interfaces visuales java

26
Tema 19- Interfaces visuales (Componentes Swing)-I Los diseñadores de Java denominan JFC (Java Foundation Classes) a un con junto de clases especialmente diseñadas para ayudar al desarrollo de aplicaciones graficas en Java, estas están 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 menús, botones, barras.... que nos permiten activar un código que es el que realmente nos llevará a una página 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 gráficas de usuario (conocidas habitualmente por GUI, del inglés Graphical User Interface). El primer paquete, java.awt, surge en las primeras versiones de Java y pronto se encontraron desventajas en su utilización. El principal inconveniente de java.awt es que la percepción de una aplicación realizada con este paquete es distinta dependiendo del sistema operativo que se utilice. En AWT cuando añadíamos un botón, por ejemplo, a nuestro diseño el compilador generaba código que le pedía al sistema operativo la creación de un botón en un determinado sitio con unas determinadas propiedades; El motivo es que esta biblioteca genera una representación 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 realización de interfaces de usuario, sino que definía sus propios componentes. Esta independencia de los sistemas operativos en los que se ejecutará la aplicación permite que se perciba con el mismo aspecto en todos. Además, é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, más rico que el de cualquier sistema operativo. Sin embargo, la biblioteca Swing no nace desde cero, sino que se apoya en el diseño de la biblioteca AWT (Abstract Window Toolkit).

Upload: stonenipples-malaga

Post on 14-Jul-2016

62 views

Category:

Documents


5 download

DESCRIPTION

interfaces visuales java

TRANSCRIPT

Page 1: Interfaces Visuales Java

Tema 19- Interfaces visuales (Componentes Swing)-I

Los diseñadores de Java denominan JFC (Java Foundation Classes) a un con junto declases especialmente diseñadas para ayudar al desarrollo de aplicaciones graficas en Java,estas están 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 deinternet: un conjunto de menús, botones, barras.... que nos permiten activar un código que esel que realmente nos llevará a una página web, salvará la imagen en el disco duro....

Los paquetes java.awt y javax.swing, junto con varios subpaquetes de éstos, son losencargados de proporcionar las clases necesarias para construir interfaces gráficas de usuario(conocidas habitualmente por GUI, del inglés Graphical User Interface).

El primer paquete, java.awt, surge en las primeras versiones de Java y pronto seencontraron desventajas en su utilización. El principal inconveniente de java.awt es que lapercepción de una aplicación realizada con este paquete es distinta dependiendo del sistemaoperativo que se utilice.

En AWT cuando añadíamos un botón, por ejemplo, a nuestro diseño el compiladorgeneraba código que le pedía al sistema operativo la creación de un botón en un determinadositio con unas determinadas propiedades;

El motivo es que esta biblioteca genera una representación virtual de los componentesde la interfaz de usuario y es el propio sistema operativo el encargado de representarvisualmente cada componente. Dado que cada sistema operativo tiene su propia manera derepresentarlos, el resultado final puede variar de un sistema a otro.

Para solucionar ese problema se definió el paquete javax.swing. Esta biblioteca ya noutilizaba los componentes del sistema operativo para la realización de interfaces de usuario,sino que definía sus propios componentes.

Esta independencia de los sistemas operativos en los que se ejecutará la aplicaciónpermite que se perciba con el mismo aspecto en todos.

Además, ésta no está condicionada por la necesidad de que el sistema operativo tengaun componente para representarlo, por lo que la biblioteca define su propio conjunto decomponentes, más rico que el de cualquier sistema operativo.

Sin embargo, la biblioteca Swing no nace desde cero, sino que se apoya en el diseño dela biblioteca AWT (Abstract Window Toolkit).

Page 2: Interfaces Visuales Java

modelo/vista/controlador

Se trata del modelo fundamental del trabajo con interfaces de usuario por parte deSwing. Consiste en tres formas de abstracción. Un mismo objeto se ve de esas tres formas:

