teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

かなり追記

2017/07/13 13:19

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -12,4 +12,67 @@
12
12
  private JLabel getJLabel() {
13
13
  return jl;
14
14
  }
15
- ```
15
+ ```
16
+
17
+ 追記
18
+ ---
19
+ 例えば、次のようにすれば、初期化を確実に行うことが出来ます。(かなり省略しています)
20
+ ```Java
21
+ public class Kadai06 {
22
+ // 必要なインスタンスの宣言
23
+ JLabel jb1; // =null は不要です
24
+ ...
25
+
26
+ public Kadai06() {
27
+ // ボタンとラベルの初期化
28
+ jb1 = new JButton();
29
+ jb1.setText("ボタン");
30
+ ...
31
+
32
+ // パネルの初期化、レイアウト設定
33
+ cp = new JPanel();
34
+ cp.setLayout(new GridLayout(1,3));
35
+ ...
36
+
37
+ // フレームの初期化
38
+ jf = new JFrame();
39
+ jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
40
+ ...
41
+ }
42
+
43
+ // ゲッターの実装
44
+ private JLabel getLabel2() { return jl2; }
45
+ ...
46
+
47
+ // マウスリスナーなどの実装
48
+ ...
49
+
50
+ // メインメソッド
51
+ public static main(String[] args) {
52
+ SwingUtilities.invokeLater(new Runnable() {
53
+ public void run() {
54
+ Kadai06 application = new Kadai06(); // ここでコンストラクタが呼ばれる
55
+ application.getJFrame().setVisible(true);
56
+ }
57
+ });
58
+ }
59
+ }
60
+ ```
61
+
62
+ あと気になるのは、インスタンスの命名に意味合いがないことです。
63
+ jl, jl1, jl2... **なんのための**ラベルなのか、全く伝わってきません。
64
+
65
+ また、リスナークラスの使い方も(初心者なので仕方ないですが)少し荒っぽい印象を受けます。
66
+ 次のように実装されてはいかがですか。
67
+ ```Java
68
+ public class MouseListener extends MouseAdapter
69
+ {
70
+ public void mouseEntered(MouseEvent eve) {
71
+ getJButton().setText("MOUSE_ENTERED");
72
+ }
73
+ ...
74
+ }
75
+ ```
76
+
77
+ ゲッターに無駄な役割がなければ、このような使い方が出来ます。
78
+ `s`と`s1`も定義しなくて大丈夫ですね。

2

ちょっと加筆

2017/07/13 13:19

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -5,6 +5,11 @@
5
5
  そもそも論になりますが、かなりバグを含みやすい設計をしています。
6
6
  実際、上記の改善をしても、また別のエラーが発生しました。
7
7
 
8
- `getXX`の役割が大きすぎるのです。
8
+ `getXX`(ゲッターと呼びます)の役割が大きすぎるのです。
9
9
  基本的に、フィールドの初期化はコンストラクタで行うべきです。
10
- `getXX`(ゲッターと呼びます)は、**インスタンスを返すだけ**の役割にしてください。
10
+ ゲッターは、**インスタンスを返すだけ**の役割にしてください。例えば、次のように。
11
+ ```Java
12
+ private JLabel getJLabel() {
13
+ return jl;
14
+ }
15
+ ```

1

成形

2017/07/13 11:45

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -6,6 +6,5 @@
6
6
  実際、上記の改善をしても、また別のエラーが発生しました。
7
7
 
8
8
  `getXX`の役割が大きすぎるのです。
9
-
10
9
  基本的に、フィールドの初期化はコンストラクタで行うべきです。
11
10
  `getXX`(ゲッターと呼びます)は、**インスタンスを返すだけ**の役割にしてください。