5

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

4

4 回答 4

9

您真的应该尝试将 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”测试。

于 2012-05-09T20:38:51.697 回答
3

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

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

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

于 2012-05-09T18:53:10.757 回答
2

如果您决定使用 JOptionPane,则可以使用 mouseAdapter 内部类将 MouseListener 添加到 JPanel 以处理 mouseClicked 事件。您必须将面板声明为 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
于 2012-05-09T20:38:49.363 回答
1

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

JDialog dialog = new JDialog();

如果您想要使对话框模态,也许您可​​以获得主 JFrame 的静态引用,例如:

JDialog dialog = new JDialog(MyMainJFrame.getInstance());
于 2012-05-09T18:42:21.360 回答