回答編集履歴

2

見直しキャンペーン中

2023/07/29 04:54

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,609 +1,304 @@
1
1
  前回の質問の続きですよね?
2
-
3
2
  [Java - 親クラスの変数を子クラスで変更し、親クラスに返す|teratail](https://teratail.com/questions/356244)
4
3
 
5
-
6
-
7
4
  前回の質問をどう解決されたかわからないので複数クラスに分けましたが、内部クラス等でいいならもっと簡単な話になります。
8
5
 
9
6
 
10
-
11
-
12
-
13
7
  > カウンタ変数iが一定数カウントされたら、自動的にsetEnabledをtrueに変更し、ボタンが有効になるようにしたい
14
8
 
15
-
16
-
17
- これはかなり本質を突いた問いでして、そういうことができれば便利なのですがただの`int`変数にはそういう機能はありません。
9
+ これはかなり本質を突いた問いでして、そういうことができれば便利なのですがただの`int`変数にはそういう機能はありません。
18
-
19
10
  `Sc`の外で`i`を変えても`Sc`は知りようがないし、逆に`Sc`が`i`を変えてもほかのクラスからはわかりません。
20
11
 
21
-
22
-
23
12
  もちろん`i`が変わった後に`i`を見れば増えてはいます(いつ増えたのかはわからない)
24
13
 
25
-
26
-
27
14
  簡単な解決策は直接`i`を変えずに、`i`を変えるメソッドを用意することです。
28
-
29
- そうすれば`Sc`はいつ`i`が変わるのかを把握できます(セッター setter)
15
+ そうすれば`Sc`はいつ`i`が変わるのかを把握できます
30
-
16
+ こういうメソッドをセッター(setter)といいます。
31
-
32
17
 
33
18
  ```Java
34
-
35
19
  import java.awt.BorderLayout;
36
-
37
20
  import java.awt.CardLayout;
38
-
39
21
  import java.awt.event.ActionEvent;
40
-
41
22
  import java.awt.event.ActionListener;
42
-
43
23
  import javax.swing.JButton;
44
-
45
24
  import javax.swing.JFrame;
46
-
47
25
  import javax.swing.JPanel;
48
26
 
49
27
 
50
-
51
-
52
-
53
28
  public class Sc extends JFrame implements ActionListener {
54
-
55
29
  public static void main(String[] args) {
56
-
57
30
  new Sc().setVisible(true);
58
-
59
- }
31
+ }
60
-
61
-
62
32
 
63
33
  private final JPanel cardPanel;
64
-
65
34
  private final CardLayout CardLayout;
66
-
67
35
  private final JButton toResult;
68
36
 
69
-
70
-
71
37
  private int i = 0;
72
38
 
73
-
74
-
75
39
  public Sc() {
76
-
77
40
  setSize(400, 300);
78
-
79
41
  setLocationRelativeTo(null);
80
-
81
42
  setDefaultCloseOperation(EXIT_ON_CLOSE);
82
43
 
83
-
84
-
85
44
  cardPanel = new JPanel();
86
-
87
45
  CardLayout = new CardLayout();
88
-
89
46
  cardPanel.setLayout(CardLayout);
90
47
 
91
-
92
-
93
48
  cardPanel.add(new QuestionPanel(this), "question");
94
49
 
95
-
96
-
97
50
  JPanel result = new JPanel();
98
-
99
51
  result.add(new JButton("result"));
100
-
101
52
  cardPanel.add(result, "result");
102
53
 
103
-
104
-
105
54
  JPanel btnPanel = new JPanel();
106
-
107
55
  toResult = new JButton("結果に進む");
108
-
109
56
  toResult.addActionListener(this);
110
-
111
57
  toResult.setActionCommand("result");
112
-
113
58
  toResult.setEnabled(false);
114
-
115
59
  btnPanel.add(toResult);
116
60
 
117
-
118
-
119
61
  add(cardPanel, BorderLayout.CENTER);
120
-
121
62
  add(btnPanel, BorderLayout.PAGE_END);
122
-
123
- }
63
+ }
124
-
125
-
126
64
 
127
65
  // public int getI() {return i;} // ゲッター(getter)
128
-
129
66
  // public void setI(int i) {this.i = i;} // セッター(setter)
130
-
131
67
  // ゲッターセッターでもいいのだが、「1ずつ増やす」しかしないのでより明確に
132
-
133
68
  public void incrementI() {
134
-
135
69
  i++;
136
-
137
70
  if (11 <= i) {
138
-
139
71
  toResult.setEnabled(true);
140
-
141
72
  }
142
-
143
- }
73
+ }
144
-
145
-
146
74
 
147
75
  @Override public void actionPerformed(ActionEvent e) {
148
-
149
76
  CardLayout.show(cardPanel, e.getActionCommand());
150
-
151
- }
77
+ }
152
-
153
- }
78
+ }
154
-
155
-
156
79
 
157
80
  class QuestionPanel extends JPanel implements ActionListener {
158
-
159
81
  private final Sc sc;
160
82
 
161
-
162
-
163
83
  QuestionPanel(Sc sc) {
164
-
165
84
  this.sc = sc;
166
85
 
167
-
168
-
169
86
  JButton yes = new JButton("〇");
170
-
171
87
  yes.addActionListener(this);
172
-
173
88
  yes.setActionCommand("yes");
174
-
175
89
  add(yes);
176
90
 
177
-
178
-
179
91
  JButton no = new JButton("×");
180
-
181
92
  no.addActionListener(this);
182
-
183
93
  no.setActionCommand("no");
184
-
185
94
  add(no);
186
-
187
- }
95
+ }
188
-
189
-
190
96
 
191
97
  @Override public void actionPerformed(ActionEvent e) {
192
-
193
98
  sc.incrementI();
194
-
195
- }
99
+ }
196
-
197
- }
100
+ }
198
-
199
101
  ```
200
102
 
201
-
202
-
203
103
  ---
204
104
 
205
-
206
-
207
105
  > ただの`int`変数にはそういう機能はありません。
208
106
 
209
-
210
-
211
- と言いましたが、実はそういうことができる仕組みは用意されています
107
+ と言いましたが、実はそういうことができる仕組みは用意されています(Swingで活用している例はほとんど見ないのですが^^;
212
-
213
- Swingで活用している例はほとんど見ないのですが^^;
214
-
215
-
216
-
217
108
  [PropertyChangeListener (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/beans/PropertyChangeListener.html)
218
-
219
109
  [PropertyChangeSupport (Java Platform SE 8 )](https://sun.ac.jp/prof/yamagu/java8docs/api/java/beans/PropertyChangeSupport.html)
220
110
 
221
-
222
-
223
111
  ```Java
224
-
225
112
  import java.awt.BorderLayout;
226
-
227
113
  import java.awt.CardLayout;
228
-
229
114
  import java.awt.event.ActionEvent;
230
-
231
115
  import java.awt.event.ActionListener;
232
-
233
116
  import java.beans.PropertyChangeEvent;
234
-
235
117
  import java.beans.PropertyChangeListener;
236
-
237
118
  import javax.swing.JButton;
238
-
239
119
  import javax.swing.JFrame;
240
-
241
120
  import javax.swing.JPanel;
242
-
243
121
  import javax.swing.event.SwingPropertyChangeSupport;
244
122
 
245
123
 
246
-
247
-
248
-
249
124
  public class Sc extends JFrame implements ActionListener, PropertyChangeListener {
250
-
251
125
  public static void main(String[] args) {
252
-
253
126
  new Sc().setVisible(true);
254
-
255
- }
127
+ }
256
-
257
-
258
128
 
259
129
  private final JPanel cardPanel;
260
-
261
130
  private final CardLayout CardLayout;
262
-
263
131
  private final JButton toResult;
264
-
265
132
  private final QuestionModel model;
266
133
 
267
134
 
268
-
269
-
270
-
271
135
  public Sc() {
272
-
273
136
  setSize(400, 300);
274
-
275
137
  setLocationRelativeTo(null);
276
-
277
138
  setDefaultCloseOperation(EXIT_ON_CLOSE);
278
139
 
279
-
280
-
281
140
  model = new QuestionModel();
282
-
283
141
  model.addPropertyChangeListener(this);
284
142
 
285
-
286
-
287
143
  cardPanel = new JPanel();
288
-
289
144
  CardLayout = new CardLayout();
290
-
291
145
  cardPanel.setLayout(CardLayout);
292
146
 
293
-
294
-
295
147
  cardPanel.add(new QuestionPanel(model), "question");
296
148
 
297
-
298
-
299
149
  JPanel result = new JPanel();
300
-
301
150
  result.add(new JButton("result"));
302
-
303
151
  cardPanel.add(result, "result");
304
152
 
305
-
306
-
307
153
  JPanel btnPanel = new JPanel();
308
-
309
154
  toResult = new JButton("結果に進む");
310
-
311
155
  toResult.addActionListener(this);
312
-
313
156
  toResult.setActionCommand("result");
314
-
315
157
  toResult.setEnabled(false);
316
-
317
158
  btnPanel.add(toResult);
318
159
 
319
-
320
-
321
160
  add(cardPanel, BorderLayout.CENTER);
322
-
323
161
  add(btnPanel, BorderLayout.PAGE_END);
324
-
325
- }
162
+ }
326
-
327
-
328
163
 
329
164
  @Override public void actionPerformed(ActionEvent e) {
330
-
331
165
  CardLayout.show(cardPanel, e.getActionCommand());
332
-
333
- }
166
+ }
334
-
335
-
336
167
 
337
168
  @Override public void propertyChange(PropertyChangeEvent evt) {
338
-
339
169
  if (11 <= model.getI()) {
340
-
341
170
  toResult.setEnabled(true);
342
-
343
171
  }
344
-
345
- }
172
+ }
346
-
347
- }
173
+ }
348
-
349
-
350
174
 
351
175
  class QuestionPanel extends JPanel implements ActionListener {
352
-
353
176
  private final QuestionModel model;
354
177
 
355
-
356
-
357
178
  QuestionPanel(QuestionModel model) {
358
-
359
179
  this.model = model;
360
180
 
361
-
362
-
363
181
  JButton yes = new JButton("〇");
364
-
365
182
  yes.addActionListener(this);
366
-
367
183
  yes.setActionCommand("yes");
368
-
369
184
  add(yes);
370
185
 
371
-
372
-
373
186
  JButton no = new JButton("×");
374
-
375
187
  no.addActionListener(this);
376
-
377
188
  no.setActionCommand("no");
378
-
379
189
  add(no);
380
-
381
- }
190
+ }
382
-
383
-
384
191
 
385
192
  @Override public void actionPerformed(ActionEvent e) {
386
-
387
193
  model.incrementI();
388
-
389
- }
194
+ }
390
-
391
- }
195
+ }
392
-
393
-
394
196
 
395
197
  class QuestionModel {
396
-
397
198
  private final SwingPropertyChangeSupport pcs = new SwingPropertyChangeSupport(this);
398
199
 
399
-
400
-
401
200
  public void addPropertyChangeListener(PropertyChangeListener listener) {
402
-
403
201
  pcs.addPropertyChangeListener(listener);
404
-
405
- }
202
+ }
406
-
407
-
408
203
 
409
204
  // public void removePropertyChangeListener(PropertyChangeListener listener) {
410
-
411
205
  // pcs.removePropertyChangeListener(listener);
412
-
413
206
  // }
414
207
 
415
-
416
-
417
208
  private int i;
418
209
 
419
-
420
-
421
210
  public int getI() { return i; }
422
211
 
423
-
424
-
425
212
  // public void setI(int newValue) {
426
-
427
213
  // int oldValue = i;
428
-
429
214
  // i = newValue;
430
-
431
215
  // pcs.firePropertyChange("i", oldValue, newValue);
432
-
433
216
  // }
434
217
 
435
-
436
-
437
218
  public void incrementI() {
438
-
439
219
  pcs.firePropertyChange("i", i++, i);
440
-
441
- }
220
+ }
442
-
443
- }
221
+ }
444
-
445
222
  ```
446
223
 
447
-
448
-
449
224
  あまり変わり映えしませんが、変更を知れるクラスをいくつでも登録できます。
450
225
 
451
-
452
-
453
226
  ---
454
227
 
455
-
456
-
457
228
  追記
458
-
459
229
  > 内部クラスで変数を扱うことにしております。
460
230
 
461
-
462
-
463
231
  `Code`は内部クラスになっていませんが、書き間違いだとして^^;
464
232
 
465
-
466
-
467
233
  内部クラスでいいなら話は簡単です。
468
-
469
- 外(Sc)の変数がそのまま使えるので、`i++`したついでにチェックするだけです。
234
+ 外(`Sc`)の変数がそのまま使えるので、`i++`したついでにチェックするだけです。
470
-
471
-
472
235
 
473
236
  ```Java
474
-
475
237
  import java.awt.BorderLayout;
476
-
477
238
  import java.awt.CardLayout;
478
-
479
239
  import java.awt.event.ActionEvent;
480
-
481
240
  import java.awt.event.ActionListener;
482
-
483
241
  import javax.swing.JButton;
484
-
485
242
  import javax.swing.JFrame;
486
-
487
243
  import javax.swing.JPanel;
488
244
 
489
-
490
-
491
245
  public class Sc extends JFrame implements ActionListener {
492
-
493
246
  public static void main(String[] args) {
494
-
495
247
  new Sc().setVisible(true);
496
-
497
- }
248
+ }
498
-
499
-
500
249
 
501
250
  private final JPanel cardPanel;
502
-
503
251
  private final CardLayout cardLayout;
504
-
505
252
  private final JButton btn_2to3;
506
253
 
507
-
508
-
509
254
  private int i = 0;
510
255
 
511
-
512
-
513
256
  public Sc() {
514
-
515
257
  setSize(400, 300);
516
-
517
258
  setLocationRelativeTo(null);
518
-
519
259
  setDefaultCloseOperation(EXIT_ON_CLOSE);
520
260
 
521
-
522
-
523
261
  JPanel p2 = new JPanel();
524
-
525
262
  JButton btn02 = new JButton("C");
526
-
527
263
  btn02.addActionListener(new Code());
528
-
529
264
  p2.add(btn02);
530
265
 
531
-
532
-
533
266
  JPanel p3 = new JPanel();
534
-
535
267
  JButton btn03 = new JButton("panel03");
536
-
537
268
  p3.add(btn03);
538
269
 
539
-
540
-
541
270
  cardPanel = new JPanel();
542
-
543
271
  cardLayout = new CardLayout();
544
-
545
272
  cardPanel.setLayout(cardLayout);
546
273
 
547
-
548
-
549
274
  cardPanel.add(p2, "panel02");
550
-
551
275
  cardPanel.add(p3, "panel03");
552
276
 
553
-
554
-
555
277
  btn_2to3 = new JButton("結果に進む");
556
-
557
278
  btn_2to3.addActionListener(this);
558
-
559
279
  btn_2to3.setActionCommand("panel03");
560
280
 
561
-
562
-
563
281
  JPanel btnPanel = new JPanel();
564
-
565
282
  btnPanel.add(btn_2to3);
566
-
567
283
  btn_2to3.setEnabled(false);
568
284
 
569
-
570
-
571
285
  add(cardPanel, BorderLayout.CENTER);
572
-
573
286
  add(btnPanel, BorderLayout.PAGE_END);
574
-
575
- }
287
+ }
576
-
577
-
578
288
 
579
289
  public void actionPerformed(ActionEvent e) {
580
-
581
290
  String cmd = e.getActionCommand();
582
-
583
291
  cardLayout.show(cardPanel, cmd);
584
-
585
- }
292
+ }
586
-
587
-
588
-
589
293
 
590
294
 
591
295
  class Code implements ActionListener {
592
-
593
296
  public void actionPerformed(ActionEvent e) {
594
-
595
297
  i++;
596
-
597
298
  if (i == 11) {
598
-
599
299
  btn_2to3.setEnabled(true);
600
-
601
300
  }
602
-
603
301
  }
604
-
605
- }
302
+ }
606
-
607
- }
303
+ }
608
-
609
304
  ```

1

内部クラス

2021/09/10 15:03

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -447,3 +447,163 @@
447
447
 
448
448
 
449
449
  あまり変わり映えしませんが、変更を知れるクラスをいくつでも登録できます。
450
+
451
+
452
+
453
+ ---
454
+
455
+
456
+
457
+ 追記
458
+
459
+ > 内部クラスで変数を扱うことにしております。
460
+
461
+
462
+
463
+ `Code`は内部クラスになっていませんが、書き間違いだとして^^;
464
+
465
+
466
+
467
+ 内部クラスでいいなら話は簡単です。
468
+
469
+ 外(Sc)の変数がそのまま使えるので、`i++`したついでにチェックするだけです。
470
+
471
+
472
+
473
+ ```Java
474
+
475
+ import java.awt.BorderLayout;
476
+
477
+ import java.awt.CardLayout;
478
+
479
+ import java.awt.event.ActionEvent;
480
+
481
+ import java.awt.event.ActionListener;
482
+
483
+ import javax.swing.JButton;
484
+
485
+ import javax.swing.JFrame;
486
+
487
+ import javax.swing.JPanel;
488
+
489
+
490
+
491
+ public class Sc extends JFrame implements ActionListener {
492
+
493
+ public static void main(String[] args) {
494
+
495
+ new Sc().setVisible(true);
496
+
497
+ }
498
+
499
+
500
+
501
+ private final JPanel cardPanel;
502
+
503
+ private final CardLayout cardLayout;
504
+
505
+ private final JButton btn_2to3;
506
+
507
+
508
+
509
+ private int i = 0;
510
+
511
+
512
+
513
+ public Sc() {
514
+
515
+ setSize(400, 300);
516
+
517
+ setLocationRelativeTo(null);
518
+
519
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
520
+
521
+
522
+
523
+ JPanel p2 = new JPanel();
524
+
525
+ JButton btn02 = new JButton("C");
526
+
527
+ btn02.addActionListener(new Code());
528
+
529
+ p2.add(btn02);
530
+
531
+
532
+
533
+ JPanel p3 = new JPanel();
534
+
535
+ JButton btn03 = new JButton("panel03");
536
+
537
+ p3.add(btn03);
538
+
539
+
540
+
541
+ cardPanel = new JPanel();
542
+
543
+ cardLayout = new CardLayout();
544
+
545
+ cardPanel.setLayout(cardLayout);
546
+
547
+
548
+
549
+ cardPanel.add(p2, "panel02");
550
+
551
+ cardPanel.add(p3, "panel03");
552
+
553
+
554
+
555
+ btn_2to3 = new JButton("結果に進む");
556
+
557
+ btn_2to3.addActionListener(this);
558
+
559
+ btn_2to3.setActionCommand("panel03");
560
+
561
+
562
+
563
+ JPanel btnPanel = new JPanel();
564
+
565
+ btnPanel.add(btn_2to3);
566
+
567
+ btn_2to3.setEnabled(false);
568
+
569
+
570
+
571
+ add(cardPanel, BorderLayout.CENTER);
572
+
573
+ add(btnPanel, BorderLayout.PAGE_END);
574
+
575
+ }
576
+
577
+
578
+
579
+ public void actionPerformed(ActionEvent e) {
580
+
581
+ String cmd = e.getActionCommand();
582
+
583
+ cardLayout.show(cardPanel, cmd);
584
+
585
+ }
586
+
587
+
588
+
589
+
590
+
591
+ class Code implements ActionListener {
592
+
593
+ public void actionPerformed(ActionEvent e) {
594
+
595
+ i++;
596
+
597
+ if (i == 11) {
598
+
599
+ btn_2to3.setEnabled(true);
600
+
601
+ }
602
+
603
+ }
604
+
605
+ }
606
+
607
+ }
608
+
609
+ ```