Modelo. Se refiere al modelo de datos que utiliza el objeto. Es la información quese manipula mediante el objeto Swing. Vista. Es cómo se muestra el objeto en la pantalla. Controlador. El controlador es el encargado de actuar cuando el usuario deciderealizar una acción sobre un elemento visible y activo de la vista. Por ejemplo:cuando se pulsa un botón, o la tecla de retorno de carro sobre un campo de texto

El patrón MVC separa los datos y la funcionalidad de la aplicación (el modelo) de surepresentación (la vista) y de la forma en que se interactúa con el modelo a través de la vista(el controlador).

Elementos de Swing

Los elementos que forman parte de una interfaz gráfica se denominan componentes.

Entre los componentes existen unos especializados que se denominan contenedores. Uncontenedor es un componente capaz de almacenar otros componentes.

Estos contenedores se subdividen en superiores e intermedios.

Page 3: Interfaces Visuales Java

Los contenedores superiores forman la base para la realización de interfaces gráficas deusuario en Java.

Los distintos contenedores superiores son proporcionados por las clases JFrame,JDialog y JApplet.

La clase JFrame se utiliza para realizar aplicaciones con interfaz gráfica en Java.La clase JDialog se utiliza para realizar ventanas de petición de datos al usuario.La clase JApplet se utiliza para realizar aplicaciones de interfaz gráfica que se ejecutan dentrode un navegador web.

Los contenedores intermedios son los encargados de almacenar los componentesvisuales de la aplicación. Además, éstos pueden incluir otros contenedores, lo que proporcionaun modelo muy flexible para realizar aplicaciones con una interfaz compleja.

JFRAME

Es el contenedor que emplearemos para situar en él todos los demás componentes quenecesitemos para el desarrollo de la interface de nuestro programa.Es una ventana de nivel superior que tiene título y bordes

Entre otras propiedades el JFRAME tenemos:

Para que una ventana no se pueda redimensionar: setResizable(true); Para centrar la ventana: setLocationRelativeTo(null); Dimensionar la ventana al tamaño de la pantalla:

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

Page 4: Interfaces Visuales Java

Hay que importar tanto la clase Dimension, como la clase Toolkit y hay que colocarlo enel constructor después 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 vayanajustando a sus respectivos tamaños, partiendo del tamaño de la ventana).

Este método 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 uncontenedor intermedio JPanel,

Es el contenedor intermedio más utilizado No tiene representación gráfica es para estructurar el contenido,

aunque se le pueden añadir bordesPara poner título a un JPanel:jPanel.setBorder(BorderFactory.createTitledBorder("Es el Titulo"));

Todos los contenedores llevan una disposición por defecto, aunque existen otras yaincorporadas en la API de Swing.

• FlowLayoutLos componentes se colocan centrados comenzando a la izquierda hasta llenar la línea, y sepasa a la siguiente

• BorderLayoutSe ponen los componentes en un lateral o en el centro indicando una dirección: “East”, “West”,“North”, “South”, “Center”

• GridLayoutSe colocan los componentes de izquierda a derecha y de arriba a abajo en una rejillarectangular de “n” filas por “m” columnas

• BoxLayoutSe colocan los componentes de acuerdo con uno de los dos ejes : vertical u horizontal

Page 5: Interfaces Visuales Java

Normalmente colocaremos JPanel sobre el área "Center" del JFrame, y si queremostener libertad absoluta a la hora de posicionar un control en el contenedor JPanel deberemoscambiar la propiedad layout a null.

Nosotros trabajaremos con componentes WindowBuilder, en este caso no hay queincorporarles el panel puesto que ya lo trean por defecto. Si hay que cambiar la propiedadlayout a absolute para poder colocar todos los componentes donde queramos.

También podemos usar groupLayout() para que los componentes se adapten alformulario.

Para realizar estos ejercicios utilizaremos el plugins Windows Builder

(Mirar documento de cómo instalar nuevos plugins) (ya lo tenemos instalado)

