質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

13498閲覧

ボタンを押したら画面遷移させたい

minmee0126

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/11/26 15:16

編集2019/11/28 21:21

画面Aに「はじめる」ボタンがあって、ボタンを押すと画面Bに遷移するようにしたいのですが、いまいちよく分かりません

調べた感じ(間違ってるかもしれないけれど)画面Aと画面Bのjavaファイルを用意してパッケージ化する…みたいな事は分かったのですが

今まで簡単な1つのjavaファイルをコンパイルして動かした事しかないので上記のような場合のコンパイルの仕方も教えて下さい

※コマンドプロントでコンパイルして動かしています

書いたコード

<画面A(トップ画面)>
import java.awt.;
import java.awt.event.
;
class Top{
public static void main(String[] args){
MyWindow mw = new MyWindow();
}
}

class MyWindow extends Frame{
Image img;
MyWindow(){
img = getToolkit().getImage("top.png");

setTitle("育成ゲーム"); setSize(700,500); setLayout(null); Button btn1 = new Button("はじめる"); btn1.setBounds(250,400,200,50); add(btn1); setVisible(true); addWindowListener(new WinListener()); } public void paint(Graphics g){ g.drawImage(img,0,0,this); }

}

class WinListener extends WindowAdapter{
public void windowClosing(WindowEvent e){System.exit(0);}
}

<画面B(メイン画面)>
import java.awt.;
import java.awt.event.
;
class Main{
public static void main(String[] args){
MyWindow mw = new MyWindow();
}
}

class MyWindow extends Frame{
Image img;
MyWindow(){
img = getToolkit().getImage("field_noon.png");

setTitle("育成ゲーム"); setSize(700,500); setLayout(null); Button btn1 = new Button("ステータス"); btn1.setBounds(50,400,100,50); add(btn1); Button btn2 = new Button("食事"); btn2.setBounds(160,400,100,50); add(btn2); Button btn3 = new Button("運動"); btn3.setBounds(270,400,100,50); add(btn3); Button btn4 = new Button("勉強"); btn4.setBounds(380,400,100,50); add(btn4); Button btn5 = new Button("お話"); btn5.setBounds(490,400,100,50); add(btn5); setVisible(true); addWindowListener(new WinListener()); } public void paint(Graphics g){ g.drawImage(img,0,0,this); }

}

class WinListener extends WindowAdapter{
public void windowClosing(WindowEvent e){System.exit(0);}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/11/27 00:50

(Androidではなく)パソコンでの、(AWTではなく)Swingでしょうか.
senior_golfer

2019/11/27 03:00

もう少し開発環境の情報などを記載する必要があると思います。 このままでは、どこから回答してよいのかわりません。
minmee0126

2019/11/28 21:24

はい、パソコンで動かす前提で作成しています。 importでawtを呼び出しているから、awtなのでしょうか…? 開発環境は特に使用しておらず、参考書を片手にテキストエディタで打っています。
senior_golfer

2019/11/28 23:49

環境などはわかりました。個人的にはEclipseなどの開発環境をつかった使ったほうが楽だと思います。 普段は上記の開発環境を使っているので、awtでの画面変遷については忘れました。 ネットで「java awt 画面変遷」で多くヒットします。このサイトでも「AWTの画面遷移について」などの質疑があります。
minmee0126

2019/11/29 02:56

ありがとうございます。 今まで「java 画面遷移」で調べていたので、awtも追加してまずは調べてみます!
guest

回答2

0

画面遷移の方法はいろいろあると思いますが、おススメはCardLayoutによる遷移です。
紙芝居のように次のページや前のページ、指定ページに瞬時に遷移します(残念ながらスライド等のアニメーションはありません)

各画面分のPanelを作成し、Frameに追加します。
最初に追加したものが表示されて、ほかのパネルは非表示になります。
previousnextshowで表示を切り替えます。

この方法のメリットは非表示になっているだけなので、各画面間のやり取りがスムーズです。
逆にデメリットはBGMを流したりした時に、明示的に止めないと遷移後も流れ続けます。


上記のような場合のコンパイルの仕方

同じフォルダにファイルがあればjavac MyWindow.javaで自動で読んでくれるようです。
指定したければjavac file1.java file2.javaのように並べていくか、javac *.javaのようにワイルドカードでもいいようです。

PCスペック等の事情がおありなのかもしれませんが、初心者ほどIDEの使用を強く推奨します。


特に理由がないのであればAWTの拡張版であるSwingのほうが、 機能・情報量・検索性(Jから始まるクラス名が多くgoogle等で見分けやすい)の面からよりよいと思います。 (今の段階ですといくつかのクラスにJを付けるかだけって程度です)


ご提示のコードを少しアレンジして、簡単なサンプルを作ってみました。
CardLayoutを入れ子に使って、メイン画面の中でも遷移させています。(黄色や赤の色がついている部分)

参考になれば幸いです。

Java

1// アプリ本体&エントリーポイント 2 3import java.awt.CardLayout; 4import java.awt.Frame; 5import java.awt.event.WindowAdapter; 6import java.awt.event.WindowEvent; 7 8class 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 3import java.awt.Button; 4import java.awt.CardLayout; 5import java.awt.Frame; 6import java.awt.Graphics; 7import java.awt.Image; 8import java.awt.Panel; 9import java.awt.event.ActionEvent; 10import java.awt.event.ActionListener; 11import java.io.File; 12import java.io.IOException; 13import javax.imageio.ImageIO; 14 15class 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 3import java.awt.Button; 4import java.awt.CardLayout; 5import java.awt.Color; 6import java.awt.Frame; 7import java.awt.Panel; 8 9class 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 3import java.awt.Button; 4import java.awt.CardLayout; 5import java.awt.Frame; 6import java.awt.Panel; 7 8class 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}

タイトル
ステータス
食事

投稿2019/11/29 07:42

編集2023/08/09 09:48
TN8001

総合スコア9317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

お疲れさまです。
Top画面の add(btn1);とsetVisible(true);の間に

   ```btn1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Main main = new Main();
main.main(null);
}
});

を入れます。 こちらのEclipse上ではMain画面に変遷しました。 Top画面を残すなどいろいろなことがあると思います。 いろいろ調べてやってみてください。 コンパイルの方法はわかりません。

投稿2019/11/29 05:37

senior_golfer

総合スコア264

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問