Консультация № 190249
08.12.2016, 13:20
0.00 руб.
0 0 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Что такое диспетчеризация событий? Зачем нужен invokeLater()? Вот небольшой пример:

Код:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Test
{
Test ()
{
JFrame wnd = new JFrame("Тест");

wnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
wnd.setBounds(200, 100, 300, 200);
wnd.setLayout(new FlowLayout());

// Эта кнопка ничего не делает.
JButton btn = new JButton("Click me");
wnd.add(btn);

wnd.setVisible(true);
}

public static void main (String args [])
{/*
SwingUtilities.invokeLater(new Runnable ()
{
public void run ()
{
new Test ();
}
});*/

new Test ();
}
}


Просто пытаюсь выстроить логическую цепочку:

1. Сначала запускаяется main().
2. Потом в нем создается поток и передается в invokeLater().
3. Внутри invokeLater(), судя по названию позже, создается объект Test и в конструкторе выполняется построение интерфейса.
4. Он отрабатывает и все, поток, созданный в main(), завершается.

Не понимаю пока двух вещей:

3. Когда именно invokeLater() запускает этот поток? Позже (после) чего?
4. Зачем отрисовку интерфейса помещать в отдельный поток, потом передавать его в какой-то invokeLater(). Не проще ли его по-быстрому отрисовать в основном потоке непосредственно в main(). Ведь это вроде процесс простой и быстрый и зачем создавать такие сложности?

Обсуждение

Форма ответа