2012-04-05 8 views
23

Ich habe eine Java Swing-Anwendung mit einer Schaltfläche, die ein Popup-Fenster erzeugt, wenn eine bestimmte Aktion ausgeführt wird. Ich möchte den Mittelpunkt des Popup-Fensters mit dem Mittelpunkt des Elternfensters ausrichten, wenn es gerendert wird. Wie kann ich die x, y Koordinaten berechnen, die für das Popup-Fenster in setLocation() gesteckt werden?Center JDialog über Eltern

Nur um zu klären. Ich möchte das Verhalten von setLocationRelativeTo() nicht, weil das das obere linke Pixel des Popups über das zentrale Pixel des übergeordneten Frames setzt. Ich möchte das mittlere Pixel des Popups über das mittlere Pixel des Eltern-Frames setzen.

+1

Andrew spricht die Wahrheit! Sie sollten in Erwägung ziehen, einen 'JDialog' anstelle eines' JFrame' zu ​​verwenden. – Qwerky

+0

ist es eigentlich ein jdialog. Aber ist es wirklich wichtig für dieses spezielle Szenario? Alles, was ich brauche, ist die Berechnung für x und y. –

Antwort

41

setLocationRelativeTo .this setzt den oberen linken Pixel des Popup über den Mittelpixel des Mutter nutzen könnten. ..

Nein, tut es nicht!

Centered Dialog

Jede der drei Dialoge mit diesem einfachen Beispiel tauchte erscheint so weit zentriert zu werden, wie ich sehen kann. Ich kann nur vermuten, dass der Code zum falschen Zeitpunkt setLocationRelativeToaufruft.

import javax.swing.*; 

class CenterTheDialog { 

    CenterTheDialog() { 
     for (int ii=1; ii<4; ii++) { 
      JFrame f = new JFrame("Frame " + ii); 
      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

      f.setSize(400,300); 
      f.setLocationByPlatform(true); 
      f.setVisible(true); 

      JDialog d = new JDialog(f); 
      d.setSize(300,200); 
      d.setLocationRelativeTo(f); 
      d.setVisible(true); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      new CenterTheDialog(); 
     }); 
    } 
} 
+0

es passiert in meinem Projekt, vielleicht aus einem anderen Grund. Ich hasse wirklich Swing. Wie auch immer, PhilNerds Antwort hat mich (irgendwie) was ich gesucht habe, wie man es berechnet. Ich habe seine Antwort akzeptiert, und ich bin auf den nächsten Fehler. Vielen Dank! –

+8

* ... "setLocationRelativeTo" zum falschen Zeitpunkt aufgerufen. *: Ja, ich habe es vor 'pack()' aufgerufen! – bigstones

5
+0

Dies setzt das obere linke Pixel des Popups über das mittlere Pixel des Elternteils. Ich möchte das mittlere Pixel des Popups über das zentrale Pixel des Elternteils setzen. –

+1

@CrHSiDrappier Sind Sie sicher? 'dann ist das Fenster so angeordnet, dass die Mitte des Fensters mit der Mitte der Komponente übereinstimmt.' – Jeffrey

+0

*" Bist du sicher? "* Das OP ist sicher falsch, wie in meinem Beispiel gezeigt, das deine Antwort erweitert. OTOH sie scheinen entschlossen, ihren Kopf tief im Sand vergraben zu lassen, also ..(Shrugs) –

2

Sie könnten versuchen, die Koordinaten des Elternfensters und seine Größe zu dem neuen Fenster vorbei und Hinzufügen der Koordinaten + 1/2 geordneten Rahmengröße in jeder Achse - 1/2 des Pop-ups x/y auf das Zentrum zentrieren.

Or..If Sie erweitern Sie setLocationRelativeTo (Inhaber)

this helps

+0

Dies setzt das obere linke Pixel des Popups über das mittlere Pixel des Elternteils. Ich möchte das zentrale Pixel des Popups über das mittlere Pixel des paren –

+0

gut, wenn Sie beschlossen, meine Formel zu folgen, Sie könnten nur zusätzlich minus 1/2 der x/y Popups Größe. – Phil

+0

fügen Sie Ihre Kommentare zu Ihrer Antwort hinzu und ich werde akzeptieren. Es ist nicht perfekt, aber ich denke, ich habe andere Dinge, die das Ergebnis beeinflussen. Ich möchte mein gesamtes Projekt hier nicht wirklich posten. Vielen Dank. –

45

Auf der JDialog Sie erstellt haben Sie pack() zuerst nennen soll, dann setLocationRelativeTo(parentFrame) und dann setVisible(true). Mit dieser Reihenfolge sollte die JDialog auf dem übergeordneten Frame zentriert angezeigt werden.

Wenn Sie zuerst nicht pack() aufrufen, funktioniert die Einstellung der relativen Position zum übergeordneten Element nicht ordnungsgemäß, da JDialog nicht weiß, welche Größe zu diesem Zeitpunkt vorliegt. Es scheint die Größe als 0 mal 0 zu nehmen, was dazu führt, dass das "obere linke Pixel des Popups über dem mittleren Pixel der übergeordneten" Positionierung in einem Kommentar zu einer der anderen Antworten erwähnt wird.

+1

Das funktionierte perfekt für mich. Danke MB! –

1

Sie können das Ereignis e verwenden, um das übergeordnete Fenster zu erhalten. Verwenden Sie getWindowAncestor und e.getSource().

dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))

Verwandte Themen