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?