JButton ActionListener - GUI обновляется только после нажатия JButton
У меня проблема с моим JButton ActionListener. У меня есть метод doTheCleaning(), определенный в другом классе, который при вызове вносит серии изменений в мой графический интерфейс.
public void doTheCleaning(){
//change image icon
//had thread.sleep here
//insert to text area
//had thread.sleep here
//etc
}
Затем в другом классе я создал экземпляр класса, содержащего мой метод doTheCleaning(), и мой ActionListener был написан с моим методом actionperformed() для моего jbutton, написанного так:
public void actionPerformed(ActionEvent e){
//some code
//newClass.doTheCleaning();
}
Я знаю, как сделать все остальное, как addActionListener() и прочее, поэтому не нужно сомневаться в этом. Меня беспокоит то, что все изменения в моем графическом интерфейсе, которые выполняются при вызове метода doTheCleaning(), применяются только после нажатия кнопки. Когда это происходит, последовательность между изменениями, которые произошли в моих ярлыках и текстовой области, не была показана. Код работает нормально, если я вызвал его непосредственно в своем классе тестера, но вызов его внутри метода actionperformed показывает только конечное состояние моего графического интерфейса. Мне нужно показать, какой элемент изменился первым, потом что дальше и так далее.
Как я могу добиться этого, когда мне нужно, чтобы эти изменения происходили только при нажатии кнопки JButton?
** Я пока не очень хорош в создании графического интерфейса в Java. iIhope вы, ребята, поняли мою точку зрения без моего кода. но я мог бы при необходимости. Благодарю.
1 ответ
Не выполняйте интенсивные операции в EDT, в противном случае графический интерфейс будет не отвечать, и вы можете не увидеть обновления графического интерфейса. Лучший выбор, который вы можете использовать, это SwingWorker
:
Override
doInBackground()
и поместите любые длинные операции внутри этого метода, чтобы он выполнялся в отдельном потоке, а не в EDT.Для создания или изменения состояния GUI компонентов GUI внутри
doInBackground()
использоватьpublish(V... chunks)
отправить данныеprocess(List<V> chunks)
, Вы должны переопределитьprocess(List<V> chunks)
, Также обратите внимание, чтоprocess(List<V> chunks)
выполнен на EDT.После
doInBackground()
возвращается,done()
выполняется на EDT, и вы можете переопределить его, чтобы использовать его для любых обновлений графического интерфейса. Вы также можете получить значение, возвращенное изdoInBackground()
используяget()
,Обратите внимание, что
SwingWorker<T,V>
является общим, и вам нужно указать типы.T
тип объекта, возвращаемого изdoInBackground()
а такжеget()
, в то время какV
тип элементов, которые вы передалиprocess(List<V> chunks)
с помощьюpublish(V... chunks)
,execute()
Метод запускает рабочий свинг, вызываяdoInBackground()
первый.
Подробнее об этом читайте в Concurrency in Swing.