今日、この質問に答えることができるかどうかを確認しようとしました。Event Dispatch Thread
( EDT )を完全には理解していないことに気付きました。グーグルはそれを確認して助け、なぜ私がそうしないのかを明らかにしました。(これも理解に関係するかもしれません。)
コードは GUI を設定し、後で (前の質問のように) フラグが設定解除されるまでテキスト フィールドを更新します。
いくつか質問/要望があります。
swingInit
両方の呼び出し (toとdoIt
) がブロックの外側にある場合 (示されているように)、以下のコードが正常に実行される理由を説明してください。これはinvokeLater
、両方の呼び出しが GUI に影響を与えたりクエリを実行したりしますが、どちらも EDT で実行されていないためです (そうですか?)。それは失敗を招いていませんか?call to
swingInit
が inside とdoIt
outside の場合もコードが実行されinvokeLater
ます。これswingInit
は EDT で実行されますが、EDT でdoIt
実行することは問題ではありませんか? (これが機能したことに驚きました。そうすべきだったのでしょうか?)どこにあるかに関係なく、
doIt
内部にある場合にハングする理由を理解していると思います: の目的は、GUIを初期化することだけです (右?)。invokeLater
swingInit
invokeLater
ブロック内ではなく
doIt
、EDT でのみ (おそらく発生したイベントから) 開始する必要がありますか?invokeLater
(EDT の概念の歴史は興味深いものです。常にそうであるとは限りません。それを理解できない理由については、上記のリンクを参照してください。)
import static java.awt.EventQueue.invokeLater;
import java.awt.event.*;
import javax.swing.*;
public class Whatever
{
static boolean flag = true;
static JTextField tf = new JTextField("Hi",20);
static JPanel p = new JPanel();
static JFrame f = new JFrame();
static JButton b = new JButton("End");
public static void main(String[] args)
{
swingInit();
invokeLater
(
new Runnable()
{
@Override
public void run()
{
// swingInit();
// doIt();
}
}
);
doIt();
}
static void swingInit()
{
b.addMouseListener
(
new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
flag = false;
JOptionPane.showMessageDialog(null,"Clicked... exiting");
System.exit(0);
}
}
);
p.add(tf);
p.add(b);
f.add(p);
f.setVisible(true);
f.pack();
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
static String getInfo(){
return "Hello... " + Math.random();
}
static void doIt(){
while(flag)
tf.setText(getInfo());
};
}