Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

パネル遷移のさいの値の受け渡しについて

例として
Panel1のtextFieldに数字を入力しbutton1を押すと
数字がインクリメントされた後、Panel2にパネル遷移し
labelにインクリメントされた数字が表示されるはず
というものを作ってみたのですが
Panel2にPanel1で入力した数字を受け渡すことが
できません。
どなたか原因のわかる方、アドバイスしていただけると
幸いです。

長くなりすぎてしまうので、コンポーネントやレイアウト
の宣言などの部分は割愛させていただきます

//MainFrameはボーダーレイアウト
public class MainFrame extends javax.swing.JFrame{
  //パネルの遷移するためのフラグ
    private boolean changeFlag1=true;
    private boolean changeFlag2;
    Panel1 p1;
    Panel2 p2;
    public MainFrame(){
        this.p1=new Panel1(this);
        this.p2=new Panel2(this);
        changePage();
    }
  //パネルを遷移させるためのメソッド
    public void changePage(){
        if(changeFlag1==true){
            setChangeFlag1(false);
            setChangeFlag2(false);
            getContentPane().add(p1);
            getContentPane().remove(p2);
            pack();
        }
        if(changeFlag2==true){
            setChangeFlag1(false);
            setChangeFlag2(false);
            getContentPane().add(p2);
            getContentPane().remove(p1);
            pack();
        }
    }
    public void setChangeFlag1(boolean changeFlag1){
        this.changeFlag1=changeFlag1;
    }
    public void setChangeFlag2(boolean changeFlag2){
        this.changeFlag2=changeFlag2;
    }
}
//インクリメントされる値を入力するためのクラス
public class Panel1 extends javax.swing.JPanel{
    MainFrame mf;
    Increment in;
    int num;
    public Panel1(MainFrame mf){
        this.mf=mf;
    }
    private void button1MouseClicked
(java.awt.event.MouseEvent evt){
        in=new Increment(Integer.parseInt(textField.
getText());
        mf.setChangeFlag1(true);
        mf.changePage();
    }
    //インクリメント後の値を返すためのメソッド
    public int getNum(){
        return num;
    }
}
//インクリメントされた値を表示するためのクラス
public class Panel2 extends javax.swing.JPanel{
    MainFrame mf;
    Increment in;
    Panel1 p1;
    public Panel2(MainFrame mf){
        this.mf=mf;
    }
    private void button2MouseClicked(java.awt.event.MouseEvent evt){       
        mf.setChangeFlag2(true);
        mf.changePage();
    }
    private void formAncestorAdded(javax.swing.event.AncestorEvent evt){
    p1=new Panel1(mf);
    in=new Increment(p1.getNum());
    label.setText(String.valueOf(in.getNum()));
    }
}
//引数をインクリメントして返すためのクラス
public class Increment{
    int num;
    public Increment(int num){
        num++;
        this.num=num;
    }
    public int getNum(){
        return num;
    }
}

2

回答

6563

閲覧

2件の回答

評価

0

Panel2#formAncestorAdded() メソッド内にて、
>   p1=new Panel1(mf);
Panel1 を new していますが、
これは、
MainFrame()内で、new されている
>        this.p1=new Panel1(this);
とは別のインスタンスになります。

ですから、

Panel2#formAncestorAdded() メソッド内にて、
> p1.getNum()
をしても、MainFrame内のp1は取れませんよ。

値の受け渡しをしたいなら、同一のインスタンスを参照してみてください。

評価

0

やんちさんのご指摘通り
MainFrameに
//getterメソッド
public Panel1 getP1(){
        return p1;
}
を追加し、
Panel2の
p1=new Panel1(mf);を
p1=mf.getP1();
というように変更したら
問題解決しました。
どうもありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。