2010-08-13 3 views
9

Beispielcode:Java: JFrame.setLocationRelativeTo (null) nicht Zentrieren des Fensters auf Ubuntu 10.04/gnome 2.30.2 mit OpenJDK 1.6.0_18

JFrame jFrame = new JFrame("Test"); 
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jFrame.setLocationRelativeTo(null); 
    jFrame.setSize(600, 600); 
    jFrame.pack(); 
    // jFrame.setLocationRelativeTo(null); // same results 
    jFrame.setVisible(true); 

screenshot http://img193.imageshack.us/img193/5296/screenshotrev.png

Ist dies die Schuld des OpenJDK? Ich erinnere mich, dass es nicht so gut war wie das von Sun, aber seitdem es der Standard für Ubuntu wurde oder was auch immer ich beschloss, damit zu gehen. Das Programm wird wahrscheinlich unter Windows laufen, also werde ich wohl mal nachsehen müssen ... Gibt es einen einfachen Weg, das plattformunabhängig zu beheben, ohne es zu zerstören, wo es schon funktioniert?

+0

In Ihrem Screenshot wird die linke obere Ecke perfekt zentriert. Sie müssen es nur um die Höhe und Breite des Rahmens versetzen. – jjnguy

+6

Wie von Evan hervorgehoben, ruft dieser Code setLocationRelativeTo() zu früh im Code auf. Es muss ** nach ** pack()/setSize() erfolgen. Beachten Sie auch, dass der Aufruf von setSize() sowohl in Ihrem Beispiel als auch in Evans redundant ist, wenn unmittelbar danach pack() folgt. –

Antwort

4

Eine Möglichkeit besteht darin, das Fenster manuell zu positionieren. Setzen Sie den folgenden Code direkt nach Ihrem Anruf an pack().

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
Point middle = new Point(screenSize.width/2, screenSize.height/2); 
Point newLocation = new Point(middle.x - (jFrame.getWidth()/2), 
           middle.y - (jFrame.getHeight()/2)); 
jFrame.setLocation(newLocation); 

Haftungsausschluss, dies wurde nur unter Windows getestet.

Außerdem sollten Sie immer setPreferredSize() anstelle von setSize() verwenden.

+0

Das Gleiche passiert. Ich frage mich, ob es mein Monitor ist? –

+0

@captain, erhalten Sie die gleichen Ergebnisse wie in Ihrer Frage? – jjnguy

+0

@Justin yep: (( –

19
JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
//jFrame.setLocationRelativeTo(null); 
jFrame.setSize(600, 600); 
jFrame.pack(); 
jFrame.setVisible(true); 
jFrame.setLocationRelativeTo(null); //To center the code 

Dies wird das Problem beheben und die JFrame Zentrum

+5

Im Grunde, ruf pack() vor setLocationRelativeTo() Das liegt daran, dass pack() die Größe des Fensters berechnet, das für die korrekte Berechnung der Zentrierung erforderlich ist. –

3
jFrame.validate(); 

Das funktioniert tatsächlich besser, da Pack die Rahmengröße ändern kann, während validate die Rahmengröße allein läßt.

1

Ich weiß, das ist eine alte Frage, aber setLocationRelativeTo() wird funktionieren, aber es muss nach pack() aufgerufen werden. Frames getWidth() und getHeight() geben nach dem Packen andere (korrekte) Werte zurück, weshalb OP nicht zentriert werden kann.

3

Nur eine Genauigkeit: Wenn Sie die Position vor der Größe des Rahmens festlegen, zentrieren Sie die obere linke Ecke des Fensters, weil die Größe (0,0) ist. Sie müssen die Größe vor dem Standort festlegen.

JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jFrame.setSize(600, 600); 
jFrame.pack(); 
jFrame.setLocationRelativeTo(null); 
jFrame.setVisible(true); 

Es funktioniert gut mit mir mit OpenJDK-6 und Ubuntu 13.04. Versuchen Sie es auf anderen Plattformen.

+0

Willkommen bei SO! Können Sie Ihre Antwort bitte mit einem Codebeispiel erweitern? – Brian

+1

Vielen Dank. Ja, natürlich, ich Ich bearbeite meine Antwort. (Entschuldigung für mein Englisch, ich bin ein Französisch Student in Informatik) – YoannFleuryDev

0

Sie sollten die jFrame-Größe nicht angeben, bevor Sie die relative Position angeben. Wenn Sie das tun, wird das Ihren iFrame vom angegebenen Ort wegziehen.

Das ist falsch ----

JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jFrame.setLocationRelativeTo(null); 
jFrame.setSize(600, 600); 
jFrame.pack(); 
jFrame.setVisible(true); 

Das ist richtig ----

JFrame jFrame = new JFrame("Test"); 
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

//size comes first 
jFrame.setSize(600, 600); 

//and then the position 
jFrame.setLocationRelativeTo(null); 

jFrame.pack(); 
jFrame.setVisible(true); 
+0

In Ihren Kommentaren sagten Sie Größe kommt zuerst, dann packen Sie die 'JFrame' achtern er 'setLocationRelativeTo' ... – Dan

Verwandte Themen