回答編集履歴

1

見直しキャンペーン中

2023/08/09 09:48

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,441 +1,221 @@
1
1
  画面遷移の方法はいろいろあると思いますが、おススメは`CardLayout`による遷移です。
2
-
3
- 紙芝居のように次のページや前のページ、指定ページに瞬時に遷移します(残念ながらスライド等のアニメーションはありません)
2
+ 紙芝居のように次のページや前のページ、指定ページに瞬時に遷移します(残念ながらスライド等のアニメーションはありません)
4
-
5
-
6
3
 
7
4
  各画面分の`Panel`を作成し、`Frame`に追加します。
8
-
9
5
  最初に追加したものが表示されて、ほかのパネルは非表示になります。
10
-
11
- `previous` `next` `show`で表示を切り替えます。
6
+ `previous``next``show`で表示を切り替えます。
12
-
13
-
14
7
 
15
8
  この方法のメリットは非表示になっているだけなので、各画面間のやり取りがスムーズです。
16
-
17
9
  逆にデメリットはBGMを流したりした時に、明示的に止めないと遷移後も流れ続けます。
18
10
 
19
-
20
-
21
11
  ---
22
12
 
23
-
24
-
25
13
  > 上記のような場合のコンパイルの仕方
26
14
 
27
-
28
-
29
15
  同じフォルダにファイルがあれば`javac MyWindow.java`で自動で読んでくれるようです。
30
-
31
16
  指定したければ`javac file1.java file2.java`のように並べていくか、`javac *.java`のようにワイルドカードでもいいようです。
32
17
 
33
-
34
-
35
18
  PCスペック等の事情がおありなのかもしれませんが、初心者ほどIDEの使用を**強く推奨**します。
36
19
 
37
-
38
-
39
20
  ---
40
21
 
41
-
42
-
43
22
  特に理由がないのであればAWTの拡張版であるSwingのほうが、 機能・情報量・検索性(Jから始まるクラス名が多くgoogle等で見分けやすい)の面からよりよいと思います。 (今の段階ですといくつかのクラスにJを付けるかだけって程度です)
44
23
 
45
-
46
-
47
24
  ---
48
25
 
49
-
50
-
51
26
  ご提示のコードを少しアレンジして、簡単なサンプルを作ってみました。
52
-
53
- CardLayoutを入れ子に使って、メイン画面の中でも遷移させています。(黄色や赤の色がついている部分)
27
+ `CardLayout`を入れ子に使って、メイン画面の中でも遷移させています。(黄色や赤の色がついている部分)
54
-
55
-
56
28
 
57
29
  参考になれば幸いです。
58
30
 
59
-
60
-
61
- ```Java
31
+ ```Java
62
-
63
32
  // アプリ本体&エントリーポイント
64
33
 
65
-
66
-
67
- import java.awt.CardLayout;
34
+ import java.awt.CardLayout;
68
-
69
- import java.awt.Frame;
35
+ import java.awt.Frame;
70
-
71
36
  import java.awt.event.WindowAdapter;
72
-
73
37
  import java.awt.event.WindowEvent;
74
38
 
75
-
76
-
77
39
  class MyWindow extends Frame {
78
-
79
40
  public static void main(String[] args) {
80
-
81
41
  MyWindow mw = new MyWindow();
82
-
83
42
  mw.setVisible(true);
84
-
85
- }
43
+ }
86
-
87
-
88
44
 
89
45
  MyWindow() {
90
-
91
46
  setTitle("育成ゲーム");
92
-
93
47
  setSize(700, 500);
94
-
95
48
  setLocationRelativeTo(null); // 画面中央に表示
96
49
 
97
-
98
-
99
50
  CardLayout cardLayout = new CardLayout(); // addしたものが1ページずつ紙芝居のように表示されるレイアウト
100
-
101
51
  setLayout(cardLayout);
102
-
103
52
  add(new TitlePanel(), "TitlePanel"); //追加した順に1ページ目、2ページ目。。。
104
-
105
53
  add(new MainPanel(), "MainPanel");
106
-
107
54
  add(new SettingPanel(), "SettingPanel");
108
55
 
109
-
110
-
111
56
  addWindowListener(new WinListener());
112
-
113
- }
57
+ }
114
-
115
-
116
58
 
117
59
  class WinListener extends WindowAdapter {
118
-
119
60
  public void windowClosing(WindowEvent e) { System.exit(0); }
120
-
121
- }
61
+ }
122
-
123
- }
62
+ }
124
-
125
- ```
63
+ ```
126
-
127
-
128
-
64
+
129
- ```Java
65
+ ```Java
130
-
131
66
  // タイトル画面 画面A
