Как я могу заставить мое основное приложение 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
, вы должны распоряжаться, когда вы закончите с ним. В противном случае вы будете утечка собственных ресурсов.