Java 从JPanel实例化JDialog

Java 从JPanel实例化JDialog,java,swing,Java,Swing,我有一个JPanel,我想用鼠标点击它,然后打开JDialog。JDialog构造函数需要一个JFrame的实例,而不是JPanel-如何解决这个问题?有一个构造函数不需要参数: JDialog dialog = new JDialog(); 如果要使对话框成为模态,可能可以获得主JFrame的静态引用,例如: JDialog dialog = new JDialog(MyMainJFrame.getInstance()); 使用无参数构造函数将减少对话框所有者。我认为最好的办法是使拥有面板

我有一个
JPanel
,我想用鼠标点击它,然后打开
JDialog
JDialog
构造函数需要一个
JFrame
的实例,而不是
JPanel
-如何解决这个问题?

有一个构造函数不需要参数:

JDialog dialog = new JDialog();
如果要使对话框成为模态,可能可以获得主JFrame的静态引用,例如:

JDialog dialog = new JDialog(MyMainJFrame.getInstance());

使用无参数构造函数将减少对话框所有者。我认为最好的办法是使拥有面板的框架成为对话框的所有者

我的意思是,您应该使用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);
}

我还没有测试过这段代码,但它足以让您理解这个想法。

如果您决定使用JOptionPane,您可以向JPanel添加一个MouseListener,并使用mouseAdapter内部类来处理mouseClicked事件。为了从内部类中访问面板,您必须声明panel final

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

您确实应该尝试将JDialog附加到父对话框或框架,特别是如果您希望它是模态的(通过传递父窗口,对话框将附加到您的窗口,并且带来父对话框也会带来子对话框)。否则,用户体验可能真的会出错:丢失对话框、阻塞窗口而看不到模式对话框等等

要查找JPanel父窗口,只需以下代码:

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);
...

如果您不知道自己是否在框架或对话框中,请对这两个类进行“instanceof”测试。

您是否考虑过使用JOptionPane?