Обновление графического интерфейса Swing во время ожидания завершения потока

У меня есть приложение Swing с классом Thread, выполняющим определенную работу. Мне нужно в определенный момент остановить запущенный поток. поэтому я помещаю логическое значение в поток, и когда я устанавливаю его в значение true, поток будет остановлен.

Проблема в том, что потоку требуется некоторое время, чтобы завершить свою внутреннюю работу.

Мне нужно запретить пользователю выполнять какие-либо действия в графическом интерфейсе до завершения потока. Я пробовал что-то вроде setEnabled (false), но приложение зависает, и графический интерфейс не изменяется до тех пор, пока поток не будет остановлен. Я также пытался обновить графический интерфейс в другом потоке, но это тоже не работает.

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

Спасибо


person Joe123    schedule 14.12.2011    source источник
comment
«Я пробовал что-то вроде setEnabled (false), но приложение зависает, а графический интерфейс не изменяется до тех пор, пока поток не будет остановлен» - как узнать, что поток остановлен?   -  person Martin James    schedule 14.12.2011
comment
пример: я отключил кнопку с помощью setEnabled (false); затем я остановил поток и использовал: while (this.myThread.isAlive ()) {}, затем я включил кнопку   -  person Joe123    schedule 14.12.2011


Ответы (2)


Лучше используйте SwingWorker:

button.setEnabled(false);
...    
@Override
protected String doInBackground() throws Exception {
    // process related code
    return "";
}

@Override
protected void done() {
    button.setEnabled(true);
}

Метод done() будет вызван после завершения процесса метода doInBackground ().

person Ashish    schedule 14.12.2011
comment
@ Joe123: вы можете принять этот ответ, нажав на пустой флажок отметьте слева. - person trashgod; 14.12.2011

Если вы знаете, когда ваш поток останавливается, установите другое логическое значение, например, thread_stopped = true; И перед любым событием действия проверьте, истинно ли thread_stopped, затем продолжайте.

person Mohsin    schedule 14.12.2011