
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で質問しましょう!
似たような質問が見つかりました
- Java Javaプログラミングの質問になります。 ボタンを押下した時に画面遷移して 画面から戻ってきた時のi 1 2023/06/26 07:50
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Ruby vscode 文字化け 1 2022/05/21 19:17
- その他(プログラミング・Web制作) uwscのCHKING関数の画像の認識がうまくいかない。 1 2022/06/18 20:55
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三菱GOTの画面切り替えについて
-
Java-jspの画面入力値保持について
-
CSVダウンロードでウィンド...
-
Javaプログラミングの質問にな...
-
location.hrefでページ切替時の...
-
javaのstrutsを使った画面遷移...
-
DirectX製ゲーム画面上に文字等...
-
登録後、呼び出し元ページに戻...
-
c++で画面を2分割にして片方...
-
C# ログイン画面からメイン画面...
-
Strutsでのセッション保持方法...
-
MFCプログラミング
-
【C#】 FormClosingのイベント...
-
JAVAのセッション変数の上書き...
-
フレームのあるWeb画面から、フ...
-
VBS/HTA:画面のサイズを取得す...
-
ボタンを押したあとに画像を表...
-
Tomcat JSPの文字コ...
-
alertでHTMLのコードが出て...
-
ServletからServletへの値渡し
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三菱GOTの画面切り替えについて
-
Java-jspの画面入力値保持について
-
location.hrefでページ切替時の...
-
遷移元を判定したい!
-
ServletからServletへの値渡し
-
C言語で今まで表示していた画面...
-
登録後、呼び出し元ページに戻...
-
画面遷移の際に確認ダイアログ...
-
FormのsubmitでFormの内容がnull
-
アドレスバーに引数を表示させ...
-
ASP.NET 画面遷移前の状態を保...
-
javaのstrutsを使った画面遷移...
-
Javascriptのhistory.back()が...
-
非アクティブな画面を操作する...
-
画面を隠す・消す方法を教えて...
-
検索画面→結果画面→検索画面と...
-
サブミット後、自動的に画面を...
-
ServletからHTMLページへの遷移...
-
C# ログイン画面からメイン画面...
-
セッション切れでのリクエスト...
おすすめ情報