【问题标题】:GUI application shuts down before the Shutdown Hook message appearsGUI 应用程序在 Shutdown Hook 消息出现之前关闭
【发布时间】:2014-05-17 16:53:06
【问题描述】:

Java 新手在这里。这是交易: 我有以下简单的关机钩子:

class SHook implements Runnable {
public void run() {
    System.out.println("SH is done.");
}
}

我有一个带有 TextArea 的 GUI 应用程序,如果输出被重定向,那么消息就会显示在那里。它的窗口监听器再次非常简单:

public class MyAdapter extends WindowAdapter {
public void windowClosing(WindowEvent w){
    System.exit(0);
}
}

当我使用 [X] 按钮关闭 GUI 应用程序时,消息会在整个关闭之前显示一瞬间。这里没有错。

我想做的是:消息打印后,等待几秒钟,足以清楚地看到消息已打印。 在 run 方法中添加 sleepwait 或其他任何东西似乎都不起作用,因为应用程序仍会立即关闭。

我猜shutdown-hook实际上正在正常工作,只是应用程序不在乎并立即关闭GUI,而我的钩子在Java边缘的某个地方打印了它的消息。

正确吗?如果是,是否有任何简单的方法来确保 GUI 应用程序仅在关闭挂钩完成后关闭,而不使关闭挂钩成为非关闭挂钩?

【问题讨论】:

  • 您不能为此使用关闭挂钩,Swing 不一定会在那里显示任何内容。还有一个问题是您需要在 EDT 上运行 all GUI 代码 - 您的关闭挂钩违反了此规则。至于在关机时运行代码 - 编写 shutdown() 方法并调用它有什么问题吗?或者在您的主​​框架中添加一个onClose 侦听器?
  • 您提到的可能替代方案没有错,我很想知道是否有任何方法可以通过关闭挂钩来做到这一点。谢谢你的回答。

标签: java multithreading swing windowlistener shutdown-hook


【解决方案1】:

关于你的 JFrame 调用方法:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

然后确保使用 adWindowListener 方法将您的 WindowAdapter 添加到 JFrame

然后在windowClosing 中输入一些 println 以查看它何时被调用,当然如果您想关闭框架,请在windowClosing 中使用System.exit(0)

【讨论】:

  • 这不是我想要的,我想用关机挂钩来做到这一点,但似乎不可能。还是谢谢。
  • windowClosing 方法是您的关闭挂钩。您可以在退出应用程序之前检查所有数据是否已保存并通知用户。
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2011-02-09
  • 2023-03-12
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多