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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

2771閲覧

AWTの画面遷移について

kubo_

総合スコア13

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2019/01/23 07:04

編集2019/01/23 10:04

前提・実現したいこと

JavaでAWTを使い、っトランプゲームを作っています。
その中で、タイトル画面からメニュー画面に遷移するボタンがあるのですが押すと遷移するものの、タイトル画面に表示されていたボタンが消えず、本来メニュー画面に表示されるべきものにプラスしてタイトル画面で出ていたボタンが表示されたままになってしまいます。
removeAll()を追加するなど試しましたが変わりませんでした。

発生している問題・エラーメッセージ

画面遷移後、前の画面で表示していたボタンが消えず、遷移後の画面にも表示されてしまいます。

該当のソースコード

※まだプロトタイプ実装途中のため、addActionListenerが一部thisのままになっています。

java

1package test; 2 3import java.awt.Font; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6 7import javax.swing.BoxLayout; 8import javax.swing.JButton; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JPanel; 12import javax.swing.JTextField; 13 14public class Title extends JFrame implements ActionListener { 15 public static void main(String args[]) { 16 new Title(); 17 } 18 19 public Title() { 20 setTitle("トランプコレクション"); 21 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 22 23 setSize(1280, 720); 24 setLocationRelativeTo(null); 25 26 getContentPane().add(getDefPanel()); 27 setVisible(true); 28 } 29 30 private JPanel getDefPanel() { 31 32 JPanel panel = new JPanel(); 33 34 String msg0 = "トランプコレクション"; 35 JLabel label = new JLabel(msg0); 36 label.setFont(new Font("MS ゴシック", Font.PLAIN, 60)); 37 label.setBounds(350, 100, 1600, 100); 38 label.setLayout(new BoxLayout(label, BoxLayout.PAGE_AXIS)); 39 this.add(label); 40 JButton stert = new JButton("Start"); 41 stert.setFont(new Font("Century", Font.ITALIC, 30)); 42 stert.setSize(200, 50); 43 stert.setLocation(400, 500); 44 45 stert.addActionListener(new MenuListener(this)); 46 this.add(stert); 47 JButton end = new JButton("End"); 48 end.setFont(new Font("Century", Font.ITALIC, 30)); 49 end.setSize(200, 50); 50 end.setLocation(700, 500); 51 end.addActionListener(new ExitListener()); 52 this.add(end); 53 54 return panel; 55 } 56 57 58 59 @Override 60 public void actionPerformed(ActionEvent e) { 61 // TODO 自動生成されたメソッド・スタブ 62 63 } 64 65 66} 67

java

1package test; 2 3import java.awt.Font; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6 7import javax.swing.BoxLayout; 8import javax.swing.JButton; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JPanel; 12import javax.swing.JTextField; 13 14class MenuListener implements ActionListener { 15 private JFrame f; 16 public MenuListener(JFrame f) { 17 this.f=f; 18 } 19 public void actionPerformed(ActionEvent e) { 20 // TODO 自動生成されたメソッド・スタブ 21 22 f.setTitle("トランプコレクション"); 23 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 24 25 f.setSize(1280, 720); 26 f.setLocationRelativeTo(null); 27 28 f.getContentPane().add(getPanel()); 29 f.setVisible(true); 30 } 31 private JPanel getPanel() { 32 33 JLabel title = new JLabel("トランプコレクション"); 34 JPanel panel=new JPanel(); 35 JButton button=new JButton(); 36 title.setLayout(new BoxLayout(title, BoxLayout.PAGE_AXIS)); 37 title.setFont(new Font("MS ゴシック", Font.PLAIN, 60)); 38 title.setBounds(350, 100, 1600, 100); 39 panel.add(title); 40 // panel.add(new JLabel("トランプコレクション")); 41 42 button = new JButton("神経衰弱"); 43 button.setSize(120, 50); 44 button.setLocation(300, 300); 45 button.setActionCommand("3"); 46 button.addActionListener(this); 47 JButton button2 = new JButton("ポーカー"); 48 button2.setSize(120, 50); 49 button2.setLocation(300, 400); 50 button2.setActionCommand("3"); 51 button2.addActionListener(this); 52 JButton button3 = new JButton("ソリティア"); 53 button3.setSize(120, 50); 54 button3.setLocation(300, 500); 55 button3.setActionCommand("3"); 56 button3.addActionListener(this); 57 JButton button4 = new JButton("タイトルに戻る"); 58 button4.setSize(150, 50); 59 button4.setLocation(550, 600); 60 button4.addActionListener(this); 61 JTextField txt = new JTextField("基本自分の記憶力が勝負を左右するゲームです。"); 62 txt.setSize(600, 50); 63 txt.setLocation(500, 300); 64 txt.setEditable(false); 65 JTextField ptxt = new JTextField("5枚の手札の組み合わせで、カードの強さをきそうトランプゲームです。"); 66 ptxt.setSize(600, 50); 67 ptxt.setLocation(500, 400); 68 ptxt.setEditable(false); 69 JTextField stxt = new JTextField("並べられたカードを数字の順番で列を移動させながら、同じマークのAからKの順番に並べかえるゲームです。"); 70 stxt.setSize(600, 50); 71 stxt.setLocation(500, 500); 72 stxt.setEditable(false); 73 JTextField sp = new JTextField(" "); 74 sp.setEditable(false); 75 // txt.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 76 panel.removeAll(); 77 panel.add(title); 78 panel.add(button); 79 panel.add(button2); 80 panel.add(button3); 81 panel.add(button4); 82 panel.add(txt); 83 panel.add(ptxt); 84 panel.add(stxt); 85 panel.add(sp); 86 87 return panel; 88 89 } 90} 91

java

1 2package test; 3 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6 7class ExitListener implements ActionListener { 8 @Override 9 public void actionPerformed(ActionEvent e) { 10 System.exit(0); 11 } 12} 13

試したこと

removeAll()を追加するなど試しましたが変わりませんでした。

補足情報(FW/ツールのバージョンなど)

java 1.8.0

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

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

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

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

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

jimbe

2019/01/23 08:56

失礼ですが, これは AWT では無く Swing とタグ付けする類ではないでしょうか.
jimbe

2019/01/23 09:01

続けてすいません, MenuListener と ExitListener の提示をお願いできますでしょうか.
jimbe

2019/01/23 09:08

Title クラスの getDefPanel メソッドの中で, ラベルやボタンを panel ではなく this に add していますが, これは合っていますか? JPanel panel = new JPanel(); : this.add(label); : this.add(stert); : this.add(end); return panel;
kubo_

2019/01/23 10:06

ご指摘ありがとうございます。 ラベルやボタンについてですがまだ実装途中のため一部そのままになっております。 申し訳ございません。
jimbe

2019/01/23 10:22

そのままとはどういうことでしょうか, this では無く panel に修正された上で, ご質問のような状態になっているということですか.
kubo_

2019/01/23 10:30

はい、そうです。 thisからpanelに直して実行しましたがボタンの位置やラベルの位置がずれるだけで結果は同じでした
jimbe

2019/01/23 10:31

なるほど, 了解しました. 構造的な問題もあるので, 全体の書き直し的な回答でも良いですか?
kubo_

2019/01/23 10:33

はい、大丈夫です。 よろしくお願いします
guest

回答1

0

ベストアンサー

構造を見直して, 1本に纏めました.

元あった getDefPanel を createTitlePanel に変更しています.
MenuListener にあった getPanel を createSelectPanel としてこちらに移動しました.
上記2つのパネルを CardLayout で重ねておき, 初期起動時はタイトル, Startボタンでセレクト, セレクトの"タイトルに戻る"ボタンでタイトルを(切り替え)表示するようにしました.
各ボタンの処理が短くなったため, 無名クラスとしてボタン生成箇所に埋め込むことで MenuListener, ExitListener が要らなくなりました.

java

1package test; 2 3import java.awt.CardLayout; 4import java.awt.Font; 5import java.awt.event.ActionEvent; 6import java.awt.event.ActionListener; 7 8import javax.swing.BoxLayout; 9import javax.swing.JButton; 10import javax.swing.JFrame; 11import javax.swing.JLabel; 12import javax.swing.JPanel; 13import javax.swing.JTextField; 14 15public class MainFrame extends JFrame { 16 public static void main(String args[]) { 17 new MainFrame(); 18 } 19 20 private JPanel cardPanel; 21 private static final String TITLE_PANEL = "title"; 22 private static final String SELECT_PANEL = "select"; 23 24 public MainFrame() { 25 setTitle("トランプコレクション"); 26 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 27 28 setSize(1280, 720); 29 setLocationRelativeTo(null); 30 31 //複数のパネルを乗せ, 名前で切り替える土台となるパネル 32 cardPanel = new JPanel(); 33 cardPanel.setLayout(new CardLayout()); //CardLayoutは重なったパネルを切り替えることができます. 34 35 //1枚目 36 JPanel titlePanel = createTitlePanel(); 37 cardPanel.add(titlePanel, TITLE_PANEL); 38 39 //2枚目 40 JPanel selectPanel = createSelectPanel(); 41 cardPanel.add(selectPanel, SELECT_PANEL); 42 43 //起動時は一枚目を表示 44 ((CardLayout)(cardPanel.getLayout())).show(cardPanel, TITLE_PANEL); 45 46 getContentPane().add(cardPanel); 47 setVisible(true); 48 } 49 50 private JPanel createTitlePanel() { 51 52 JPanel panel = new JPanel(null); 53 54 String msg0 = "トランプコレクション"; 55 JLabel label = new JLabel(msg0); 56 label.setFont(new Font("MS ゴシック", Font.PLAIN, 60)); 57 label.setBounds(350, 100, 1600, 100); 58 label.setLayout(new BoxLayout(label, BoxLayout.PAGE_AXIS)); 59 panel.add(label); 60 61 JButton stert = new JButton("Start"); 62 stert.setFont(new Font("Century", Font.ITALIC, 30)); 63 stert.setSize(200, 50); 64 stert.setLocation(400, 500); 65 stert.addActionListener(new ActionListener() { 66 @Override 67 public void actionPerformed(ActionEvent e) { 68 //selPanel を表示します 69 ((CardLayout)(cardPanel.getLayout())).show(cardPanel, SELECT_PANEL); 70 } 71 }); 72 panel.add(stert); 73 74 JButton end = new JButton("End"); 75 end.setFont(new Font("Century", Font.ITALIC, 30)); 76 end.setSize(200, 50); 77 end.setLocation(700, 500); 78 end.addActionListener(new ActionListener() { //こういった定型的で短い処理の場合は省略形で定義します. 79 @Override 80 public void actionPerformed(ActionEvent e) { 81 System.exit(0); 82 } 83 }); 84 panel.add(end); 85 86 return panel; 87 } 88 89 private JPanel createSelectPanel() { 90 91 JLabel title = new JLabel("トランプコレクション"); 92 JPanel panel=new JPanel(null); 93 JButton button=new JButton(); 94 title.setLayout(new BoxLayout(title, BoxLayout.PAGE_AXIS)); 95 title.setFont(new Font("MS ゴシック", Font.PLAIN, 60)); 96 title.setBounds(350, 100, 1600, 100); 97 panel.add(title); 98 // panel.add(new JLabel("トランプコレクション")); 99 100 button = new JButton("神経衰弱"); 101 button.setSize(120, 50); 102 button.setLocation(300, 300); 103 button.setActionCommand("3"); 104 //button.addActionListener(this); 105 JButton button2 = new JButton("ポーカー"); 106 button2.setSize(120, 50); 107 button2.setLocation(300, 400); 108 button2.setActionCommand("3"); 109 //button2.addActionListener(this); 110 JButton button3 = new JButton("ソリティア"); 111 button3.setSize(120, 50); 112 button3.setLocation(300, 500); 113 button3.setActionCommand("3"); 114 //button3.addActionListener(this); 115 JButton button4 = new JButton("タイトルに戻る"); 116 button4.setSize(150, 50); 117 button4.setLocation(550, 600); 118 button4.addActionListener(new ActionListener() { 119 @Override 120 public void actionPerformed(ActionEvent e) { 121 //defPanel を表示します 122 ((CardLayout)(cardPanel.getLayout())).show(cardPanel, TITLE_PANEL); 123 } 124 }); 125 JTextField txt = new JTextField("基本自分の記憶力が勝負を左右するゲームです。"); 126 txt.setSize(600, 50); 127 txt.setLocation(500, 300); 128 txt.setEditable(false); 129 JTextField ptxt = new JTextField("5枚の手札の組み合わせで、カードの強さをきそうトランプゲームです。"); 130 ptxt.setSize(600, 50); 131 ptxt.setLocation(500, 400); 132 ptxt.setEditable(false); 133 JTextField stxt = new JTextField("並べられたカードを数字の順番で列を移動させながら、同じマークのAからKの順番に並べかえるゲームです。"); 134 stxt.setSize(600, 50); 135 stxt.setLocation(500, 500); 136 stxt.setEditable(false); 137 JTextField sp = new JTextField(" "); 138 sp.setEditable(false); 139 // txt.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 140 panel.removeAll(); 141 panel.add(title); 142 panel.add(button); 143 panel.add(button2); 144 panel.add(button3); 145 panel.add(button4); 146 panel.add(txt); 147 panel.add(ptxt); 148 panel.add(stxt); 149 panel.add(sp); 150 151 return panel; 152 153 } 154}

投稿2019/01/23 11:05

編集2019/01/23 11:24
jimbe

総合スコア12648

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

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

jimbe

2019/01/23 11:18

ご質問の問題は各部品の登録先が混乱していたことです. まず, getDefPanel で this に対して add していたこと, それから JFrame の ContentPane の Layout を意識していなかった為と思われます. JFrame.getContentPane() で得られるペインのレイアウトは BorderLayout であり, 追加情報が無い状態では中央に重ねられたと思います. そのため, 二つが重なって表示されたものと推測しました. このコードでは, コメントを入れておきましたが, JFrame(contentPane) の上に CardLayout の JPanel を乗せ, そのパネルに2枚のJPanel を乗せておいて切り替える形にしました.
jimbe

2019/01/23 11:49 編集

すいません, 2つのパネルの配置が乱れたままでした. JPanel のコンストラクタに null を渡すと Layout を無効に出来, 各部品の setLocation() 等が効くようになります. 本来はレイアウトの機能を使って配置することで, ウインドウのサイズ変更等に対応するようにするのですけれど.
kubo_

2019/01/23 23:49

ありがとうございます。 無事動作しました。 今回教えていただいたことを今後に活かしていきたいと思います。 ありがとうございました。
jimbe

2019/01/24 03:37

構造を変えてしまい申し訳ありません. kubo_ さんのプログラムですから回答としてあまり好ましくない方法だとは分かっているのですが. 言い訳ですが, クラスファイルを分ける場合は Listener ではなく JFrame や JPanel 等で分けると, 各画面やパネル毎の処理がそれぞれのクラスに入るので分かりやすくなります. Listener の行う処理は, それが登録されるボタンやメニュー, さらのそのボタンやメニューが属するパネルやフレームに関する処理を行う場合が殆どですので, それらのクラスファイルに書いておくほうが良いと思います. 今回は行いませんでしたが, この意味では createTitlePanel や createSelectPanel で作っているパネルをクラスとして抜き出し, TitlePanel.java として class TitlePanel extends JPanel {}, SelectPanel として class SelectPanel extends JPanel {}なファイルを作ってそれぞれのコンストラクタでボタンやテキストを配置するようにするともっと良いかと思います. ( selectPanel の'タイトルに戻る'ボタンのように 別のクラスのオブジェクト/操作が必要なら, コンストラクタで渡したりで連携します) 言い訳も長くてすいません.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問