2010-11-30 19 views
2

2つの異なるアクションリスナーでは、いくつかの条件が満たされたときにダイアログが表示されます。 両方のアクションリスナーがダイアログを表示する必要がある場合は、同時に2つのダイアログが表示されます。しかし、私はそれらを一つずつ表示したい。コードの簡素化invokeLaterを使用してダイアログを1つずつ表示する

 SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JOptionPane.showMessageDialog(getTopLevelAncestor(), "dialog 1"); 
      } 
     }); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JOptionPane.showMessageDialog(getTopLevelAncestor(), "dialog 2"); 
      } 
     }); 

これら2 "SwingUtilities.invokeLaterを" 呼び出しは異なるクラスです。

+0

2つの異なるActionListensが同時に呼び出されるのはなぜですか?デザイン問題のように聞こえます。複数の編集(または何でも)を実行する単一のActionListenerが必要です。次に、それぞれの編集を別々に呼び出して、その表示ダイアログを個別に表示することができます。 – camickr

答えて

1

それを追跡するクラスを作成します。このクラスには、表示するダイアログのキューが含まれます。ダイアログが閉じられるたびに、キューの最初のものが表示され、キューから削除されます。他のクラスがダイアログを表示する必要がある場合、キューが空であるか、または他のクラスに挿入されているかどうかが直ちに表示されます。

1

これはダイアログのモダリティに関連しています。このトピックについての有益な記事はhttp://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/modality/です。ダイアログには異なる優先順位を持つ異なるモダリティタイプがあります。優先度の低い第2ダイアログを作成して問題を解決することができます。

JOptionPane pane = new JOptionPane("dialog 2", JOptionPane.INFORMATION_MESSAGE); 
JDialog dialog = pane.createDialog("Message"); 
dialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL); 
dialog.setVisible(true); 

うまくいけば、これが役に立ちます。

+0

いいえ、どちらも動作しません。同時に2つのダイアログが表示されます。 –

+0

タイミングに問題がある可能性もあります。短い連続でイベントディスパッチから2つのダイアログが呼び出されたときに動作します。異なるクラスから提出するときは、物事が異なる可能性があります。 – JooMing

0

invokeAndWait()が必要です。このメソッドは、Runnableが終了するまで待機します。

状況によっては、最初のダイアログが閉じられたときです。