在actionPerformed方法中重构JFrame

时间:2014-03-05 21:45:18

标签: java swing user-interface jframe dispose

所以我目前有一个程序有2个窗口扩展JFrame

主窗口有一个打开新窗口的按钮(窗口2)。 Window2有自己定义的类,包含小部件和侦听器。目前,如果我在第二个窗口仍然打开的情况下不止一次按下主框架中的按钮,那么它将切换到该窗口,而不会创建一个新窗口(这正是我想要的)。

第二个窗口还有一些小部件,一个搜索字段和一个根据用户在JTextField中键入的内容填充的表格。问题是,一旦我关闭Window2并按下主窗口中的按钮重新打开它,就会出现相同的窗口,其中包含先前在搜索字段和填充表格中输入的文本。

问题是,我想这样做,以便一旦Window2关闭并重新打开,然后我创建一个全新的Window2实例,其中包含一个空的搜索字段和表格。我认为这适用于JFrame.DISPOSE_ON_CLOSE,但事实并非如此。

我的一些代码可能会更好地解释这一点:

public class MainWindow extends JFrame{

    /*
     * create widgets and panels in Main window
     */
    private Window2 ww = null;
    Button.addActionListener(new ActionListener() { // the button that opens 
                                                    //a new window

                @Override
                public void actionPerformed(ActionEvent e) {
                   if (ww==null) {  //creating the new window here
                       ww = new Window2();
                       ww.setTitle("Window2");
                       ww.setSize(600, 400);

                }
                ww.setVisible(true);
            });
    }


/*
 * Window 2
 */

public class Window2 extends JFrame { 

//add widgets and listeners

pack();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

1 个答案:

答案 0 :(得分:3)

您可以通过多种方式实现此目标,最简单的方法是检查窗口是否可见,例如......

public void actionPerformed(ActionEvent e) {
    if (ww==null || !ww.isVisible()) {
        ww = new Window2();
        ww.setTitle("Window2");
        // You should be using pack
        ww.setSize(600, 400);
    }
    ww.setVisible(true);
}

现在,说到这一点,通常不鼓励以这种方式使用多个帧,因为它让用户感到困惑,特别是当他们可能已经打开多个窗口做其他事情时,其他帧可能会“丢失”。

您应该考虑使用模式对话框,强制用户完成对话框的工作,并在完成后关闭它。这将阻止用户与父窗口交互,直到对话框关闭或使用CardLayoutJTabbedPane,允许您根据需要在视图之间切换。