Подтвердить что ты не робот

Java.awt.EventQueue.invokeLater объяснен

Мне очень любопытно, почему мы должны использовать java.awt.EventQueue.invokeLater для управления компонентами swing.

Почему мы не можем сделать это в обычной теме? Что именно происходит за кулисами? Из того, что я заметил, если у меня есть JFrame, я могу установить видимость в true или false из основного потока без каких-либо ошибок, и он, похоже, работает. Итак, что именно я могу достичь, используя java.awt.EventQueue.invokeLater? Я также полностью понимаю, что я могу использовать SwingUtilities.invokeLater, но как здесь объясняется, они кажутся одним и тем же.

Спасибо всем за их объяснение. Надеюсь, это правильный вопрос.

РЕДАКТИРОВАТЬ: ответить на вопрос wumpz Мы можем создать jframe

JFrame frame = new JFrame("Hello world");
frame.setSize(new Dimension(300, 300));
frame.setPreferredSize(new Dimension(300, 300));
frame.setMaximumSize(new Dimension(300, 300));
frame.setMinimumSize(new Dimension(300, 300));
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

И в том же потоке он был создан, чтобы сделать следующее.

for (int i = 0; i < 34; i++)
{
    System.out.println("Main thread setting to "+(!frame.isVisible()));
    frame.setVisible(!frame.isVisible());
}

И никаких жалоб.

4b9b3361

Ответ 1

Полная обработка Swing выполняется в потоке с именем EDT (Event Dispatching Thread). Поэтому вы должны блокировать GUI, если вы будете вычислять некоторые длительные вычисления в этом потоке.

Здесь вы можете обработать свои вычисления в другом потоке, поэтому ваш графический интерфейс остается отзывчивым. В конце вы хотите обновить свой графический интерфейс, который должен быть выполнен в EDT. Теперь EventQueue.invokeLater вступает в игру. Он отправляет событие (ваш Runnable) в конце списка событий Swings и обрабатывается после обработки всех предыдущих графических событий.

Также возможно использование EventQueue.invokeAndWait. Разница в том, что ваш поток вычислений блокируется до тех пор, пока ваш графический интерфейс не будет обновлен. Таким образом, очевидно, что это не должно использоваться из EDT.

Будьте внимательны не, чтобы обновить свой графический интерфейс Swing из другого потока. В большинстве случаев это вызывает некоторые странные проблемы обновления/обновления.

Все еще есть Java-код, который запускает JFrame простой из основного потока. Это может вызвать проблемы, но не препятствует Swing. Большинство современных IDE теперь создают что-то вроде этого, чтобы запустить графический интерфейс:

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}

Ответ 2

Все поддерживаемые платформы предлагают однопоточные графические библиотеки. Свинг - кросс-платформенный. Поэтому объекты GUI Swing следует создавать и обрабатывать только в потоке отправки событий.

В стороне, SwingUtilities.invokeLater() является обложкой для EventQueue.invokeLater() с версии 1.3.