Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用actionPerformed方法重构JFrame_Java_Swing_User Interface_Jframe_Dispose - Fatal编程技术网

Java 用actionPerformed方法重构JFrame

Java 用actionPerformed方法重构JFrame,java,swing,user-interface,jframe,dispose,Java,Swing,User Interface,Jframe,Dispose,所以我现在有一个程序,它有两个窗口扩展JFrame 主窗口有一个打开新窗口(窗口2)的按钮Window2有自己定义的带有小部件和侦听器的类。此时,如果我在第二个窗口仍然打开时多次按下主框架中的按钮,则它将切换到该窗口,而不会创建新窗口(这正是我想要的) 第二个窗口还有一些小部件、一个搜索字段和一个根据用户在JTextField中键入的内容填充的表。问题是,一旦我关闭窗口2并按下主窗口中的按钮重新打开它,搜索字段和填充的表格中会出现与先前输入的文本相同的窗口 问题是,我想这样做,一旦关闭并重新打开

所以我现在有一个程序,它有两个窗口扩展
JFrame

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

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

问题是,我想这样做,一旦关闭并重新打开
Window2
,我就会创建一个全新的
Window2
实例,其中包含一个空的搜索字段和表。我原以为这对JFrame.DISPOSE\u ON\u 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);
}

有很多方法可以实现这一点,最简单的方法是检查窗口是否可见,例如

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);
}
话虽如此,一般不鼓励以这种方式使用多个帧,因为这会让用户感到困惑,特别是当他们可能已经打开多个窗口做其他事情时,其他帧可能会“丢失”


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

使用CardLayout和JFrame.pack()不要使用多个JFrame-有关详细信息,请查看此处,很遗憾,我必须,这是我学校项目的一项要求。如果在
Window2
关闭时,向
Window2
添加一个调用
Window1
上的方法的
WindowListener
(),该怎么办。该方法可以将
ww
设置为null,这将迫使
Window1
中的
ActionListener
在单击按钮时创建
Window2
的新实例。让我知道这是否有效,我会把它写下来,作为一个答案。+1-这是一个比我评论中的想法好得多的解决方案,尽管我不得不考虑是否会有某种资源泄漏(我有理由相信不会)。不太确定模态对话的建议-有时多帧是最好的解决方案。“我认为我们必须相信OP知道她真正想要实现什么。”戴维德瓦莱斯同意,完全缺乏背景并没有帮助,但我们也应该从经验中吸取教训。这些只是可能有助于解决长期问题或工作流程的备选方案。作为开发人员和用户,我知道多帧是后端的一大难题……非常感谢。您能告诉我为什么在这种情况下DISPOSE\u ON\u CLOSE不起作用吗?
DISPOSE\u ON\u CLOSE
处理帧渲染到的本机对等对象(想想窗口句柄),它不会处理您创建的
JFrame
对象的实例-否则您将运行到
NullPointerExceptions
,但Java不是这样工作的。通过
ww
变量,仍然有一个对
JFrame
的强引用,这意味着对象不能被垃圾收集