【问题标题】:How do I program an exit for one window that won't close other windows that are open?如何为一个不会关闭其他打开的窗口的窗口编程退出?
【发布时间】:2014-05-20 21:02:32
【问题描述】:

我正在创建一个简单的文本编辑器,但遇到了一个小问题。通过单击菜单中的新按钮,我可以打开并打开几个用于创建文本文档的新窗口。我的问题是,如果我从菜单中单击“文件”,然后单击“退出”,它会关闭所有窗口,而不仅仅是我想要关闭的那个。我该怎么做才能关闭所选窗口而不是整个应用程序。

这里有一些代码:

public void actionPerformed(ActionEvent event) {
    if(event.getSource() == newFile) {
        new EditorGUI();
    } else if(event.getSource() == openFile) {
        JFileChooser open = new JFileChooser();
        open.showOpenDialog(null);
        File file = open.getSelectedFile();             
        openingFiles(file);
    }  else if(event.getSource() == exit) {
        System.exit(0);
    }
}

但是,当我单击窗口右上角的 X 时,它可以工作:

private JFrame createEditorWindow() {
    editorWindow = new JFrame("JavaEdit");
    editorWindow.setVisible(true);
    editorWindow.setExtendedState(Frame.MAXIMIZED_BOTH);
    editorWindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    // Create Menu Bar
    editorWindow.setJMenuBar(createMenuBar());
    editorWindow.add(scroll, BorderLayout.CENTER);
    editorWindow.pack();
    // Centers application on screen
    editorWindow.setLocationRelativeTo(null);

    return editorWindow;
}

截图:

【问题讨论】:

  • 请参阅The Use of Multiple JFrames, Good/Bad Practice?,了解为什么通常不建议使用多帧的一些背景知识。 OTOH 这听起来像是为数不多的“角落案例”之一,其中拥有多个框架实例(每个正在编辑的文档一个)可能对用户有意义。在这种情况下,向下滚动到讨论该用例的其他一些答案。

标签: java swing


【解决方案1】:

不要使用多个框架。一个应用程序应该只有一个主 JFrame。

那么子窗口应该是JDialog。 JDialog 将仅支持DISPOSE_ON_CLOSE,因此您不必担心退出应用程序。

【讨论】:

  • JDialog 会为我提供相同的功能吗?
  • 是的,它有一个内容窗格,就像 JFrame 一样。
  • 我不得不说,我认为这是多个帧实际上有意义的“极端情况”之一。 AFAIU 有 3 种用于多文档编辑器的基本方法。 1) 带有选项卡式窗格的框架。每个文档的选项卡。 2) 一个带有桌面窗格/内部框架的框架。每个文档的内部框架。 3) 分离框架。每个文件一个。 -- (1) 可能是一个合适的替代方案,尽管作为用户,我可能更喜欢在该框架和单独框架之间进行选择。
  • 同意您可以使用多个框架,这会导致在任务栏上显示多个框架并可能导致窗口混乱。但是,如果 OP 确实使用了这种方法,那么所有帧都应该使用 DISPOSE_ON_CLOSE。
【解决方案2】:

这似乎也能解决问题:

if(event.getSource() == exit) {
    editorWindow.dispose();
}

【讨论】:

  • -1,是的,它可以解决问题,但最好正确地设计您的应用程序。通过您使用的其他应用程序学习,例如您正在查看此论坛的浏览器。浏览器有一个主窗口,然后当您单击某些菜单项时,会根据需要显示一个 JDialog。
  • 这是一个公平的观点。我将这个项目提交给 Code Review 网站,以获得关于更好、更简洁的代码结构的建议,所以如果我不听从你的建议,那就太虚伪了:-P
  • 在我的回答中查看 Andrew 的评论。有可能使用多个框架(我仍然认为这不是一个好的选择,请再次考虑您当前可能使用的现有编辑器)。
  • 是的,选项卡式窗格似乎是编辑器中的一个不错的功能,所以我可能会恢复到类似的东西!
【解决方案3】:

您可以编写如下代码:

private JFrame createEditorWindow() {
    JFrame editorWindow = new JFrame("JavaEdit");
    editorWindow.setExtendedState(JFrame.MAXIMIZED_BOTH);
    editorWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    editorWindow.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent event) {
            exitProcedure();
        }
    });
    // Create Menu Bar
    editorWindow.setJMenuBar(createMenuBar());
    editorWindow.add(scroll, BorderLayout.CENTER);
    editorWindow.pack();
    // Centers application on screen
    editorWindow.setLocationRelativeTo(null);

    editorWindow.setVisible(true);
    return editorWindow;
}

public void exitProcedure() {
    editorWindow.dispose();
}

您在 JMenuUtem 操作侦听器中为 Exit 执行 exitProcedure。

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多