2010-06-21 10 views
17

Estoy desarrollando una aplicación Java Swing. ¿Cómo puedo hacerlo para que cuando se abra el programa y las demás ventanas aparezcan en el centro de la pantalla?Center Swing Windows

Respuesta

47
frame.setLocationRelativeTo(null); 
+0

¿Funciona también en las versiones anteriores de Java? Estoy sorprendido porque hace un tiempo me di cuenta de que la única forma de hacerlo era "a mano", como se explica aquí: http://www.java2s.com/Code/Java/Swing-JFC/Howtocenteraframeordialog.htm –

+1

Eso es válido a partir de 1.4, pero debe asegurarse de empacar o, en su defecto, dimensionar la pantalla correctamente. – Yishai

+2

No es realmente obvio cuando no lo sabe, pero el comportamiento de [setLocationRelativeTo()] (http://tinyurl.com/34syhcj), con un valor nulo, es, de hecho, centrar la ventana, como se describe en el javadoc. – Gnoupi

1

Tendrás que hacerlo a mano, usando setLocation(x,y).

Algo así como:

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
frame.setLocation((dim.width-frameWidth)/2, (dim.height-frameHeight)/2); 

debería hacerlo (no probado).

1

hacerlo a mano en un entorno multi-pantalla da algo como esto (estática, porque es probable que lo querría en una clase de utilidad):

public static Rectangle getScreenBounds(Component top){ 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gd = ge.getScreenDevices(); 

    if (top != null){ 
     Rectangle bounds = top.getBounds(); 
     int centerX = (int) bounds.getCenterX(); 
     int centerY = (int) bounds.getCenterY(); 

     for (GraphicsDevice device : gd){ 
      GraphicsConfiguration gc = device.getDefaultConfiguration(); 
      Rectangle r = gc.getBounds(); 
      if (r.contains(centerX, centerY)){ 
       return r; 
      } 
     } 
    } 
    return gd[0].getDefaultConfiguration().getBounds(); 
} 

public void centerWindowOnScreen(Window windowToCenter){ 
    Rectangle bounds = getScreenBounds(windowToCenter); 
    Point newPt = new Point(bounds.x + bounds.width/2, bounds.y + bounds.height/2); 
    Dimension componentSize = windowToCenter.getSize(); 
    newPt.x -= componentSize.width/2; 
    newPt.y -= componentSize.height/2; 
    windowToCenter.setLocation(newPt); 

} 

En cuanto a los botones por defecto, es JDialog.getRootPane().setDefaultButton(btn), pero botón tiene que estar ya agregado al diálogo, y visible.

+0

Trabajo con dos pantallas aquí. Uno está incluso verticalmente desplazado. Las respuestas de Camickr/Rehans funcionan para mí. Centra la ventana en la primera pantalla. ¿No es eso lo que tu método intentas lograr? ¿O me estoy perdiendo algo aquí? ¡Gracias! – Riscie

+0

@Riscie no realmente. Mi método está tratando de encontrar en qué pantalla se muestra su componente, para que pueda centrarlo en esta pantalla, no solo en la primera. – Taisin

+0

gracias por aclarar! Bueno, eso es muy necesario! Una pena que esto no se ofrece por defecto! – Riscie

4

frame.setLocationRelativeTo (null); hacer que el marco abierto en Cetner

Saludos, Rehan Farooq

+0

funcionó para mí! ¡Gracias! – StiGMaT

3

Es fácil si está utilizando Netbeans. En la ventana de propiedades de JFrame, vaya a "Código" pestaña. Hay una opción como "Generar centro". Marque esa opción. JFrame se mostrará en el centro.