- ベストアンサー
【java】ボタンクリックで画面遷移を行う方法
- javaをはじめて2週間の_tonnuraと申します。swingを用いて1枚のフレームに対し、ボタンクリックにより画面遷移を行っていくアプリを作成しています。最初の画面での画面遷移は成功するのですが、その画面からの遷移のために別のパネルを加えると画面が更新されません。
- 「getContentPane().list(System.out)」で確認したところ、物はあるようなので、「validate()」をかけているのですが変化なしです。過去の質問に解決方法があると思い、検索で「QNo.196900 クリックでGUI部品を追加する」を見つけたのですが、コンポーネントに対するremoveAll後のvalidate()だけでは対処できませんでした。
- actionPerformedにて、「KihonCore kihonC」に飛ばしていますが、処理として「各部品の定義・配置・新たに定義したパネルへのセット後 パネルをコンポーネントへ配置」を行っています。画面遷移の順序としては初期画面表示→2枚目の画面を貼り付け→初期画面を貼り付け(初期メニュー画面を描写)となっています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
補足ありがとうございます。 ざっと見たところ、KihonCoreの各メソッドで Menu mn = new Menu(); でMenuクラスのインスタンスを生成しているのが変な動作の原因のような気がします。 Menuのインスタンスを生成した時点で別のフレーム(窓)を生成しています。 また、ボタンをアクションリスナーに登録していますが別フレームに登録していますので、 2つ目の画面から3つ目の画面に移るボタンを押したとしても そのフレームでイベントは起こりません。 なので、KihonCoreのメソッドを呼ぶ際にMenu自身を引数とする等したほうが良いかもしれません。
その他の回答 (1)
- lailai2580
- ベストアンサー率64% (16/25)
KihonCoreクラスのbtnClk_MenuAmメソッドとbtnClk_Rtnメソッドは staticにしてもいいような気がしなくもないですが それはさておき 質問内容がよく理解できなかったのですが 現在の状態では >初期画面表示→//■2枚目の画面を貼り付け→//■初期画面を貼り付け(初期メニュー画面を描写) が出来ているということですか? それを拡張して >初期画面→2枚目の画面→×3枚目の画面 にしたいという意味ですか? >初期画面表示→//■2枚目の画面を貼り付け→//■初期画面を貼り付け(初期メニュー画面を描写) これが出来ているのであれば、3枚目の画面を表示するのは同じ要領です。 出来ていないのであれば、KihonCoreクラスのbtnClk_Rtnメソッドに問題があるのではないでしょうか。 個人的に addWindowListener(new myListener(0)); が何なのかも気になりました。
補足
lailai2580さん、ご回答ありがとうございます。 質問内容が分かりづらくてすいませんでした。 初期画面→(btn_gozen押下)→2枚目画面表示→(btn_returnボタン押下)→×3枚目(表示できず。2枚目の画面のまま)という状態です。 kihonCoreクラスのソースを記載させていただきます。 ※myListenerですが「windowClosing(WindowEvent we)」時にダイアログを表示させる処理です。文字数の関係で掲載できませんでした・・・Menuクラスの「addWindowListener(new myListener(0));」をコメントアウトしても画面については同じだったので無関係だとは思います。 ------------------------------------------------------------ package test; import java.awt.*; import javax.swing.*; import test.Menu; public class KihonCore { //■2枚目の画面にてbtn_returnを押下 void btnClk_Rtn(Container c){ System.out.println("戻るボタン処理開始"); SpringLayout layout = new SpringLayout(); JPanel p01 = new JPanel(); p01.setOpaque(true); p01.setLayout(layout); Menu mn = new Menu(); //背景 ImageIcon title = new ImageIcon("./image/title_main.png"); JLabel t_label = new JLabel(title); //画面ヘッダー背景 ImageIcon icon_logo01 = new ImageIcon("./image/header_whiteR.png"); JLabel logo01 = new JLabel(icon_logo01); //画面右上ロゴ ImageIcon icon_logo02 = new ImageIcon("./image/header_dsLogo.png"); JLabel logo02 = new JLabel(icon_logo02); JButton btn_gozen = new JButton(); btn_gozen.addActionListener(mn); btn_gozen.setActionCommand("btn_gozen"); btn_gozen.setPreferredSize(new Dimension(118, 45)); ImageIcon icon_gozen = new ImageIcon("./image/btn_gozen.png"); btn_gozen.setIcon(icon_gozen); JButton btn_gogo = new JButton(); btn_gogo.setActionCommand("btn_gogo"); btn_gogo.setPreferredSize(new Dimension(118, 45)); ImageIcon icon_gogo = new ImageIcon("./image/btn_gogo.png"); btn_gogo.setIcon(icon_gogo); JButton btn_syuuryou = new JButton("終了"); btn_syuuryou.setActionCommand("btn_syuuryou"); btn_syuuryou.setPreferredSize(new Dimension(100, 50)); btn_syuuryou.setFont(new Font("HG丸ゴシックM-PRO", Font.PLAIN, 28)); layout.putConstraint(SpringLayout.NORTH, logo02, 5, SpringLayout.NORTH, p01); layout.putConstraint(SpringLayout.WEST, logo02, 607, Spr ingLayout.WEST, p01); layout.putConstraint(SpringLayout.NORTH, btn_gozen, 90, SpringLayout.NORTH, p01); layout.putConstraint(SpringLayout.WEST, btn_gozen, 370, SpringLayout.WEST,p01); layout.putConstraint(SpringLayout.NORTH, btn_gogo, 185, SpringLayout.NORTH, p01); layout.putConstraint(SpringLayout.WEST, btn_gogo, 370, S pringLayout.WEST, p01); layout.putConstraint(SpringLayout.NORTH, btn_syuuryou, 4 80,SpringLayout.NORTH, p01); layout.putConstraint(SpringLayout.WEST, btn_syuuryou, 62 3, SpringLayout.WEST,p01); p01.add(btn_gozen); p01.add(btn_gogo); p01.add(btn_syuuryou); p01.add(logo02); p01.add(logo01); p01.add(t_label); c.add(p01); } //■メニュー画面にてbtn_gozen押下 void btnClk_MenuAm(Container c){ ※btnClk_Rtnと同様の処理です。定義と配置は文字数の関係で省略させていただきます。(問題のボタンのみ記載・配置部品の位置等は異なっています) JButton btn_return = new JButton("戻る"); btn_return.addActionListener(mn); btn_return.setActionCommand("btn_return"); btn_return.setPreferredSize(new Dimension(100, 50)); layout.putConstraint(SpringLayout.NORTH, btn_return, 480,SpringLayout.NORTH, p02); layout.putConstraint(SpringLayout.WEST, btn_return, 627, SpringLayout.WEST,p02); p02.add(btn_gozenB01); p02.add(btn_gozenB02); p02.add(label_gozenB01); p02.add(label_gozenB02); p02.add(btn_return); p02.add(logo02); p02.add(logo03); p02.add(logo01); c.add(p02); } }
お礼
lailai2580様 お忙しい中ご回答していただき、とてもうれしく思います。 大変わかりやすく、とても参考になりました! なるほど、「Menu生成は起動イベントとして、あとで作り直そう」 と思っていたので盲点でした。知識不足でお恥ずかしいのですが 今の自分にはとても価値のある失敗だったと思います。 本来なら、ソースの修正を済まして「出来ました!」と報告するのが 礼儀だとは思いますが、別の作業が入ってしまい、ソースをいじるのは数日後になりそうです。申し訳ありません。 本を購入したり、知人に聞いたりして対応を考えていたのですが、 解決できず、ダメ元で初めてネットで書き込みさせていただきました。 わかりやすい回答、頭の中の疑問点が一気に無くなった感じです。 1日も早く質問に答えられる側になるよう、精進したいと思います。 本当にありがとうございました!