Где вызывается поток диспетчеризации событий?

Я прочитал, что весь код, который создает компоненты 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 его не запускает.

Короче говоря

  1. Когда запускается EDT? (JVM запускает EDT вместе с основным методом, если вообще запускается EDT при выполнении этого кода?)
  2. Код обработчика событий для кнопки запускается на EDT?
9
задан Lahiru Ashan 29 November 2016 в 03:32
поделиться