Я читал, что весь код, который создает компоненты Swing и обрабатывает события, должен запускаться потоком диспетчеризации событий. Я понимаю, как это достигается с помощью метода SwingUtilities.invokeLater()
. Рассмотрим следующий код, в котором инициализация графического интерфейса выполняется в самом методе main
.
public class GridBagLayoutTester extends JPanel implements ActionListener {
public GridBagLayoutTester() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
JButton button = new JButton("Testing");
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
button.addActionListener(this);
add(button, gbc);
}
public void actionPerformed(ActionEvent e) {
System.out.println("event handler code");
}
public static void main(String[] args) {
JFrame frame = new JFrame("GridBagLayoutDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(new GridBagLayoutTester(), BorderLayout.CENTER);
frame.setSize(800, 600);
frame.pack();
frame.setVisible(true);
System.out.println("Exiting");
}
}
Как получилось, что этот код работает идеально? Мы создаем JFrame
и вызываем множество других методов в основном потоке. Я не понимаю, где именно здесь проявляется EDT (какой код он выполняет?). Конструктор класса GridBagLayoutTester
также вызывается из метода main
, что означает, что EDT его не запускает.
Короче
- Когда начинается EDT? (запускает ли JVM EDT вместе с основным методом, если EDT вообще запускается при выполнении этого кода?)
- Выполняется ли код обработчика событий для кнопки на EDT?