SwingUtilities.invokeLater

Мой вопрос связан с SwingUtilities.invokeLater . Когда я должен его использовать? Должен ли я использовать каждый раз, когда мне нужно обновлять компоненты GUI? Что он делает? Есть ли альтернатива этому, поскольку он не кажется интуитивным и добавляет, казалось бы, лишний код?

5 Solutions collect form web for “SwingUtilities.invokeLater”

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

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

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

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

 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 & JTable), но только с помощью вещества L & F (отлично для проверки согласованности событий на EDT)

  5. Основные вещи: параллелизм в Swing

  6. Весь вывод из фоновых задач должен быть завернут в invokeLater()

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

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

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

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

Важно понимать, что Java имеет отдельный stream (EDT), который обрабатывает события, связанные с Swing.

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

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

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

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

Имейте в виду, что этот stream – это те же кадры рисования нитей и т. Д. … на вашем экране. Следовательно, слушатели не должны выполнять сложные / длинные / интенсивные работы с ЦП, иначе ваш экран замерзнет.

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

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

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

  • JComboBox Выбор слушателя?
  • Темы с ключевыми привязками
  • Java GUI-слушатели без AWT
  • Изменение размера с canvasом в jscrollpane в jsplitpane
  • Текстовое всплывающее окно всплывает над Swing JTextArea?
  • Приведение компонента к BufferedImage приводит к повреждению отображения
  • Добавление JPanels от других classов к cardLayout
  • перерисовать кнопку поворота с разным gradleиентом
  • Java Animate JLabel
  • Почему JScrollPane в JOptionPane не показывает весь его контент?
  • Сохранение правильного стиля при поиске текста
  • Давайте будем гением компьютера.