質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Java

    15846questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    248questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Java Swingを用いたGUIアプリケーションの作成

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 437

Hopp

score 1

前提・実現したいこと

Javaを勉強しているものです
今回Swingを使ってGUIアプリケーションを作りたいのですが
製作中にエラーが出てしまい、手詰まりとなってしまいました
皆様のお力をお借りしたいです
条件

  1. パネルを2枚に横で分割
  2. 上の段をさらに縦に3つに分割
  3. 左からボタン、ラベル1、ラベル2を配置
  4. ボタンにはマウスカーソルが入ったときと出たときにイベントを発生
  5. ラベル1にはマウスのボタンを押したときとはなしたときにイベントを発生
  6. ラベル2にはカーソルを動かしたときとドラッグしたときにイベントを発生
  7. パネル下段に各イベントのメッセージを表示する

発生している問題・エラーメッセージ

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Kadai06.Kadai006.getJButton(Kadai006.java:111)
at Kadai06.Kadai006.getJContentPane1(Kadai006.java:54)
at Kadai06.Kadai006.getJFrame(Kadai006.java:43)
at Kadai06.Kadai006.access$0(Kadai006.java:29)
at Kadai06.Kadai006$1.run(Kadai006.java:190)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:672)
at java.awt.EventQueue.access$400(EventQueue.java:81)
at java.awt.EventQueue$2.run(EventQueue.java:633)
at java.awt.EventQueue$2.run(EventQueue.java:631)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:642)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

該当のソースコード

package Kadai06;


import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;

public class Kadai006 {

    private JFrame jf = null;
    private JPanel cp = null;
    private JPanel cp1 = null;

    private JLabel jl = null;
    private JButton jb1 = null;
    private JLabel jl1 = null;
    private JLabel jl2 = null;
    public String s = null;
    public String s1 = null;


    private JFrame getJFrame() {

        if(jf == null) {
            jf = new JFrame();
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setSize(480, 360);
            jf.setLocationRelativeTo(null);
            JPanel cp2 = (JPanel) jf.getContentPane();

            cp2.setLayout(new GridLayout(2,2));
            cp2 = (JPanel) jf.getContentPane(); 

            jf.setTitle("課題6");

            jf.getContentPane().add(getJContentPane1());
            jf.getContentPane().add(getJContentPane2());


    }        
            return jf;
}
    private JPanel getJContentPane1() {
        if (cp == null) {
            cp = new JPanel();
            cp.setLayout(new GridLayout(1,3));
            cp.add(getJButton());
            cp.add(getJLabel1());
            cp.add(getJLabel2());


        }
        return cp;
    }

    private JPanel getJContentPane2() {
        if (cp1 == null) {

            cp1.setLayout(new GridLayout());
            cp1.add(getJLabel());
        }
        return cp1;
    }


    private JLabel getJLabel() {
        if (jl == null) {
            jl = new JLabel();
            jl.setText("s");
        }
        return jl;

    }

    private JLabel getJLabel1() {
        if (jl == null) {
            jl1 = new JLabel();
            jl1.setText("ラベル1");
            jl1.addMouseListener(new MouseListener());
        }
        return jl1;

    }
        private JLabel getJLabel2() {
            if (jl == null) {
                jl2 = new JLabel();
                jl2.setText("ラベル2");
                jl2.addMouseMotionListener(new MouseChecker());
                jl2.addMouseListener(new MouseListener());
            }
            return jl2;
    }
    private JButton getJButton() {
        if (jb1 == null) 
        {
             jb1 = new JButton();
            jb1.setText("ボタン");





    jb1.addMouseListener(new MouseListener());
    jl.setText("s");
        }

    return jb1;


    }

    public class MouseChecker extends MouseInputAdapter
    {
        public void mouseMoved(MouseEvent e)
        {
            int x = e.getX();
            int y = e.getY();
            s="MOUSE_MOVED:(";
            s1=Integer.toString(x);
            s=s+s1;
            s=s+",";
            s1=Integer.toString(y);
            s=s+s1;
            s=s+")";
        }

        public void mouseDragged(MouseEvent e)
        {
            int x = e.getX();
            int y = e.getY();
            s="MOUSE_MOVED:(";
            s1=Integer.toString(x);
            s=s+s1;
            s=s+",";
            s1=Integer.toString(y);
            s=s+s1;
            s=s+")";
            s=s+"-";

            x = e.getX();
            y = e.getY();
            s="MOUSE_MOVED:(";
            s1=Integer.toString(x);
            s=s+s1;
            s=s+",";
            s1=Integer.toString(y);
            s=s+s1;
            s=s+")";
        }
    }


    public class MouseListener extends MouseAdapter
    {
        public void mouseEntered(MouseEvent eve)
        {
            s="MOUSE_ENTERED";
        }

