Java – Paso a paso Tema 11
Written by lopezatienza on 06/09/2009 – 12:30 -TEMA11. Aplicaciones con Java
En esta unidad el alumno aprenderá a utilizar las clases necesarias para realizar aplicaciones gráficas con Java, desarrollará también applets en Java para insertarlos en páginas web. El alumno será capaz de conectar aplicaciones Java con bases de
datos y conocerá una serie de conceptos básicos para poder realizar programación para móviles con Java.
1. Aplicaciones gráficas con Java
2. Applets en Java
3. Programación de Base de Datos con Java
4. Programación de Móviles
1. Aplicaciones gráficas con Java
INTRODUCCIÓN
La Java Foundation Classes se trata de un conjunto de clases para mejorar el soporte al desarrollo de GUIs.
Se creó como una extensión de la AWT añadiendo las siguientes características:
- Componentes Swing.
- Soporte de Look & Feel (Aspecto o estilo que presentan las ventanas)
- Java 2D API
- Soporte de Drag & Drop (Permite implementar las acciones de arrastrar y soltar con el ratón).
¿Qué diferencias nos encontramos entre Swing y AWT?
Swing es el conjunto de nuevos componentes visuales. Habitualmente también se usa como término genérico para referirse a las JFC.
Su diferencia más importante con la AWT es que los componentes son “lightweight”, esto quiere decir que no se usan componentes dependientes del sistema operativo, aparte Swing está totalmente escrito en Java. Todo esto aporta una mayor funcionalidad en manos del programador, y en la posibilidad de mejorar en gran medida los interfaces gráficos de usuario.
Para diferenciar los componentes Swing de los AWT, sus nombres están precedidos por una ‘J’.
Todas las clases Swing se encuentran en el paquete javax.swing.*;
Nunca debemos mezclar componentes Swing con componentes AWT en una misma aplicación.
Son muchas las ventajas que ofrece el uso de Swing. Por ejemplo, la navegación con el teclado es automática, cualquier aplicación Swing se puede utilizar sin ratón, o sin tener que escribir una línea de código adicional.
Empezaremos viendo los componentes AWT, para luego migrar todos esos componentes a sus respectivas formas en Swing, y estudiar las nuevas características que nos aporta, dado que considero conveniente que el alumno entienda primero el AWT, para luego ver como el Swing mejora este AWT.
1.1 EL PAQUETE AWT
Es una librería de clases Java para el desarrollo de interfaces de usuario gráficas (GUI). Por tratarse de código Java, las aplicaciones serán independientes de plataforma. No así su apariencia visual. Es la librería básica. Sobre ella se construyó a posteriori otra más flexible y potente: JFC/Swing. La AWT se encuentra en el paquete: java.awt.*
Dispone de la mayoría de controles visuales estándar: Button, Canvas, Frame, Dialog, Label, List, Choice, ScrollBar, ScrollPane, TextField, TextArea, Menu.
Los elementos básicos que componen esta librería son:
- Los componentes (java.awt.Component) como Buttons, Labels, TextFields, etc…
- Los contenedores (java.awt.Container) como los Frames, los Panels, etc… que pueden contener componentes.
- Los gestores de posición (java.awt.LayoutManager) que gestionan la disposición de los componentes dentro de los contenedores.
- Los eventos (java.awt.AWTEvent) que avisan de las acciones del usuario.
java.awt.Component
Se trata de una clase abstracta que implementa toda la funcionalidad básica de las clases visuales, disponiendo de métodos para mostrar y esconder, habilitar, deshabilitar y atributos como el color del foreground y background, tamaño y posición.
java.awt.Container
Se trata de una clase que implementa la funcionalidad de contener a otros componentes: Window, Dialog, FileDialog, Frame, Panel.
java.awt.LayoutManager
Los contenedores sirven para agrupar componentes visuales. Pero, ¿cómo se distribuyen dichos componentes en su interior? Para ello, se utilizan implementaciones del interface java.awt.LayoutManager.
Cada contenedor tiene asociado un LayoutManager que distribuye los componentes en el interior del contenedor. Por ejemplo, un Panel tiene asociado por defecto una instancia de java.awt.FlowLayout.
Coordenadas y posicionamiento
La posición de los componentes visuales es relativa al contenedor en el que se encuentra. La coordenada 0,0 es la esquina superior izquierda del contenedor. La clase java.awt.Component implementa varios métodos para la gestión del tamaño y
posicionamiento como por ejemplo:
Rectangle getBounds( ); Dimension getSize( ); void setLocation(int x, int y);
void setSize(Dimension d); Point getLocation( ); Container getParent( );
void setBounds(int x, int y, int width, int height);
La clase java.awt.Container posee varios métodos para acceder a los componentes que
contienen como por ejemplo:
add(Component c) Inserta el componente c en el contenedor que utiliza el método.
remove(Component c) Elimina el componente c en el contenedor que utiliza el método.
Component[] getComponents( ) Devuelve un array con los componentes del contenedor
Pasos a seguir
- Crear el componente Button b=new Button( );
- Añadir el componente al contenedor unContenedor.add(b);
- Invocar métodos sobre el componente y manejar sus eventos. b.setText(“Ok”);
Ejemplos de componentes
Layout Managers
Todos los contenedores AWT tienen asociado un LayoutManager para coordinar el tamaño y la situación de sus componentes (Panel->FlowLayout, Frame->BorderLayout)
Cada Layout se caracteriza por el estilo que emplea para situar los componentes en su interior: Alineación de izquierda a derecha, Alineación en rejilla, Alineación del frente a atrás.
¿Por qué usar Layout Managers?
Determinan el tamaño y la posición de los componentes en un contenedor. Tiene un API que permite al contenedor y al LayoutManager gestionar el cambio de tamaño de contenedor de manera transparente. Consiguen que la aplicación sea independiente de la resolución de las máquinas donde se ejecuta. Implementan el interface java.awt.LayoutManager.
FlowLayout: sitúa los componentes de izquierda a derecha. Les modifica la posición pero no les modifica el tamaño.
BorderLayout: se basa en los puntos cardinales. Modifica tanto la posición como el tamaño de los componentes.
CardLayout: permite al desarrollador intercambiar distintas vistas como si se tratase de una baraja. Modifica tanto la posición como el tamaño de los componentes.
GridLayout: usa una matriz en la que sitúa cada uno de los componentes. El tamaño de todas las celdas es igual.
GridBagLayout: similar al anterior, pero no fuerza a que todos los componentes tengan el mismo tamaño.
EVENTOS
Un evento es una encapsulación de una información que puede ser enviada a la aplicación de manera asíncrona. Pueden corresponder a acciones físicas (ratón y teclado) y a acciones lógicas. java.util.EventObject es la clase padre de todos los
eventos. Su subclase java.awt.AWTEvent es la clase padre de todos los eventos AWT.
Los eventos contienen un id (int que describe el tipo de evento). También contiene información sobre el origen del evento (getSource( );).
El manejo de eventos se consigue mediante el uso de interfaces definidos en el paquete java.awt.event: ActionListener, WindowListener, KeyListener, MouseListener,…
Tipos de eventos:
- Físicos:
o ComponentEvent: Esconder, mover, redimensionar, mostrar.
o ContainerEvent: Añadir o eliminar un componente.
o FocusEvent: Obtener o perder foco.
o KeyEvent: Pulsar, liberar o teclear una tecla.
o MouseEvent: Entrar, salir, pulsar, soltar, clicar.
- Semánticos:
o ActionEvent: Una acción se ha ejecutado.
o AdjustmentEvent: Un valor se ha ajustado.
o ItemEvent: Un estado ha cambiado.
o TextEvent: Un texto ha cambiado.
ADAPTERS
Son clases que tienen definidos todos los métodos de un interface concreto.
La implementación de dichos métodos está vacía.
Heredando de un Adapter, y sobrescribiendo los métodos necesarios conseguimos el mismo interface.
Problema: en Java no existe la herencia múltiple, por ello se suelen usar con las Clases Anónimas.
Ejemplo con Adapters
Registro a la notificación de eventos
Cuando invocamos el método addWindowListener, estamos estableciendo un ‘callback’.
Como parámetro se manda un escuchador, el cual debe implementar el interfaz correspondiente.
Cuando se genera un WindowEvent como consecuencia de pulsar el botón con la X, el método windowClosing( ) del escuchador es invocado.
Se pueden añadir varios escuchadores a un mismo notificador de eventos.
EJEMPLO
import java.awt.*;
import java.awt.event.*;
public class EjemploBotonEvento implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
if(((Button)ev.getSource()).getLabel().equals("Aceptar"))
System.out.println("Has pulsado Aceptar");
else
System.out.println("Has pulsado Cancelar");
}
public EjemploBotonEvento()
{
Frame f=new Frame();
f.setTitle("Ejemplo de Evento de Boton");
f.setSize(200,150);
f.setLayout(new FlowLayout());
Button b1=new Button("Aceptar");
b1.addActionListener(this);
f.add(b1);
Button b2=new Button("Cancelar");
b2.addActionListener(this);
f.add(b2);
f.setVisible(true);
}
public static void main(String[] args)
{
EjemploBotonEvento b=new EjemploBotonEvento();
}
}
OTRAS CLASES
java.awt.Color
Implementa un color descrito según en RGB, que es un sistema de definición de colores, donde se especifica el nivel de saturación de cada uno de esos tres colores mediante valores entre 0 y 255.
Se puede construir mediante un valor RGB: Color amarillo= new Color(255,255,0);
O utilizar colores predefinidos mediante constantes: Color amarillo= Color.YELLOW;
java.awt.Font
Implementa la representación gráfica de una letra.
Se define mediante:
- Familia: nombre del tipo de letra.
- Estilo: normal o negrita y/o cursiva.
- Tamaño: píxels del punto utilizado para pintar la letra.
Existen dos clases de nombres de familia:
- Lógico: Serif, SansSerif, Monospaced, Dialog y DialogInput.
- Físico: Cualquier familia instalada en el sistema.
Para definir el estilo se utilizan estas constantes:
Font.PLAIN: normal, Font.BOLD: negrita, Font.ITALIC: cursiva.
Para combinar varios estilos se utiliza el OR lógico a nivel de bit: |
java.awt.Cursor
Implementa la representación gráfica del cursor.
Existen varios predefinidos, que se pueden usar mediante el uso de constantes. Algunos cursores:
Cruz: Cursor.CROSSHAIR_CURSOR
Mano: Cursor.HAND_CURSOR
Mover: Cursor.MOVE_CURSOR
Texto: Cursor.TEXT_CURSOR
Espera: Cursor.WAIT_CURSOR
La clase java.awt.Component tiene el método: public void setCursor(Cursor cursor)
java.awt.Graphics
Sirve para dibujar. Todos los componentes AWT son dibujados en pantalla a través del método de la clase java.awt.Component: public void paint(Graphics g);
Permite: trabajar con primitivas gráficas: figuras, colores, textos; o trabajar con
imágenes: GIF y TPEG.
Un componente puede pedir que sea repintado mediante el método:
public void repaint( );
También permite trabajar con imágenes, representadas por la clase java.awt.Image.
Soporta los formatos: GIF y JPEG.
Para cargar una imagen se utiliza la clase java.awt.Toolkit:
Toolkit.getDefaultToolkit( ).getImage(…);
Para pintar una imagen: drawImage( );
1.2 EL PAQUETE SWING
javax.swing.JComponent
Hereda de la clase java.awt.Container. Se trata de una clase abstracta que implementa toda la funcionalidad básica de las clases visuales: Ayudas emergentes, bordes, gestión del Look & Feel, gestión de la accesibilidad, gestión de teclas asociadas, soporte de Drag & Drop.
Migrando de AWT a Swing
Se eliminan todos los import de paquetes java.awt.*. Se importa el paquete javax.swing.*. Se cambia cada componente AWT por el Swing más parecido.
Frame->JFrame, Button->JButton
NOTA: No se pueden añadir componentes o establecer LayoutManagers directamente sobre JWindow, JFrame, JDialog o JApplet. Esto hay que hacerlo sobre el Container que devuelve el método: public Container getContentPane( ).
javax.swing.JFrame
Layout Managers
Todos los contenedores Swing tienen asociado un LayoutManager para coordinar el tamaño y la situación de sus componentes. JPanel->FlowLayout, JFrame->BorderLayout.
Cada Layout se caracteriza por el estilo que emplea para situar los componentes en su interior:
- Alineación de izquierda a derecha.
- Alineación en rejilla.
- Alineación del frente a atrás.
Aparte de los que vimos para awt, existen nuevos Layout Managers:
- BoxLayout: sitúa los componentes en línea vertical u horizontal, respetando sus tamaños. La clase javax.swing.Box tiene métodos para crear zonas con espacio como createVerticalStrut(int) y zonas que absorban los espacios como
createVerticalGlue(int).
- SpringLayout: permite definir la relación (distancia) entre los límites de los distintos controles.
- ScrollPaneLayout, ViewportLayout: utilizados internamente por Swing para algunos de los componentes como el ScrollPane.
EVENTOS
LOOK & FEEL
Existen distintas alternativas para seleccionar el Look & Feel de una aplicación Java:
- Por línea de comando:
o Java –Dswing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel MiApp
- Mediante el fichero swing.properties (localizado en el directorio \lib del JRE)
- Por código de forma estática (al inicio del programa)
o try{
UIManager.setLookAndFeel(“javax.swing.plaf.metal.MetalLookAndFeel”);
}
catch(Exception ex){}
<< Volver al tema anterior
Referencias:
Tags: Java
Posted in Java | 4 Comments »
junio 4th, 2010 at 00:21
Java Look and Feel…
Tu post es interesante.. he agregado un Trackback de tu post en mi blog :)…
junio 4th, 2010 at 08:28
Me parece perfecto 🙂
Un saludo!
noviembre 11th, 2010 at 14:25
Me alegro que te sirviera de ayuda 😉