Una vez instalado:

Inicia un nuevo proyecto con nombre : NuevoVisual Menú Archivo > Nuevo > Proyecto Java Ahora en el proyecto agrega el siguiente elemento:Menú Archivo > Nuevo > Otras >WindowBuilder > Swing Designer > AplicationWindow y le das el mismo nombre :NuevoVisual

Page 6: Interfaces Visuales Java

El resultado será similar a

Antes de seguir recordemos el código generado por WindowBuilder:

Page 7: Interfaces Visuales Java

Propiedades

Las propiedades de los componentes son las características particulares quepodemos darle a cada uno. Son por ejemplo: El tamaño, color de fondo, tipo de letra…

Pero definir y aprender todas las propiedades de cada componente es una tarea casiimposible, dado que están todas definidas en la API y además los entornos de trabajo lastienen todas definidas y muestran un interface para interactuar con ellas evitando quedebamos modificarlas directamente sobre el código.

Un ejemplo de una parte de las propiedades de un botón que nos ofrece el entorno deEclipse es:

Si queremos ver más propiedades, sepulsa el botón visualizar propiedadesavanzadas

Por ejemplo:Para poner el titulo se usa la propiedad title, si se hace en programación setTitle(“nuevo

nombre”)

Page 8: Interfaces Visuales Java

NOTA: Los objetos que necesitamos consultar o modificar en tiempo de ejecucióndebemos defirnirlos como atributos de clase. para ello dentro deEclipse->Ventana->preferencias->WindowBuilder->Swing-> CodeGeneration,marcar Field

Page 9: Interfaces Visuales Java

También podemos seleccionar un determinado control y en el panel de propiedades del objetoen el botón Convert local to field, sino aparece el botón, sobre el componente botón derecho(rename)

Las clases de interfaz gráfica con los que trabajaremos son:

• La clase JLabel, que define un letrero en la pantalla.• La clase JButton, que define un botón.• La clase JTextField, que define una caja de texto en donde podemos escribir o mostrar

datos.• La clase JRadioButton, que permite seleccionar, de un conjunto de botones,

determinado botón y al mismo tiempo deseleccionar los demás botones de esta clase.• La clase JCheckBox, que permite seleccionar o deseleccionar un atributo.• La clase JComboBox que permite seleccionar, de un conjunto de opciones, únicamente

una opción.• La clase JSlider que permite seleccionar algún dato numérico de un rango determinado.

Todas las clases con las que vamos a trabajar tienen una serie de propiedades que podemosvariar en modo diseño o en modo programación que son:

Diseño Programación

Cambiar el texto actual Text setText(String texto);JComboBox y el JSlider no cuentan con este mensaje.

Cambiar el tamaño del objeto Size setSize(int ancho, int alto);

Cambiar el tipo de fuente Font setFont("Helvetica", 1, 20);

Cambiar el color de fondo del objeto background setBackground(0, 255, 0);

Page 10: Interfaces Visuales Java

Cambiar el color del texto Foreground setForeground(0, 255, 0);Resaltar el borde del objeto BorderPainted setBorderPainted(Boolean b); Solo existe paraestas tres clases: JButton, JRadioButton, JCheckBox.Cambiar la ubicación del objeto Location setLocation(nuevaX, nuevaY);

También tenemos getX( ) y getY( ), los cuales devuelven la posición actual del objeto, de estaforma puedes desplazarlos respecto a su posición original.

Definir el tamaño y ubicación Bounds setBounds(10,10,400,300)

Los procesos de entrada o captura de datos y procesos de salida de información sonprocesos básicos en cualquier programa o aplicación de cualquier lenguaje de programación.

Para aplicaciones por consola ya se vieron las instrucciones respectivas, para el caso deaplicaciones visuales, este problema de e/s se resuelve usando componentes o controlesespecializados en cada una de las tareas respectivas.

En java para una aplicación sencilla se ocupan los siguientes objetos:

