javaをはじめて2週間の_tonnuraと申します。
swingを用いて1枚のフレームに対し、ボタンクリックにより
画面遷移を行っていくアプリを作成しています。
最初の画面での画面遷移は成功するのですが、
その画面からの遷移のために、別のパネルを加えると画面が更新されません。初期画面→2枚目の画面→×3枚目の画面(2枚目のまま)
「getContentPane().list(System.out)」で確認したところ、物はあるようなので、「validate()」をかけているのですが変化なしです。
過去の質問に解決方法があると思い、検索で「QNo.196900 クリックでGUI部品を追加する」を見つけたのですが、コンポーネントに対するremoveAll後のvalidate()だけでは対処できませんでした。
以下にソースを記載します。
汚くて申し訳ありませんが、ご解答いただければ嬉しく思います。
※actionPerformedにて、「KihonCore kihonC」に飛ばしていますが
処理として「各部品の定義・配置・新たに定義したパネルへのセット後 パネルをコンポーネントへ配置」を行っています。
※画面遷移の順序としては
初期画面表示→//■2枚目の画面を貼り付け→//■初期画面を貼り付け(初期メニュー画面を描写)となっています。
------------------------------------------------------------
package test;
import java.awt.*;
import javax.swing.*;
import test.KihonCore.myListener;
public class Menu extends JFrame implements ActionListener {
public static void main(String[] args) {
Menu frame_m = new Menu();
frame_m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame_m.setTitle("画面遷移テスト");
frame_m.setBounds(10, 10, 750, 570);
frame_m.setVisible(true);
frame_m.setResizable(false);
}
Menu() {
SpringLayout layout = new SpringLayout();
JPanel panel_menu = new JPanel();
panel_menu.setLayout(layout);
JButton btn_gozen = new JButton();
tn_gozen.addActionListener(this);
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);
panel_menu.add(btn_gozen);
getContentPane().add(panel_menu);
validate();
addWindowListener(new myListener(0));
System.out.println("起動直後の画面状態");
getContentPane().list(System.out);
}
public void actionPerformed(ActionEvent ae) {
String cmd = ae.getActionCommand();
try {
if (cmd.equals("btn_gozen")) {
//■2枚目の画面を貼り付け
getContentPane().removeAll();
KihonCore kihonC = new KihonCore();
kihonC.btnClk_MenuAm(getContentPane());
validate();
System.out.println("2画面目遷移後の画面状態");
getContentPane().list(System.out);
} else if (cmd.equals("btn_b01")) {
System.out.println("2画面目の1が押されました。");
} else if (cmd.equals("btn_b02")) {
System.out.println("2画面目の2が押されました。。");//
} else if (cmd.equals("btn_seiseki")) {
System.out.println("メニューボタン4が押下されました。");
} else if (cmd.equals("btn_syuuryou")) {
System.out.println("終了ボタンが押下されました。");
int option = JOptionPane.showConfirmDialog(null,"終了しますか?", "終了確認", JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.YES_OPTION) {
System.out.println("はいを選択:終了");
System.exit(0);
} else if (option == JOptionPane.NO_OPTION) {
System.out.println("いいえを選択:終了しない");
return;
}
} else if (cmd.equals("btn_return")) {
System.out.println("戻るボタンが押下されました。");
//■初期画面を貼り付け(初期メニュー画面を描写
getContentPane().removeAll();
KihonCore kihonC = new KihonCore();
kihonC.btnClk_Rtn(getContentPane());
validate();
System.out.println("2画面目にて戻るを押した直後の画面状態");
getContentPane().list(System.out);
}
} catch (Exception e) {
System.out.println("エラーが発生しました");
e.printStackTrace();
}
}
}
No.2ベストアンサー
- 回答日時:
補足ありがとうございます。
ざっと見たところ、KihonCoreの各メソッドで
Menu mn = new Menu();
でMenuクラスのインスタンスを生成しているのが変な動作の原因のような気がします。
Menuのインスタンスを生成した時点で別のフレーム(窓)を生成しています。
また、ボタンをアクションリスナーに登録していますが別フレームに登録していますので、
2つ目の画面から3つ目の画面に移るボタンを押したとしても
そのフレームでイベントは起こりません。
なので、KihonCoreのメソッドを呼ぶ際にMenu自身を引数とする等したほうが良いかもしれません。
lailai2580様
お忙しい中ご回答していただき、とてもうれしく思います。
大変わかりやすく、とても参考になりました!
なるほど、「Menu生成は起動イベントとして、あとで作り直そう」
と思っていたので盲点でした。知識不足でお恥ずかしいのですが
今の自分にはとても価値のある失敗だったと思います。
本来なら、ソースの修正を済まして「出来ました!」と報告するのが
礼儀だとは思いますが、別の作業が入ってしまい、ソースをいじるのは数日後になりそうです。申し訳ありません。
本を購入したり、知人に聞いたりして対応を考えていたのですが、
解決できず、ダメ元で初めてネットで書き込みさせていただきました。
わかりやすい回答、頭の中の疑問点が一気に無くなった感じです。
1日も早く質問に答えられる側になるよう、精進したいと思います。
本当にありがとうございました!
No.1
- 回答日時:
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, SpringLayout.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, SpringLayout.WEST, p01);
layout.putConstraint(SpringLayout.NORTH, btn_syuuryou, 480,SpringLayout.NORTH, p01);
layout.putConstraint(SpringLayout.WEST, btn_syuuryou, 623, 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);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
歩いた自慢大会
「めちゃくちゃ歩いたエピソード」を教えてください。 長時間でも長距離でも結構です。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
JPanelの切り替えと再描画
Java
-
Swing 編集不可でも選択可能なJTableセルの設定方法
Java
-
SwingでJtableのヘッダ行が表示されません
Java
-
-
4
JavaのswingでCardLayoutの画面遷移がしたいです
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
登録後、呼び出し元ページに戻...
-
遷移元を判定したい!
-
ポップアップでウィンドウを表...
-
三菱GOTの画面切り替えについて
-
ブラウザアドレスバーからのURL...
-
Androidで常時表示されるツール...
-
Javaプログラミングの質問にな...
-
phpBBのトップページ
-
ASP.NET 画面遷移前の状態を保...
-
Java-jspの画面入力値保持について
-
OracleForms ボタンが急に反応...
-
C言語で今まで表示していた画面...
-
プログラムの素朴な疑問
-
JSPから出力されたHTML画面のcl...
-
腕時計の時報をならないように...
-
ActiveWorkbook.Pathの一つ下の...
-
CGI(Perl)のメッセージボックス...
-
動的に作成したラジオボタンの...
-
javaでDBから取得したデータのJ...
-
フォームで同じ複数のnameで違...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三菱GOTの画面切り替えについて
-
C言語で今まで表示していた画面...
-
ASP.NET 画面遷移前の状態を保...
-
遷移元を判定したい!
-
Strutsの情報保持の仕方について
-
C# ログイン画面からメイン画面...
-
画面を隠す・消す方法を教えて...
-
Java-jspの画面入力値保持について
-
Wi-Fiのパスワードが指定なしと...
-
Javaプログラミングの質問にな...
-
FormのsubmitでFormの内容がnull
-
登録後、呼び出し元ページに戻...
-
ServletからServletへの値渡し
-
アドレスバーに引数を表示させ...
-
セッション切れでのリクエスト...
-
javaのstrutsを使った画面遷移...
-
JAVAのセッション変数の上書き...
-
Javascriptのhistory.back()が...
-
strutsで、JSP→アクションクラ...
-
Sessionがnullになりません。
おすすめ情報