132
67
 
133
-
134
-
135
68
  import java.awt.Button;
136
-
137
- import java.awt.CardLayout;
69
+ import java.awt.CardLayout;
138
-
139
- import java.awt.Frame;
70
+ import java.awt.Frame;
140
-
141
71
  import java.awt.Graphics;
142
-
143
72
  import java.awt.Image;
144
-
145
73
  import java.awt.Panel;
146
-
147
74
  import java.awt.event.ActionEvent;
148
-
149
75
  import java.awt.event.ActionListener;
150
-
151
76
  import java.io.File;
152
-
153
77
  import java.io.IOException;
154
-
155
78
  import javax.imageio.ImageIO;
156
79
 
157
-
158
-
159
80
  class TitlePanel extends Panel implements ActionListener {
160
-
161
81
  private Image img;
162
82
 
163
-
164
-
165
83
  TitlePanel() {
166
-
167
84
  try {
168
-
169
85
  // getImageは起動直後画像が出ないことがあるので、読み込みを待ってくれるこちらに変更
170
-
171
86
  img = ImageIO.read(new File("title.png"));
172
-
173
87
  } catch (IOException e) { e.printStackTrace(); }
174
88
 
175
-
176
-
177
89
  setLayout(null);
178
-
179
90
  Button startButton = new Button("はじめる");
180
-
181
91
  startButton.setBounds(250, 100, 200, 50);
182
-
183
92
  // addActionListenerを3パターンで登録したが大体同じ意味
184
-
185
93
  // ほかのクラスでは行数を節約できるラムダ方式を採用
186
-
187
94
  startButton.addActionListener(this); // このクラス(TitlePanel)のactionPerformedでアクションを指定
188
-
189
95
  add(startButton);
190
96
 
191
-
192
-
193
97
  Button settingButton = new Button("せってい");
194
-
195
98
  settingButton.setBounds(250, 200, 200, 50);
196
-
197
99
  settingButton.addActionListener( // 匿名クラスでアクションを指定
198
-
199
100
  new ActionListener() {
200
-
201
101
  @Override
202
-
203
102
  public void actionPerformed(ActionEvent e) {
204
-
205
103
  Frame frame = (Frame) getParent();
206
-
207
104
  CardLayout cardLayout = (CardLayout) frame.getLayout();
208
-
209
105
  cardLayout.show(frame, "SettingPanel"); // ページ名を指定して切り替え
210
-
211
106
  }
212
-
213
107
  }
214
-
215
108
  );
216
-
217
109
  add(settingButton);
218
110
 
219
-
220
-
221
111
  Button exitButton = new Button("やめる");
222
-
223
112
  exitButton.setBounds(250, 300, 200, 50);
224
-
225
113
  exitButton.addActionListener(e -> System.exit(0)); // ラムダでアクションを指定
226
-
227
114
  add(exitButton);
228
-
229
- }
115
+ }
230
-
231
-
232
116
 
233
117
  @Override
234
-
235
118
  public void paint(Graphics g) {
236
-
237
119
  g.drawImage(img, 0, 0, null);
238
-
239
- }
120
+ }
240
-
241
-
242
121
 
243
122
  @Override
244
-
245
123
  public void actionPerformed(ActionEvent e) { // startButtonで呼ばれるメソッド
246
-
247
124
  Frame frame = (Frame) getParent();
248
-
249
125
  CardLayout cardLayout = (CardLayout) frame.getLayout();
250
-
251
126
  cardLayout.next(frame); // 次のページに切り替え
252
-
253
- }
127
+ }
254
-
255
- }
128
+ }
256
-
257
- ```
129
+ ```
258
-
259
-
260
-
130
+
261
- ```Java
131
+ ```Java
262
-
263
132
  // メインのゲーム画面 画面B
264
133
 
265
-
266
-
267
134
  import java.awt.Button;
268
-
269
- import java.awt.CardLayout;
135
+ import java.awt.CardLayout;
270
-
271
136
  import java.awt.Color;
272
-
273
- import java.awt.Frame;
137
+ import java.awt.Frame;
274
-
275
138
  import java.awt.Panel;
276
139
 