        public void mouseExited(MouseEvent eve)
        {
            s="MOUSE_EXITED";
        }

        public void mouseClicked(MouseEvent eve)
        {
            s="MOUSE_CLICKED";
        }

        public void mouseReleased(MouseEvent eve)
        {
            s="MOUSE_RELEASED";
        }
    }




    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Kadai006 application = new Kadai006();
                application.getJFrame().setVisible(true);
            }
        });
    }
}

試したこと

浅はかな知識ではありますが、ヌルポインタとエラーコードから読めたので、宣言を変更したりしました

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

getJLabel()が呼び出されていないので、jlが実体を持っていません。
適切なタイミングでgetJLabel()を実行してください。


そもそも論になりますが、かなりバグを含みやすい設計をしています。
実際、上記の改善をしても、また別のエラーが発生しました。

getXX(ゲッターと呼びます)の役割が大きすぎるのです。
基本的に、フィールドの初期化はコンストラクタで行うべきです。
ゲッターは、インスタンスを返すだけの役割にしてください。例えば、次のように。

private JLabel getJLabel() {
   return jl;
}

追記

例えば、次のようにすれば、初期化を確実に行うことが出来ます。(かなり省略しています)

public class Kadai06 {
   // 必要なインスタンスの宣言
   JLabel jb1;    // =null は不要です
   ...

   public Kadai06() {
      // ボタンとラベルの初期化
      jb1 = new JButton();
      jb1.setText("ボタン");
      ...

      // パネルの初期化、レイアウト設定
      cp = new JPanel();
      cp.setLayout(new GridLayout(1,3));
      ...

      // フレームの初期化
      jf = new JFrame();
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      ...      
   }

   // ゲッターの実装
   private JLabel getLabel2() { return jl2; }
   ...

   // マウスリスナーなどの実装
   ...

   // メインメソッド
   public static main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            Kadai06 application = new Kadai06();    // ここでコンストラクタが呼ばれる
            application.getJFrame().setVisible(true);
         }
      });
   }
}

あと気になるのは、インスタンスの命名に意味合いがないことです。
jl, jl1, jl2... なんのためのラベルなのか、全く伝わってきません。

また、リスナークラスの使い方も(初心者なので仕方ないですが)少し荒っぽい印象を受けます。
次のように実装されてはいかがですか。

public class MouseListener extends MouseAdapter
{
   public void mouseEntered(MouseEvent eve) { 
      getJButton().setText("MOUSE_ENTERED");
   }
   ...
}

ゲッターに無駄な役割がなければ、このような使い方が出来ます。
ss1も定義しなくて大丈夫ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/13 21:33

    早速のご回答ありがとうございます
    ご指摘を参考にして、getJLabel()の位置を書き換えてみたのですが、いかんせんやはりエラーとなってしまいます、お手数ですが、もう少し詳しく教えていただきたいと思います
    よろしくお願いいたします

    キャンセル

  • 2017/07/13 21:37

    私と同じエラーが生じたなら、おそらくまたヌルポアクセスでしょう。
    回答でも書きましたように、これらのバグはコードの構造に寄るものだと考えた方がいいです。
    一つ一つ解消しても、どこまでバグが潜んでいるかわかりません。
    ですから、まずコードの構造を見直すことをお勧めします。

    キャンセル

  • 2017/07/13 21:38

    コードの改造は面倒に思えますが、おそらく一番の近道です。
    今後の保守や機能追加も容易になります。

    キャンセル

  • 2017/07/13 21:49

    初心者だから、ということを盾にするのは大変恐縮なのですが
    コードのくみなおしを行った経験がありません
    そこで、ご教授願いたいのですが、機能は細分化するのが良いのでしょうか?

    キャンセル

  • 2017/07/13 21:55

    メソッドに関する原則として、次のようなものが挙げられます。
    ・他のメソッドとの依存関係が少ないこと
    ・メソッドの役割が多岐に渡らないこと
    上記はかなり簡略化してますが、”モジュール化”と調べると色々出てきます。

    キャンセル

  • 2017/07/13 21:56

    さて、質問者さまのコードについてですが...
    見やすさを考慮して、回答に追記する形にさせていただきます。
    少々お待ちください。

    キャンセル

  • 2017/07/13 22:06

    ご丁寧にありがとうございます

    キャンセル

  • 2017/07/18 23:26

    ありがとうございます!
    なんとか、参考にして解決することができました!

    キャンセル

0

JLabel jl がnullだからです。

jlはgetJContentPane2()の中で作成しているにも関わらず、
先に呼ばれているgetJContentPane1()の中で参照されています。

getJButton()を呼ぶ前に、getJLabel()が呼ばれる必要がありますね。

追記

LouiS0616さんの「そもそも論」は、私も同意です。
ちょっと複雑に作りすぎだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15846questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    248questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。