Swingコンポーネントを構築し、イベントを処理するすべてのコードは、イベントディスパッチスレッドによって実行される必要があることを読みました。この方法を使用することで、これがどのように達成されるかを理解していSwingUtilities.invokeLater()
ます。main
GUIの初期化がメソッド自体で行われる次のコードについて考えてみます。
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はいつ開始されますか?(このコードの実行中にEDTが開始された場合、JVMはmainメソッドとともにEDTを開始しますか?)
- ボタンのイベントハンドラーコードはEDTで実行されますか?