invokeAndWait в SwingUtilities

Пожалуйста, объясните метод invokeAndWait () в SwingUtilities. Я не могу это понять. Объясните это очень четко. Было бы очень полезно, если вы попробуете пример.

Отредактировано для добавления расширения @ noob вопроса:

Что не ясно об этом ?

Вот пример модифицированного использования:

import javax.swing.SwingUtilities; public class InvokeAndWaitStuff { public static void main(String[] args) { final Runnable doHelloWorld = new Runnable() { public void run() { System.out.println("Hello World on " + Thread.currentThread()); } }; Thread appThread = new Thread() { public void run() { try { SwingUtilities.invokeAndWait(doHelloWorld); } catch (Exception e) { e.printStackTrace(); } System.out.println("Finished on " + Thread.currentThread()); } }; appThread.start(); } } 

Вывод:

 Hello World on Thread[AWT-EventQueue-0,6,main] Finished on Thread[Thread-0,5,main] 

И почему это важно?

Заставляет doHelloWorld.run () выполняться синхронно в streamе диспетчеризации событий AWT. Этот вызов блокируется до тех пор, пока все ожидающие события AWT не будут обработаны и (тогда) doHelloWorld.run () вернется. Этот метод следует использовать, когда stream приложений должен обновлять графический интерфейс.

Насколько я могу судить, это в основном узкое место, которое заставляет обновления графического интерфейса выполнять синхронно одним streamом, а не асинхронно несколькими streamами, что потенциально может быть небезопасным.

Чтобы понять, что invokeAndWait() , вам сначала нужно понять модель событий / streamов Swing.

В принципе, все, что влияет на GUI каким-либо образом, должно происходить в одном streamе . Это связано с тем, что опыт показывает, что многопоточный графический интерфейс невозможно получить правильно.

В Swing этот специальный stream GUI называется Thread Dispatch Thread или EDT . Он запускается, как только отображается компонент верхнего уровня Swing, и это базовый рабочий stream, который имеет очередь FIFO объектов событий, которые он выполняет один за другим.

Когда графический интерфейс Swing нужно рисовать или обновлять, JRE помещает событие в очередь EDT. Действия пользователя, вызывающие вызов слушателей, начинаются как события в очереди EDT. И (это важная часть), все, что ваша программа делает с изменением графического интерфейса (например, регистрация слушателей, добавление / удаление компонентов графического интерфейса пользователя или изменение данных модели, отображаемых графическим интерфейсом), должны быть помещены в очередь EDT или GUI может получить поврежден.

И теперь для финиша: invokeAndWait() помещает Runnable вы передаете ему в очередь событий EDT, и ждет, пока EDT не выполнит его. Это должно использоваться, когда stream, не относящийся к GUI, должен делать что-то, что влияет на графический интерфейс, но также нужно подождать, пока оно не будет выполнено до его продолжения. Если вы просто хотите сделать что-то, что влияет на графический интерфейс, но все равно, когда оно будет закончено, вы должны использовать invokeLater() .

У меня была аналогичная проблема в JTable. Программа была заблокирована где-то в методе scrollRectToVisible. Я заменил вызов, обернув его вызовом invokeLater. InvokeAndWait не разрешил проблему с блоком.

  SwingUtilities.invokeLater(new Runnable() { @Override public void run() { table.scrollRectToVisible(r); } }); 
  • Почему мои вещи не отображаются в JFrame?
  • Отключить элементы в JList
  • Остановка windows от отображения до полного нарисования?
  • Ограничение количества символов JTextField и прием только числовых символов
  • как перетаскивать файлы из каталога в java
  • Как приостановить и возобновить stream в Java из другого streamа
  • Настройка Tree.collapsedIcon для одного JTree
  • Получение состояния JToggleButton
  • Как работает paintComponent?
  • Что-то кажется неправильным в макете, JButton показывает неожиданное поведение при изменении размера windows
  • TableModelListener и проверка нескольких столбцов
  • Давайте будем гением компьютера.