Я прочитал, что весь код, который создает компоненты Swing и обрабатывает события, должен запускаться потоком диспетчеризации событий. Я понимаю, как это достигается с помощью метода SwingUtilities.invokeLater ()
. Рассмотрим следующий код, в котором инициализация GUI выполняется в самом методе 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
также вызывается из основного метода
, что означает, что EDT его не запускает.
Короче говоря