3

私は現在、他の誰かが書いたスレッドコントロールクラスで作業しています。これは、Java Swingアプリケーションに使用されます。私には2つの方法がありますが、なぜ私が両方から違う行動を取っているのか混乱しています。私が知っているイベントディスパッチャスレッドとSwingについては、以下の2つの方法に違いはありません。明らかに、これは真実ではありません。 GUI(新しいボタン/再描画)を更新しながら、ポップアップを表示するスイング:すぐにコードを実行すると対invokeLater

//If this is the AWT Event Processing thread then run the code immediately, 
//otherwise schedule it for later processing 

public static void runWithEventThread(Runnable r) 
{ 
    if (EventQueue.isDispatchThread()) 
    { 
     r.run(); 
    } 
    else 
    { 
     EventQueue.invokeLater(r); 
    } 
} 


//Schedule the runnable for later processing by the AWT Event Queue 
public static void runLaterWithEventThread(Runnable r) 
{ 
    EventQueue.invokeLater(r); 
} 

runWithEventThreadを(使用)、私はGUIが時々アップ混乱だろうことがわかりました。しかし、runLaterWithEventThread()を使用すると、問題はありませんでした。

runLaterWithEventThread()を使用すると、複数のポップアップが表示されたときに(OKをクリックした後に表示される)、すべてのポップアップが一度に表示されることがわかりました。

私が理解するところでは、両方のメソッドが同じことをしている必要があります。誰かが何が起こっているのか説明してください。

+0

「GUIが時々混乱してしまう」「何かを駄目にする」とはどういう意味ですか?また、あなたが渡している仕事はどれくらいの期間実行されますか? –

+0

私は基本的にJListの項目の色を変更しています。 JListの一部のようにうなり音がポップアップ画面の歪んだ画像によってオーバーレイされます。プログラムがクラッシュして画面を最小化するときと同様ですが、プログラムの歪んだイメージが残ることがあります。私が実行に渡すタスクは、最初にJlistを更新してからポップアップを更新することです。 –

答えて

2

最初のメソッドがイベントスレッドから実行された場合、2番目のメソッドとは異なる動作をする可能性があります。イベントスレッドで現在待機中のイベントがあれば、それらのイベントはBEFORE 2番目のメソッドを使用する場合はrun()メソッドが実行されますが、最初のメソッドを使用するとrun()メソッドが即座に実行され、run()メソッドの終了後にキューの既存イベントが実行されます。

関連する問題