2

基本上,我想做的是JFrame在同一个类中用一个按钮关闭 a 。我有 2 节课Class1Class2. 当我点击“添加数据”按钮时Class1,它会打开Class2(有点像一个对话框),Class2当我点击“完成”按钮时我想关闭它。

-------------------------------------------Class1------ -------------

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
        }

    }

}

-------------------------------------------Class2------ -------------

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

我不明白在 doneActionListener 中对 co2 的需求。我相信您可以通过将最后几行更改为:

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

不过,我没有测试它。如果解决方案有效,请告诉我。

于 2012-05-31T11:20:26.203 回答
2
  • 不要创建多个JFrame,如果您需要弹出窗口,请查看带有父级的JDialogJFrame

  • 不要扩展JFrame,您必须创建局部变量,否则您不能在层次结构中丢失对此ObjectJComponents引用

  • 我会改用CardLayout关于 CardLayout 的教程

  • 隐藏JFrame你必须JFrame#setDefaultCloseOperation(HIDE_ON_CLOSE)或从JButtons ActionListener代码调用JFrame#setVisible(false)

于 2012-05-31T11:23:00.167 回答
0

我实际上是在寻找相同的答案,发现在ActionListener与您对应的部分中,JButton您应该插入

this.setVisible(false);

this.dispose();

只是终止并隐藏当前JFrame和父级JFrame将恢复,而整个程序终止包括

System.exit(0);

这将使所有的JFrame's dissapear

于 2014-07-23T11:33:23.030 回答
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 回答