Instantiate JDialog from JPanel

java, swing

Solution

You should really try to attach the JDialog to a parent Dialog or Frame, especially if you want it modal (by passing a parent Window, the dialog will be attached to your Window and bringing the parent will bring the child dialog as well). Otherwise, the user experience can really go wrong: lost dialogs, blocking windows without seeing the modal dialog, etc...

To find your JPanel parent Window, all you need is this code:

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

If you don't know if you are in a Frame or Dialog, make the "instanceof" test for both classes.

Problem

I've got a `JPanel`, which I want to respond to a mouse click and then open a `JDialog`. The `JDialog` constructor needs an instance of `JFrame` and not `JPanel` - how do I work around this?

Original source