java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
上記のコードが実際に何をするのか教えてください。行ごとの説明を探しています。特に最初の行で、なぜそれを使用するのか、どのシナリオでこれを使用する必要があるのかを教えてください。
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
上記のコードが実際に何をするのか教えてください。行ごとの説明を探しています。特に最初の行で、なぜそれを使用するのか、どのシナリオでこれを使用する必要があるのかを教えてください。
この例では、Runnableから派生した任意のクラスが表示されます。この匿名クラスは、実行可能なインターフェイスのrunメソッドをオーバーライドします。次に、この匿名クラスがインスタンス化され、静的メソッドであるEventQueue.invokeLaterメソッドに渡されます。このメソッドは、オブジェクトを...まあ...eventQueueに追加します。EvenQueueには、キーボードイベントやマウスイベントなどの多くのイベントがあります。このキューからデータを継続的にポーリングするスレッドがあります。そのスレッドがここでインスタンス化された匿名クラスに到達すると、run()メソッドを実行します。これにより、クラスNewJFrameのオブジェクトがインスタンス化され、表示されるように設定されます。
これを複雑にすることの全体的なポイントは、新しいJFrame()。setVisible(true)部分がメインスレッドではなく、イベントディスパッチスレッドで実行されることです。Swingでは、イベントディスパッチスレッドのユーザーインターフェイスを変更するすべてのコードを実行する必要があります。
これは、後で実行するように指示されたコードのブロックです(遅延と呼ばれることもあります)。内部クラス(new Runnable() {...}
)は、基本的に、実行されるコードのブロックを渡すことを可能にします。このinvokeLater
メソッドは、コードのブロックが実行されることを保証しますが、いつ実行されるかは保証しません。特定のコードをすぐに実行するのは安全ではない場合があり、冗長すぎてマルチスレッドを自分で実行することはできません。そのため、Javaは、コードを安全に実行するためのこのユーティリティメソッドを提供します。コードはすぐに実行されますが、安全に実行できるようになるまで実行されません。
invokeLater() メソッドは、Runnable オブジェクトをパラメーターとして受け取ります。このオブジェクトは、run() メソッドを実行するイベント ディスパッチ スレッドに送信されます。これが、run() メソッドが Swing コードを実行するのに常に安全である理由です。
-IvarD
このinvokeLater
呼び出しは、指定されたランナブルを後で処理するためにキューに入れます。つまり、メソッド呼び出しが戻っrun()
たときに、メソッド内のコードはまだ実行されていません。invokeLater
このタイプのコードには、2 つの典型的な使用例があります。
匿名クラスがパラメーターとしてinvokeLater
呼び出しに渡されます。このコードと同じです。
private void foo()
{
java.awt.EventQueue.invokeLater(new JFrameCreator());
}
private class JFrameCreator implements Runnable
{
public void run() {
new NewJFrame().setVisible(true);
}
}