Professional Documents
Culture Documents
Los diseadores de Java denominan JFC (Java Foundation Classes) a un con junto de
clases especialmente diseadas para ayudar al desarrollo de aplicaciones graficas en Java,
estas estn agrupadas en AWT, Swing y Accesibility API.
Una interfaz es lo que le permite a un usuario comunicarse con un programa.
Una interfaz es lo que nosotros vemos al arrancar, por ejemplo, un navegador de
internet: un conjunto de mens, botones, barras.... que nos permiten activar un cdigo que es
el que realmente nos llevar a una pgina web, salvar la imagen en el disco duro....
Los paquetes java.awt y javax.swing, junto con varios subpaquetes de stos, son los
encargados de proporcionar las clases necesarias para construir interfaces grficas de usuario
(conocidas habitualmente por GUI, del ingls Graphical User Interface).
El primer paquete, java.awt, surge en las primeras versiones de Java y pronto se
encontraron desventajas en su utilizacin. El principal inconveniente de java.awt es que la
percepcin de una aplicacin realizada con este paquete es distinta dependiendo del sistema
operativo que se utilice.
En AWT cuando aadamos un botn, por ejemplo, a nuestro diseo el compilador
generaba cdigo que le peda al sistema operativo la creacin de un botn en un determinado
sitio con unas determinadas propiedades;
El motivo es que esta biblioteca genera una representacin virtual de los componentes
de la interfaz de usuario y es el propio sistema operativo el encargado de representar
visualmente cada componente. Dado que cada sistema operativo tiene su propia manera de
representarlos, el resultado final puede variar de un sistema a otro.
Para solucionar ese problema se defini el paquete javax.swing. Esta biblioteca ya no
utilizaba los componentes del sistema operativo para la realizacin de interfaces de usuario,
sino que defina sus propios componentes.
Esta independencia de los sistemas operativos en los que se ejecutar la aplicacin
permite que se perciba con el mismo aspecto en todos.
Adems, sta no est condicionada por la necesidad de que el sistema operativo tenga
un componente para representarlo, por lo que la biblioteca define su propio conjunto de
componentes, ms rico que el de cualquier sistema operativo.
Sin embargo, la biblioteca Swing no nace desde cero, sino que se apoya en el diseo de
la biblioteca AWT (Abstract Window Toolkit).
modelo/vista/controlador
Se trata del modelo fundamental del trabajo con interfaces de usuario por parte de
Swing. Consiste en tres formas de abstraccin. Un mismo objeto se ve de esas tres formas:
Modelo. Se refiere al modelo de datos que utiliza el objeto. Es la informacin que
se manipula mediante el objeto Swing.
Vista. Es cmo se muestra el objeto en la pantalla.
Controlador. El controlador es el encargado de actuar cuando el usuario decide
realizar una accin sobre un elemento visible y activo de la vista. Por ejemplo:
cuando se pulsa un botn, o la tecla de retorno de carro sobre un campo de texto
El patrn MVC separa los datos y la funcionalidad de la aplicacin (el modelo) de su
representacin (la vista) y de la forma en que se interacta con el modelo a travs de la vista
(el controlador).
Elementos de Swing
Los elementos que forman parte de una interfaz grfica se denominan componentes.
Entre los componentes existen unos especializados que se denominan contenedores. Un
contenedor es un componente capaz de almacenar otros componentes.
Estos contenedores se subdividen en superiores e intermedios.
Hay que importar tanto la clase Dimension, como la clase Toolkit y hay que colocarlo en
el constructor despus de declarar el formulario;
private void initialize() {
frmConcesionarioAbrahan = new JFrame();
frmConcesionarioAbrahan.setTitle("Concesionario S13");
frmConcesionarioAbrahan.getContentPane().setBackground(Color.BLACK);
frmConcesionarioAbrahan.setResizable(false);
frmConcesionarioAbrahan.setBounds(100, 100, 451, 342);
frmConcesionarioAbrahan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
frmConcesionarioAbrahan.setSize(screenSize);
}
Maximizar la ventana que ya aparezca de entrada:
frmConcesionarioAbrahan.setExtendedState(JFrame.MAXIMIZED_BOTH);
Quitar el marco (sin titulo, y sin los botones (_
X)
frmConcesionarioAbrahan.setUndecorated(true);
Ajustar ventana (Hacer que todos los componentes contenidos en la ventana se vayan
ajustando a sus respectivos tamaos, partiendo del tamao de la ventana).
Este mtodo debe ser el ltimo en ser llamado: pack()
NOTA: En el caso de que trabajemos con componentes swing:
Normalmente los componentes no van sobre el frame, sino que se colocan en un
contenedor intermedio JPanel,
Es el contenedor intermedio ms utilizado
No tiene representacin grfica es para estructurar el contenido,
aunque se le pueden aadir bordes
Para poner ttulo a un JPanel:
jPanel.setBorder(BorderFactory.createTitledBorder("Es el Titulo"));
Todos los contenedores llevan una disposicin por defecto, aunque existen otras ya
incorporadas en la API de Swing.
FlowLayout
Los componentes se colocan centrados comenzando a la izquierda hasta llenar la lnea, y se
pasa a la siguiente
BorderLayout
Se ponen los componentes en un lateral o en el centro indicando una direccin: East, West,
North, South, Center
GridLayout
Se colocan los componentes de izquierda a derecha y de arriba a abajo en una rejilla
rectangular de n filas por m columnas
BoxLayout
Se colocan los componentes de acuerdo con uno de los dos ejes : vertical u horizontal
Propiedades
Las propiedades de los componentes son las caractersticas particulares que
podemos darle a cada uno. Son por ejemplo: El tamao, color de fondo, tipo de letra
Pero definir y aprender todas las propiedades de cada componente es una tarea casi
imposible, dado que estn todas definidas en la API y adems los entornos de trabajo las
tienen todas definidas y muestran un interface para interactuar con ellas evitando que
debamos modificarlas directamente sobre el cdigo.
Un ejemplo de una parte de las propiedades de un botn que nos ofrece el entorno de
Eclipse es:
Si queremos ver ms propiedades, se
pulsa el botn visualizar propiedades
avanzadas
Por ejemplo:
Para poner el titulo se usa la propiedad title, si se hace en programacin setTitle(nuevo
nombre)
Todas las clases con las que vamos a trabajar tienen una serie de propiedades que podemos
variar en modo diseo o en modo programacin que son:
Diseo
Cambiar el texto actual
Text
JComboBox y el JSlider no cuentan con este mensaje.
Programacin
setText(String texto);
Size
Font
setFont("Helvetica", 1, 20);
background
Bounds
setBounds(10,10,400,300)
Botn:JButton
Otro control visual de uso muy comn es el que provee la clase JButton. Este control
visual muestra un botn.
En java es el control principal del jFrame, contiene el cdigo principal del programa y su
activacin por el usuario provoca que se realicen los principales procesos del problema
planteado (aqu es donde se capturan datos, se realizan operaciones, etc.).
De este control se maneja su propiedad TEXT para etiquetarlo con la palabra OK o
ACEPTAR o EXE y su evento Click para activarlo, es en dicho evento donde se construye el
cdigo del programa.
Para insertar una imagen en un botn se hace desde cdigo ya que en diseo genera un
cdigo de error.
Cuando se genera el botn se aade:
ImageIcon Icono= new ImageIcon(nombre.jpg);
jButton.setIcon(Icono);
Mucho mejor usar:
JButton.setIcon(new ImageIcon (formulario.class.getResource(imagen.jpg)));
No se puede poner ruta a la imagen sino no la veriamos desde otro ordenador, se coloca
en la carpeta del proyecto fuera de src, se puede colocar en una carpeta del proyecto y puede
ser:mpg, bmp, png o jpg no ico.
Otros mtodos:
Para cambiar la imagen cuando el ratn este sobre el botn:
jButton.setRolloverIcon(new ImagenIcon(nombre.jpg));
Cambiar de imagen cuando se presione el botn:
jButton.setPressedIcon(new ImagenIcon(nombre.jpg));
Para hacer botones redondos:
Se busca la imagen correspondiente, se aplica el mtodo:
setContentAreaFilled(false) para elimnar toda el rea alrededor del botn
setBorder(null) quitar el borde del botn
poner la imagen como icono
jToopleButton es un botn bi-estado
Campo de texto:JTextField
As como podramos decir que el control JLabel remplaza a la salida estndar
System.out.print, el control JTextField cumple la funcin de la clase Scanner para la entrada de
datos.
En Java este componente es un importante componente visual, su funcin principal es
manejar todos los procesos de entrada y salida (input/output) al programa.
Su principal propiedad es Text(), que es la propiedad que contiene el dato de tipo
STRING que se manipulara en los programas o aplicaciones.
El dato dentro de esta propiedad es de tipo STRING y por tanto se tendr que convertir a
datos numricos normales para poder efectuar procesos numricos
El control JTextField permite al operador del programa ingresar una cadena de
caracteres por teclado.
Como ejemplo vamos a ver cmo se realizara el clculo del doble de un valor numrico
introducido por el usuario. La ventana contiene campoNmero donde el usuario indicar un
nmero, y campoResultado donde se mostrar el doble del valor escrito.
Podemos ver que se ha generado automticamente el cdigo para inicializar los textos de los
controles JLabel y JButton
import
import
import
import
import
import
import
import
java.awt.BorderLayout;
javax.swing.JPanel;
javax.swing.JFrame;
java.awt.GridBagLayout;
java.awt.Dimension;
javax.swing.JLabel;
java.awt.event.KeyEvent;
java.awt.Color;
import java.awt.Rectangle;
import javax.swing.JTextField;
import javax.swing.JButton;
public class pruebavisual extends JFrame {
private
private
private
private
private
private
private
private
private
public pruebavisual() {
super(); --- Llama a la clase padre
initialize(); }---Llama al constructor
----------------------------private JButton getJButtoncancelar() {
if (jButtoncancelar == null) {
jButtoncancelar = new JButton();
jButtoncancelar.setBounds(new Rectangle(231, 171, 141, 36));
jButtoncancelar.setText("Cancelar");
}
return jButtoncancelar;}
/*Aqu se aadira main */ }
Y de esta forma con todos los objetos
Podemos sacar un mensaje usando : (No olvidar que hay que importar la clase :
import javax.swing.JOptionPane;
JOptionPane.showMessageDialog( null, "Hola mundo ", JOptionPane.PLAIN_MESSAGE );
Tambin podemos visualizar el contenido de variables:
JOptionPane.showMessageDialog( null, "La suma es " + suma, "Suma de dos enteros",
JOptionPane.PLAIN_MESSAGE );
El primer argumento ayuda a la aplicacin de Java a determinar en dnde debe colocar el
cuadro de dilogo. El valor null indica que el dilogo debe aparecer en el centro de la
pantalla de la computadora.
El segundo argumento es el mensaje a mostrar; en este caso, el resultado de concatenar el
objeto String "La suma es " y el valor de suma.
El tercer argumento ("Suma de dos enteros") representa la cadena que debe aparecer en la
barra de ttulo del dilogo, en la parte superior.
El cuarto argumento (JOption-Pane.PLAIN_MESSAGE) es el tipo de dilogo de mensaje a
mostrar. Un dilogo PLAIN_MESSAGE no muestra un icono a la izquierda del mensaje. La
clase JOptionPane proporciona varias versiones sobrecargadas de los mtodos
Donde null es la posicin centrada y El texto que queremos que aparezca, es este caso aparece
un cuadro de dialogo con el siguiente formato:
El sistema operativo notifica a las aplicaciones que estn ocurriendo estos eventos, y
ellas deciden si han de responder o no de algn modo a este evento.
Evento en Java
Cada vez que un usuario ejecuta una accin sobre un programa desarrollado en Java se
produce un evento que el sistema operativo recoge y transmite al sistema Java.
Cuando la JVM recibe un evento genera una clase de ese tipo y es transmitido a un
mtodo para que lo procese.
Es decir se crea un objeto al producirse un evento (Source) pero lo gestiona
otro objeto (listener). Este tipo de arquitectura se llama modelo basado en la
delegacin.
El modelo de delegacin de eventos
El modelo de Java se basa en la delegacin de eventos: el evento se produce en un
determinado componente, por ejemplo un botn. Dnde se produce el evento se denomina
fuente del evento. A continuacin el evento se transmite a unmanejador de eventos (event
listener) que este asignado al componente en el que se produjo el evento. El objeto que
escucha los eventos es el que se encargar de responder a ellos adecuadamente.
Evento en Swing
Un evento de Swing es una accin iniciada por el usuario al utilizar un
elemento de un interface de usuario.
Cada vez que se produce un evento automticamente se crea un objeto de ese tipo de
evento.
Todos los eventos vienen de la clase java.awt.event
Manejo de Eventos
Cuando un usuario interacta con un interface de usuario pulsando un botn,
seleccionando un valor de un botn se genera un evento que tiene los siguientes elementos:
1. Fuente del evento o event source .Es el componente swing que origina el evento.
2. El escuchador o event listener. Es el encargado de atrapar o detectar que se ha producido
un evento.
3. El manejador del evento o event handler Es un mtodo que recibe un objeto del tipo de
evento que se ha producido, lo descifra, ejecuta el cdigo asociado y devuelve el control al
usuario.
Es decir que tendremos que para manejar los eventos que se producen en una aplicacin
tenemos que controlar estos 3 aspectos.
Tipos de Eventos
El modelo de eventos que permite java es:
ActionEvent
Este evento se produce cuando se efecta cualquier accin sobre un
componente, ya sea un click , doble click...
AdjustmentEvent
Este evento se produce cuando se ajusta un valor de un componente.
ComponentEvent
Este evento se produce cuando el usuario mueve redimensiona un componente.
ItemEvent
Este evento se produce cuando se modifica el estado de un elemento del
componente.
TextEvent
Este evento se produce cuando el contenido textual de un componente cambia.
FocusEvent
Este evento se produce cuando se cambia el foco de un componente.
InputEvent
Este evento se produce cuando se realizan operaciones especiales con el teclado o ratn
(ctrl + alt )
ContainerEvent
Este evento se produce cuando se aaden o se eliminan componentes en un
contenedor.
WindowEvent
Este evento se produce cuando se realiza una accin sobre una ventana como abrirla,
cerrarla, minimizarla
KeyEvent (Importante)
Este evento se produce cuando el usuario presiona una tecla. (Lo usaremos para
controlar la tecla pulsada)
Por ejemplo si queremos controlar que solo introduzcamos valores numricos:
KeyEvent->eventos->key->KeyTiped y generamos el cdigo:
Nombreobjeto.addKeyListener(new KeyAdapter(){
@override
public void keyTyped(keyEvent e){
char caracter=e.getKeyChar(); // declaramos un character que recoge la tecla pulsada
if(caracter<0 || carcter >9)
e.consume() // llamamos al mtodo consume(), que no va a hacer eco de la tecla
pulsada hasta que no sea un numero
}
});
MouseEvent
Este evento se produce cuando el usuario realiza una accin con el ratn ya sea click,
pasar por encima de un componente
Se utiliza cuando queremos que un mtodo se ejecute nada ms abrir la ventana por ej.
Cargar un JComboBox o un JTable. Se hace aadiendo el evento: window->windowOpened al
Frame
Por Ej.
public class MiClase implements ActionListener
{
public void actionPerformed (ActionEvent e)
{
// Aqui el cdigo que queremos que se ejecute cuando tiene lugar la accin.
// la pulsacin del botn, el <INTRO> en el JTextField, eleccin en el JComboBox, etc.
}
}
Distinguir qu botn causa la accin
Cuando nos decidimos a hacer una clase, suele ser habitual querer aprovechar
la clase para varios botones. En el mtodo actionPerformed() de esa clase se nos pasa un
ActionEvent. Con este ActionEvent podemos obtener informacin sobre quin es el que ha
provocado el evento.
Object fuente = event.getSource();
Este mtodo nos devuelve el componente java (JButton, JTextField, etc) que ha provocado
el evento. Si la clase est aadida, por ejemplo a boton1, boton2 y boton3, en el mtodo
actionPerformed() podemos hacer algo como esto
public void actionPerformed (ActionEvent e)
{
Object fuente = e.getSource();
if (fuente==boton1)
metodoParaBoton1();
else if (fuente==boton2)
metodoParaBoton2();
else if (fuente==boton3)
metodoParaBoton3();
}
Para aadir un evento a un objeto, y fijaos el cdigo que se genera automticamente:
jcerrar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.exit(0);
}
});
En el parmetro del mtodo addActionListener del botn que cierra se le pasa la
referencia a una interface que se crea de tipo ActionListener e implementa el mtodo
actionPerformed donde agregaremos el cdigo necesario para responder el evento en este caso
cerrar la aplicacin.
Veamos un ejemplo
Para asociar eventos existe una mecnica para automatizar la generacin de las
interfaces que capturan los eventos de los objetos JButton, JMenuItem, JList etc.
Crearemos una interfaz visual similar a esta (tres controles de tipo JLabel, dos JTextField y dos
JButton):
Ahora seleccionamos el control JButton y con le hacemos click con el botn derecho y aparece
el men contextual y vemos el evento que vamos a aplicar
En este caso actionPerformed. Hacemos clic sobre el evento y vemos que se abre el editor de
texto y aparece el siguiente cdigo generado automticamente:
jButtonsumar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("actionPerformed()");
} });
En el parmetro del mtodo addActionListener del botn que suma se le pasa la
referencia a una interface que se crea de tipo ActionListener e implementa el mtodo
actionPerformed donde agregaremos el cdigo necesario para responder el evento,
en este caso aparece por defecto una salida por consola.
Para este problema debemos rescatar los valores almacenados en los controles de tipo
JTextField, convertirlos a entero, sumarlos y enviar dicho resultado a una JLabel.
jButtonsumar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
int v1=Integer.parseInt(jTextFieldprimervalor.getText());
int v2=Integer.parseInt(jTtextFieldsegundovalor.getText());
int suma=v1+v2;
jLabel1resultado.setText(String.valueOf(suma));
}
});
Hacemos lo mismo para el botn Salir:
jButtonsalir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.exit(0);
} });
Ejecutamos el programa y listo:
Ejercicios propuestos
1.- Confeccionar un programa que permita ingresar un mail en un control de tipo JTextField y
el cuerpo del mail en un control de tipo JTextArea. Aadirle dos botones uno limpiar que
limpiar el area de texto y otro para salir
2.-Realiza la siguiente interfaz, de forma que al pulsar un botn aparezca una etiqueta con su
color y escrito el texto en ese color: