2011-05-21 27 views

答えて

7

私はこれがあなたのコードが実行されて表示されますどのように上のビットより多くの制御を与えることを考えると、私はこのために持たないJDialogを使用します。しかし、これはJOptionPanesでも行うことができます。たとえば、ActionListenerが別のJOptionPaneの表示を引き起こしたJOptionPaneにJButtonを表示した場合例えばについて

import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class NestedJOptions { 
    public static void main(String[] args) { 
     final JPanel panel = new JPanel(); 
     panel.add(new JButton(new AbstractAction("Push Me") { 
     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(panel, "hello world!"); 
     } 
     })); 

     JOptionPane.showMessageDialog(null, panel); 
    } 
} 
+0

あなたはちょうどあなたに提案しました;-) OPが探していたものかもしれない何かを達成する興味深い方法。 – Howard

+0

本当にクレイジー、奇妙な... +1 – mKorbel

+0

これは方法クール、btwそれはなぜ機能するか。すべてのダイアログはモーダルではありませんか? – Pacerier

2

EDIT:ウナギの@Hovercraftフルよりよい解決策を提供します。 OPが何を求めていたのだろうか。 JOptionPaneのjavadocsから

すべてのダイアログはモーダルです。各 showXxxDialogメソッドは、ユーザーの対話が になるまで、呼び出し元 をブロックします。

いいえ、JOptionPaneで目的の機能を達成することはできません。しかし、JOptionPaneは、よく遭遇する少数のものを作成する便利なクラスですJDialog。必要な機能はJOptionPaneで直接サポートされていないため、JDialogを使用して直接実装することを検討する必要があります。たとえば:

public class DialogTest { 
    static final SimpleDateFormat SDF = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss"); 

    public static void main(String[] args) { 

     final JFrame frame = new JFrame("Dialog test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(createPanelToPopDialog(frame)); 
     frame.setSize(500, 200); 
     frame.show(); 
    } 

    static JPanel createPanelToPopDialog(final JFrame parent) { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     JButton button = new JButton("Pop a Dialog"); 
     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       JDialog dialog = new JDialog(parent, true); 
       dialog.add(createPanelToPopDialog(parent)); 
       dialog.setSize(500, 200); 
       dialog.show(); 
      } 
     }); 
     panel.add(button, BorderLayout.SOUTH); 
     panel.add(new JLabel("Created at " + SDF.format(new Date()))); 

     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     return panel; 
    } 
} 
+0

私は異なることを頼みます。私のサンプルコードを見てください。呼び出し元ブロックのコードからは実行できませんが、JOptionPaneが保持するSwingコードから実行できます。 @Hovercraft - 同意しました。 –

+0

'JOptionPane'オプションを忘れてしまいました。これはあなた自身の' Component'をレンダリングするために渡すことができます。 –

-1

あなたはそれを試して何か問題に遭遇したのですか、それとも尋ねているだけですか?

for (int i = 0; i < 5; i++) { 
      Thread t = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        JOptionPane.showMessageDialog(null, "I'm thread " + Thread.currentThread().getId()); 
       } 
      }); 
      t.start(); 
     } 

しかし、唯一の1つのメッセージダイアログがスイングイベントを受け取ることができるようになります:あなたは、いくつかのJOptionPanesを示すいくつかのスレッドを生成することができ、それが作成されたスレッドのブロック、それはのでJOptionPaneのは、モーダルです。あなたは出現した順にそれらを閉じる必要があります(ランダムです)。

+1

すべてのSwingコードは同じスレッド(EDT)から呼び出す必要があるため、マルチスレッドは悪い考えですが、さらに必要ではありません。 –

+0

Swingシングルスレッドルールを破るサンプルコードを提供しているので、投票結果が下がりました。この回答を削除することをお勧めします。 –

+0

@ Hovercraft Eelsの完全版:私は、新しいウィンドウを作成するときにSwingがいくつかの安全対策を講じていると思うので、モーダルウィンドウが1つしかスイングイベントを受け取らないので、ダイアログを作成するいくつかのスレッドを開始するのはOKです。 1つは細心の注意を払わなければならないが、それは可能である。 –