277
-
278
-
279
140
  class MainPanel extends Panel {
280
-
281
141
  MainPanel() {
282
-
283
142
  setLayout(null);
284
143
 
285
-
286
-
287
144
  // MainPanelの中でさらにCardLayoutで表示の切り替え
288
-
289
145
  Panel innerPanel = new Panel();
290
-
291
146
  innerPanel.setBounds(50, 50, 600, 330);
292
-
293
147
  CardLayout innerCardLayout = new CardLayout();
294
-
295
148
  innerPanel.setLayout(innerCardLayout);
296
-
297
149
  // 本来はそれぞれのPanelクラスになりますが、サンプルのためただの色違いパネル
298
-
299
150
  innerPanel.add(new Panel() {{ setBackground(Color.orange); }}, "p1");
300
-
301
151
  innerPanel.add(new Panel() {{ setBackground(Color.red); }}, "p2");
302
-
303
152
  innerPanel.add(new Panel() {{ setBackground(Color.green); }}, "p3");
304
-
305
153
  innerPanel.add(new Panel() {{ setBackground(Color.blue); }}, "p4");
306
-
307
154
  innerPanel.add(new Panel() {{ setBackground(Color.pink); }}, "p5");
308
-
309
155
  add(innerPanel);
310
156
 
311
-
312
-
313
157
  Button btn1 = new Button("ステータス");
314
-
315
158
  btn1.setBounds(50, 400, 100, 50);
316
-
317
159
  btn1.addActionListener(e -> innerCardLayout.show(innerPanel, "p1"));
318
-
319
160
  add(btn1);
320
161
 
321
-
322
-
323
162
  Button btn2 = new Button("食事");
324
-
325
163
  btn2.setBounds(160, 400, 100, 50);
326
-
327
164
  btn2.addActionListener(e -> innerCardLayout.show(innerPanel, "p2"));
328
-
329
165
  add(btn2);
330
166
 
331
-
332
-
333
167
  Button btn3 = new Button("運動");
334
-
335
168
  btn3.setBounds(270, 400, 100, 50);
336
-
337
169
  btn3.addActionListener(e -> innerCardLayout.show(innerPanel, "p3"));
338
-
339
170
  add(btn3);
340
171
 
341
-
342
-
343
172
  Button btn4 = new Button("勉強");
344
-
345
173
  btn4.setBounds(380, 400, 100, 50);
346
-
347
174
  btn4.addActionListener(e -> innerCardLayout.show(innerPanel, "p4"));
348
-
349
175
  add(btn4);
350
176
 
351
-
352
-
353
177
  Button btn5 = new Button("お話");
354
-
355
178
  btn5.setBounds(490, 400, 100, 50);
356
-
357
179
  btn5.addActionListener(e -> innerCardLayout.show(innerPanel, "p5"));
358
-
359
180
  add(btn5);
360
181
 
361
182
 
362
-
363
-
364
-
365
183
  Button backButton = new Button("タイトルに戻る");
366
-
367
184
  backButton.setBounds(550, 10, 100, 25);
368
-
369
185
  backButton.addActionListener(e -> {
370
-
371
186
  Frame frame = (Frame) getParent();
372
-
373
187
  CardLayout cardLayout = (CardLayout) frame.getLayout();
374
-
375
188
  cardLayout.first(frame); // 先頭のページに切り替え
376
-
377
189
  });
378
-
379
190
  add(backButton);
380
-
381
- }
191
+ }
382
-
383
- }
192
+ }
384
-
385
- ```
193
+ ```
386
-
387
-
388
-
194
+
389
- ```Java
195
+ ```Java
390
-
391
196
  // 設定画面 画面C
392
197
 
393
-
394
-
395
198
  import java.awt.Button;
396
-
397
- import java.awt.CardLayout;
199
+ import java.awt.CardLayout;
398
-
399
- import java.awt.Frame;
200
+ import java.awt.Frame;
400
-
401
201
  import java.awt.Panel;
402
202
 
403
-
404
-
405
203
  class SettingPanel extends Panel {
406
-
407
204
  SettingPanel() {
408
-
409
205
  setLayout(null);
410
206
 
411
-
412
-
413
207
  Button backButton = new Button("タイトルに戻る");
414
-
415
208
  backButton.setBounds(250, 300, 200, 50);
416
-
417
209
  backButton.addActionListener(e -> {
418
-
419
210
  Frame frame = (Frame) getParent();
420
-
421
211
  CardLayout cardLayout = (CardLayout) frame.getLayout();
422
-
423
212
  cardLayout.first(frame); // 先頭のページに切り替え
424
-
425
213
  });
426
-
427
214
  add(backButton);
428
-
429
- }
215
+ }
430
-
431
- }
216
+ }
432
-
433
- ```
217
+ ```
434
-
435
-
436
218
 
437
219
  ![タイトル](acdb4d02db50b889ef77b7f50d20312b.png)
438
-
439
220
  ![ステータス](a81f82e56777199ebc9a73f955c7db94.png)
440
-
441
221
  ![食事](01877e96bff0ba5f98688deb4ae97939.png)