Как я могу заставить мое основное приложение SWT правильно завершить работу в Mac OS X 10.5.6? - PullRequest
11 голосов
/ 27 января 2009

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

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

Я пробовал это с jar SW3 v3.4 и v3.5, под Eclipse 3.4.1 под Mac OS X 10.5.6 (Intel).

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

Ответы [ 2 ]

9 голосов
/ 27 января 2009

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

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

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

Основной метод завершится после удаления оболочки. Если вы должны использовать метод выхода, вызовите его после удаления всех ресурсов 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 голосов
/ 27 января 2009

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

shell = new Shell();

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...