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
的强引用,这意味着对象不能被垃圾收集