Apariencia de un JFrame

La problemática no es crear un JFrame, ya que cualquier programador sabe crear una clase que herede de JFrame. El problema es que la nueva ventana tenga la apariencia deseada. Así que en el siguiente ejemplo se recogen unas cuantas líneas de código típicas a la hora de cambiar el aspecto que tiene por defecto un JFrame:

public class MainFrame extends JFrame {

	MainFrame(){
	   	this.setTitle("Mi ventana Java");

		//Fija el tamaño de la ventana
		this.setSize(300,300);

		//Cambia el icono de la taza de café (la imagen puede ser png,jpg,etc ...).
		this.setIconImage(new ImageIcon(getClass().getResource("Mi_imagen.jpg")).getImage());

		//Hace que la ventana no se pueda redimensionar
		this.setResizable(false);

		//Hace que la ventana aparezca centrada en la pantalla
		this.setLocationRelativeTo(null);

	}
}

Otras opciones que pueden resultar interesantes

Dimensionar la ventana al tamaño de la pantalla:

Hacer que la ventana tenga el mismo tamaño que la pantalla en la que va a aparecer:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(screenSize);

Maximizar la ventana:

Es decir que la ventana aparezca de entrada ya maximizada en la pantalla.

this.setExtendedState(JFrame.MAXIMIZED_BOTH);

Quitar el marco de la ventana:

Quita el marco en el que aparece el título de la ventana y los botones de minimizar, maximizar y cerrar la ventana:

this.setUndecorated(true);

Ajustar la ventana:

Hacer que toda la jerarquía de componentes contenidos en la ventana, se vaya ajustando a sus respectivos tamaños, partiendo del tamaño de la ventana. (Produce una serie de llamadas en cascada al método pack de cada componente contenido en la ventana). Este método siempre debe ser el último en ser llamado en el constructor del JFrame personalizado que se esté creando.

this.pack();

Mostrar el JFrame

Finalmente para que el JFrame sea visible, hay que invocar el método setVisible. Una buena práctica es invocar este método en la línea de código siguiente a la instanciación del objeto derivado de JFrame. De esta forma se evitan posibles errores lógicos en el constructor de la clase implementada, ya que algunas llamadas a determinados métodos no tienen efecto una vez que la ventana es visible. En el siguiente ejemplo se ha creado una clase llamada StartPoint que será el punto de comienzo de la aplicación.

public class StartPoint {
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				MainFrame mf = new MainFrame();
				mf.setVisible(true);
			}
		});
	}
}

Acerca de franciscoguemes

Ingeniero en Informática
Esta entrada fue publicada en Swing. Guarda el enlace permanente.

5 respuestas a Apariencia de un JFrame

  1. ignorante dijo:

    Para centrar en la pantalla un JFrame luego de hacer el pack o de asignarle su dimensión, se puede hacer esto
    (this es el JFrame)

    private void center() {
    final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    final Point center = ge.getCenterPoint();
    final int w = this.getWidth();
    final int h = this.getHeight();
    final int x = center.x – w / 2;
    final int y = center.y – h / 2;
    this.setBounds(x, y, w, h);
    }

    • franciscoguemes dijo:

      Efectivamente puedes hacer lo que bien indicas, y te va a funcionar exáctamente igual que si haces:
      (this es el JFrame)
      //Hace que la ventana aparezca centrada en la pantalla
      this.setLocationRelativeTo(null);

      La explicación es que el método setLocationRelativeTo(Component c) pertenece a la clase java.awt.Window que es la clase base de java.awt.Frame, quien a su vez el la clase padre de javax.swing.JFrame. Dicho de otra manera: Que tu método “public void center()” ya está implementado en la clase java.awt.Window y funciona exáctamente igual, solo que recibe como parámetro el componente sobre el cuál calculará el punto central para ubicar el JFrame. Si se le pasa una referecia nula, el método de java.awt.Window actúa exactamente igual que tu método, calcula el punto central de la pantalla.

      CONCLUSION:
      El código va a funcionar correctamente de ambas formas, pero siempre es preferible reutilizar los métodos heredados, ya que de esta forma se reduce el código fuente de las clases, lo que redunda en un código más legible, reutilizable, mantenible y además reduce ostensiblemente la posibilidad de aparición de nuevos errores.

      • Cindy dijo:

        Hola, tengo una duda. Si yo quisiera cambiar la típica ventana cuadrada de Jframe, por algo mas mono, como que mi ventana tenga la forma de una máquina de lotería, o de un árbol, etc. cualquier cosa que no sea cuadrada. Se puede hacer?.

  2. ignorante dijo:

    Probablemente es algo que aprendí antes de que ese método fuera agregado en java 1.4.

    • franciscoguemes dijo:

      Es lo bueno de Java que con cada nueva versión se añade mas funcionalidad a las clases que conforman los paquetes base, liberando a los desarrolladores de escribir código redundante en múltiples aplicaciones.
      La verdad es que si se compara Java con otros lenguages de programación anteriores es sorprendente ver como con unas pocas líneas de código se puede crear una ventana (vacía) para un formulario. Cosa que por ejemplo en C/C++ llevaría en torno a unas 100 líneas de código.

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