1.- Un contenedor apropiado para todos los demás objetos, para este caso un objeto de tipojFrame.2.-Componentes o controles que permitan desplegar textos o mensajes estáticos jLabel3.-Componentes o controles que permitan capturar datos y/o desplegar datos o información,jTextField.4.-Componentes o controles que permitan controlar o dirigir las conductas y códigos de losdemás elementos de la aplicación o programa, jButton.

Etiquetas: JLabel

Este componente se utiliza para desplegar textos o mensajes estáticos, textos talescomo encabezados, solicitud al usuario del programa para que proporcione algún dato oinformación (edad, dame sueldo, etc.).De todos los componentes de interfaz de usuario queproporciona Java, las etiquetas son, sin lugar a duda, los más sencillos. Las etiquetas seutilizan para situar fragmentos de texto o imágenes en la pantalla, de manera que su uso máscomún es dar título a otras áreas o a otros componentes Swing.

También es un objeto en java y por tanto tiene asociados sus propias propiedades yobjetos-eventos, al mismo tiempo como se está usando dentro del objeto jFrame, muchaspropiedades que se definan para este objeto, el objeto jLabel las va a heredar.

Para dar valor a una propiedad por código se utiliza la sintaxis:

jLabel.setPROPIEDAD(parámetros)

Algunas de sus propiedades más importantes son:

Background(), Border(), Bounds(), Cursor(), Enabled(), Font(), Foreground(), Name(),Opaque(), Text(), ToolTipText(), Visible()

El método setToolTipText hace que cuando pasemos el ratón por encima de la etiquetaaparezca el texto. Por ejemplo: etiqueta1.setToolTipText( "Esta es etiqueta1" );

Page 11: Interfaces Visuales Java

Cabe destacar las propiedades:

Text: Modificará el texto que se muestra de la labelName: Nombre de la variable por si tenemos que acceder por código Java.Opaque: Es necesario poner la propiedad a true porque si no la etiqueta es transparentepor defecto y no podemos darle color de fondo jLabel.Opaque(true);

Las etiquetas presentan 3 formas de alineamiento:· LEFT o izquierda (JLabel.LEFT).· CENTER o centrada(JLabel.CENTER).· RIGHT o derecho (JLabel.RIGTH).

Un ejemplo de la utilización de este componente podría ser el siguiente en el que se muestranlas distintas construcciones del componente JLabel:

setText(String) Establece y obtiene, respectivamente, el texto de la etiqueta.

jLabel.setText(“Etiqueta solo con texto”);

setIcon(Icon) Establece y obtiene, respectivamente, la imagen de la etiqueta.

Para redimensionar la imagen , en una etiqueta:

ImageIcon a = new ImageIcon("img\\varon.png");

comboBox = new JComboBox();comboBox.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if(comboBox.getSelectedIndex()==1){

Image img = a.getImage();Image resizedImage = img.getScaledInstance(foto.getWidth(),

foto.getHeight(), 0);foto.setIcon(new ImageIcon(resizedImage));}

Page 12: Interfaces Visuales Java

Botón:JButton

Otro control visual de uso muy común es el que provee la clase JButton. Este controlvisual muestra un botón.

