【问题标题】:How can I get my basic SWT application to exit properly in Mac OS X 10.5.6?如何让我的基本 SWT 应用程序在 Mac OS X 10.5.6 中正确退出?
【发布时间】:2010-10-03 17:56:30
【问题描述】:

我有以下 SWT 测试代码:

public static void main(String[] args) {
    shell = new Shell();
    shell.setText(APP_NAME + " " + APP_VERSION);
    shell.addShellListener(new ShellListener() {
        public void shellActivated(ShellEvent event) { }
        public void shellClosed(ShellEvent event) { exit(); }
        public void shellDeactivated(ShellEvent event) { }
        public void shellDeiconified(ShellEvent event) { }
        public void shellIconified(ShellEvent event) { }
    });     
    shell.open();
    display = shell.getDisplay();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

我的exit()方法如下:

private void exit() {
    System.exit(0);
}

我尝试通过关闭外壳(“窗口”)或拉下应用程序菜单(标记为“SWT”)并选择“退出”来退出应用程序。

当我这样做时,Dock 中留下了一个 SWT 存根,并且 SWT 应用程序实际上并没有退出。我必须通过 Eclipse 或 Force Quit 手动终止 SWT 应用程序。

我已经在 Mac OS X 10.5.6 (Intel) 下的 Eclipse 3.4.1 下使用 v3.4 和 v3.5 SWT jar 进行了尝试。

我是否需要做额外的工作才能在我关闭 shell 时退出应用程序?

【问题讨论】:

    标签: java macos swt


    【解决方案1】:

    您没有正确释放本机资源 - 您有资源泄漏。

    你不需要这样做:

    private void exit() {
        System.exit(0);
    }
    

    当 shell 被释放时 main 方法将退出。如果您必须使用退出方法,请在释放所有 SWT 资源后调用它:

        Display display = new Display();
        try {
            Shell shell = new Shell(display);
            try {
                shell.open();
                while (!shell.isDisposed()) {
                    if (!display.readAndDispatch()) {
                        display.sleep();
                    }
                }
            } finally {
                if (!shell.isDisposed()) {
                    shell.dispose();
                }
            }
        } finally {
            display.dispose();
        }
        System.exit(0);
    

    【讨论】:

    • 其实你需要处理的是Shell,而不是Display。
    • 你误会了——我只是将 exit(0) 调用移到了 main 方法的末尾。我已经更新了帖子以使其更清晰。
    【解决方案2】:

    当你分配 Shell 时:

    shell = new Shell();

    随之分配了一些本地资源。您必须在退出应用程序之前释放这些资源:

    私人无效退出(){ shell.dispose(); System.exit(0); }

    当然,您必须为您的 exit() 方法提供“shell”变量才能执行此操作。

    请注意,我认为您不需要处置显示器,因为您没有使用“new Display()”创建它。但是,您使用new 创建的 SWT 中的任何内容(JavaDoc 中记录的少数项目除外)都必须在完成后处理掉。否则会泄露原生资源。

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多