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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Swing

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

Q&A

解決済

2回答

2036閲覧

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

Hopp

総合スコア9

Java

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

Swing

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

0グッド

0クリップ

投稿2017/07/13 11:21

###前提・実現したいこと
Javaを勉強しているものです
今回Swingを使ってGUIアプリケーションを作りたいのですが
製作中にエラーが出てしまい、手詰まりとなってしまいました
皆様のお力をお借りしたいです
条件
0. パネルを2枚に横で分割
0. 上の段をさらに縦に3つに分割
0. 左からボタン、ラベル1、ラベル2を配置
0. ボタンにはマウスカーソルが入ったときと出たときにイベントを発生
0. ラベル1にはマウスのボタンを押したときとはなしたときにイベントを発生
0. ラベル2にはカーソルを動かしたときとドラッグしたときにイベントを発生
0. パネル下段に各イベントのメッセージを表示する

###発生している問題・エラーメッセージ
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)

###該当のソースコード

Java

1package Kadai06; 2 3 4import java.awt.GridLayout; 5import java.awt.event.MouseAdapter; 6import java.awt.event.MouseEvent; 7 8import javax.swing.JButton; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JPanel; 12import javax.swing.SwingUtilities; 13import javax.swing.event.MouseInputAdapter; 14 15public class Kadai006 { 16 17 private JFrame jf = null; 18 private JPanel cp = null; 19 private JPanel cp1 = null; 20 21 private JLabel jl = null; 22 private JButton jb1 = null; 23 private JLabel jl1 = null; 24 private JLabel jl2 = null; 25 public String s = null; 26 public String s1 = null; 27 28 29 private JFrame getJFrame() { 30 31 if(jf == null) { 32 jf = new JFrame(); 33 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 34 jf.setSize(480, 360); 35 jf.setLocationRelativeTo(null); 36 JPanel cp2 = (JPanel) jf.getContentPane(); 37 38 cp2.setLayout(new GridLayout(2,2)); 39 cp2 = (JPanel) jf.getContentPane(); 40 41 jf.setTitle("課題6"); 42 43 jf.getContentPane().add(getJContentPane1()); 44 jf.getContentPane().add(getJContentPane2()); 45 46 47 } 48 return jf; 49} 50 private JPanel getJContentPane1() { 51 if (cp == null) { 52 cp = new JPanel(); 53 cp.setLayout(new GridLayout(1,3)); 54 cp.add(getJButton()); 55 cp.add(getJLabel1()); 56 cp.add(getJLabel2()); 57 58 59 } 60 return cp; 61 } 62 63 private JPanel getJContentPane2() { 64 if (cp1 == null) { 65 66 cp1.setLayout(new GridLayout()); 67 cp1.add(getJLabel()); 68 } 69 return cp1; 70 } 71 72 73 private JLabel getJLabel() { 74 if (jl == null) { 75 jl = new JLabel(); 76 jl.setText("s"); 77 } 78 return jl; 79 80 } 81 82 private JLabel getJLabel1() { 83 if (jl == null) { 84 jl1 = new JLabel(); 85 jl1.setText("ラベル1"); 86 jl1.addMouseListener(new MouseListener()); 87 } 88 return jl1; 89 90 } 91 private JLabel getJLabel2() { 92 if (jl == null) { 93 jl2 = new JLabel(); 94 jl2.setText("ラベル2"); 95 jl2.addMouseMotionListener(new MouseChecker()); 96 jl2.addMouseListener(new MouseListener()); 97 } 98 return jl2; 99 } 100 private JButton getJButton() { 101 if (jb1 == null) 102 { 103 jb1 = new JButton(); 104 jb1.setText("ボタン"); 105 106 107 108 109 110 jb1.addMouseListener(new MouseListener()); 111 jl.setText("s"); 112 } 113 114 return jb1; 115 116 117 } 118 119 public class MouseChecker extends MouseInputAdapter 120 { 121 public void mouseMoved(MouseEvent e) 122 { 123 int x = e.getX(); 124 int y = e.getY(); 125 s="MOUSE_MOVED:("; 126 s1=Integer.toString(x); 127 s=s+s1; 128 s=s+","; 129 s1=Integer.toString(y); 130 s=s+s1; 131 s=s+")"; 132 } 133 134 public void mouseDragged(MouseEvent e) 135 { 136 int x = e.getX(); 137 int y = e.getY(); 138 s="MOUSE_MOVED:("; 139 s1=Integer.toString(x); 140 s=s+s1; 141 s=s+","; 142 s1=Integer.toString(y); 143 s=s+s1; 144 s=s+")"; 145 s=s+"-"; 146 147 x = e.getX(); 148 y = e.getY(); 149 s="MOUSE_MOVED:("; 150 s1=Integer.toString(x); 151 s=s+s1; 152 s=s+","; 153 s1=Integer.toString(y); 154 s=s+s1; 155 s=s+")"; 156 } 157 } 158 159 160 public class MouseListener extends MouseAdapter 161 { 162 public void mouseEntered(MouseEvent eve) 163 { 164 s="MOUSE_ENTERED"; 165 } 166 167 public void mouseExited(MouseEvent eve) 168 { 169 s="MOUSE_EXITED"; 170 } 171 172 public void mouseClicked(MouseEvent eve) 173 { 174 s="MOUSE_CLICKED"; 175 } 176 177 public void mouseReleased(MouseEvent eve) 178 { 179 s="MOUSE_RELEASED"; 180 } 181 } 182 183 184 185 186 public static void main(String[] args) { 187 SwingUtilities.invokeLater(new Runnable() { 188 public void run() { 189 Kadai006 application = new Kadai006(); 190 application.getJFrame().setVisible(true); 191 } 192 }); 193 } 194}

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

JLabel jl がnullだからです。

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

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

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

投稿2017/07/13 11:41

編集2017/07/13 11:44
root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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


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

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

Java

1private JLabel getJLabel() { 2 return jl; 3}

追記

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

Java

1public class Kadai06 { 2 // 必要なインスタンスの宣言 3 JLabel jb1; // =null は不要です 4 ... 5 6 public Kadai06() { 7 // ボタンとラベルの初期化 8 jb1 = new JButton(); 9 jb1.setText("ボタン"); 10 ... 11 12 // パネルの初期化、レイアウト設定 13 cp = new JPanel(); 14 cp.setLayout(new GridLayout(1,3)); 15 ... 16 17 // フレームの初期化 18 jf = new JFrame(); 19 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 20 ... 21 } 22 23 // ゲッターの実装 24 private JLabel getLabel2() { return jl2; } 25 ... 26 27 // マウスリスナーなどの実装 28 ... 29 30 // メインメソッド 31 public static main(String[] args) { 32 SwingUtilities.invokeLater(new Runnable() { 33 public void run() { 34 Kadai06 application = new Kadai06(); // ここでコンストラクタが呼ばれる 35 application.getJFrame().setVisible(true); 36 } 37 }); 38 } 39}

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

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

Java

1public class MouseListener extends MouseAdapter 2{ 3 public void mouseEntered(MouseEvent eve) { 4 getJButton().setText("MOUSE_ENTERED"); 5 } 6 ... 7}

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

投稿2017/07/13 11:35

編集2017/07/13 13:19
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hopp

2017/07/13 12:33

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

2017/07/13 12:37

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

2017/07/13 12:38

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

2017/07/13 12:49

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

2017/07/13 12:55

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

2017/07/13 12:56

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

2017/07/13 13:06

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

2017/07/18 14:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問