En java es el control principal del jFrame, contiene el código principal del programa y suactivación por el usuario provoca que se realicen los principales procesos del problemaplanteado (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 elcódigo del programa.

Para insertar una imagen en un botón se hace desde código ya que en diseño genera uncódigo de error. Cuando se genera el botón se añade:

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 colocaen la carpeta del proyecto fuera de src, se puede colocar en una carpeta del proyecto y puedeser:mpg, bmp, png o jpg no ico.

Otros métodos:

Para cambiar la imagen cuando el ratón este sobre el botón:

jButton.setRolloverIcon(new ImagenIcon(“nombre.jpg”));

Cambiar de imagen cuando se presione el botón:

jButton.setPressedIcon(new ImagenIcon(“nombre.jpg”));

Para hacer botones redondos:

Se busca la imagen correspondiente, se aplica el método:

setContentAreaFilled(false) para elimnar toda el área alrededor del botón

setBorder(null) quitar el borde del botón

poner la imagen como icono

jToopleButton es un botón bi-estado

Page 13: Interfaces Visuales Java

Campo de texto:JTextField

Así como podríamos decir que el control JLabel remplaza a la salida estándarSystem.out.print, el control JTextField cumple la función de la clase Scanner para la entrada dedatos.

En Java este componente es un importante componente visual, su función principal esmanejar 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 tipoSTRING 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 adatos numéricos normales para poder efectuar procesos numéricos

El control JTextField permite al operador del programa ingresar una cadena decaracteres por teclado.

Como ejemplo vamos a ver cómo se realizaría el cálculo del doble de un valor numéricointroducido por el usuario. La ventana contiene campoNúmero donde el usuario indicará unnúmero, y campoResultado donde se mostrará el doble del valor escrito.

El botón Calcular realizará el proceso de recoger el valor introducido, calcular el doble ymostrar el resultado, el código será el siguiente:

private void botónCalcularActionPerformed(java.awt.event.ActionEvent evt){String textoIntroducido, textoDoble;int numIntroducido, valorDoble;//Recoger el dato introducido por el usuariotextoIntroducido = campoNúmero.getText();//Convertirlo a tipo numériconumIntroducido = Integer.valueOf(textoIntroducido);//Calcular el doblevalorDoble = numIntroducido * 2;//Convertir el resultado a textotextoDoble = String.valueOf(valorDoble);//Mostrar el resultadocampoResultado.setText(textoDoble);

//Todo lo anterior se podría escribir en una solo línea://campoResultado.setText(String.valueOf(Integer.valueOf(campoNúmero.getText())*2));}

Page 14: Interfaces Visuales Java

Con getText leemos el string introducido en jTextField

Lo convertimos a números con Integer.valueOf, operamos y convertimos el resultado astring con String.valueOf y guardamos el resultado con setText

Para darle el foco a un campo de texto: jTextFieldNombre.requestFocus();Para quitar la marca del foco sobre el objeto , en diseño Propiedad :FocusPainted false;

getSelectedText(): retorna el texto seleccionado en su interior;

setEditable(boolean b): habilita o inhabilita la posibilidad de cambiar el texto contenido

Area de texto: JTextArea

El control de tipo JTextArea permite ingresar múltiples líneas, a diferencia del control detipo JTextField.

Los componentes de área de texto (JTextArea), además del método setText, disponendel método append, el cual permite añadir texto al que ya tuviera anteriormente el área detexto. Hay que recordar que el método setText elimina el texto que tuviera anteriormente elcomponente sobre el que se aplica.

jTextAreaSaludo.append("amigos");

Por defecto, el contenido de los campos de texto y de las áreas de texto puede sermodificado por el usuario cuando ejecuta el programa. Si se desea sólo se pueda modificar elcontenido desde el código fuente o desde el diseño, se debe cambiar la propiedad "Editable"del campo de texto o del área de texto. La propiedad lineWrapp, indica el número decaracteres por línea.

Page 15: Interfaces Visuales Java

Inicializar propiedades de los objetos.

Crear un proyecto y luego un JFrame con las siguientes componentes visuales :Dos controles de tipo JLabel, dos JTextField y dos JButton , para que quede algo como:

Veamos algunas propiedades que podemos modificar

La propiedad text cambia el texto que muestra el objeto JLabel. Probemos de disponer eltexto "Ingrese nombre de usuario:".

De forma similar hagamos los cambios en la propiedad text de los otroscontroles visuales de nuestro JFrame:

Podemos ver que se ha generado automáticamente el código para inicializar los textos de loscontroles JLabel y JButton

import java.awt.BorderLayout;import javax.swing.JPanel;import javax.swing.JFrame;import java.awt.GridBagLayout;import java.awt.Dimension;import javax.swing.JLabel;import java.awt.event.KeyEvent;import java.awt.Color;

Page 16: Interfaces Visuales Java

import java.awt.Rectangle;import javax.swing.JTextField;import javax.swing.JButton;

public class pruebavisual extends JFrame {

private static final long serialVersionUID = 1L;private JPanel jContentPane = null;private JPanel jPanel = null;private JLabel jLabel = null;private JLabel jLabel1clave = null;private JTextField jTextFieldusuario = null;private JTextField jTextFieldclave = null;private JButton jButtonaceptar = null;private JButton jButtoncancelar = null;

public pruebavisual() {super(); --- Llama a la clase padreinitialize(); }---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 añadiría 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 );

También 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 aplicación de Java a determinar en dónde debe colocar elcuadro de diálogo. El valor null indica que el diálogo debe aparecer en el centro de lapantalla de la computadora.

El segundo argumento es el mensaje a mostrar; en este caso, el resultado de concatenar elobjeto String "La suma es " y el valor de suma.

El tercer argumento ("Suma de dos enteros") representa la cadena que debe aparecer en labarra de título del diálogo, en la parte superior.

El cuarto argumento (JOption-Pane.PLAIN_MESSAGE) es el tipo de diálogo de mensaje amostrar. Un diálogo PLAIN_MESSAGE no muestra un icono a la izquierda del mensaje. Laclase JOptionPane proporciona varias versiones sobrecargadas de los métodos

Page 17: Interfaces Visuales Java

showInputDialog y showMessageDialog, así como métodos que muestran otros tipos dediálogos.

Para obtener información completa acerca de la clase JOptionPane, visite el sitiojava.sun.com/javase/6/docs/api/javax/swing/JOptionPane.html.

Constantes de diálogos de mensajes de JOptionPane

Las constantes que representan los tipos de diálogos de mensajes se muestran en elcuadro. Todos los tipos de diálogos de mensaje, excepto PLAIN_MESSAGE, muestran un iconoa la izquierda del mensaje. Estos iconos proporcionan una indicación visual de la importanciadel mensaje para el usuario. Observe que un icono QUESTION_MESSAGE es el iconopredeterminado para un cuadro de diálogo de entrada

Existen varios tipos de jOptionPane, otro muy usado es jOptionPane.showConformDialog

JOptionPane.showConfirmDialog(null, "Conforme");

Donde null es la posición centrada y El texto que queremos que aparezca, es este caso apareceun cuadro de dialogo con el siguiente formato:

Esto nos devuelve un número entero que indica el botón pulsado:0 para el si, 1 para el no y 2 para cancelar, lo que nos permitirá usar por ejemplo un switch()-case para controlar los distintos métodos.

Ver el ejercicio JoptionPaneSuma

¿Qué es un evento?

Todos los sistemas operativos están constantemente atendiendo a los eventosgenerados por los usuarios. Estos eventos pueden ser pulsar una tecla, mover el ratón, hacerclic con el ratón, pulsar el ratón sobre un botón o menú (Java distingue entre simplementepulsar el ratón en un sitio cualquiera o hacerlo, por ejemplo, en un botón).

Page 18: Interfaces Visuales Java

El sistema operativo notifica a las aplicaciones que están ocurriendo estos eventos, yellas deciden si han de responder o no de algún modo a este evento.

Evento en Java

Cada vez que un usuario ejecuta una acción sobre un programa desarrollado en Java seproduce 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 unmétodo para que lo procese.

Es decir se crea un objeto al producirse un evento (Source) pero lo gestionaotro objeto (listener). Este tipo de arquitectura se llama modelo basado en ladelegación.

El modelo de delegación de eventos

El modelo de Java se basa en la delegación de eventos: el evento se produce en undeterminado componente, por ejemplo un botón. Dónde se produce el evento se denomina“fuente del evento”. A continuación el evento se transmite a un”manejador de eventos” (eventlistener) que este asignado al componente en el que se produjo el evento. El objeto queescucha los eventos es el que se encargará de responder a ellos adecuadamente.

Evento en Swing

Un evento de Swing es una acción iniciada por el usuario al utilizar unelemento de un interface de usuario.

Cada vez que se produce un evento automáticamente se crea un objeto de ese tipo deevento.Todos los eventos vienen de la clase java.awt.event

Page 19: Interfaces Visuales Java

Manejo de Eventos

Cuando un usuario interactúa con un interface de usuario pulsando un botón,seleccionando un valor de un botón 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 producidoun evento.3. El manejador del evento o event handler Es un método que recibe un objeto del tipo deevento que se ha producido, lo descifra, ejecuta el código asociado y devuelve el control alusuario.

Es decir que tendremos que para manejar los eventos que se producen en una aplicacióntenemos que controlar estos 3 aspectos.

Tipos de Eventos

El modelo de eventos que permite java es:

ActionEventEste evento se produce cuando se efectúa cualquier acción sobre un

componente, ya sea un click , doble click...

AdjustmentEventEste evento se produce cuando se ajusta un valor de un componente.

ComponentEventEste evento se produce cuando el usuario mueve redimensiona un componente.

ItemEventEste evento se produce cuando se modifica el estado de un elemento del

componente.

Page 20: Interfaces Visuales Java

TextEventEste 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 ratón(ctrl + alt …)

ContainerEvent

Este evento se produce cuando se añaden o se eliminan componentes en uncontenedor.

WindowEvent

Este evento se produce cuando se realiza una acción sobre una ventana como abrirla,cerrarla, minimizarla…

KeyEvent (Importante)

Este evento se produce cuando el usuario presiona una tecla. (Lo usaremos paracontrolar la tecla pulsada)Por ejemplo si queremos controlar que solo introduzcamos valores numéricos:

KeyEvent->eventos->key->KeyTiped y generamos el código:

Nombreobjeto.addKeyListener(new KeyAdapter(){@overridepublic void keyTyped(keyEvent e){char caracter=e.getKeyChar(); // declaramos un character que recoge la tecla pulsadaif(caracter<’0’ || carácter >’9’)

e.consume() // llamamos al método consume(), que no va a hacer eco de la teclapulsada hasta que no sea un numero}});

MouseEvent

Este evento se produce cuando el usuario realiza una acción con el ratón ya sea click,pasar por encima de un componente…

Page 21: Interfaces Visuales Java

Listener u Oyentes de Eventos

Un oyente de eventos es una clase de tipo interface Java que contiene una serie dedeclaraciones de métodos preparados para capturar las diferentes situaciones que producen unevento.

Si una clase implementa este interface se definirán los métodos y si se produce elevento se ejecutará el código asociado con la acción producida.

Para cada evento del tipo xxxEvent, existe una interface xxxListener con todos susmétodos, los más importantes son:

Se utiliza cuando queremos que un método se ejecute nada más abrir la ventana por ej.Cargar un JComboBox o un JTable. Se hace añadiendo el evento: window->windowOpened alFrame

Page 22: Interfaces Visuales Java

Por Ej.

public class MiClase implements ActionListener{

public void actionPerformed (ActionEvent e){

// Aqui el código que queremos que se ejecute cuando tiene lugar la acción.// la pulsación del botón, el <INTRO> en el JTextField, elección en el JComboBox, etc.

}}

Distinguir qué botón causa la acción

Cuando nos decidimos a hacer una clase, suele ser habitual querer aprovecharla clase para varios botones. En el método actionPerformed() de esa clase se nos pasa unActionEvent. Con este ActionEvent podemos obtener información sobre quién es el que haprovocado el evento.

Object fuente = event.getSource();

Este método nos devuelve el componente java (JButton, JTextField, etc) que ha provocadoel evento. Si la clase está añadida, por ejemplo a boton1, boton2 y boton3, en el métodoactionPerformed() 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 añadir un evento a un objeto, y fijaos el código que se genera automáticamente:

Page 23: Interfaces Visuales Java

jcerrar.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent e) {

System.exit(0); }});

En el parámetro del método addActionListener del botón que cierra se le pasa lareferencia a una interface que se crea de tipo ActionListener e implementa el métodoactionPerformed donde agregaremos el código necesario para responder el evento en este casocerrar la aplicación.

Veamos un ejemplo

Para asociar eventos existe una mecánica para automatizar la generación de lasinterfaces 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 dosJButton):

Ahora seleccionamos el control JButton y con le hacemos click con el botón derecho y apareceel menú contextual y vemos el evento que vamos a aplicar

Page 24: Interfaces Visuales Java

En este caso actionPerformed. Hacemos clic sobre el evento y vemos que se abre el editor detexto y aparece el siguiente código generado automáticamente:

jButtonsumar.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent e) {

System.out.println("actionPerformed()");} });

