画面遷移の方法はいろいろあると思いますが、おススメはCardLayout
による遷移です。
紙芝居のように次のページや前のページ、指定ページに瞬時に遷移します(残念ながらスライド等のアニメーションはありません)
各画面分のPanel
を作成し、Frame
に追加します。
最初に追加したものが表示されて、ほかのパネルは非表示になります。
previous
・next
・show
で表示を切り替えます。
この方法のメリットは非表示になっているだけなので、各画面間のやり取りがスムーズです。
逆にデメリットはBGMを流したりした時に、明示的に止めないと遷移後も流れ続けます。
上記のような場合のコンパイルの仕方
同じフォルダにファイルがあればjavac MyWindow.java
で自動で読んでくれるようです。
指定したければjavac file1.java file2.java
のように並べていくか、javac *.java
のようにワイルドカードでもいいようです。
PCスペック等の事情がおありなのかもしれませんが、初心者ほどIDEの使用を強く推奨 します。
特に理由がないのであればAWTの拡張版であるSwingのほうが、 機能・情報量・検索性(Jから始まるクラス名が多くgoogle等で見分けやすい)の面からよりよいと思います。 (今の段階ですといくつかのクラスにJを付けるかだけって程度です)
ご提示のコードを少しアレンジして、簡単なサンプルを作ってみました。
CardLayout
を入れ子に使って、メイン画面の中でも遷移させています。(黄色や赤の色がついている部分)
参考になれば幸いです。
Java
1 // アプリ本体&エントリーポイント
2
3 import java . awt . CardLayout ;
4 import java . awt . Frame ;
5 import java . awt . event . WindowAdapter ;
6 import java . awt . event . WindowEvent ;
7
8 class MyWindow extends Frame {
9 public static void main ( String [ ] args ) {
10 MyWindow mw = new MyWindow ( ) ;
11 mw . setVisible ( true ) ;
12 }
13
14 MyWindow ( ) {
15 setTitle ( "育成ゲーム" ) ;
16 setSize ( 700 , 500 ) ;
17 setLocationRelativeTo ( null ) ; // 画面中央に表示
18
19 CardLayout cardLayout = new CardLayout ( ) ; // addしたものが1ページずつ紙芝居のように表示されるレイアウト
20 setLayout ( cardLayout ) ;
21 add ( new TitlePanel ( ) , "TitlePanel" ) ; //追加した順に1ページ目、2ページ目。。。
22 add ( new MainPanel ( ) , "MainPanel" ) ;
23 add ( new SettingPanel ( ) , "SettingPanel" ) ;
24
25 addWindowListener ( new WinListener ( ) ) ;
26 }
27
28 class WinListener extends WindowAdapter {
29 public void windowClosing ( WindowEvent e ) { System . exit ( 0 ) ; }
30 }
31 }
Java
1 // タイトル画面 画面A
2
3 import java . awt . Button ;
4 import java . awt . CardLayout ;
5 import java . awt . Frame ;
6 import java . awt . Graphics ;
7 import java . awt . Image ;
8 import java . awt . Panel ;
9 import java . awt . event . ActionEvent ;
10 import java . awt . event . ActionListener ;
11 import java . io . File ;
12 import java . io . IOException ;
13 import javax . imageio . ImageIO ;
14
15 class TitlePanel extends Panel implements ActionListener {
16 private Image img ;
17
18 TitlePanel ( ) {
19 try {
20 // getImageは起動直後画像が出ないことがあるので、読み込みを待ってくれるこちらに変更
21 img = ImageIO . read ( new File ( "title.png" ) ) ;
22 } catch ( IOException e ) { e . printStackTrace ( ) ; }
23
24 setLayout ( null ) ;
25 Button startButton = new Button ( "はじめる" ) ;
26 startButton . setBounds ( 250 , 100 , 200 , 50 ) ;
27 // addActionListenerを3パターンで登録したが大体同じ意味
28 // ほかのクラスでは行数を節約できるラムダ方式を採用
29 startButton . addActionListener ( this ) ; // このクラス(TitlePanel)のactionPerformedでアクションを指定
30 add ( startButton ) ;
31
32 Button settingButton = new Button ( "せってい" ) ;
33 settingButton . setBounds ( 250 , 200 , 200 , 50 ) ;
34 settingButton . addActionListener ( // 匿名クラスでアクションを指定
35 new ActionListener ( ) {
36 @Override
37 public void actionPerformed ( ActionEvent e ) {
38 Frame frame = ( Frame ) getParent ( ) ;
39 CardLayout cardLayout = ( CardLayout ) frame . getLayout ( ) ;
40 cardLayout . show ( frame , "SettingPanel" ) ; // ページ名を指定して切り替え
41 }
42 }
43 ) ;
44 add ( settingButton ) ;
45
46 Button exitButton = new Button ( "やめる" ) ;
47 exitButton . setBounds ( 250 , 300 , 200 , 50 ) ;
48 exitButton . addActionListener ( e -> System . exit ( 0 ) ) ; // ラムダでアクションを指定
49 add ( exitButton ) ;
50 }
51
52 @Override
53 public void paint ( Graphics g ) {
54 g . drawImage ( img , 0 , 0 , null ) ;
55 }
56
57 @Override
58 public void actionPerformed ( ActionEvent e ) { // startButtonで呼ばれるメソッド
59 Frame frame = ( Frame ) getParent ( ) ;
60 CardLayout cardLayout = ( CardLayout ) frame . getLayout ( ) ;
61 cardLayout . next ( frame ) ; // 次のページに切り替え
62 }
63 }
Java
1 // メインのゲーム画面 画面B
2
3 import java . awt . Button ;
4 import java . awt . CardLayout ;
5 import java . awt . Color ;
6 import java . awt . Frame ;
7 import java . awt . Panel ;
8
9 class MainPanel extends Panel {
10 MainPanel ( ) {
11 setLayout ( null ) ;
12
13 // MainPanelの中でさらにCardLayoutで表示の切り替え
14 Panel innerPanel = new Panel ( ) ;
15 innerPanel . setBounds ( 50 , 50 , 600 , 330 ) ;
16 CardLayout innerCardLayout = new CardLayout ( ) ;
17 innerPanel . setLayout ( innerCardLayout ) ;
18 // 本来はそれぞれのPanelクラスになりますが、サンプルのためただの色違いパネル
19 innerPanel . add ( new Panel ( ) { { setBackground ( Color . orange ) ; } } , "p1" ) ;
20 innerPanel . add ( new Panel ( ) { { setBackground ( Color . red ) ; } } , "p2" ) ;
21 innerPanel . add ( new Panel ( ) { { setBackground ( Color . green ) ; } } , "p3" ) ;
22 innerPanel . add ( new Panel ( ) { { setBackground ( Color . blue ) ; } } , "p4" ) ;
23 innerPanel . add ( new Panel ( ) { { setBackground ( Color . pink ) ; } } , "p5" ) ;
24 add ( innerPanel ) ;
25
26 Button btn1 = new Button ( "ステータス" ) ;
27 btn1 . setBounds ( 50 , 400 , 100 , 50 ) ;
28 btn1 . addActionListener ( e -> innerCardLayout . show ( innerPanel , "p1" ) ) ;
29 add ( btn1 ) ;
30
31 Button btn2 = new Button ( "食事" ) ;
32 btn2 . setBounds ( 160 , 400 , 100 , 50 ) ;
33 btn2 . addActionListener ( e -> innerCardLayout . show ( innerPanel , "p2" ) ) ;
34 add ( btn2 ) ;
35
36 Button btn3 = new Button ( "運動" ) ;
37 btn3 . setBounds ( 270 , 400 , 100 , 50 ) ;
38 btn3 . addActionListener ( e -> innerCardLayout . show ( innerPanel , "p3" ) ) ;
39 add ( btn3 ) ;
40
41 Button btn4 = new Button ( "勉強" ) ;
42 btn4 . setBounds ( 380 , 400 , 100 , 50 ) ;
43 btn4 . addActionListener ( e -> innerCardLayout . show ( innerPanel , "p4" ) ) ;
44 add ( btn4 ) ;
45
46 Button btn5 = new Button ( "お話" ) ;
47 btn5 . setBounds ( 490 , 400 , 100 , 50 ) ;
48 btn5 . addActionListener ( e -> innerCardLayout . show ( innerPanel , "p5" ) ) ;
49 add ( btn5 ) ;
50
51
52 Button backButton = new Button ( "タイトルに戻る" ) ;
53 backButton . setBounds ( 550 , 10 , 100 , 25 ) ;
54 backButton . addActionListener ( e -> {
55 Frame frame = ( Frame ) getParent ( ) ;
56 CardLayout cardLayout = ( CardLayout ) frame . getLayout ( ) ;
57 cardLayout . first ( frame ) ; // 先頭のページに切り替え
58 } ) ;
59 add ( backButton ) ;
60 }
61 }
Java
1 // 設定画面 画面C
2
3 import java . awt . Button ;
4 import java . awt . CardLayout ;
5 import java . awt . Frame ;
6 import java . awt . Panel ;
7
8 class SettingPanel extends Panel {
9 SettingPanel ( ) {
10 setLayout ( null ) ;
11
12 Button backButton = new Button ( "タイトルに戻る" ) ;
13 backButton . setBounds ( 250 , 300 , 200 , 50 ) ;
14 backButton . addActionListener ( e -> {
15 Frame frame = ( Frame ) getParent ( ) ;
16 CardLayout cardLayout = ( CardLayout ) frame . getLayout ( ) ;
17 cardLayout . first ( frame ) ; // 先頭のページに切り替え
18 } ) ;
19 add ( backButton ) ;
20 }
21 }