【问题标题】:Reject a OS X system shutdown拒绝 OS X 系统关机
【发布时间】:2013-02-10 16:14:53
【问题描述】:

我们有一个 SWT 应用程序,当它仍在运行时会导致挂起,并且用户在 OS X 上触发系统关闭。从应用程序菜单关闭应用程序可以正常工作。

我尝试将SWT.Close 监听器注册到Display 实例:

display.addListener(SWT.Close, new Listener() {
    @Override
    public void handleEvent(Event event) {
        if (!handleExitRequest()) {
            event.doit = false;
            event.type = SWT.None;
        }
    }
});

这神奇地解决了挂起,但不幸的是,退出时调用它并不可靠。 :(

【问题讨论】:

  • 您是否尝试使用Shutdown Hook 清理和关闭 SWT 内容?
  • 没有。 IIRC,当虚拟机退出时会触发关闭挂钩,但我的虚拟机只是挂起。
  • 你能用几句话解释一下“魔法”吗?此行检查什么:if (!handleExitRequest())?我想看看完整的方法。
  • handleExitRequest 是我们代码中的一个方法,如果应用程序可以直接退出(例如,没有未保存的更改),它将返回 true。如果它现在不能退出,它返回false。我认为这很明显。
  • 您的问题解决了吗?如果是,如何?如果您能发布答案,那就太好了。通知我们有关 Mac 上的 SWT 问题...

标签: java macos swt


【解决方案1】:

我在主线程上监听关闭挂钩的结果好坏参半。有时它有效,有时则无效。过去对我有用的是创建一个单独的线程并将关闭挂钩注册到该线程。

public class MyGuiApplication
{
    public static void main( String[] args )
    {
        Runtime runtime = Runtime.getRuntime();
        Thread shutdownThread = new Thread(new Runnable()
        {
          @Override
          public void run()
          {
            // Put graceful shutdown code of the main application/thread here.
          }
        });

        runtime.addShutdownHook( shutdownThread );

        startMyApp();
    }
}

希望这对你有用。

【讨论】:

  • 我不是在询问关闭挂钩。如果系统要关闭,我要求获得通知,以便我的应用程序可以干净地退出或拒绝关闭,例如当有未保存的更改时。
  • 据我所知,Java 中没有办法让您真正拒绝操作系统关闭。此外,您没有明确指出您在最初提出的问题中的目标是什么。如果您想要更好的答案,您可能需要编辑您的问题并准确说明您要做什么。
  • 您有什么理由不想使用这种方法而不是尝试以您的方式解决问题?似乎最好不要正确挂起和关闭,而不是阻止用户请求的操作(关闭)。 ??
  • 关闭钩子不是获取您正在寻找的通知的方式吗?你的关机钩子不能调用你从上面的 Display.Close 调用的代码吗?对不起,如果那不正常。我不做 SWT 应用程序。
  • 恕我直言,如果调用了System.exit,则会调用shutdownhook。无法中止此 VM 关闭!这对于清理资源很有用。但这不是这里的问题。
【解决方案2】:

看看这个class和这个class

Application 类允许您将 Java 应用程序与本机 OS X 环境集成。 ... 如果用户在您的应用程序中有未保存的更改,请取消关闭/注销。

你也可以看看以下问题:

How to cancel shutdown in Mac OS X when application is an agent?

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2013-04-13
    • 2012-07-16
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多