2012-05-09 18 views
5

Ich habe eine JPanel, die ich auf einen Mausklick reagieren möchte und dann eine JDialog öffnen. Der JDialog Konstruktor benötigt eine Instanz von JFrame und nicht JPanel - wie kann ich das umgehen?Instantiate JDialog von JPanel

+2

Haben Sie überlegt, eine JOptionPane zu verwenden? – ChadNC

Antwort

1

Es gibt einen Konstruktor, das Argument nicht brauchen:

JDialog dialog = new JDialog(); 

Wenn das, was Sie wollen, ist den Dialog modal zu machen, vielleicht können Sie einen statischen Verweis von Ihnen Haupt JFrame, so etwas wie erhalten:

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

Mit dem Parameter free constructor wird der Dialog ohne Besitzer gemacht. Ich denke, dass es am besten wäre, wenn der Frame, der das Panel besitzt, der Eigentümer des Dialogs ist.

Damit meine ich, dass Sie die getParent() von Ihrem JPanel verwenden sollten, um seinen Besitzer zu finden und dann dieses Objekt als Besitzer Ihres JFrame zu senden.

Eine grobe Code für das wäre

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

Ich habe diesen Code nicht getestet, aber es ist genug gut für Sie auf die Idee zu verstehen.

2

Wenn Sie sich für ein JOptionPane entscheiden, können Sie dem JPanel einen MouseListener mit einer mouseAdapter-Innenklasse hinzufügen, um mouseClicked-Ereignisse zu verarbeiten. Sie müssten das Panel-Finale deklarieren, um von der inneren Klasse auf das Panel zugreifen zu können.

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

Sie sollen wirklich die JDialog zu einem übergeordneten Dialog oder Rahmen, versuchen vor allem zu befestigen, wenn Sie es (indem ein übergeordnetes Fenster, der Dialog wird Ihr Fenster angebracht werden und bringt die Eltern das bringt modal wollen Kind-Dialog). Andernfalls gehen die User Experience wirklich falsch: lost Dialoge, Fenster blockieren, ohne den modalen Dialog zu sehen, etc ...

Um die JPanel Eltern-Fenster zu finden, alles, was Sie brauchen, ist dieser 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); 
... 

Wenn Sie nicht wissen, ob Sie sich in einem Frame oder Dialog befinden, führen Sie den Test "instanceof" für beide Klassen durch.