En el parámetro del método addActionListener del botón que suma se le pasa lareferencia a una interface que se crea de tipo ActionListener e implementa el métodoactionPerformed donde agregaremos el código 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 tipoJTextField, 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 botón Salir:jButtonsalir.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent e) {System.exit(0); } });

Ejecutamos el programa y listo:

Page 25: Interfaces Visuales Java

Ejercicios propuestos

1.- Confeccionar un programa que permita ingresar un mail en un control de tipo JTextField yel cuerpo del mail en un control de tipo JTextArea. Añadirle dos botones uno limpiar quelimpiará el area de texto y otro para salir

2.-Realiza la siguiente interfaz, de forma que al pulsar un botón aparezca una etiqueta con sucolor y escrito el texto en ese color:

El botón limpiar limpiaría la etiqueta de todo texto

3.-Introducir un número y que me diga que si es par o impar, mediante una etiquetaQue permanecerá invisible hasta que aceptemos el número. El botón salir nos dará un mensajede finalización usar jOptionPane

Page 26: Interfaces Visuales Java

4.-Ingresar el nombre de usuario y clave en controles de tipo JTextField. Si se ingresalas cadena (usuario: juan, clave=abc123) mostrar un mensaje que diga correcto en casocontrario mostrar el mensaje "Incorrecto". Si te atreves haz que el programa solo tepermita pedir la clave tres veces y si no lo aciertas te sales de la aplicación

