Должен ли я использовать каждый раз, когда мне нужно обновлять компоненты GUI?
blockquote>Нет, если вы уже на мероприятии (EDT), который всегда применяется при реагировании на инициируемые пользователем события, такие как щелчки и выбор. (Методы
actionPerformed
и т. Д. Всегда вызывается EDT.)Если вы не на EDT, однако хотите обновить GUI (если вы хотите обновить графический интерфейс из некоторого потока таймера или из какого-то сетевого потока и т. д.), вам придется расписать обновление, которое будет выполнять EDT. Вот для чего этот метод.
Swing в основном небезопасен. I.e., все взаимодействие с этим API должно выполняться в одном потоке (EDT). Если вам нужно сделать обновления GUI из другого потока (поток таймера, сетевой поток, ...), вам нужно использовать такие методы, как тот, который вы упомянули (SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, ...).
Каждое приложение Swing имеет как минимум 2 потока:
Если вы хотите обновить пользовательский интерфейс, вы должны выполнить код в EDT. Такие методы, как SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, EventQueue.invokeLater, EventQueue.invokeAndWait позволяют выполнять код по EDT.
Мой вопрос на этот раз связан с
blockquote>SwingUtilities.invokeLater
: когда я должен его использовать?. Ключом к пониманию является то, что Java имеет отдельную обработку потока (EDT) Связанные с Swing события.
Вы должны использовать
invokeLater()
для отображения основногоJFrame
настольного приложения (например) вместо того, чтобы пытаться сделать это в текущем потоке. Он также создаст контекст для изящного закрытия приложения позже.Это для большинства приложений.
Должен ли я каждый раз использовать обновления для компонентов GUI? Что он делает?
blockquote>No. Если вы измените компонент GUI, он инициирует событие, которое будет зарегистрировано для последующей отправки Swing. Если есть слушатель для этого события, поток EDT будет вызывать его где-то по дороге. Вам не нужно использовать
invokeLater()
, просто установите слушателей на компоненты правильно.Имейте в виду, что этот поток - это те же кадры рисования нитей и т. д. ... на вашем экране. Следовательно, слушатели не должны выполнять сложные / длинные / интенсивные задачи, в противном случае ваш экран замерзнет.
Есть ли альтернатива этому, поскольку он не звучит интуитивно и добавляет, казалось бы, ненужный код?
blockquote>Вам не нужно писать больше кода, чем отображать ваше приложение с
invokeLater()
+ слушателями, которые вас интересуют на компоненте. Остальное обрабатывается Swing.
Swing is single threaded and all changes to the GUI must be done on EDT
Основное использование для invokeLater()
invokeLater()
EventQueue
, invokeLater()
. Вы можете проверить его с помощью if (SwingUtilities.isEventDispatchThread()) {...
invokeAndWait()
, но до сегодняшнего дня я (просто мой взгляд) не может найти причину использования invokeAndWait()
вместо invokeLater()
, кроме жестких изменений в GUI (JTree & amp; JTable), но только с помощью Substance L & amp; F (отлично подходит для проверки согласованности событий на EDT) invokeLater()
Большинство инициированных пользователем событий (клики, клавиатура) уже будут на EDT, поэтому вам не придется использовать SwingUtilities для этого. Это распространяется на множество случаев, за исключением потоков main () и рабочих потоков, которые обновляют EDT.