2012-05-09 21 views
5

JPanelがあります。これはマウスのクリックに応答してからJDialogを開きます。 JDialogのコンストラクタではJPanelではなくJFrameのインスタンスが必要です。これを回避するにはどうすればよいですか?JPanelからJDialogをインスタンス化する

+2

JOptionPaneの使用を検討しましたか? – ChadNC

答えて

1

引数を必要としないコンストラクタがあります:

JDialog dialog = new JDialog(); 

何がしたいことは、ダイアログモーダルにするのであれば、多分あなたはあなたのメインのJFrameの静的参照を取得することができ、のようなもの:

は、
JDialog dialog = new JDialog(MyMainJFrame.getInstance()); 
3

パラメータのないコンストラクタを使用すると、ダイアログはオーナーなしになります。私は、あなたのパネルを所有するFrameをダイアログの所有者にするのが最善の方法だと考えています。

これは、JPanelのgetParent()を使用して所有者を見つけ、このオブジェクトをJFrameの所有者として送信する必要があることを意味します。

そのため、粗コードは、私はこのコードをテストしていない

java.awt.Container c = myPanel.getParent(); 
while (!(c instanceof javax.swing.JFrame) && (c!=null)) { 
     c = c.getParent(); 
} 
if (c!=null) { 
    JFrame owner=(javax.swing.JFrame) c; 
    JDialog myDialog=new JDialog(owner); 
} 

だろうが、あなたのアイデアを理解するためにenought良いです。

2

JOptionPaneを使用することに決めた場合、mouseAdapter内部クラスを使用してMouseListenerをJPanelに追加して、mouseClickedイベントを処理できます。内部クラスからパネルにアクセスするには、最終パネルを宣言する必要があります。

final JPanel testPanel = new JPanel(); 

testPanel.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent e) 
    {   
     JOptionPane.showMessageDialog(testPanel,"Title","InformationMessage",JOptionPane.INFORMATION_MESSAGE); 

    }});//end of mouseClicked method 
7

あなたは本当にあなたがしたい場合は特に、それはモーダル(親ウィンドウを渡すことで、ダイアログがあなたのウィンドウに添付されますと、親をもたらすこともたらす、親ダイアログまたはフレームに使って、JDialogを添付するようにしてください子ダイアログも同様)。そうでなければ、ユーザ体験は本当に間違って行くことができます。

JPanel panel = new JPanel(); 
Window parentWindow = SwingUtilities.windowForComponent(panel); 
// or pass 'this' if you are inside the panel 
Frame parentFrame = null; 
if (parentWindow instanceof Frame) { 
    parentFrame = (Frame)parentWindow; 
} 
JDialog dialog = new JDialog(parentFrame); 
... 

:失われたダイアログを、等...

があなたのJPanelの親ウィンドウを見つけるには、モーダルダイアログを表示せずにウィンドウをブロックし、あなたが必要なのは、このコードですフレームまたはダイアログにいるかどうかわからない場合は、両方のクラスの "instanceof"テストを行います。

関連する問題