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

回答編集履歴

1

見直しキャンペーン中

2023/08/09 09:48

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -1,221 +1,221 @@
1
- 画面遷移の方法はいろいろあると思いますが、おススメは`CardLayout`による遷移です。
2
- 紙芝居のように次のページや前のページ、指定ページに瞬時に遷移します(残念ながらスライド等のアニメーションはありません)
3
-
4
- 各画面分の`Panel`を作成し、`Frame`に追加します。
5
- 最初に追加したものが表示されて、ほかのパネルは非表示になります。
6
- `previous` `next` `show`で表示を切り替えます。
7
-
8
- この方法のメリットは非表示になっているだけなので、各画面間のやり取りがスムーズです。
9
- 逆にデメリットはBGMを流したりした時に、明示的に止めないと遷移後も流れ続けます。
10
-
11
- ---
12
-
13
- > 上記のような場合のコンパイルの仕方
14
-
15
- 同じフォルダにファイルがあれば`javac MyWindow.java`で自動で読んでくれるようです。
16
- 指定したければ`javac file1.java file2.java`のように並べていくか、`javac *.java`のようにワイルドカードでもいいようです。
17
-
18
- PCスペック等の事情がおありなのかもしれませんが、初心者ほどIDEの使用を**強く推奨**します。
19
-
20
- ---
21
-
22
- 特に理由がないのであればAWTの拡張版であるSwingのほうが、 機能・情報量・検索性(Jから始まるクラス名が多くgoogle等で見分けやすい)の面からよりよいと思います。 (今の段階ですといくつかのクラスにJを付けるかだけって程度です)
23
-
24
- ---
25
-
26
- ご提示のコードを少しアレンジして、簡単なサンプルを作ってみました。
27
- CardLayoutを入れ子に使って、メイン画面の中でも遷移させています。(黄色や赤の色がついている部分)
28
-
29
- 参考になれば幸いです。
30
-
31
- ```Java
32
- // アプリ本体&エントリーポイント
33
-
34
- import java.awt.CardLayout;
35
- import java.awt.Frame;
36
- import java.awt.event.WindowAdapter;
37
- import java.awt.event.WindowEvent;
38
-
39
- class MyWindow extends Frame {
40
- public static void main(String[] args) {
41
- MyWindow mw = new MyWindow();
42
- mw.setVisible(true);
43
- }
44
-
45
- MyWindow() {
46
- setTitle("育成ゲーム");
47
- setSize(700, 500);
48
- setLocationRelativeTo(null); // 画面中央に表示
49
-
50
- CardLayout cardLayout = new CardLayout(); // addしたものが1ページずつ紙芝居のように表示されるレイアウト
51
- setLayout(cardLayout);
52
- add(new TitlePanel(), "TitlePanel"); //追加した順に1ページ目、2ページ目。。。
53
- add(new MainPanel(), "MainPanel");
54
- add(new SettingPanel(), "SettingPanel");
55
-
56
- addWindowListener(new WinListener());
57
- }
58
-
59
- class WinListener extends WindowAdapter {
60
- public void windowClosing(WindowEvent e) { System.exit(0); }
61
- }
62
- }
63
- ```
64
-
65
- ```Java
66
- // タイトル画面 画面A
67
-
68
- import java.awt.Button;
69
- import java.awt.CardLayout;
70
- import java.awt.Frame;
71
- import java.awt.Graphics;
72
- import java.awt.Image;
73
- import java.awt.Panel;
74
- import java.awt.event.ActionEvent;
75
- import java.awt.event.ActionListener;
76
- import java.io.File;
77
- import java.io.IOException;
78
- import javax.imageio.ImageIO;
79
-
80
- class TitlePanel extends Panel implements ActionListener {
81
- private Image img;
82
-
83
- TitlePanel() {
84
- try {
85
- // getImageは起動直後画像が出ないことがあるので、読み込みを待ってくれるこちらに変更
86
- img = ImageIO.read(new File("title.png"));
87
- } catch (IOException e) { e.printStackTrace(); }
88
-
89
- setLayout(null);
90
- Button startButton = new Button("はじめる");
91
- startButton.setBounds(250, 100, 200, 50);
92
- // addActionListenerを3パターンで登録したが大体同じ意味
93
- // ほかのクラスでは行数を節約できるラムダ方式を採用
94
- startButton.addActionListener(this); // このクラス(TitlePanel)のactionPerformedでアクションを指定
95
- add(startButton);
96
-
97
- Button settingButton = new Button("せってい");
98
- settingButton.setBounds(250, 200, 200, 50);
99
- settingButton.addActionListener( // 匿名クラスでアクションを指定
100
- new ActionListener() {
101
- @Override
102
- public void actionPerformed(ActionEvent e) {
103
- Frame frame = (Frame) getParent();
104
- CardLayout cardLayout = (CardLayout) frame.getLayout();
105
- cardLayout.show(frame, "SettingPanel"); // ページ名を指定して切り替え
106
- }
107
- }
108
- );
109
- add(settingButton);
110
-
111
- Button exitButton = new Button("やめる");
112
- exitButton.setBounds(250, 300, 200, 50);
113
- exitButton.addActionListener(e -> System.exit(0)); // ラムダでアクションを指定
114
- add(exitButton);
115
- }
116
-
117
- @Override
118
- public void paint(Graphics g) {
119
- g.drawImage(img, 0, 0, null);
120
- }
121
-
122
- @Override
123
- public void actionPerformed(ActionEvent e) { // startButtonで呼ばれるメソッド
124
- Frame frame = (Frame) getParent();
125
- CardLayout cardLayout = (CardLayout) frame.getLayout();
126
- cardLayout.next(frame); // 次のページに切り替え
127
- }
128
- }
129
- ```
130
-
131
- ```Java
132
- // メインのゲーム画面 画面B
133
-
134
- import java.awt.Button;
135
- import java.awt.CardLayout;
136
- import java.awt.Color;
137
- import java.awt.Frame;
138
- import java.awt.Panel;
139
-
140
- class MainPanel extends Panel {
141
- MainPanel() {
142
- setLayout(null);
143
-
144
- // MainPanelの中でさらにCardLayoutで表示の切り替え
145
- Panel innerPanel = new Panel();
146
- innerPanel.setBounds(50, 50, 600, 330);
147
- CardLayout innerCardLayout = new CardLayout();
148
- innerPanel.setLayout(innerCardLayout);
149
- // 本来はそれぞれのPanelクラスになりますが、サンプルのためただの色違いパネル
150
- innerPanel.add(new Panel() {{ setBackground(Color.orange); }}, "p1");
151
- innerPanel.add(new Panel() {{ setBackground(Color.red); }}, "p2");
152
- innerPanel.add(new Panel() {{ setBackground(Color.green); }}, "p3");
153
- innerPanel.add(new Panel() {{ setBackground(Color.blue); }}, "p4");
154
- innerPanel.add(new Panel() {{ setBackground(Color.pink); }}, "p5");
155
- add(innerPanel);
156
-
157
- Button btn1 = new Button("ステータス");
158
- btn1.setBounds(50, 400, 100, 50);
159
- btn1.addActionListener(e -> innerCardLayout.show(innerPanel, "p1"));
160
- add(btn1);
161
-
162
- Button btn2 = new Button("食事");
163
- btn2.setBounds(160, 400, 100, 50);
164
- btn2.addActionListener(e -> innerCardLayout.show(innerPanel, "p2"));
165
- add(btn2);
166
-
167
- Button btn3 = new Button("運動");
168
- btn3.setBounds(270, 400, 100, 50);
169
- btn3.addActionListener(e -> innerCardLayout.show(innerPanel, "p3"));
170
- add(btn3);
171
-
172
- Button btn4 = new Button("勉強");
173
- btn4.setBounds(380, 400, 100, 50);
174
- btn4.addActionListener(e -> innerCardLayout.show(innerPanel, "p4"));
175
- add(btn4);
176
-
177
- Button btn5 = new Button("お話");
178
- btn5.setBounds(490, 400, 100, 50);
179
- btn5.addActionListener(e -> innerCardLayout.show(innerPanel, "p5"));
180
- add(btn5);
181
-
182
-
183
- Button backButton = new Button("タイトルに戻る");
184
- backButton.setBounds(550, 10, 100, 25);
185
- backButton.addActionListener(e -> {
186
- Frame frame = (Frame) getParent();
187
- CardLayout cardLayout = (CardLayout) frame.getLayout();
188
- cardLayout.first(frame); // 先頭のページに切り替え
189
- });
190
- add(backButton);
191
- }
192
- }
193
- ```
194
-
195
- ```Java
196
- // 設定画面 画面C
197
-
198
- import java.awt.Button;
199
- import java.awt.CardLayout;
200
- import java.awt.Frame;
201
- import java.awt.Panel;
202
-
203
- class SettingPanel extends Panel {
204
- SettingPanel() {
205
- setLayout(null);
206
-
207
- Button backButton = new Button("タイトルに戻る");
208
- backButton.setBounds(250, 300, 200, 50);
209
- backButton.addActionListener(e -> {
210
- Frame frame = (Frame) getParent();
211
- CardLayout cardLayout = (CardLayout) frame.getLayout();
212
- cardLayout.first(frame); // 先頭のページに切り替え
213
- });
214
- add(backButton);
215
- }
216
- }
217
- ```
218
-
219
- ![タイトル](acdb4d02db50b889ef77b7f50d20312b.png)
220
- ![ステータス](a81f82e56777199ebc9a73f955c7db94.png)
1
+ 画面遷移の方法はいろいろあると思いますが、おススメは`CardLayout`による遷移です。
2
+ 紙芝居のように次のページや前のページ、指定ページに瞬時に遷移します(残念ながらスライド等のアニメーションはありません)
3
+
4
+ 各画面分の`Panel`を作成し、`Frame`に追加します。
5
+ 最初に追加したものが表示されて、ほかのパネルは非表示になります。
6
+ `previous``next``show`で表示を切り替えます。
7
+
8
+ この方法のメリットは非表示になっているだけなので、各画面間のやり取りがスムーズです。
9
+ 逆にデメリットはBGMを流したりした時に、明示的に止めないと遷移後も流れ続けます。
10
+
11
+ ---
12
+
13
+ > 上記のような場合のコンパイルの仕方
14
+
15
+ 同じフォルダにファイルがあれば`javac MyWindow.java`で自動で読んでくれるようです。
16
+ 指定したければ`javac file1.java file2.java`のように並べていくか、`javac *.java`のようにワイルドカードでもいいようです。
17
+
18
+ PCスペック等の事情がおありなのかもしれませんが、初心者ほどIDEの使用を**強く推奨**します。
19
+
20
+ ---
21
+
22
+ 特に理由がないのであればAWTの拡張版であるSwingのほうが、 機能・情報量・検索性(Jから始まるクラス名が多くgoogle等で見分けやすい)の面からよりよいと思います。 (今の段階ですといくつかのクラスにJを付けるかだけって程度です)
23
+
24
+ ---
25
+
26
+ ご提示のコードを少しアレンジして、簡単なサンプルを作ってみました。
27
+ `CardLayout`を入れ子に使って、メイン画面の中でも遷移させています。(黄色や赤の色がついている部分)
28
+
29
+ 参考になれば幸いです。
30
+
31
+ ```Java
32
+ // アプリ本体&エントリーポイント
33
+
34
+ import java.awt.CardLayout;
35
+ import java.awt.Frame;
36
+ import java.awt.event.WindowAdapter;
37
+ import java.awt.event.WindowEvent;
38
+
39
+ class MyWindow extends Frame {
40
+ public static void main(String[] args) {
41
+ MyWindow mw = new MyWindow();
42
+ mw.setVisible(true);
43
+ }
44
+
45
+ MyWindow() {
46
+ setTitle("育成ゲーム");
47
+ setSize(700, 500);
48
+ setLocationRelativeTo(null); // 画面中央に表示
49
+
50
+ CardLayout cardLayout = new CardLayout(); // addしたものが1ページずつ紙芝居のように表示されるレイアウト
51
+ setLayout(cardLayout);
52
+ add(new TitlePanel(), "TitlePanel"); //追加した順に1ページ目、2ページ目。。。
53
+ add(new MainPanel(), "MainPanel");
54
+ add(new SettingPanel(), "SettingPanel");
55
+
56
+ addWindowListener(new WinListener());
57
+ }
58
+
59
+ class WinListener extends WindowAdapter {
60
+ public void windowClosing(WindowEvent e) { System.exit(0); }
61
+ }
62
+ }
63
+ ```
64
+
65
+ ```Java
66
+ // タイトル画面 画面A
67
+
68
+ import java.awt.Button;
69
+ import java.awt.CardLayout;
70
+ import java.awt.Frame;
71
+ import java.awt.Graphics;
72
+ import java.awt.Image;
73
+ import java.awt.Panel;
74
+ import java.awt.event.ActionEvent;
75
+ import java.awt.event.ActionListener;
76
+ import java.io.File;
77
+ import java.io.IOException;
78
+ import javax.imageio.ImageIO;
79
+
80
+ class TitlePanel extends Panel implements ActionListener {
81
+ private Image img;
82
+
83
+ TitlePanel() {
84
+ try {
85
+ // getImageは起動直後画像が出ないことがあるので、読み込みを待ってくれるこちらに変更
86
+ img = ImageIO.read(new File("title.png"));
87
+ } catch (IOException e) { e.printStackTrace(); }
88
+
89
+ setLayout(null);
90
+ Button startButton = new Button("はじめる");
91
+ startButton.setBounds(250, 100, 200, 50);
92
+ // addActionListenerを3パターンで登録したが大体同じ意味
93
+ // ほかのクラスでは行数を節約できるラムダ方式を採用
94
+ startButton.addActionListener(this); // このクラス(TitlePanel)のactionPerformedでアクションを指定
95
+ add(startButton);
96
+
97
+ Button settingButton = new Button("せってい");
98
+ settingButton.setBounds(250, 200, 200, 50);
99
+ settingButton.addActionListener( // 匿名クラスでアクションを指定
100
+ new ActionListener() {
101
+ @Override
102
+ public void actionPerformed(ActionEvent e) {
103
+ Frame frame = (Frame) getParent();
104
+ CardLayout cardLayout = (CardLayout) frame.getLayout();
105
+ cardLayout.show(frame, "SettingPanel"); // ページ名を指定して切り替え
106
+ }
107
+ }
108
+ );
109
+ add(settingButton);
110
+
111
+ Button exitButton = new Button("やめる");
112
+ exitButton.setBounds(250, 300, 200, 50);
113
+ exitButton.addActionListener(e -> System.exit(0)); // ラムダでアクションを指定
114
+ add(exitButton);
115
+ }
116
+
117
+ @Override
118
+ public void paint(Graphics g) {
119
+ g.drawImage(img, 0, 0, null);
120
+ }
121
+
122
+ @Override
123
+ public void actionPerformed(ActionEvent e) { // startButtonで呼ばれるメソッド
124
+ Frame frame = (Frame) getParent();
125
+ CardLayout cardLayout = (CardLayout) frame.getLayout();
126
+ cardLayout.next(frame); // 次のページに切り替え
127
+ }
128
+ }
129
+ ```
130
+
131
+ ```Java
132
+ // メインのゲーム画面 画面B
133
+
134
+ import java.awt.Button;
135
+ import java.awt.CardLayout;
136
+ import java.awt.Color;
137
+ import java.awt.Frame;
138
+ import java.awt.Panel;
139
+
140
+ class MainPanel extends Panel {
141
+ MainPanel() {
142
+ setLayout(null);
143
+
144
+ // MainPanelの中でさらにCardLayoutで表示の切り替え
145
+ Panel innerPanel = new Panel();
146
+ innerPanel.setBounds(50, 50, 600, 330);
147
+ CardLayout innerCardLayout = new CardLayout();
148
+ innerPanel.setLayout(innerCardLayout);
149
+ // 本来はそれぞれのPanelクラスになりますが、サンプルのためただの色違いパネル
150
+ innerPanel.add(new Panel() {{ setBackground(Color.orange); }}, "p1");
151
+ innerPanel.add(new Panel() {{ setBackground(Color.red); }}, "p2");
152
+ innerPanel.add(new Panel() {{ setBackground(Color.green); }}, "p3");
153
+ innerPanel.add(new Panel() {{ setBackground(Color.blue); }}, "p4");
154
+ innerPanel.add(new Panel() {{ setBackground(Color.pink); }}, "p5");
155
+ add(innerPanel);
156
+
157
+ Button btn1 = new Button("ステータス");
158
+ btn1.setBounds(50, 400, 100, 50);
159
+ btn1.addActionListener(e -> innerCardLayout.show(innerPanel, "p1"));
160
+ add(btn1);
161
+
162
+ Button btn2 = new Button("食事");
163
+ btn2.setBounds(160, 400, 100, 50);
164
+ btn2.addActionListener(e -> innerCardLayout.show(innerPanel, "p2"));
165
+ add(btn2);
166
+
167
+ Button btn3 = new Button("運動");
168
+ btn3.setBounds(270, 400, 100, 50);
169
+ btn3.addActionListener(e -> innerCardLayout.show(innerPanel, "p3"));
170
+ add(btn3);
171
+
172
+ Button btn4 = new Button("勉強");
173
+ btn4.setBounds(380, 400, 100, 50);
174
+ btn4.addActionListener(e -> innerCardLayout.show(innerPanel, "p4"));
175
+ add(btn4);
176
+
177
+ Button btn5 = new Button("お話");
178
+ btn5.setBounds(490, 400, 100, 50);
179
+ btn5.addActionListener(e -> innerCardLayout.show(innerPanel, "p5"));
180
+ add(btn5);
181
+
182
+
183
+ Button backButton = new Button("タイトルに戻る");
184
+ backButton.setBounds(550, 10, 100, 25);
185
+ backButton.addActionListener(e -> {
186
+ Frame frame = (Frame) getParent();
187
+ CardLayout cardLayout = (CardLayout) frame.getLayout();
188
+ cardLayout.first(frame); // 先頭のページに切り替え
189
+ });
190
+ add(backButton);
191
+ }
192
+ }
193
+ ```
194
+
195
+ ```Java
196
+ // 設定画面 画面C
197
+
198
+ import java.awt.Button;
199
+ import java.awt.CardLayout;
200
+ import java.awt.Frame;
201
+ import java.awt.Panel;
202
+
203
+ class SettingPanel extends Panel {
204
+ SettingPanel() {
205
+ setLayout(null);
206
+
207
+ Button backButton = new Button("タイトルに戻る");
208
+ backButton.setBounds(250, 300, 200, 50);
209
+ backButton.addActionListener(e -> {
210
+ Frame frame = (Frame) getParent();
211
+ CardLayout cardLayout = (CardLayout) frame.getLayout();
212
+ cardLayout.first(frame); // 先頭のページに切り替え
213
+ });
214
+ add(backButton);
215
+ }
216
+ }
217
+ ```
218
+
219
+ ![タイトル](acdb4d02db50b889ef77b7f50d20312b.png)
220
+ ![ステータス](a81f82e56777199ebc9a73f955c7db94.png)
221
221
  ![食事](01877e96bff0ba5f98688deb4ae97939.png)