在 java/swing 中关闭窗口时采取的正确操作是什么?

2023-11-26

我刚刚在我的 CustomUIPanel 类中编写了这个测试代码:

public static void main(String[] args) {
    final JDialog dialog = CustomUIPanel.createDialog(null, 
       CustomUIPanel.selectFile());
    dialog.addWindowListener(new WindowAdapter() {
        @Override public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
}

它可以正常工作,如果CustomUIPanel.main()是程序的入口点,但这让我想知道:如果另一个类调用怎么办?CustomUIPanel.main()供测试用?然后我打电话给System.exit(0)是不正确的。

如果没有顶级窗口,有没有办法告诉 Swing 事件调度线程自动退出?

如果不是,如果目标是在所有顶级窗口关闭时退出程序,那么 JDialog/JFrame 在关闭时应该做什么?


您可以使用setDefaultCloseOperation()的方法JDialog,指定DISPOSE_ON_CLOSE:

setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

也可以看看12.8 程序退出.

附录:结合@camickr的有用答案,当窗口关闭或按下关闭按钮时,此示例退出。

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;

/** @see http://stackoverflow.com/questions/5540354 */
public class DialogClose extends JDialog {

    public DialogClose() {
        this.setLayout(new GridLayout(0, 1));
        this.add(new JLabel("Dialog close test.", JLabel.CENTER));
        this.add(new JButton(new AbstractAction("Close") {

            @Override
            public void actionPerformed(ActionEvent e) {
                DialogClose.this.setVisible(false);
                DialogClose.this.dispatchEvent(new WindowEvent(
                    DialogClose.this, WindowEvent.WINDOW_CLOSING));
            }
        }));
    }

    private void display() {
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new DialogClose().display();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 java/swing 中关闭窗口时采取的正确操作是什么? 的相关文章

随机推荐

  • 获取流中符合条件的第一个元素

    如何获取流中与条件匹配的第一个元素 我已经尝试过这个但不起作用 this stops stream filter Stop s gt s getStation getName equals name 该标准不起作用 过滤器方法是在 Stop
  • 使用 Powershell 将 XML 转换为哈希表

    我想转换 XML
  • 扩展打字稿接口

    在 TypeScript 中扩展 Express Request 接口时 我遇到了这个问题 我想使用外部库定义 但无法导入外部库 因为它会导致错误 gt 错误 4 28 TS1147 内部模块中的导入声明无法引用外部模块 编辑 这是一个 d
  • ReferenceError:未定义要求

    我目前正在开发 Mozilla Firefox 插件 我已经设置了一个面板并附加了一个内容脚本 我需要在内容脚本和 main js 之间进行通信 我为此使用 addon sdk 的端口 api 然而由于某种原因 我什至无法在两者之间传递简单
  • 向量储备 C++

    我有一个非常大的多维向量 其大小一直在变化 当我只知道大小的近似值时 使用 vector reserve 函数有什么意义吗 所以基本上我有一个向量 A 256 256 x y 其中 程序中的每次迭代 x 都会从 0 变化到 50 然后再次变
  • Spark 数据帧的 null 值和 countDistinct

    我有一个非常简单的数据框 df spark createDataFrame None 1 3 2 1 3 2 1 3 a b c a b c null 1 3 2 1 3 2 1 3 当我申请一个countDistinct在此数据框上 我发
  • UISearchDisplayController 自动释放如何导致不同视图控制器崩溃?

    我有两个视图控制器 A 和 B 从 A 我导航到视图控制器 B 如下所示 in View Controller A navigateToB method void navigateToB BViewController bViewContr
  • 我可以避免 .NET 中的 JIT 吗?

    假设我的代码是否始终在特定处理器上运行 并且如果我在安装过程中拥有此信息 我是否有机会避免 JIT Use NGEN 本机映像生成器 Ngen exe 是一种可提高托管应用程序性能的工具 Ngen exe 创建本机映像 这些映像是包含已编译
  • 如何让 Internet Explorer 8 支持第 n 个 child() CSS 元素?

    我想为我的表格行提供斑马条纹效果 在所有其他浏览器中 可以使用 CSS 第 n 个子元素来完成 但我也想在 IE 8 上这样做 那么我该怎么做呢 使用填充 选择性就足够好了 没有polyfill 由于IE8支持第一个孩子 你可以欺骗它来支持
  • Cookie 中允许使用哪些字符?

    Cookie 名称和值中允许使用哪些字符 它们与 URL 或某些公共子集相同吗 我问的原因是我最近遇到了一些奇怪的 cookie 行为 这些行为 以他们的名字命名 我只是想知道这是否是特定于浏览器的 或者我的代码是否有问题 根据古老的网景c
  • find 缺少选项 -printf,现在怎么办?

    我还没有找到Mac的find没有 printf选项的原因 苹果通常会决定去掉与其他命令不正交的选项 如何在 Mac 中达到与以下命令相同的结果没有 coreutils find printf i n command in Ubuntu 这并
  • 如何在eclipse中导入com.sun.javadoc.*?

    导入 com sun javadoc eclipse 向我报告此错误 导入 com sun javadoc 无法解析 似乎未安装该包 查看网站http download oracle com javase 1 5 0 docs guide
  • 如果构造函数的参数非法,则阻止类的实例化?

    我有一个公共构造函数 它接受一个参数 int Age 来创建一个对象 我想检查传递的参数是否合法 例如年龄不能为负数 如果非法 则不要创建对象 实例 如果合法的话没问题 我只能想到一种方法来做到这一点 将构造函数设为私有 创建一个带有参数
  • 什么是未定义的引用/未解析的外部符号错误以及如何修复它?

    什么是未定义的引用 未解析的外部符号错误 常见原因有哪些 如何修复和预防这些错误 假设您有以下代码 a cpp int get return 0 b cpp int get usually one doesn t write this di
  • JQuery 检测标签是否自关闭

    有没有办法像图像标签一样使用 JQuery 检测标签是否自动关闭 动态的东西不仅仅是图像标签 if selector 0 tagName toLowerCase img do something jQuery 在内部使用这个列表 area
  • Flutter - 未处理的异常:FormatException:意外的字符(在字符 1 处)|响应实例

    当我获取 api 时 控制台显示如下错误 E flutter 10838 错误 flutter lib ui ui dart state cc 157 未处理的异常 FormatException 意外的字符 在字符 1 处 E flutt
  • Git 错误:[远程拒绝] master -> master(缺少必要的对象)

    我对 git 有一个相当令人担忧的问题 几天前 当服务器 git 出现蓝屏时 我正在提交一些更改 我们认为这实际上是由 git 引起的 从那时起 我无法向存储库提交任何更改 而其他人可以 我无法再对服务器崩溃时提交的文件提交更改 但是我可以
  • 如何不硬编码密码?

    在我的最后一个问题 用于存储秘密的便携式数据库 中迄今为止最好的答案告诉使用 sqlite crypt 阅读 sqlite crypt 文档 打开数据库的新参数是密码 当然 我不想对密码进行硬编码 所以我在想存储密码的最佳 简单且快速的方法
  • 让 CMake 声明一个虚假目标

    我想生成一些compile时间常数 这第一个答案另一个问题让我非常接近 来自我的 CMakeLists txt add library PROJECT NAME STATIC CXX SRCS compile time hpp add cu
  • 在 java/swing 中关闭窗口时采取的正确操作是什么?

    我刚刚在我的 CustomUIPanel 类中编写了这个测试代码 public static void main String args final JDialog dialog CustomUIPanel createDialog nul