Java – AWT/Swing – Centrar una ventana en pantalla

Cuando trabajamos con ventanas tipo JFrameJDialog, etc. y las hacemos visibles estas aparecen por defecto arriba y a la izquierda de la pantalla, más exactamente en las coordenadas 0:0. Ahora veremos como centrarlos desde su inicio.

Antes de J2SE 1.4


Debemos basarnos en las dimensiones de la pantalla en la que se esta ejecutando nuestro programa, para eso usaremos el método Toolkit.getDefaultToolkit().getScreenSize() el cual nos devuelve las dimensiones en pixels. A continuación un ejemplo con un JFrame:

import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Toolkit;

class WindowDemo1 {

    public static void main(String[] args) {
         JFrame frame = new JFrame("Un JFrame centrado");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         //se obtienen las dimensiones de la pantalla.
         Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();

         /** en cambio de darle un tamaño predefinido al JFrame, aprovecharé el uso
         de las dimensiones para darle un tamaño en proporción a las dimensiones
         de la pantalla. NOTA: esto es opcional */
         frame.setSize(pantalla.height / 3, pantalla.width / 3);

         //se obtienen las dimensiones de la ventana
         Dimension ventana = frame.getSize();

         //este es el calculo que hacemos para obtener las coordenadas del centro de la pantalla
         int width = (pantalla.width - ventana.width) / 2;
         int height = (pantalla.height - ventana.height) / 2;

         //colocamos la ventana en las coordenadas calculadas anteriormente
         frame.setLocation(width, height);

         frame.setVisible(true);
    }
}

Desde J2SE 1.4


Desde a partir del JDK 1.4 podemos centrar una ventana de una forma mas corta y simple, tenemos en la clase Window (de la cual heredan Frame y JFrame) el método void setLocationRelativeTo(Componenet c) donde c seria el referente sobre el cual se centraría nuestra ventana por encima, pero si le pasamos null como parámetro entonces la ventana se centraría tomando como referencia la pantalla. De nuevo el ejemplo con el JFrame:

import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Toolkit;

class WindowDemo2 {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Un JFrame centrado");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);    //centrar en pantalla
        frame.setVisible(true);
    }
}

Notar que aquí no tuve la oportunidad de establecer en el JFrame un tamaño proporcional a la ventana.

En cualquiera de los casos vistos anteriormente el resultado será algo como:

Centrando un JDialog en un JFrame


Para centrar un JDialog sobre un JFrame usamos el método void setLocationRelativeTo(Componenet c) pasándole como argumento la referencia del JFrame padre. Véase:

import javax.swing.JFrame;
import javax.swing.JDialog;

class WindowDemo3 {

    public static void main(String[] args) {
        //construimos el JFrame
        JFrame frame = new JFrame("Un JFrame centrado");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);    //centrar en pantalla
        frame.setVisible(true);

        //construimos el JDialog
        JDialog dialogo = new JDialog(frame, "Un JDialog centrado en un JFrame padre");
        dialogo.setSize(250, 250);
        dialogo.setLocationRelativeTo(frame);    //centrar en el JFrame
        dialogo.setVisible(true);
    }
}

El resultado será algo como:

No importaría si el JFrame no estuviera centrado en pantalla, el JDialog siempre aparecería centrado en el JFrame:

import javax.swing.JFrame;
import javax.swing.JDialog;

class WindowDemo4 {

    public static void main(String[] args) {
        //construimos el JFrame sin centrarlo
        JFrame frame = new JFrame("JFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);

        //construimos el JDialog
        JDialog dialogo = new JDialog(frame, "Un JDialog centrado en un JFrame padre");
        dialogo.setSize(250, 250);
        dialogo.setLocationRelativeTo(frame);    //centrar en el JFrame
        dialogo.setVisible(true);
    }
}

El resultado será algo como:


Documentación:
* Java™ Platform, Standard Edition 6 API Specification


, , , , , , ,

  1. #1 por Leonardo el diciembre 9, 2011 - 5:38 pm

    Muy util, gracias por la info.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: