SwingUtilities - использование invokeLater [дубликат]

51
задан Zoyd 21 May 2014 в 22:21
поделиться

5 ответов

Должен ли я использовать каждый раз, когда мне нужно обновлять компоненты GUI?

Нет, если вы уже на мероприятии (EDT), который всегда применяется при реагировании на инициируемые пользователем события, такие как щелчки и выбор. (Методы actionPerformed и т. Д. Всегда вызывается EDT.)

Если вы не на EDT, однако хотите обновить GUI (если вы хотите обновить графический интерфейс из некоторого потока таймера или из какого-то сетевого потока и т. д.), вам придется расписать обновление, которое будет выполнять EDT. Вот для чего этот метод.

Swing в основном небезопасен. I.e., все взаимодействие с этим API должно выполняться в одном потоке (EDT). Если вам нужно сделать обновления GUI из другого потока (поток таймера, сетевой поток, ...), вам нужно использовать такие методы, как тот, который вы упомянули (SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, ...).

52
ответ дан aioobe 25 August 2018 в 11:26
поделиться

Каждое приложение Swing имеет как минимум 2 потока:

  1. Основной поток, выполняющий приложение
  2. EDT (Event Dispatching Thread) - это поток, который обновляет интерфейс (поэтому пользовательский интерфейс не будет зависеть).

Если вы хотите обновить пользовательский интерфейс, вы должны выполнить код в EDT. Такие методы, как SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, EventQueue.invokeLater, EventQueue.invokeAndWait позволяют выполнять код по EDT.

7
ответ дан Ammar 25 August 2018 в 11:26
поделиться

Мой вопрос на этот раз связан с SwingUtilities.invokeLater: когда я должен его использовать?

. Ключом к пониманию является то, что Java имеет отдельную обработку потока (EDT) Связанные с Swing события.

Вы должны использовать invokeLater() для отображения основного JFrame настольного приложения (например) вместо того, чтобы пытаться сделать это в текущем потоке. Он также создаст контекст для изящного закрытия приложения позже.

Это для большинства приложений.

Должен ли я каждый раз использовать обновления для компонентов GUI? Что он делает?

No. Если вы измените компонент GUI, он инициирует событие, которое будет зарегистрировано для последующей отправки Swing. Если есть слушатель для этого события, поток EDT будет вызывать его где-то по дороге. Вам не нужно использовать invokeLater(), просто установите слушателей на компоненты правильно.

Имейте в виду, что этот поток - это те же кадры рисования нитей и т. д. ... на вашем экране. Следовательно, слушатели не должны выполнять сложные / длинные / интенсивные задачи, в противном случае ваш экран замерзнет.

Есть ли альтернатива этому, поскольку он не звучит интуитивно и добавляет, казалось бы, ненужный код?

Вам не нужно писать больше кода, чем отображать ваше приложение с invokeLater() + слушателями, которые вас интересуют на компоненте. Остальное обрабатывается Swing.

7
ответ дан aristotll 25 August 2018 в 11:26
поделиться
Swing is single threaded and all changes to the GUI must be done on EDT 

Основное использование для invokeLater()

  1. Основные методы должны быть всегда завернуты в invokeLater()
  2. Задержка (но асинхронно) действие / событие до конца из EventQueue,
  3. Если EDT не существует, вам необходимо создать новый EDT, используя invokeLater(). Вы можете проверить его с помощью if (SwingUtilities.isEventDispatchThread()) {...
  4. Существует invokeAndWait(), но до сегодняшнего дня я (просто мой взгляд) не может найти причину использования invokeAndWait() вместо invokeLater(), кроме жестких изменений в GUI (JTree & amp; JTable), но только с помощью Substance L & amp; F (отлично подходит для проверки согласованности событий на EDT)
  5. Основной материал: Параллельность в Swing
  6. Весь вывод из фоновых задач должен быть завернут в invokeLater()
13
ответ дан Community 25 August 2018 в 11:26
поделиться

Большинство инициированных пользователем событий (клики, клавиатура) уже будут на EDT, поэтому вам не придется использовать SwingUtilities для этого. Это распространяется на множество случаев, за исключением потоков main () и рабочих потоков, которые обновляют EDT.

3
ответ дан Garrett Hall 25 August 2018 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: