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.

Другие вопросы по тегам