我遇到了在我的Java程序中修复两个GUI的另一个问题。假设我们有一个新的JFrame:
public class guiOne {
public static void main (String [] agrs) {
JFrame f = new JFrame();
JButton b = new JButton();
JPanel p = new JPanel();
b.setSize(100,100);
f.setTitle("New JFrame");
f.setVisible(true);
f.setSize(300,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p.add(b);
f.add(b);
}
当我点击新按钮时,会出现一个新的JFrame。我得到的问题是当我添加此代码时:
System.exit(guiOne);
所有退出。我只想在启动新的JFrame后立即退出guiOne。为什么关闭一切?
答案 0 :(得分:2)
在这种情况下,您应该使用f.dispose()
。 System.exit
停止整个jvm。请注意,您可以在框架上使用setDefaultCloseOperation
,以便使用窗口管理器挂钩(例如Alt-F4等)将其关闭。
public static void main(String[] args) {
final JFrame frame = new JFrame("Test");
frame.add(new JButton(new AbstractAction("Open new frame") {
@Override
public void actionPerformed(ActionEvent e) {
// create new frame
JFrame newFrame = new JFrame("New Frame");
newFrame.add(new JLabel("new frame..."));
newFrame.pack();
newFrame.setVisible(true);
newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// dispose the old frame
frame.dispose();
}
}));
frame.pack();
frame.setVisible(true);
}
答案 1 :(得分:2)
f.setVisible(true);
必须是Container
1)永远不要将新的JFrame创建为另一个顶级容器,如果需要,可以使用JDialog与父JFrame
和/或setModal()/ ModalityTypes
2)不要创建新的Top-Level Container
,一次创建此容器并将其重用于getComtentPane.removeAll()
3)你看了CardLayout的简单易用的实现,在屏幕上与另一个JFrame/JDialog
一起玩时更加难以理解
4)JTabbedPane是另一种方法
答案 2 :(得分:1)
这实际上取决于窗户关闭时你想要发生什么。 EXIT_ON_CLOSE表示JVM将在窗口关闭时关闭,这通常不是您想要发生的事情。 DISPOSE_ON_CLOSE将释放JFrame所拥有的资源,并且是用于未经常打开的窗口的内容。 HIDE_ON_CLOSE适用于您只希望窗口不可见但仍保持资源的情况。使打开窗口更快,并在您反复使用窗口时使用。
我建议你做以下事情:
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);