「みんな教えて! 選手権!!」開催のお知らせ

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();
}
}
}

A 回答 (2件)

補足ありがとうございます。



ざっと見たところ、KihonCoreの各メソッドで
Menu mn = new Menu();
でMenuクラスのインスタンスを生成しているのが変な動作の原因のような気がします。
Menuのインスタンスを生成した時点で別のフレーム(窓)を生成しています。
また、ボタンをアクションリスナーに登録していますが別フレームに登録していますので、
2つ目の画面から3つ目の画面に移るボタンを押したとしても
そのフレームでイベントは起こりません。
なので、KihonCoreのメソッドを呼ぶ際にMenu自身を引数とする等したほうが良いかもしれません。
    • good
    • 0
この回答へのお礼

lailai2580様
お忙しい中ご回答していただき、とてもうれしく思います。

大変わかりやすく、とても参考になりました!
なるほど、「Menu生成は起動イベントとして、あとで作り直そう」
と思っていたので盲点でした。知識不足でお恥ずかしいのですが
今の自分にはとても価値のある失敗だったと思います。

本来なら、ソースの修正を済まして「出来ました!」と報告するのが
礼儀だとは思いますが、別の作業が入ってしまい、ソースをいじるのは数日後になりそうです。申し訳ありません。

本を購入したり、知人に聞いたりして対応を考えていたのですが、
解決できず、ダメ元で初めてネットで書き込みさせていただきました。

わかりやすい回答、頭の中の疑問点が一気に無くなった感じです。
1日も早く質問に答えられる側になるよう、精進したいと思います。

本当にありがとうございました!

お礼日時:2008/09/25 14:17

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);
}

補足日時:2008/09/22 10:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報