Приложение с графическим интерфейсом закрывается до появления сообщения Shutdown Hook

Новичок в Java здесь. Вот в чем дело: у меня есть следующий простой хук выключения:

class SHook implements Runnable {
public void run() {
    System.out.println("SH is done.");
}
}

И у меня есть приложение с графическим интерфейсом с TextArea, где вывод перенаправляется, так что сообщение отображается там. Его оконный прослушиватель снова очень прост:

public class MyAdapter extends WindowAdapter {
public void windowClosing(WindowEvent w){
    System.exit(0);
}
}

Когда я закрываю приложение с графическим интерфейсом с помощью кнопки [X], сообщение появляется на долю секунды, прежде чем все это закрывается. Здесь нет ничего плохого.

Что я хотел бы сделать, так это: после того, как сообщение было напечатано, подождите пару секунд, достаточно, чтобы ясно видеть, что сообщение было напечатано. Добавление sleep или wait или чего-то еще в метод run не работает, поскольку приложение по-прежнему закрывается немедленно.

Я предполагаю, что хук shutdown на самом деле выполняет свою работу должным образом, просто приложению все равно, и он немедленно закрывает графический интерфейс, в то время как мой хук печатает свое сообщение где-то в подвешенном состоянии Java.

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


person user3648026    schedule 17.05.2014    source источник
comment
Вы не можете использовать для этого хук выключения, Swing не обязательно будет отображать что-либо. Существует также проблема, заключающаяся в том, что вам нужно запускать весь код графического интерфейса пользователя в EDT — ваш хук выключения нарушает это правило. Что касается запуска кода при завершении работы - что-то не так с написанием метода shutdown() и его вызовом? Или добавить прослушиватель onClose к вашему основному фрейму?   -  person Boris the Spider    schedule 17.05.2014
comment
Ничего плохого в возможных альтернативах, о которых вы упомянули, мне было любопытно узнать, есть ли способ сделать это с помощью отключения. Спасибо за ваш ответ.   -  person user3648026    schedule 17.05.2014


Ответы (1)


В вашем методе вызова JFrame:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Затем убедитесь, что ваш WindowAdapter добавлен к JFrame методом adWindowListener.

Затем в windowClosing поместите немного println, чтобы увидеть, когда он вызывается, и, конечно, используйте System.exit(0) в windowClosing, если вы хотите, чтобы фрейм был закрыт.

person Volodymyr Levytskyi    schedule 17.05.2014
comment
Это не то, что я искал, я хотел сделать это с помощью хука выключения, но, похоже, это невозможно. Спасибо, в любом случае. - person user3648026; 17.05.2014
comment
Метод windowClosing - это ваш крючок для выключения. Вы можете проверить, все ли данные были сохранены, и уведомить пользователя перед выходом из приложения. - person Volodymyr Levytskyi; 18.05.2014