退出Java GUI中的冲突

时间:2012-02-29 08:14:22

标签: java swing jframe dispose

我遇到了在我的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。为什么关闭一切?

3 个答案:

答案 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);