Swing ダイアログ レイアウトを開始するときに、クラスの run メソッドで開始するかどうかに違いはありますか。
public void run() { フレーム = 新しい JFrame(); ... frame.setVisible( true ); }
またはクラスコンストラクター?
パブリック MyClass { フレーム = 新しい JFrame(); ... frame.setVisible( true ); } public void run() { }
ありがとう
Swing ダイアログ レイアウトを開始するときに、クラスの run メソッドで開始するかどうかに違いはありますか。
public void run() { フレーム = 新しい JFrame(); ... frame.setVisible( true ); }
またはクラスコンストラクター?
パブリック MyClass { フレーム = 新しい JFrame(); ... frame.setVisible( true ); } public void run() { }
ありがとう
はい、それは重要です。その理由は、JFrameの作成を含むほとんどのSwingコードをSwingイベントスレッド(イベントディスパッチスレッドまたはEDT)で呼び出す必要があるためです。これを行うには、通常、RunnableでSwing GUIを作成し、次のようなものを呼び出して、イベントスレッドでRunnableをキューに入れます。
SwingUtilities.invokeLater(new Runnable(){
public void run() {
// create your Swing GUI here
frame = new JFrame();
...
frame.setVisible( true );
}
});
例外はrepaint()
、コンポーネントのメソッドなど、スレッドセーフであるとAPIに文書化されているSwingメソッド呼び出しです。
これは文脈上のものです。@hovercraftfullofeels が指摘しているように、EDT
初期化を含め、すべての UI コードが で実行されていることを確認する必要があります。
で既に実行している場合は、 (本当に必要でない限り)EDT
を使用する必要はありません。それ以外の場合は、呼び出しを に再同期する必要があります。InvokeLater
EDT
で確認するのがベストEventQueue.isDispatchingThread