2010-08-13 67 views
9

muestra:Java: JFrame.setLocationRelativeTo (nulo) no centrar la ventana en Ubuntu 10.04/GNOME 2.30.2 con OpenJDK código 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

¿Es esta culpa del OpenJDK? Recuerdo haber oído que no era tan bueno como el de Sun, pero desde que se convirtió en el estándar para Ubuntu o lo que sea, decidí aceptarlo. El programa probablemente se ejecutará en Windows, así que supongo que tendré que comprobarlo ... ¿Hay alguna manera fácil de arreglar esto de una manera independiente de la plataforma sin romperlo donde ya funciona?

+0

En ti captura de pantalla, la esquina superior izquierda está perfectamente centrado. Solo necesita compensarlo por la altura y el ancho del marco. – jjnguy

+6

Como señala Evan, este código llama a setLocationRelativeTo() demasiado pronto en el código. Debe hacerse ** después de ** pack()/setSize(). También tenga en cuenta que tanto en su ejemplo como en Evan, la llamada a setSize() es redundante si es seguida inmediatamente por pack(). –

Respuesta

4

Una forma es colocar manualmente la ventana. Coloque el siguiente código justo después de llamar al 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); 

exención de responsabilidad, esto sólo se probó en las ventanas.

Además, siempre debe usar setPreferredSize() en lugar de setSize().

+0

Lo mismo sucede. Me pregunto si es mi monitor? –

+0

@captain, ¿obtiene los mismos resultados que en su pregunta? – 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 

Esto corregirá el problema y centrar el JFrame

+5

Básicamente, call pack() before setLocationRelativeTo() Esto se debe a que pack() calcula el tamaño de la ventana, que es necesaria para realizar el cálculo de centrado correctamente. –

3
jFrame.validate(); 

En realidad, esto funciona mejor, ya que el paquete se puede cambiar el tamaño del marco, mientras que validate deja el tamaño del marco.

1

Sé que esta es una pregunta antigua, pero setLocationRelativeTo() funcionará pero se debe llamar después de pack(). Frame getWidth() y getHeight() devuelven valores diferentes (correctos) después del empaque y es por eso que OP no puede centrarse.

3

Solo una precisión: si establece la ubicación antes del tamaño del marco, se centrará en la esquina superior izquierda de la ventana porque el tamaño es (0,0). Tienes que establecer el tamaño antes de la ubicación.

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

Funciona bien conmigo con OpenJDK-6 y Ubuntu 13.04. Pruébalo en otras plataformas.

+0

¡Bienvenido a SO! ¿Puede ampliar su respuesta con un ejemplo de código? – Brian

+1

Gracias. Sí, por supuesto, yo Editaré mi respuesta. (Perdón por mi inglés, soy un estudiante de francés en ciencias de la computación). – YoannFleuryDev

0

No debe declarar el tamaño jFrame antes de indicar la ubicación relativa. Si lo hace, lo que sucede es que sacará su iFrame de la ubicación determinada.

Esto está mal ----

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

Esto es correcto ----

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

En sus comentarios, dijo que el tamaño es lo primero, luego empaqueta el 'JFrame' a popa er 'setLocationRelativeTo' ... – Dan

Cuestiones relacionadas