5.- Escribir un programa que represente una ventana que contenga dos cajas de texto ydos botones, uno etiquetado con “MAYÚSCULAS” y otro con “minúsculas”. Cuando sepulse el botón de mayúsculas se deberá convertir el contenido de la primera caja detexto a mayúsculas y si se pulsa el otro a minúsculas y presentarlo en la segunda cajade texto. Si no hay texto se debe presentar un mensaje de error.

6.-Máquina de bolas consistirá algo parecido a esta interfaz, que vosotros podéismejorar: sustituir los botones por botones con iconos uno con luz y otro sin luz,Que activaran o desactivaran el resto de los componentes, al pulsar el botón rojoSe incrementara el contador rojo y así con todos, al pulsar sin Luz, desactivara todos losbotones

Contadores de bolasRojas, Verdes ,Azul

7.- Introduce 5 números y busca el Mayor y el menor, controla que solointroduzcas 5 números y después aparecerán los resultados, la interfaz te la dejo a ti

8.- Ejercicio Calculadora Swing (El componente Pesetas se añadirá en el temasiguiente)Escribir un programa en Java que permita realizar las operaciones típicas de una calculadora:suma, resta, multiplicación y división. El usuario introducirá el operando 1 el 2 y luegoseleccionará la operación a realizar, mostrando el resultado correspondiente. También debetener la posibilidad de convertir de pesetas a euros y viceversa. El programa deberá tratartodos los posibles errores en tiempo de ejecución, dando un mensaje con un diálogo de error.El aspecto gráfico del programa puede ser como el siguiente: