domingo, 4 de marzo de 2018

Swing: Como crear ventanas principales (JFrame) en Java

Este tutorial como otros tantos de este blog, es una traducción del tutorial oficial, enriquecido con comentarios y experiencia propia.

Una venta JFrame es una ventana de nivel superior (en la jerarquía de componentes), el cual tiene un titulo y border. Un frame (traducido como marco o ventana) es una instancia de la clase JFrame, es una ventana que posee un border, un titulo y botones en la esquina superior derecha para cerrar, minimizar y restaurar la ventana. Una aplicación que usa interfaz grafica de usuario debe tener al menos un frame.

Para crear una ventana que es dependiente de otra ventana - se oculta cuando la otra ventana es minimizada, por ejemplo - debes usar una instancia de un JDialog en lugar de un JFrame. Para crear una ventana que se muestre dentro de otra ventana, debes usar un JInternalFrame.

Creando y Mostrando Ventanas


Para crear y mostrar una ventana lo haremos en 5 pasos


//1.- Crear la Ventana con el titulo "FrameDemo"
JFrame frame = new JFrame("FrameDemo");

//2.- Opcional: Que pasará al cerrar la ventana? Salir de la aplicación.
//Cuando se cierra un frame (botón 'X') la aplicación aun sigue corriendo
//con está opción también cerramos la aplicación
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//3.- Crear componentes y agregarlos a la ventana
//crear un JLabel vacio...
JLabel emptyLabel = new JLabel("");
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

//4.- Ajustar el tamaño de la ventana de acuerdo al tamaño de los componentes agregados
frame.pack();

//5.- Mostrar la ventana
frame.setVisible(true);

Aquí algunos detalles sobre el código

1. La primera linea de código crea un frame usando un constructor que te permite definir el titulo de la ventana. Otro constructor de JFrame usado con mucha frecuencia es el constructor sin argumento.

2. El siguiente codigo define que pasará cuando el usuario cierra la ventana. La operación EXIT_ON_CLOSE cierra el programa cuando el usuario cierra la ventana. Este comportamiento es apropiado para este programa porque el programa tiene una sola ventana principal, y cerrando la ventana principal deja al programa inutilizable.

3. Las siguientes lineas de código agrega un label vacío al contenedor (content pane) del frame. Si no estás familiarizado con contenedores y como agregar componentes a ellos, escribiré una entrada más adelante.

Para frame que tienen menús, tu puedes agregar la barra de menús al frame usando el metodo setJMenuBar. También escribiré una entrada más adelante sobre Como usar Menús.

Es muy importante agregar los componentes al frame por medio del ContentPane, el LayoutManager del ContentPane es un BorderLayoutManager.

Como información adicional, un JFrame tiene un RootPane, ContentPane y GlassPane. En el futuro escribiré una entrada cobre estos Paneles.

4. El metodo pack establece el tamaño del frame en relación con el tamaño (preferredSize) de todos los componentes agregados al contenedor del frame. Una alternativa al metodo pack es establecer el tamaño del frame explicitamente llamando al metodo setSize. En general, es preferible llamar a pack sobre setSize, ya que el metodo pack delega la tarea al LayoutManager.

5. Ahora si, llamando al metodo setVisible(true) haremos que el frame se muestre en la pantalla. Las versiones anteriores usaban el metodo show para mostrar el frame, pero es mejor usar setVisible(true)

Codigo fuente del Ejemplo

package com.macrob.swing;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

/**
 *
 * @author Roberto Lopez <marcos.roberto.lopez@gmail.com>
 */
public class JFrameDemo {

public static void main(String args[]){
//1. Creamos el frame con un titulo
JFrame frame = new JFrame("FrameDemo");

//2.- Opcional: Que pasara al cerrar la ventana? Salir de la aplicacion.
//Cuando se cierra un frame (boton 'X') la aplicacion aun sigue corriendo
//con está opcion tambien cerramos la aplicacion
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

//3.- Crear componentes y agregarlos a la ventana
//crear un JLabel vacio...
JLabel emptyLabel = new JLabel("");
emptyLabel.setPreferredSize(new Dimension(250, 100));
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

//4.- Ajustar el tamaño de la ventana de acuerdo al tamaño de los componentes agregados
frame.pack();

//5.- Mostrar la ventana
frame.setVisible(true);
}


}


