私はスイングを始めたばかりで、まだその詳細を学んでいます。基本的なコードを書き、EDT の実験を開始しました。コードは次のとおりです。
public class SwingDemo2 extends Thread implements ActionListener {
JLabel jl;
SwingDemo2() {
JFrame jfr = new JFrame("Swing Event Handling");
jfr.setSize(250, 100);
jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jl = new JLabel("Press a button!", SwingConstants.CENTER);
System.out.println("After Label: " + SwingUtilities.isEventDispatchThread());
JButton jb1 = new JButton("OK");
jb1.setActionCommand("OK");
jb1.addActionListener(this);
JButton jb2 = new JButton("Reset");
jb2.setActionCommand("Reset");
jb2.addActionListener(this);
jfr.add(jl, BorderLayout.NORTH);
jfr.add(jb1, BorderLayout.WEST);
jfr.add(jb2, BorderLayout.EAST);
System.out.println("After adding: " + SwingUtilities.isEventDispatchThread());
jfr.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.println("In main: " + SwingUtilities.isEventDispatchThread());
new SwingDemo2();
}
});
}
public void actionPerformed(ActionEvent ae) {
if (ae.getActionCommand() == "OK") {
System.out.println("In OK: " + SwingUtilities.isEventDispatchThread());
jl.setText("You pressed Ok");
}
else if (ae.getActionCommand() == "Reset") {
System.out.println("In Reset: " + SwingUtilities.isEventDispatchThread());
jl.setText("You pressed Reset");
}
}
}
現在のスレッドを確認するためのメソッドをいくつか追加しましisEventDispatchThread()
た。GUI とは別に、コンソールのメッセージは次のとおりです。
In main: true
After Label: true
After adding: true
In OK: true
In Reset: true
私はずっとEDTにいたようです。私の質問は、jfr.setVisible(true)
ステートメントの後、SwingDemo2()
コンストラクターに戻るmain()
べきではなく、それが EDT の終わりであってはならないということです。
GUI で最初にボタンを押すまで何秒も待ったのに、イベント処理がまだ EDT で行われているのはなぜですか? EDT が終了するのに十分な時間を与えるべきではありませんか?
事前にサンクス!