Как я могу заставить мое основное приложение SWT нормально выйти в Mac OS X 10.5.6?

У меня есть следующий тестовый код 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" ) и выбрав "Quit".

Когда я это делаю, SWT-заглушка остается в доке, и приложение SWT фактически не вышло. Я должен вручную завершить приложение SWT через Eclipse или принудительно завершить работу.

Я пробовал это с помощью фонов v3.4 и v3.5 SWT под Eclipse 3.4.1 в Mac OS X 10.5.6 (Intel).

Есть ли дополнительная работа, которую мне нужно сделать, чтобы выйти из приложения, когда я закрываю оболочку?

Ответ 1

Вы не правильно выпускаете собственные ресурсы - у вас есть утечка ресурсов.

Вам не нужно делать это:

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

Основной метод выйдет, когда оболочка будет удалена. Если вы должны использовать метод exit, вызовите его после того, как вы разместили все ресурсы 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);

Ответ 2

Когда вы назначили оболочку:

shell = new Shell();

вместе с ним были выделены некоторые собственные ресурсы. Вы должны избавиться от этих ресурсов до выхода из приложения:

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

Конечно, вам нужно предоставить переменную "shell" для вашего метода exit() для этого.

Обратите внимание, что я не считаю, что вам нужно отображать Дисплей, так как вы не создали его с помощью "new Display()". Но что-нибудь в SWT (за исключением нескольких элементов, где это описано в JavaDoc), которые вы создаете с помощью new, вы должны распоряжаться, когда вы закончите с ним. В противном случае вы будете утечка собственных ресурсов.