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

回答編集履歴

2

本文中にリンクとコメントを追加

2018/01/04 15:31

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,16 +1,14 @@
1
1
  他の回答者様によって解決内容が既に出ているので少し違ったアプローチの回答を致します。
2
2
 
3
3
  他のクラスがJFrameを継承したクラスの内部実装(JLabel)について詳しいのはクラス間の結合度が高いのであまり好ましくないかと。
4
- あるクラスに対して内部の値を変更したい時は、イベントとして通知するいです。
4
+ あるクラスに対して内部の値を変更したい時は、該当のクラスに対してイベントとして通知する形にして、通知側のクラス値を変更するとう形の方が個人的に好きです。
5
5
 
6
-
7
-
8
- 1,PropertyChangeListener を実装する。
6
+ 1,NewJFrameクラスは[PropertyChangeListener](https://docs.oracle.com/javase/jp/8/docs/api/java/beans/PropertyChangeListener.html) を実装する。
9
7
  ```Java
10
8
  import java.beans.PropertyChangeListener;
11
9
  public class NewJFrame extends javax.swing.JFrame implements PropertyChangeListener {
12
10
  ```
13
- 2,propertyChangeイベントイベント内で、jLabel1.setTextを行う。
11
+ 2,[propertyChange](https://docs.oracle.com/javase/jp/8/docs/api/java/beans/PropertyChangeListener.html#propertyChange-java.beans.PropertyChangeEvent-)イベントイベント内で、jLabel1.setTextの処理を行う。
14
12
  ```Java
15
13
  @Override
16
14
  public void propertyChange(PropertyChangeEvent e) {
@@ -22,21 +20,22 @@
22
20
  ```Java
23
21
  import java.beans.PropertyChangeEvent;
24
22
  class OtherClass {
25
- private final NewJFrame frame;
23
+ private PropertyChangeListener listener; //listenerの参照は不要になったタイミングでnullを入れるほうがイベントハンドラのリークを防げます。
26
24
  private final Random rnd = new Random();
27
- OtherClass(NewJFrame frame){
25
+ OtherClass(PropertyChangeListener listener){
28
- this.frame = frame;
26
+ this.listener = listener;
29
27
  }
30
28
  void setText() {
31
29
  String text = "Hello" + String.valueOf(rnd.nextInt(500));
32
30
  PropertyChangeEvent event = new PropertyChangeEvent(this, "setText", text, text);
33
- this.frame.propertyChange(event);
31
+ this.listener.propertyChange(event);
34
32
  }
35
33
  }
36
34
  ```
37
35
  以下はnetbeansで作ったサンプルソースコードです。ご参考まで
38
36
 
39
37
  ```Java
38
+
40
39
  import java.beans.PropertyChangeListener;
41
40
  import java.beans.PropertyChangeEvent;
42
41
  import java.util.Random;
@@ -155,15 +154,15 @@
155
154
  }
156
155
 
157
156
  class OtherClass {
158
- private final NewJFrame frame;
157
+ private PropertyChangeListener listener; //listenerの参照は不要になったタイミングでnullを入れるほうがイベントハンドラのリークを防げます。
159
158
  private final Random rnd = new Random();
160
- OtherClass(NewJFrame frame){
159
+ OtherClass(PropertyChangeListener listener){
161
- this.frame = frame;
160
+ this.listener = listener;
162
161
  }
163
162
  void setText() {
164
163
  String text = "Hello" + String.valueOf(rnd.nextInt(500));
165
164
  PropertyChangeEvent event = new PropertyChangeEvent(this, "setText", text, text);
166
- this.frame.propertyChange(event);
165
+ this.listener.propertyChange(event);
167
166
  }
168
167
  }
169
168
  // Variables declaration - do not modify

1

引用文を追加

2018/01/04 15:31

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -21,11 +21,18 @@
21
21
  3,他クラス側でNewJFrameに対してpropertyChangeイベントを発火する。
22
22
  ```Java
23
23
  import java.beans.PropertyChangeEvent;
24
+ class OtherClass {
25
+ private final NewJFrame frame;
26
+ private final Random rnd = new Random();
27
+ OtherClass(NewJFrame frame){
28
+ this.frame = frame;
29
+ }
24
30
  void setText() {
25
31
  String text = "Hello" + String.valueOf(rnd.nextInt(500));
26
32
  PropertyChangeEvent event = new PropertyChangeEvent(this, "setText", text, text);
27
33
  this.frame.propertyChange(event);
28
34
  }
35
+ }
29
36
  ```
30
37
  以下はnetbeansで作ったサンプルソースコードです。ご参考まで
31
38
 
@@ -164,4 +171,8 @@
164
171
  private javax.swing.JLabel jLabel1;
165
172
  // End of variables declaration
166
173
  }
167
- ```
174
+ ```
175
+
176
+ □参考情報
177
+ [PropertyChangeListener](https://docs.oracle.com/javase/jp/8/docs/api/java/beans/PropertyChangeListener.html)
178
+ [PropertyChangeEvent](https://docs.oracle.com/javase/jp/8/docs/api/java/beans/PropertyChangeEvent.html)