我讀到構造Swing組件和處理事件的所有代碼都必須由Event Dispatch Thread運行。我明白這是如何通過使用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
並在主線程中調用大量其他方法。我不明白美國東部時間到底在哪裏(它執行什麼代碼?)。 GridBagLayoutTester
類的構造函數也從main
方法調用,這意味着EDT沒有運行它。
總之
- 當在EDT正在啓動? (如果在運行此代碼時啓動所有EDT,JVM是否會啓動EDT以及主方法?)
- 按鈕的事件處理程序代碼是否在EDT上運行?
關於Component.repaint()我懷疑這只是「設置標誌」,它實際上排隊寫生活動(將然後由EDT處理)。 – jfpoilpret 2010-09-03 14:23:21
模式是一樣的。您不需要知道爲了成功使用EDT而處理的內部處理方式。 – 2010-09-03 14:28:09
所以frame.setVisible()調用在EDT上執行? – Stormshadow 2010-09-03 14:33:15