2

基本的に、私がやりたかったJFrameのは、同じクラスのボタンでを閉じることです。私は2つのクラスClass1とを持っていClass2ます。の[データの追加]ボタンをクリックするClass1と開きClass2(ダイアログボックスのようなもの)、[Class2完了]ボタンをクリックすると閉じます。

-------------------------------クラス1------------------ -------------

public class Class1 extends JFrame{

private JPanel contentPane;

      public Class1(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 355, 251);
        contentPane = new JPanel();
        contentPane.setBackground(Color.WHITE);
        contentPane.setForeground(Color.BLACK);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

//Add labels and other relevant content here

        JButton addData = new JButton("Add Data");
        addData.setBounds(32, 135, 130, 23);
        contentPane.add(addData);
        addData.addActionListener(new addDataActionListener());
      }
class addDataActionListener implements ActionListener{

        public void actionPerformed(ActionEvent arg5) {
            Class2 co = new Class2();
            co.setVisible(true);
        //opening the Class2 JFrame
        }

    }

}

-------------------------------クラス2------------------ -------------

public class Class2 extends JFrame {

    private JPanel contentPane;

      public Class2(){
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(100, 100, 415, 238);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

//Add labels and other relevant content here

        JButton done = new JButton("Done");
        done.setBounds(206, 164, 89, 23);
        contentPane.add(done);
        done.addActionListener(new doneActionListener());
      }

    class doneActionListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {

        //add stuff that needs to be done

            Class2 co2 = new Class2();
            co2.setVisible(false);
            co2.dispose();
}

ただし、[完了]ボタンをクリックすると、他のすべてのアクションが実行されますが、Class2のフレームは閉じられません。誰かがそれがどのように行われたかを私に知らせてくれれば幸いです。

追伸 私はJavaを初めて使用します(約4か月前に開始しました)。はっきりしていなくてごめんなさい。前もって感謝します :)

4

5 に答える 5

3

あなたdoneActionListenerのは間違ったことをしている。

コードはClass2、現在開いているインスタンスを閉じるのではなく、実際に新しいインスタンスを作成して閉じています。

これを試して:

class doneActionListener implements ActionListener{

    private JFrame toBeClose;

    public doneActionListener(JFrame toBeClose) {
        this.toBeClose = toBeClose;
    }

    public void actionPerformed(ActionEvent e) {
        toBeClose.setVisible(false);
        toBeClose.dispose();
    }
}

public Class2(){   
    // other code 
    // pass this to doneActionListener to be close
    done.addActionListener(new doneActionListener(this));
}
于 2012-05-31T11:21:23.570 に答える
2
  • 複数のJFrameを作成しないでください。ポップアップウィンドウが必要な場合は、親を使用してJDialogを確認してください。JFrame

  • 拡張しないJFrameでください。ローカル変数を作成する必要があります。そうしないObjectと、JComponents階層内でこの参照を失うことはありません。

  • 代わりにCardLayoutを使用します。CardLayoutに関するチュートリアル

  • 非表示のJFrame場合は、コードJFrame#setDefaultCloseOperation(HIDE_ON_CLOSE)から呼び出すか、JButtons ActionListenerコードから呼び出す必要がありますJFrame#setVisible(false)

于 2012-05-31T11:23:00.167 に答える
2

doneActionListenerでのco2の必要性を理解していませんでした。最終行を次のように変更することで、この問題を解決できると思います。

   this.setVisible(false);
   this.dispose();

しかし、私はそれをテストしませんでした。解決策が機能するかどうか教えてください。

于 2012-05-31T11:20:26.203 に答える
0

* doneActionListenerでこれらの変更を試してください*

   class doneActionListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {

        //add stuff that needs to be done

            SetVisible(false); //since its already extending the JFrame

    }

または単に.... System.exit(0);を使用します。

于 2012-05-31T11:44:07.503 に答える
0

私は実際に同じ答えを探していましたが、ActionListenerあなたに対応するものにJButton挿入する必要があることがわかりました

this.setVisible(false);

this.dispose();

現在のプログラムを終了して非表示にすると、プログラム全体が終了する間JFrame、親はそのように再開します。JFrame

System.exit(0);

これにより、すべてJFrameのが消えます

于 2014-07-23T11:33:23.030 に答える