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

回答編集履歴

2

見直しキャンペーン中

2023/07/29 04:54

投稿

TN8001
TN8001

スコア10114

answer CHANGED
@@ -1,305 +1,304 @@
1
- 前回の質問の続きですよね?
2
- [Java - 親クラスの変数を子クラスで変更し、親クラスに返す|teratail](https://teratail.com/questions/356244)
3
-
4
- 前回の質問をどう解決されたかわからないので複数クラスに分けましたが、内部クラス等でいいならもっと簡単な話になります。
5
-
6
-
7
- > カウンタ変数iが一定数カウントされたら、自動的にsetEnabledをtrueに変更し、ボタンが有効になるようにしたい
8
-
9
- これはかなり本質を突いた問いでして、そういうことができれば便利なのですがただの`int`変数にはそういう機能はありません。
10
- `Sc`の外で`i`を変えても`Sc`は知りようがないし、逆に`Sc`が`i`を変えてもほかのクラスからはわかりません。
11
-
12
- もちろん`i`が変わった後に`i`を見れば増えてはいます(いつ増えたのかはわからない)
13
-
14
- 簡単な解決策は直接`i`を変えずに、`i`を変えるメソッドを用意することです。
15
- そうすれば`Sc`はいつ`i`が変わるのかを把握できます(セッター setter)
16
-
17
- ```Java
18
- import java.awt.BorderLayout;
19
- import java.awt.CardLayout;
20
- import java.awt.event.ActionEvent;
21
- import java.awt.event.ActionListener;
22
- import javax.swing.JButton;
23
- import javax.swing.JFrame;
24
- import javax.swing.JPanel;
25
-
26
-
27
- public class Sc extends JFrame implements ActionListener {
28
- public static void main(String[] args) {
29
- new Sc().setVisible(true);
30
- }
31
-
32
- private final JPanel cardPanel;
33
- private final CardLayout CardLayout;
34
- private final JButton toResult;
35
-
36
- private int i = 0;
37
-
38
- public Sc() {
39
- setSize(400, 300);
40
- setLocationRelativeTo(null);
41
- setDefaultCloseOperation(EXIT_ON_CLOSE);
42
-
43
- cardPanel = new JPanel();
44
- CardLayout = new CardLayout();
45
- cardPanel.setLayout(CardLayout);
46
-
47
- cardPanel.add(new QuestionPanel(this), "question");
48
-
49
- JPanel result = new JPanel();
50
- result.add(new JButton("result"));
51
- cardPanel.add(result, "result");
52
-
53
- JPanel btnPanel = new JPanel();
54
- toResult = new JButton("結果に進む");
55
- toResult.addActionListener(this);
56
- toResult.setActionCommand("result");
57
- toResult.setEnabled(false);
58
- btnPanel.add(toResult);
59
-
60
- add(cardPanel, BorderLayout.CENTER);
61
- add(btnPanel, BorderLayout.PAGE_END);
62
- }
63
-
64
- // public int getI() {return i;} // ゲッター(getter)
65
- // public void setI(int i) {this.i = i;} // ッター(setter
66
- // ゲッターセッターでもいいのだが、「1ずつ増やす」しかしないのでより明確に
67
- public void incrementI() {
68
- i++;
69
- if (11 <= i) {
70
- toResult.setEnabled(true);
71
- }
72
- }
73
-
74
- @Override public void actionPerformed(ActionEvent e) {
75
- CardLayout.show(cardPanel, e.getActionCommand());
76
- }
77
- }
78
-
79
- class QuestionPanel extends JPanel implements ActionListener {
80
- private final Sc sc;
81
-
82
- QuestionPanel(Sc sc) {
83
- this.sc = sc;
84
-
85
- JButton yes = new JButton("〇");
86
- yes.addActionListener(this);
87
- yes.setActionCommand("yes");
88
- add(yes);
89
-
90
- JButton no = new JButton("×");
91
- no.addActionListener(this);
92
- no.setActionCommand("no");
93
- add(no);
94
- }
95
-
96
- @Override public void actionPerformed(ActionEvent e) {
97
- sc.incrementI();
98
- }
99
- }
100
- ```
101
-
102
- ---
103
-
104
- > ただの`int`変数にはそういう機能はありません。
105
-
106
- と言いましたが、実はそういうことができる仕組みは用意されています。
107
- Swingで活用している例はほとんど見ないのですが^^;
108
-
109
- [PropertyChangeListener (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/beans/PropertyChangeListener.html)
110
- [PropertyChangeSupport (Java Platform SE 8 )](https://sun.ac.jp/prof/yamagu/java8docs/api/java/beans/PropertyChangeSupport.html)
111
-
112
- ```Java
113
- import java.awt.BorderLayout;
114
- import java.awt.CardLayout;
115
- import java.awt.event.ActionEvent;
116
- import java.awt.event.ActionListener;
117
- import java.beans.PropertyChangeEvent;
118
- import java.beans.PropertyChangeListener;
119
- import javax.swing.JButton;
120
- import javax.swing.JFrame;
121
- import javax.swing.JPanel;
122
- import javax.swing.event.SwingPropertyChangeSupport;
123
-
124
-
125
- public class Sc extends JFrame implements ActionListener, PropertyChangeListener {
126
- public static void main(String[] args) {
127
- new Sc().setVisible(true);
128
- }
129
-
130
- private final JPanel cardPanel;
131
- private final CardLayout CardLayout;
132
- private final JButton toResult;
133
- private final QuestionModel model;
134
-
135
-
136
- public Sc() {
137
- setSize(400, 300);
138
- setLocationRelativeTo(null);
139
- setDefaultCloseOperation(EXIT_ON_CLOSE);
140
-
141
- model = new QuestionModel();
142
- model.addPropertyChangeListener(this);
143
-
144
- cardPanel = new JPanel();
145
- CardLayout = new CardLayout();
146
- cardPanel.setLayout(CardLayout);
147
-
148
- cardPanel.add(new QuestionPanel(model), "question");
149
-
150
- JPanel result = new JPanel();
151
- result.add(new JButton("result"));
152
- cardPanel.add(result, "result");
153
-
154
- JPanel btnPanel = new JPanel();
155
- toResult = new JButton("結果に進む");
156
- toResult.addActionListener(this);
157
- toResult.setActionCommand("result");
158
- toResult.setEnabled(false);
159
- btnPanel.add(toResult);
160
-
161
- add(cardPanel, BorderLayout.CENTER);
162
- add(btnPanel, BorderLayout.PAGE_END);
163
- }
164
-
165
- @Override public void actionPerformed(ActionEvent e) {
166
- CardLayout.show(cardPanel, e.getActionCommand());
167
- }
168
-
169
- @Override public void propertyChange(PropertyChangeEvent evt) {
170
- if (11 <= model.getI()) {
171
- toResult.setEnabled(true);
172
- }
173
- }
174
- }
175
-
176
- class QuestionPanel extends JPanel implements ActionListener {
177
- private final QuestionModel model;
178
-
179
- QuestionPanel(QuestionModel model) {
180
- this.model = model;
181
-
182
- JButton yes = new JButton("〇");
183
- yes.addActionListener(this);
184
- yes.setActionCommand("yes");
185
- add(yes);
186
-
187
- JButton no = new JButton("×");
188
- no.addActionListener(this);
189
- no.setActionCommand("no");
190
- add(no);
191
- }
192
-
193
- @Override public void actionPerformed(ActionEvent e) {
194
- model.incrementI();
195
- }
196
- }
197
-
198
- class QuestionModel {
199
- private final SwingPropertyChangeSupport pcs = new SwingPropertyChangeSupport(this);
200
-
201
- public void addPropertyChangeListener(PropertyChangeListener listener) {
202
- pcs.addPropertyChangeListener(listener);
203
- }
204
-
205
- // public void removePropertyChangeListener(PropertyChangeListener listener) {
206
- // pcs.removePropertyChangeListener(listener);
207
- // }
208
-
209
- private int i;
210
-
211
- public int getI() { return i; }
212
-
213
- // public void setI(int newValue) {
214
- // int oldValue = i;
215
- // i = newValue;
216
- // pcs.firePropertyChange("i", oldValue, newValue);
217
- // }
218
-
219
- public void incrementI() {
220
- pcs.firePropertyChange("i", i++, i);
221
- }
222
- }
223
- ```
224
-
225
- あまり変わり映えしませんが、変更を知れるクラスをいくつでも登録できます。
226
-
227
- ---
228
-
229
- 追記
230
- > 内部クラスで変数を扱うことにしております。
231
-
232
- `Code`は内部クラスになっていませんが、書き間違いだとして^^;
233
-
234
- 内部クラスでいいなら話は簡単です。
235
- 外(Sc)の変数がそのまま使えるので、`i++`したついでにチェックするだけです。
236
-
237
- ```Java
238
- import java.awt.BorderLayout;
239
- import java.awt.CardLayout;
240
- import java.awt.event.ActionEvent;
241
- import java.awt.event.ActionListener;
242
- import javax.swing.JButton;
243
- import javax.swing.JFrame;
244
- import javax.swing.JPanel;
245
-
246
- public class Sc extends JFrame implements ActionListener {
247
- public static void main(String[] args) {
248
- new Sc().setVisible(true);
249
- }
250
-
251
- private final JPanel cardPanel;
252
- private final CardLayout cardLayout;
253
- private final JButton btn_2to3;
254
-
255
- private int i = 0;
256
-
257
- public Sc() {
258
- setSize(400, 300);
259
- setLocationRelativeTo(null);
260
- setDefaultCloseOperation(EXIT_ON_CLOSE);
261
-
262
- JPanel p2 = new JPanel();
263
- JButton btn02 = new JButton("C");
264
- btn02.addActionListener(new Code());
265
- p2.add(btn02);
266
-
267
- JPanel p3 = new JPanel();
268
- JButton btn03 = new JButton("panel03");
269
- p3.add(btn03);
270
-
271
- cardPanel = new JPanel();
272
- cardLayout = new CardLayout();
273
- cardPanel.setLayout(cardLayout);
274
-
275
- cardPanel.add(p2, "panel02");
276
- cardPanel.add(p3, "panel03");
277
-
278
- btn_2to3 = new JButton("結果に進む");
279
- btn_2to3.addActionListener(this);
280
- btn_2to3.setActionCommand("panel03");
281
-
282
- JPanel btnPanel = new JPanel();
283
- btnPanel.add(btn_2to3);
284
- btn_2to3.setEnabled(false);
285
-
286
- add(cardPanel, BorderLayout.CENTER);
287
- add(btnPanel, BorderLayout.PAGE_END);
288
- }
289
-
290
- public void actionPerformed(ActionEvent e) {
291
- String cmd = e.getActionCommand();
292
- cardLayout.show(cardPanel, cmd);
293
- }
294
-
295
-
296
- class Code implements ActionListener {
297
- public void actionPerformed(ActionEvent e) {
298
- i++;
299
- if (i == 11) {
300
- btn_2to3.setEnabled(true);
301
- }
302
- }
303
- }
304
- }
1
+ 前回の質問の続きですよね?
2
+ [Java - 親クラスの変数を子クラスで変更し、親クラスに返す|teratail](https://teratail.com/questions/356244)
3
+
4
+ 前回の質問をどう解決されたかわからないので複数クラスに分けましたが、内部クラス等でいいならもっと簡単な話になります。
5
+
6
+
7
+ > カウンタ変数iが一定数カウントされたら、自動的にsetEnabledをtrueに変更し、ボタンが有効になるようにしたい
8
+
9
+ これはかなり本質を突いた問いでして、そういうことができれば便利なのですがただの`int`変数にはそういう機能はありません。
10
+ `Sc`の外で`i`を変えても`Sc`は知りようがないし、逆に`Sc`が`i`を変えてもほかのクラスからはわかりません。
11
+
12
+ もちろん`i`が変わった後に`i`を見れば増えてはいます(いつ増えたのかはわからない)
13
+
14
+ 簡単な解決策は直接`i`を変えずに、`i`を変えるメソッドを用意することです。
15
+ そうすれば`Sc`はいつ`i`が変わるのかを把握できます
16
+ こういうメソッドをセッター(setter)といいます。
17
+
18
+ ```Java
19
+ import java.awt.BorderLayout;
20
+ import java.awt.CardLayout;
21
+ import java.awt.event.ActionEvent;
22
+ import java.awt.event.ActionListener;
23
+ import javax.swing.JButton;
24
+ import javax.swing.JFrame;
25
+ import javax.swing.JPanel;
26
+
27
+
28
+ public class Sc extends JFrame implements ActionListener {
29
+ public static void main(String[] args) {
30
+ new Sc().setVisible(true);
31
+ }
32
+
33
+ private final JPanel cardPanel;
34
+ private final CardLayout CardLayout;
35
+ private final JButton toResult;
36
+
37
+ private int i = 0;
38
+
39
+ public Sc() {
40
+ setSize(400, 300);
41
+ setLocationRelativeTo(null);
42
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
43
+
44
+ cardPanel = new JPanel();
45
+ CardLayout = new CardLayout();
46
+ cardPanel.setLayout(CardLayout);
47
+
48
+ cardPanel.add(new QuestionPanel(this), "question");
49
+
50
+ JPanel result = new JPanel();
51
+ result.add(new JButton("result"));
52
+ cardPanel.add(result, "result");
53
+
54
+ JPanel btnPanel = new JPanel();
55
+ toResult = new JButton("結果に進む");
56
+ toResult.addActionListener(this);
57
+ toResult.setActionCommand("result");
58
+ toResult.setEnabled(false);
59
+ btnPanel.add(toResult);
60
+
61
+ add(cardPanel, BorderLayout.CENTER);
62
+ add(btnPanel, BorderLayout.PAGE_END);
63
+ }
64
+
65
+ // public int getI() {return i;} // ッター(getter
66
+ // public void setI(int i) {this.i = i;} // セッター(setter)
67
+ // ゲッターセッターでもいいのだが、「1ずつ増やす」しかしないのでより明確に
68
+ public void incrementI() {
69
+ i++;
70
+ if (11 <= i) {
71
+ toResult.setEnabled(true);
72
+ }
73
+ }
74
+
75
+ @Override public void actionPerformed(ActionEvent e) {
76
+ CardLayout.show(cardPanel, e.getActionCommand());
77
+ }
78
+ }
79
+
80
+ class QuestionPanel extends JPanel implements ActionListener {
81
+ private final Sc sc;
82
+
83
+ QuestionPanel(Sc sc) {
84
+ this.sc = sc;
85
+
86
+ JButton yes = new JButton("〇");
87
+ yes.addActionListener(this);
88
+ yes.setActionCommand("yes");
89
+ add(yes);
90
+
91
+ JButton no = new JButton("×");
92
+ no.addActionListener(this);
93
+ no.setActionCommand("no");
94
+ add(no);
95
+ }
96
+
97
+ @Override public void actionPerformed(ActionEvent e) {
98
+ sc.incrementI();
99
+ }
100
+ }
101
+ ```
102
+
103
+ ---
104
+
105
+ > ただの`int`変数にはそういう機能はありません。
106
+
107
+ と言いましたが、実はそういうことができる仕組みは用意されています(Swingで活用している例はほとんど見ないのですが^^;
108
+ [PropertyChangeListener (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/beans/PropertyChangeListener.html)
109
+ [PropertyChangeSupport (Java Platform SE 8 )](https://sun.ac.jp/prof/yamagu/java8docs/api/java/beans/PropertyChangeSupport.html)
110
+
111
+ ```Java
112
+ import java.awt.BorderLayout;
113
+ import java.awt.CardLayout;
114
+ import java.awt.event.ActionEvent;
115
+ import java.awt.event.ActionListener;
116
+ import java.beans.PropertyChangeEvent;
117
+ import java.beans.PropertyChangeListener;
118
+ import javax.swing.JButton;
119
+ import javax.swing.JFrame;
120
+ import javax.swing.JPanel;
121
+ import javax.swing.event.SwingPropertyChangeSupport;
122
+
123
+
124
+ public class Sc extends JFrame implements ActionListener, PropertyChangeListener {
125
+ public static void main(String[] args) {
126
+ new Sc().setVisible(true);
127
+ }
128
+
129
+ private final JPanel cardPanel;
130
+ private final CardLayout CardLayout;
131
+ private final JButton toResult;
132
+ private final QuestionModel model;
133
+
134
+
135
+ public Sc() {
136
+ setSize(400, 300);
137
+ setLocationRelativeTo(null);
138
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
139
+
140
+ model = new QuestionModel();
141
+ model.addPropertyChangeListener(this);
142
+
143
+ cardPanel = new JPanel();
144
+ CardLayout = new CardLayout();
145
+ cardPanel.setLayout(CardLayout);
146
+
147
+ cardPanel.add(new QuestionPanel(model), "question");
148
+
149
+ JPanel result = new JPanel();
150
+ result.add(new JButton("result"));
151
+ cardPanel.add(result, "result");
152
+
153
+ JPanel btnPanel = new JPanel();
154
+ toResult = new JButton("結果に進む");
155
+ toResult.addActionListener(this);
156
+ toResult.setActionCommand("result");
157
+ toResult.setEnabled(false);
158
+ btnPanel.add(toResult);
159
+
160
+ add(cardPanel, BorderLayout.CENTER);
161
+ add(btnPanel, BorderLayout.PAGE_END);
162
+ }
163
+
164
+ @Override public void actionPerformed(ActionEvent e) {
165
+ CardLayout.show(cardPanel, e.getActionCommand());
166
+ }
167
+
168
+ @Override public void propertyChange(PropertyChangeEvent evt) {
169
+ if (11 <= model.getI()) {
170
+ toResult.setEnabled(true);
171
+ }
172
+ }
173
+ }
174
+
175
+ class QuestionPanel extends JPanel implements ActionListener {
176
+ private final QuestionModel model;
177
+
178
+ QuestionPanel(QuestionModel model) {
179
+ this.model = model;
180
+
181
+ JButton yes = new JButton("〇");
182
+ yes.addActionListener(this);
183
+ yes.setActionCommand("yes");
184
+ add(yes);
185
+
186
+ JButton no = new JButton("×");
187
+ no.addActionListener(this);
188
+ no.setActionCommand("no");
189
+ add(no);
190
+ }
191
+
192
+ @Override public void actionPerformed(ActionEvent e) {
193
+ model.incrementI();
194
+ }
195
+ }
196
+
197
+ class QuestionModel {
198
+ private final SwingPropertyChangeSupport pcs = new SwingPropertyChangeSupport(this);
199
+
200
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
201
+ pcs.addPropertyChangeListener(listener);
202
+ }
203
+
204
+ // public void removePropertyChangeListener(PropertyChangeListener listener) {
205
+ // pcs.removePropertyChangeListener(listener);
206
+ // }
207
+
208
+ private int i;
209
+
210
+ public int getI() { return i; }
211
+
212
+ // public void setI(int newValue) {
213
+ // int oldValue = i;
214
+ // i = newValue;
215
+ // pcs.firePropertyChange("i", oldValue, newValue);
216
+ // }
217
+
218
+ public void incrementI() {
219
+ pcs.firePropertyChange("i", i++, i);
220
+ }
221
+ }
222
+ ```
223
+
224
+ あまり変わり映えしませんが、変更を知れるクラスをいくつでも登録できます。
225
+
226
+ ---
227
+
228
+ 追記
229
+ > 内部クラスで変数を扱うことにしております。
230
+
231
+ `Code`は内部クラスになっていませんが、書き間違いだとして^^;
232
+
233
+ 内部クラスでいいなら話は簡単です。
234
+ 外(`Sc`)の変数がそのまま使えるの、`i++`したついでにチェックるだけです
235
+
236
+ ```Java
237
+ import java.awt.BorderLayout;
238
+ import java.awt.CardLayout;
239
+ import java.awt.event.ActionEvent;
240
+ import java.awt.event.ActionListener;
241
+ import javax.swing.JButton;
242
+ import javax.swing.JFrame;
243
+ import javax.swing.JPanel;
244
+
245
+ public class Sc extends JFrame implements ActionListener {
246
+ public static void main(String[] args) {
247
+ new Sc().setVisible(true);
248
+ }
249
+
250
+ private final JPanel cardPanel;
251
+ private final CardLayout cardLayout;
252
+ private final JButton btn_2to3;
253
+
254
+ private int i = 0;
255
+
256
+ public Sc() {
257
+ setSize(400, 300);
258
+ setLocationRelativeTo(null);
259
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
260
+
261
+ JPanel p2 = new JPanel();
262
+ JButton btn02 = new JButton("C");
263
+ btn02.addActionListener(new Code());
264
+ p2.add(btn02);
265
+
266
+ JPanel p3 = new JPanel();
267
+ JButton btn03 = new JButton("panel03");
268
+ p3.add(btn03);
269
+
270
+ cardPanel = new JPanel();
271
+ cardLayout = new CardLayout();
272
+ cardPanel.setLayout(cardLayout);
273
+
274
+ cardPanel.add(p2, "panel02");
275
+ cardPanel.add(p3, "panel03");
276
+
277
+ btn_2to3 = new JButton("結果に進む");
278
+ btn_2to3.addActionListener(this);
279
+ btn_2to3.setActionCommand("panel03");
280
+
281
+ JPanel btnPanel = new JPanel();
282
+ btnPanel.add(btn_2to3);
283
+ btn_2to3.setEnabled(false);
284
+
285
+ add(cardPanel, BorderLayout.CENTER);
286
+ add(btnPanel, BorderLayout.PAGE_END);
287
+ }
288
+
289
+ public void actionPerformed(ActionEvent e) {
290
+ String cmd = e.getActionCommand();
291
+ cardLayout.show(cardPanel, cmd);
292
+ }
293
+
294
+
295
+ class Code implements ActionListener {
296
+ public void actionPerformed(ActionEvent e) {
297
+ i++;
298
+ if (i == 11) {
299
+ btn_2to3.setEnabled(true);
300
+ }
301
+ }
302
+ }
303
+ }
305
304
  ```

1

内部クラス

2021/09/10 15:03

投稿

TN8001
TN8001

スコア10114

answer CHANGED
@@ -222,4 +222,84 @@
222
222
  }
223
223
  ```
224
224
 
225
- あまり変わり映えしませんが、変更を知れるクラスをいくつでも登録できます。
225
+ あまり変わり映えしませんが、変更を知れるクラスをいくつでも登録できます。
226
+
227
+ ---
228
+
229
+ 追記
230
+ > 内部クラスで変数を扱うことにしております。
231
+
232
+ `Code`は内部クラスになっていませんが、書き間違いだとして^^;
233
+
234
+ 内部クラスでいいなら話は簡単です。
235
+ 外(Sc)の変数がそのまま使えるので、`i++`したついでにチェックするだけです。
236
+
237
+ ```Java
238
+ import java.awt.BorderLayout;
239
+ import java.awt.CardLayout;
240
+ import java.awt.event.ActionEvent;
241
+ import java.awt.event.ActionListener;
242
+ import javax.swing.JButton;
243
+ import javax.swing.JFrame;
244
+ import javax.swing.JPanel;
245
+
246
+ public class Sc extends JFrame implements ActionListener {
247
+ public static void main(String[] args) {
248
+ new Sc().setVisible(true);
249
+ }
250
+
251
+ private final JPanel cardPanel;
252
+ private final CardLayout cardLayout;
253
+ private final JButton btn_2to3;
254
+
255
+ private int i = 0;
256
+
257
+ public Sc() {
258
+ setSize(400, 300);
259
+ setLocationRelativeTo(null);
260
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
261
+
262
+ JPanel p2 = new JPanel();
263
+ JButton btn02 = new JButton("C");
264
+ btn02.addActionListener(new Code());
265
+ p2.add(btn02);
266
+
267
+ JPanel p3 = new JPanel();
268
+ JButton btn03 = new JButton("panel03");
269
+ p3.add(btn03);
270
+
271
+ cardPanel = new JPanel();
272
+ cardLayout = new CardLayout();
273
+ cardPanel.setLayout(cardLayout);
274
+
275
+ cardPanel.add(p2, "panel02");
276
+ cardPanel.add(p3, "panel03");
277
+
278
+ btn_2to3 = new JButton("結果に進む");
279
+ btn_2to3.addActionListener(this);
280
+ btn_2to3.setActionCommand("panel03");
281
+
282
+ JPanel btnPanel = new JPanel();
283
+ btnPanel.add(btn_2to3);
284
+ btn_2to3.setEnabled(false);
285
+
286
+ add(cardPanel, BorderLayout.CENTER);
287
+ add(btnPanel, BorderLayout.PAGE_END);
288
+ }
289
+
290
+ public void actionPerformed(ActionEvent e) {
291
+ String cmd = e.getActionCommand();
292
+ cardLayout.show(cardPanel, cmd);
293
+ }
294
+
295
+
296
+ class Code implements ActionListener {
297
+ public void actionPerformed(ActionEvent e) {
298
+ i++;
299
+ if (i == 11) {
300
+ btn_2to3.setEnabled(true);
301
+ }
302
+ }
303
+ }
304
+ }
305
+ ```