使用同一类的按钮关闭JFrame

时间:2012-05-31 11:16:04

标签: java swing jframe

基本上,我想做的是用同一个班级的按钮关闭JFrame。我有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个月前开始)。对不起,如果我不够清楚。在此先感谢:)

5 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:2)

我不明白在doneActionListener中需要co2。我相信你可以通过将最后一行改为:

来解决这个问题
   this.setVisible(false);
   this.dispose();
但是,我没有测试它。如果解决方案有效,请告诉我。

答案 2 :(得分:2)

  • 不要创建多个JFrame,如果您需要弹出窗口,请JDialog与父母JFrame

  • 不扩展JFrame,您必须创建局部变量,否则您无法在Object hierachry

    <中失去对此JComponents的引用/ LI>
  • 我改用CardLayouttutorial about CardLayout

  • 隐藏JFrame,您必须JFrame#setDefaultCloseOperation(HIDE_ON_CLOSE)或致电JButtons ActionListener代码JFrame#setVisible(false)

答案 3 :(得分: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);

答案 4 :(得分:0)

我实际上是在搜索相同的答案,并发现在您ActionListener对应的JButton中应插入

this.setVisible(false);

this.dispose();

只是终止并隐藏当前JFrame,而父JFrame将继续这样,而整个程序终止包括

System.exit(0);

这将使所有JFrame的消失