【问题标题】:Exit Conflicts in Java GUIJava GUI 中的退出冲突
【发布时间】:2012-02-29 08:14:21
【问题描述】:

在我的 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);

所有退出。我只希望 guiOne 在我启动新的 JFrame 后立即退出。为什么它会关闭所有内容?

【问题讨论】:

    标签: java swing jframe dispose


    【解决方案1】:

    f.setVisible(true); 必须是容器构造函数中的最后一行代码

    1) 永远不要创建一个新的 JFrame 作为另一个顶级容器,将 JDialogJFrame 的父级一起使用和/或在需要时与 setModal()/ ModalityTypes 一起使用

    2) 不要创建新的Top-Level Container,创建这个容器一次,然后用getComtentPane.removeAll() 重复使用它

    3) 您可以查看 CardLayout 以获得简单易用的实现,与屏幕上的另一个 JFrame/JDialog 一起玩更舒适

    4) JTabbedPane 是另一种方法

    【讨论】:

      【解决方案2】:

      这真的取决于你想在窗户关闭时发生什么。 EXIT_ON_CLOSE 意味着 JVM 将在窗口关闭时关闭,这通常不是您想要发生的。 DISPOSE_ON_CLOSE 将释放 JFrame 持有的资源,并且是您用于不经常打开的窗口的资源。 HIDE_ON_CLOSE 用于当您只希望窗口不可见但仍保持对资源的控制时。使打开窗口更快,并且在您将反复使用窗口时使用。

      我建议您执行以下操作:

      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      

      【讨论】:

        【解决方案3】:

        在这种情况下,您应该改用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);
        }
        

        【讨论】:

        • 你能解释一下 throws IOexception 的作用吗?谢谢
        • 哦,好吧。我一直在阅读一些Java代码,无法理解extends和implements以及throws的区别。
        猜你喜欢
        • 2015-02-03
        • 2019-05-02
        • 1970-01-01
        • 2011-09-24
        • 2012-10-06
        • 2016-12-09
        • 2011-11-26
        • 2019-03-03
        • 2012-12-23
        相关资源
        最近更新 更多