El API del JFrame

El API para uso de frames puede caer dentro de las siguientes categorías
  • Creando y Configurando un Frame
  • Estableciendo el tamaño e ubicación del Frame
  • Metodos relacionados con el RootPane

Creando y Configurando un Frame
Método o constructorPropósito
JFrame()
JFrame(String)
Crea un frame que inicialmente no se muestra. El parámetro String proporciona un titulo para el frame. Para mostrar el frame debes invocar al método setVisible(true)
void setDefaultCloseOperation(int)
int getDefaultCloseOperation()
Establecer u obtener la operación que ocurre cuando el usuario presiona el botón cerrar del frame.
Posibles opciones son:
  • DO_NOTHING_ON_CLOSE (no hacer nada)
  • HIDE_ON_CLOSE (ocultar el frame)
  • DISPOSE_ON_CLOSE (ocultar y liberar recursos graficos usados, salir de la aplicación después de liberar el frame)
  • EXIT_ON_CLOSE (Salir de la aplicación inmediatamente)
Las primeras tres constantes están definidas en la interface WindowConstants, el cual JFrame implementa. La constante EXIT_ON_CLOSE está definida en la clase JFrame
void setIconImage(Image)
Image getIconImage()
(in Frame)
Establecer u obtener el icono que representa el frame. Observar que el parámetro es un objeto java.awt.Image y no un javax.swing.ImageIcon.
void setTitle(String)
String getTitle()
(in Frame)
Establecer u obtener el titulo del frame
void setUndecorated(boolean)
boolean isUndecorated()
(in Frame)
Set or get whether this frame should be decorated. Works only if the frame is not yet displayable (has not been packed or shown). Typically used with full-screen exclusive mode or to enable custom window decorations.
static void setDefaultLookAndFeelDecorated(boolean)
static boolean isDefaultLookAndFeelDecorated()
Determine whether subsequently created JFrames should have their Window decorations (such as borders, and widgets for closing the window) provided by the current look-and-feel. Note that this is only a hint, as some look and feels may not support this feature.

Establecer el tamaño e ubicación del Frame
MétodoPropósito
void pack()
(in Window)
Calcula y establece el tamaño según el preferred size de los componentes agregados.
void setSize(int, int)
void setSize(Dimension)
Dimension getSize()
(in Component)
Establecer y obtener el tamaño del frame. Los parámetros int para setSize especifican el ancho y altura respectivamente.
void setBounds(int, int, int, int)
void setBounds(Rectangle)
Rectangle getBounds()
(in Component)
Establecer y obtener el tamaño y ubicación del frame. Para el método con parámetros int, la esquina superior izquierda se especifica por x, y, el cual son los dos primeros parametros, los otros dos corresponden al ancho y alto.
void setLocation(int, int)
Point getLocation()
(in Component)
Establecer y obtener la ubicación de la esquina superior izquierda del frame. Los parámetros son x e y respectivamente.
void setLocationRelativeTo(Component)
(in Window)
Posiciona el frame en el centro del componente especificado. Si el argumento es null, el frame es centrado en la pantalla. Este método se debe invocar después de establecer el tamaño del frame.


Metodos relacionados con el RootPane

MethodPurpose
void setContentPane(Container)
Container getContentPane()
Set or get the frame content pane. The content pane contains the visible GUI components within the frame.
JRootPane createRootPane()
void setRootPane(JRootPane)
JRootPane getRootPane()
Create, set, or get the frame root pane. The root pane manages the interior of the frame including the content pane, the glass pane, and so on.
void setJMenuBar(JMenuBar)
JMenuBar getJMenuBar()
Set or get the frame menu bar to manage a set of menus for the frame.
void setGlassPane(Component)
Component getGlassPane()
Set or get the frame glass pane. You can use the glass pane to intercept mouse events or paint on top of your program GUI.
void setLayeredPane(JLayeredPane)
JLayeredPane getLayeredPane()
Set or get the frame layered pane. You can use the frame layered pane to put components on top of or behind other components.

Referencia

https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html



No hay comentarios:

Publicar un comentario