Está en la página 1de 35

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Indice
1. Introducci on 2. Crear una ventana 3. Componentes swing 3.1. JPanel y JLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. ImageIcon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. JTextField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4. JTextArea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5. JButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6. JCheckBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7. JRadioButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 5 6 7 7 8 8 9 9

3.8. ButtonGroup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.9. JComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.10. JList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.11. JTable y JScrollPane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.12. JTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.13. JMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4. Organizaci on de los componentes 16

4.1. BorderLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.2. FlowLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.3. GridLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.4. CardLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 4.5. GridBagLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5. Tratamiento de eventos 5.1. MouseListener 5.3. WindowListener 19

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

5.2. KeyListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.4. ActionListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5.5. TextListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5.6. ItemListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

1.

Introducci on

En esta sesi on se van a ver algunos aspectos de JFC (Java Foundation Classes). JFC es un conjunto de componentes para trabajo con interfaces gr acas de usuario en Java. Contiene: Abstract Window Toolkit (AWT)

API para el dise no de interfaces gr acas de usuario que se integran en el sistema de ventanas nativo del sistema donde se ejecutan, incluyendo APIs para arrastrar y soltar.

Java 2D Ir al ndice
juan.gutierrez@uv.es

P agina: 1

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

APIs para trabajar con gr acos 2D, trabajo con im agenes, texto e impresi on.

Swing

APIs que extienden AWT para proporcionar una biblioteca de componentes para el dise no de interfaces gr acas de usuario enteramente realizadas en Java.

Accesibilidad

APIs para permitir que las aplicaciones sean accesibles a las personas con discapacidades.

Internacionalizaci on

Todas estas APIs incluyen soporte para crear aplicaciones que puedan ser utilizadas independientemente de la localizaci on del usuario.

Aqu vamos a ver algo de Swing y de AWT. A grandes rasgos, los pasos para crear una interfaz gr aca de usuario son Crear una ventana Colocar componentes en la ventana Organizar los componentes en los contenedores Tratar los eventos

2.

Crear una ventana


Se puede crear una ventana (que servir a como contenedor de componentes) utilizando la clase

JFrame.

El siguiente c odigo muestra c omo se puede crear una ventana con tama no 300 por 200 pixels. Ir al ndice
juan.gutierrez@uv.es

P agina: 2

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

i m p o r t j a v a x . swing . ; p u b l i c c l a s s EjemploVentana { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Ventana ven = new Ventana ( ) ; ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; ven . show ( ) ; } } c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { setSize (300 ,200) ; } }

El resultado al ejecutar esta aplicaci on es el siguiente:

Si se desea que en la ventana aparezca un t tulo se puede poner como primera sentencia en el constructor de Ventana la siguiente instrucci on:
s u p e r ( Ventana ) ;

En este caso se ver a lo siguiente:

Las ventanas son contenedores de otros componentes tales como barras de men u, campos de texto, botones, etc. De hecho una ventana est a constituida por una serie de capas:

Ir al ndice

juan.gutierrez@uv.es

P agina: 3

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

JFrame JRoot JLayeredPane Content pane Glass pane

Para a nadir componentes a la ventana, primero se debe obtener el contenedor content pane y a continuaci on a nadir los componentes a este. Por ejemplo, supongamos que deseamos dibujar un rect angulo en la ventana. El rect angulo no se puede dibujar directamente sobre un objeto del tipo JFrame. En su lugar procederemos del siguiente modo:

1. Crearemos una clase que extienda a JPanel 2. Sobreescribiremos su m etodo paintComponent(Graphics g) 3. A nadiremos un objeto de este tipo a la ventana.

El c odigo se muestra a continuaci on:


i m p o r t j a v a x . swing . ; i m p o r t j a v a . awt . ; c l a s s MiPanel e x t e n d s JPanel { p u b l i c v o i d paintComponent ( G r a p h i c s g ) { s u p e r . paintComponent ( g ) ; g . drawRect ( 2 0 , 2 0 , 8 0 , 8 0 ) ; } } c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { getContentPane ( ) . add ( new MiPanel ( ) ) ; setSize (300 ,200) ; } }

p u b l i c c l a s s EjemploVentana2 { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Ventana ven = new Ventana ( ) ;

Ir al ndice

juan.gutierrez@uv.es

P agina: 4

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; ven . show ( ) ; } }

Se ha sobreescrito un m etodo de la clase JPanel donde especicamos qu e se debe realizar cuando haya que mostrar este componente, pero... donde llamamos a este m etodo?. La respuesta es: en ning un sitio. Este m etodo es llamado autom aticamente cada vez que hay que pintar el componente y esto ocurre cada vez que:

Cuando hay que mostrarlo por primera vez Cuando se modica el tama no de la ventana Cuando la ventana estaba minimizada y se vuelve a mostrar. Cuando otra aplicaci on que cubre a la ventana se mueve. ...

3.

Componentes swing

Un componente es un objeto que tiene una representaci on gr aca y que puede ser mostrado por pantalla y que puede utilizado por el usuario. Ejemplos de componentes son: JButton, JTextField, JScrollPane, JTextArea, 1 Utilizan como base la clase java.awt.Component que est a denida como abstracta. Todos los componentes (excepto los men us) extienden a esta clase. Los componentes se pueden dividir en dos categor as: Un conjunto de componentes est a formado por widgets 2 . Otro conjunto est a formado por contenedores. Estos componentes extienden a la clase java.awt.Container (que es una clase abstracta que extiende a Component). Los contenedores son componentes que pueden incluir otros componentes. La siguiente gura muestra la relaci on entre componentes y contenedores
Hay otra serie de clases que no empiezan por J: Button, TextField, TextArea,... que pertenecen a AWT. Contracci on de Window y gadget. Una representaci on visible de un componente que puede ser manipulada por el usuario. Botones, campos de texto y barras de desplazamiento son ejemplos de widgets
2 1

Ir al ndice

juan.gutierrez@uv.es

P agina: 5

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Contenedor alto nivel


JFrame JApplet

Contenedor intermedio
JPanel JScrollPane

}} }} } }} }}

...

...

PPP PPP PPP AA PPP AA PPP AA PPP AA PPP A PP Contenedor PPPP Componentes intermedio
JPanel JScrollPane JButton JTextField

...

...

...

Componentes
JButton JTextField

Componentes

...

JButton JTextField

...

...

Vamos a ver algunos de los componentes que ofrece Swing.

3.1.

JPanel y JLabel

Un objeto de la clase JPanel sirve para contener otros componentes. La clase JLabel se utiliza para crear etiquetas de texto.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; JPanel p = new JPanel ( ) ; p . add ( new J L a b e l ( Ejemplo de JPanel ) ) ; c . add ( p ) ; setSize (200 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 6

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

3.2.

ImageIcon

Objetos de esta clase se pueden utilizar para mostrar im agenes.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( S t r i n g f i c h ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; ImageIcon i i = new ImageIcon ( f i c h ) ; c . add ( new J L a b e l ( , i i , J L a b e l .CENTER) ) ; setSize (650 ,500) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( a r g s [ 0 ] ) ; } }

3.3.

JTextField

Objetos de esta clase se utilizan para que el usuario pueda introducir datos a la aplicaci on.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; J T e x t F i e l d campoTexto = new J T e x t F i e l d ( 2 0 ) ; c . add ( new J L a b e l ( Nombre ) ) ; c . add ( campoTexto ) ; setSize (350 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 7

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

3.4.

JTextArea

Objetos de esta clase se utilizan para que el usuario pueda introducir datos tipo texto de gran tama no.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; JTextArea a r e a = new JTextArea ( 8 , 2 0 ) ; c . add ( new J L a b e l ( O b s e r v a c i o n e s ) ) ; c . add ( a r e a ) ; setSize (350 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

3.5.

JButton

Un objeto de esta clase representa un bot on.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; JButton b1 = new JButton ( Aceptar ) ; JButton b2 = new JButton ( C a n c e l a r ) ; c . add ( b1 ) ; c . add ( b2 ) ; setSize (350 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 8

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

3.6.

JCheckBox

Sirve para seleccionar elementos.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; JCheckBox cb = new JCheckBox ( P i z a r r a ) ; cb . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 2 0 ) ) ; c . add ( cb ) ; setSize (200 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

3.7.

JRadioButton

Sirve para seleccionar elementos.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; JRadioButton rb=new JRadioButton ( P i z a r r a ) ; rb . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 2 0 ) ) ; c . add ( rb ) ; setSize (200 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 9

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

3.8.

ButtonGroup

Se pueden agrupar una serie de JRadioButton de forma que s olo pueda estar seleccionado uno de ellos.
i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; c . add ( new J L a b e l ( S e l e c c i o n a e l t i p o de c o m b u s t i b l e ) ) ; Font f u e n t e = new Font ( A r i a l , Font . PLAIN , 1 8 ) ; JRadioButton g a s = new JRadioButton ( G a s o l i n a ) ; gas . setFont ( fuente ) ; JRadioButton d i e = new JRadioButton ( D i e s e l ) ; die . setFont ( fuente ) ; // Agrupamos l o s b o t o n e s ButtonGroup grupo = new ButtonGroup ( ) ; grupo . add ( g a s ) ; grupo . add ( d i e ) ; JPanel r a d i o P a n e l = new JPanel ( ) ; r a d i o P a n e l . s e t L a y o u t ( new GridLayout ( 0 , 1 ) ) ; r a d i o P a n e l . add ( g a s ) ; r a d i o P a n e l . add ( d i e ) ; c . add ( r a d i o P a n e l ) ; setSize (300 ,300) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 10

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

3.9.

JComboBox

Sirve para mostrar una lista desplegable de elementos.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; JComboBox cb = new JComboBox ( ) ; cb . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 2 0 ) ) ; cb . addItem ( P i z a r r a ) ; cb . addItem ( P a n t a l l a ) ; cb . addItem ( P r o y e c t o r ) ; c . add ( cb ) ; setSize (200 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

3.10.

JList

Objetos de esta clase sirven para mostrar una lista con elementos.

Ir al ndice

juan.gutierrez@uv.es

P agina: 11

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . e v e n t . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new FlowLayout ( ) ) ; String [ ] datos = { Pizarra , Pantalla , Proyector }; J L i s t l i s t a = new J L i s t ( d a t o s ) ; c . add ( l i s t a ) ; setSize (200 ,200) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

3.11.

JTable y JScrollPane

Objetos del tipo JTable sirven para mostrar informaci on en forma tabular. Los objetos del tipo JScrollPane sirven para contener componentes y mostrar barras de desplazamiento.
i m p o r t j a v a x . swing . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r cp = getContentPane ( ) ; cp . s e t L a y o u t ( new BorderLayout ( ) ) ; // Nombres de l a s columnas f i n a l S t r i n g [ ] nombreCol = { S e s i o n , Tema , Fecha , Aula } ; // Datos Object [ ] [ ] datos = { { 1 , MySQL , 12 07 04 , 5 } , { 2 , MySQL , 13 07 04 , 5 } , { 3 , JDBC , 14 07 04 , 5 } , { 4 , GUI , 15 07 04 , 5 } , { 5 , P r o y e c t o , 16 07 04 , 5 } } ; JTable t a b l a = new JTable ( d at os , nombreCol ) ; t a b l a . s e t F o n t ( new Font ( A r i a l , Font .BOLD, 1 8 ) ) ; t a b l a . setRowHeight ( 2 4 ) ; J S c r o l l P a n e j s p = new J S c r o l l P a n e ( t a b l a ) ; // , ver , hor ) ; cp . add ( j s p , BorderLayout .CENTER) ; setSize (500 ,300) ; setVisible ( true ) ;

Ir al ndice

juan.gutierrez@uv.es

P agina: 12

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

} p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ejercicio 1 Realizar una consulta en la que se muestren las familias del Reino Unido donde el precio de estancia por d a sea menor o igual a 18 euros, se debe seleccionar el nombre de la familia, la ciudad y el tipo de casa. El resultado se debe mostrar en una JTable.

3.12.

JTree

Objetos de este tipo sirven para mostrar la informaci on en forma de arbol.

i m p o r t j a v a x . swing . ; i m p o r t j a v a x . swing . t r e e . ; i m p o r t j a v a . awt . ; p u b l i c c l a s s Ventana e x t e n d s JFrame { p r i v a t e JTree a r b o l ; p u b l i c Ventana ( ) {

C o n t a i n e r c = getContentPane ( ) ; c . s e t L a y o u t ( new BorderLayout ( ) ) ; // C o n s t r u c c i o n d e l a r b o l DefaultMutableTreeNode a s i g = new DefaultMutableTreeNode ( E n l a c e s ) ; DefaultMutableTreeNode tema = n u l l ; DefaultMutableTreeNode s e c c i o n = n u l l ; tema = new DefaultMutableTreeNode ( B u s c a d o r e s ) ; a s i g . add ( tema ) ; s e c c i o n = new DefaultMutableTreeNode ( Google ) ;

Ir al ndice

juan.gutierrez@uv.es

P agina: 13

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

tema . add ( s e c c i o n ) ; s e c c i o n = new DefaultMutableTreeNode ( Yahoo ) ; tema . add ( s e c c i o n ) ;

tema = new DefaultMutableTreeNode ( Java ) ; a s i g . add ( tema ) ; s e c c i o n = new DefaultMutableTreeNode ( Sun ) ; tema . add ( s e c c i o n ) ; s e c c i o n = new DefaultMutableTreeNode ( IBM ) ; tema . add ( s e c c i o n ) ; s e c c i o n = new DefaultMutableTreeNode ( JavaWorld ) ; tema . add ( s e c c i o n ) ;

a r b o l = new JTree ( a s i g ) ; a r b o l . s e t F o n t ( new Font ( A r i a l , Font .BOLD, 2 0 ) ) ; c . add ( a r b o l , BorderLayout .CENTER) ; setSize (400 ,600) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 14

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

3.13.

JMenu

i m p o r t j a v a . awt . ; i m p o r t j a v a x . swing . ; c l a s s Ventana e x t e n d s JFrame { p r i v a t e JMenuBar mb ; Ventana ( ) { // Se c r e a una b a r r a de men us mb = new JMenuBar ( ) ; // Creamos un e l e m e n t o d e l men u JMenu a r c h i v o = new JMenu ( Ar c hi v o ) ; a r c h i v o . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 2 0 ) ) ; // Creamos y a n adimos submen us JMenuItem nuevo = new JMenuItem ( Nuevo ) ; nuevo . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; a r c h i v o . add ( nuevo ) ; JMenuItem a b r i r = new JMenuItem ( A b r i r ) ; a b r i r . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; a r c h i v o . add ( a b r i r ) ; JMenuItem v e r = new JMenuItem ( Ver t o d o s ) ; v e r . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; a r c h i v o . add ( v e r ) ; // Ahora a n adimos a r c h i v o a l a b a r r a de menus mb . add ( a r c h i v o ) ; // Creamos o t r o e l e m e n t o d e l men u JMenu e d i t a r = new JMenu ( E d i t a r ) ; e d i t a r . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 2 0 ) ) ; // Creamos y a n adimos submen us JMenuItem c o p i a r = new JMenuItem ( C op ia r ) ; c o p i a r . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; e d i t a r . add ( c o p i a r ) ; JMenuItem p e g a r = new JMenuItem ( Pegar ) ; p e g a r . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; e d i t a r . add ( p e g a r ) ; JMenuItem c o r t a r = new JMenuItem ( C o r t a r ) ; c o r t a r . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; e d i t a r . add ( c o r t a r ) ; // A n adimos e d i t a r a l a b a r r a de menu mb . add ( e d i t a r ) ;

setJMenuBar (mb) ; setSize (500 ,500) ; setVisible ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new Ventana ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 15

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

4.

Organizaci on de los componentes


Cuando en una ventana hay muchos componentes hay que organizarlos de alg un modo.

Java proporciona diversos esquemas de organizaci on (layout managers) que pueden ser utilizados para organizar los componentes dentro de los contenedores. Los gestores de organizaci on se encargan de reorganizar los componentes en caso de que el usuario cambie el tama no de la ventana. Los gestores de organizaci on que ofrece Java son:
BorderLayout, FlowLayout, BoxLayout, CardLayout, GridLayout, GridBagLayout

El procedimiento es siempre el mismo, se crea un objeto de alguna de estas clases y se le indica al contenedor que organice los componentes utilizando el objeto (para ello los contenedores disponen del m etodo setLayout(LayoutManager m).

4.1.

BorderLayout

Se puede utilizar para colocar en un contenedor cinco componentes como m aximo ya que proporciona cinco posiciones donde colocar los componentes, estas son: NORTH (arriba), SOUTH (abajo), WEST (izquierda), EAST (derecha) y CENTER (en el centro).

Ir al ndice

juan.gutierrez@uv.es

P agina: 16

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

i m p o r t j a v a . awt . ; i m p o r t j a v a x . swing . ; c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; JButton JButton JButton JButton JButton b1 b2 b3 b4 b5 = = = = = new new new new new JButton ( A ) ; JButton ( B ) ; JButton ( C ) ; JButton ( D ) ; JButton ( E ) ;

c . s e t L a y o u t ( new BorderLayout ( ) ) ; c . add ( b1 , BorderLayout .NORTH) ; c . add ( b2 , BorderLayout .SOUTH) ; c . add ( b3 , BorderLayout .WEST) ; c . add ( b4 , BorderLayout . EAST) ; c . add ( b5 , BorderLayout .CENTER) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Ventana v = new Ventana ( ) ; v . setSize (300 ,300) ; v . show ( ) ; } }

4.2.

FlowLayout

Coloca los componentes de izquierda a derecha conforme se van a nadiendo a la ventana. El tama no de los componentes se ajusta a su contenido.

Ir al ndice

juan.gutierrez@uv.es

P agina: 17

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

i m p o r t j a v a . awt . ; i m p o r t j a v a x . swing . ; c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; JButton JButton JButton JButton JButton b1 b2 b3 b4 b5 = = = = = new new new new new JButton ( A ) ; JButton ( B ) ; JButton ( Bot o n m as l a r g o ) ; JButton ( D ) ; JButton ( E ) ;

c . s e t L a y o u t ( new FlowLayout ( ) ) ; c . add ( b1 ) ; c . add ( b2 ) ; c . add ( b3 ) ; c . add ( b4 ) ; c . add ( b5 ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Ventana v = new Ventana ( ) ; v . setSize (200 ,200) ; v . show ( ) ; } }

4.3.

GridLayout

Coloca los componentes en las y columnas en funci on de los valores pasados al constructor. Todas las celdas tendr an el mismo tama no.

i m p o r t j a v a . awt . ; i m p o r t j a v a x . swing . ; c l a s s Ventana e x t e n d s JFrame { p u b l i c Ventana ( ) { C o n t a i n e r c = getContentPane ( ) ; JButton b1 = new JButton ( A ) ; JButton b2 = new JButton ( B ) ; JButton b3 = new JButton ( C ) ; JButton b4 = new JButton ( D ) ; JButton b5 = new JButton ( E ) ; c . s e t L a y o u t ( new GridLayout ( 2 , 3 ) ) ; c . add ( b1 ) ; c . add ( b2 ) ; c . add ( b3 ) ; c . add ( b4 ) ; c . add ( b5 ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Ventana v = new Ventana ( ) ; v . setSize (300 ,300) ; v . show ( ) ; } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 18

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

4.4.

CardLayout

Se puede utilizar para mostrar de forma condicional unos elementos u otros, de forma que se puede controlar qu e elementos ser an visibles. Una ilustraci on es una pila de cartas en las que s olo la superior es visible en un instante dado.

4.5.

GridBagLayout

Este es un organizador complejo que permite ajustar la posici on de los componentes. Al colocar los componentes en los contenedores se especican las restricciones que se deben cumplir ( posici on del componente, anchura y altura del componente, separaci on entre los componentes, posici on dentro del espacio que ocupa, ...). Ejercicio 2 Se pide construir la interfaz gr aca que se muestra en la siguiente gura.

5.

Tratamiento de eventos

Hasta ahora las interfaces gr acas que se han mostrado tienen poca utilidad ya que no responden a las acciones del usuario. Qu e ocurre si pulsamos sobre un bot on? Qu e ocurre si pulsamos sobre una celda de la tabla? Qu e ocurre si pulsamos sobre un elemento de un men u? Pues con lo que hemos hecho hasta ahora, aparentemente no sucede nada, no se obtiene ninguna respuesta.

Ir al ndice

juan.gutierrez@uv.es

P agina: 19

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

El bot on es una fuente de eventos

En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este componente es una fuente de eventos de rat on.

1 El usuario pulsa el rat on sobre el bot on

2 Se lanza un evento del tipo MouseEvent

Si el usuario pulsa con el rat on sobre el bot on se lanza un evento del tipo MouseEvent. Si no hay ning un objeto que recoja ese evento no sucede nada.

Qu e es lo que falta? Falta especicar qu e es lo que se debe realizar cuando se produzcan determinados eventos sobre los componentes que se coloquen en la ventana. Esta tarea es la que se conoce como tratamiento de eventos. Cualquier sistema operativo que soporte GUIs monitoriza los eventos que se producen, como por ejemplo pulsaciones sobre las teclas o pulsaciones con un bot on del rat on. El sistema operativo informa sobre estos eventos a los programas que est an en ejecuci on. Cada programa decide qu e hacer (si es que debe hacer algo) en respuesta a estos eventos. En Java se utiliza un modelo conocido como modelo de delegaci on de eventos. s El modelo de delegaci on de eventos se basa en que los componentes disparan eventos que pueden ser tratados por escuchadores (o manipuladores).

Ir al ndice

juan.gutierrez@uv.es

P agina: 20

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Los escuchadores se registran en un componente. Por ejemplo, en un bot on podemos registrar un escuchador de eventos de rat on. Una vez que el escuchador ha sido a nadido al componente, cuando se produzca un evento, los m etodos apropiados del manipulador (que han sido especicados en la interfaz) ser an llamados.

El bot on es una fuente de eventos

1 Registramos un oyente de eventos de rat on asociado al bot on

En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este componente es una fuente de eventos de rat on. Ahora registramos un oyente de eventos de rat on en el bot on.

2 El usuario pulsa el rat on sobre el bot on

3 Se lanza un evento del tipo MouseEvent

4 El oyente recibe la noticaci on del evento

Si el usuario pulsa con el rat on sobre el bot on se lanza un evento del tipo MouseEvent. Los oyentes que se hayan registrados son noticados de que se ha producido un evento.

La clase EventObject del paquete java.util es la clase padre de todos los eventos. Su constructor recibe una referencia al objeto que genera el evento. Esta clase tiene dos m etodos: getSource() que devuelve el objeto que gener o el evento y toString(). Los paquetes relacionados con los eventos en AWT son java.awt.event. La clase abstracta AWTEvent denida en el paquete java.awt es una subclase de EventObject. Ir al ndice
juan.gutierrez@uv.es

P agina: 21

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Es la superclase de todos los eventos basados en AWT utilizados por el modelo de delegaci on de eventos. Hay dos clases de eventos: Eventos de componente o de bajo nivel ocurren cuando ocurre algo espec co en un componente. Por ejemplo al moverse, entrar o salir el rat on sobre un componente, al ganar o perder la atenci on,... Eventos sem anticos no son tan espec cos como los anteriores y no son disparados necesariamente por una acci on at omica tal y como una pulsaci on del rat on. Las acciones que disparan estos eventos depende del objeto: por ejemplo en una lista se disparan cuando sus elementos son pulsados dos veces, en un campo de texto se disparan cuando se pulsa la tecla enter. Los eventos de componente o de bajo nivel son:
ComponentEvent, ContainerEvent, FocusEvent, InputEvent, KeyEvent, MouseEvent, MouseWheelEvent y WindowEvent

Los eventos sem anticos son:


ActionEvent ,AdjustmentEvent , ItemEvent, TextEvent

A continuaci on se muestran los eventos que se denen en AWT y cual es la acci on que los produce Eventos AWT ActionEvent Descripci on Se genera cuando el usuario pulsa un bot on, pulsa Return en un campo de texto, selecciona un elemento de un men u o cuando un elemento de una lista se pulsado 2 veces. Se genera cuando se manipula una barra de deslizamiento. Evento que indica que un elemento de una lista se ha seleccionado o ha dejado de estar seleccionado. Los siguientes componentes generan eventos de este tipo: CheckBox, CheckBoxMenuItem, Choice, List. Se genera cuando se cambia el valor de un area de texto o de un campo de texto. Los objetos fuente de este evento son: TextField y TextArea.

AdjustmentEvent ItemEvent

TextEvent

Ir al ndice

juan.gutierrez@uv.es

P agina: 22

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Eventos AWT ComponentEvent

ContainerEvent FocusEvent

Descripci on Un evento que indica que un componente ha sido movido, ha cambiado de tama no o ha sido ocultado. AWT maneja este evento (es decir que aunque expl citamente tratemos este evento, AWT tambi en lo har a). Se genera cuando se a nade o se elimina un componente de un contenedor. AWT trata este evento. Se genera cuando un componente gana o pierde la atenci on. Un componente tiene la atenci on al pulsar sobre el con el rat on o por que se ha llegado a el pulsando la tecla de tabulaci on. El componente que tiene la atenci on recibe los eventos de teclado.

Eventos AWT KeyEvent MouseEvent MouseWheelEvent WindowEvent

Descripci on Es una subclase de InputEvent. Se genera cuando se pulsa una tecla o libera una tecla. Es una subclase de InputEvent. Se genera cuando el rat on se mueve, se pulsa, se arrastra, o cuando entra o sale el rat on de un componente. Un evento que indica que la rueda del rat on se ha movido en un componente. Se genera cuando una ventana se activa, se desactiva, se cierra, se minimiza se maximiza o se sale de ella.

La jerarqu a de estas clases se muestra en el siguiente diagrama:


EventObject

ContainerEvent

l CC QQQQ lll xx CC QQQ lll xxx l QQQ CC l x ll x l QQQ CC l x l x l QQQ CC x lll x QQQ l C x l l C x l QQQ CC x ll x l QQQ l x C l l x C QQQ l C xx lll ComponentEvent AdjustmentEvent ActionEvent ItemEvent TextEvent 5 x< O aCChPPP lll PPP x C l x l C l xx CC PPPP lll CC PPP lll xxxx l l PPP CC x lll PPP x C l l x C l PPP l x CC x ll l PPP x l C x l C l PPP x CC x lll PPP x l l C ll xx <<abstract>>
FocusEvent

<<abstract>> ; O aC hQ 5 AWTEvent

KeyEvent

x< xx x xx xx x xx xx x x xx xx

InputEvent

aCC CC CC CC CC CC CC CC CC

PaintEvent

WindowEvent

MouseEvent

Ir al ndice

juan.gutierrez@uv.es

P agina: 23

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Vamos a ver ahora algunas de las interfaces que se ofrecen en java.awt con el n de especicar los m etodos que deben poseer los objetos oyentes o auditores para cada uno de los eventos.

5.1.

MouseListener

p u b l i c i n t e r f a c e MouseListener extends EventListener

Esta interfaz la deben implementar aquellas clases que est en interesadas en escuchar eventos del tipo MouseEvent El objeto de esta clase debe registrarse en un componente utilizando su m etodo addMouseListener. Los m etodos que dene esta interfaz son:
// Metodo l l a m a d o cuando s e p u l s a y l i b e r a un b o t o n d e l r a t o n // s o b r e un componente v o i d mou seClicked ( MouseEvent e ) // Metodo l l a m a d o cuando e l r a t o n e n t r a en un componente v o i d mouseEntered ( MouseEvent e ) // Metodo l l a m a d o cuando e l r a t o n s a l e de un componente v o i d mouseExited ( MouseEvent e ) // Metodo l l a m a d o a l p u l s a r un b o t o n d e l r a t o n s o b r e un componente v o i d mousePressed ( MouseEvent e ) // Metodo l l a m a d o a l l i b e r a r un b o t o n d e l r a t o n s o b r e un componente v o i d mouseReleased ( MouseEvent e )

En el siguiente ejemplo se trata el evento: el usuario ha pulsado con el rat on sobre el bot on. Lo que se realiza en el manipulador del evento es obtener lo que el usuario haya escrito en el campo de texto y mostrarlo por la salida est andar.
i m p o r t j a v a . awt . e v e n t . ; i m p o r t j a v a . awt . ; i m p o r t j a v a x . swing . ; c l a s s EventosRaton e x t e n d s JFrame { p r i v a t e JButton boton ; p r i v a t e J T e x t F i e l d campoTexto ; p u b l i c EventosRaton ( ) { c l a s s ManipulaMouseEvent i m p l e m e n t s M o u s e L i s t e n e r { p u b l i c v o i d mouseEntered ( MouseEvent e ) { } p u b l i c v o i d mouseExited ( MouseEvent e ) { } p u b l i c v o i d mou seClicked ( MouseEvent e ) {} p u b l i c v o i d mouseReleased ( MouseEvent e ) {} p u b l i c v o i d mousePressed ( MouseEvent e ) { System . out . p r i n t l n ( campoTexto . g e t T e x t ( ) ) ; } } C o n t a i n e r cp = getContentPane ( ) ; cp . s e t L a y o u t ( new FlowLayout ( ) ) ;

Ir al ndice

juan.gutierrez@uv.es

P agina: 24

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

cp . add ( new J L a b e l ( I n t r o d u c e p r e c i o : ) ) ; campoTexto = new J T e x t F i e l d ( 2 0 ) ; cp . add ( campoTexto ) ; boton = new JButton ( Aceptar ) ; cp . add ( boton ) ; boton . a d d M o u s e L i s t e n e r ( new ManipulaMouseEvent ( ) ) ; setSize (500 ,300) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { EventosRaton ven = new EventosRaton ( ) ; ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; ven . show ( ) ; } }

A continuaci on se muestra un ejemplo en el que se realiza una consulta a la base de datos utilizando un dato introducido por el usuario en un campo de texto. La consulta a la base de datos es la del ejercicio 2 de la sesi on de JDBC pero ahora se utiliza un
PreparedStatement.
import import import import j a v a . awt . e v e n t . ; j a v a . awt . ; j a v a x . swing . ; java . s q l . ;

/ C l a s e de apoyo . En e l l a encapsulamos l a c o n e x i o n a l a b a s e de d a t o s y las consultas / c l a s s Consultas { p r i v a t e C o n n e c t i o n con ; p r i v a t e P r e p a r e d S t a t e m e n t ps ; // C o n s t r u c t o r Consultas () { S t r i n g u r l = j d b c : mysql : / / l o c a l h o s t : 3 3 0 6 / e s t a n c i a s ? u s e r=u s u a r i o&password=c l a v e ; try { C l a s s . forName ( com . mysql . j d b c . D r i v e r ) ; con = DriverManager . g e t C o n n e c t i o n ( u r l ) ; ps = con . p r e p a r e S t a t e m e n t ( s e l e c t f a m i l i a s . NombreF , c a s a s . Ciudad , c a s a s . Tipo from f a m i l i a s , c a s a s where ( f a m i l i a s . IdCasa=c a s a s . IdCasa ) and ( c a s a s . p r e c i o H a b D i a < = ?) ) ; } c a t c h ( SQLException ex ) { ex . p r i n t S t a c k T r a c e ( ) ; } c a t c h ( ClassNotFoundException ex ) { ex . p r i n t S t a c k T r a c e ( ) ; } } / Metodo que r e a l i z a una c o n s u l t a a l a b a s e de d a t o s y d e v u e l v e un e l R e s u l t S e t con e l r e s u l t a d o . @param v a l o r un f l o a t n e c e s a r i o para c o n s t r u i r l a c o n s u l t a

Ir al ndice

juan.gutierrez@uv.es

P agina: 25

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

@return un o b j e t o d e l t i p o R e s u l t S e t con e l r e s u l t a d o de l a c o n s u l t a / public ResultSet consultaCasas ( f l o a t valor ) { ResultSet resultado = n u l l ; try { ps . s e t F l o a t ( 1 , v a l o r ) ; r e s u l t a d o = ps . e x e c u t e Q u e r y ( ) ; } c a t c h ( SQLException ex ) { ex . p r i n t S t a c k T r a c e ( ) ; } return resultado ; } / Metodo para c e r r a r l a c o n e x i o n con l a b a s e de d a t o s / public void cierraConexion () { try { con . c l o s e ( ) ; } c a t c h ( SQLException ex ) { ex . p r i n t S t a c k T r a c e ( ) ; } } }

/ Esta e s l a v e n t a n a / c l a s s ConsultaGUI e x t e n d s JFrame { p r i v a t e JButton boton ; p r i v a t e J T e x t F i e l d campoTexto ; p r i v a t e C o n s u l t a s c o n s = new C o n s u l t a s ( ) ; p u b l i c ConsultaGUI ( ) { // Creamos una c l a s e para manipular e v e n t o s de r a t o n c l a s s ManipulaMouseEvent i m p l e m e n t s M o u s e L i s t e n e r { p u b l i c v o i d mouseEntered ( MouseEvent e ) { } p u b l i c v o i d mouseExited ( MouseEvent e ) { } p u b l i c v o i d mou seClicked ( MouseEvent e ) {} p u b l i c v o i d mouseReleased ( MouseEvent e ) {} p u b l i c v o i d mousePressed ( MouseEvent e ) { S t r i n g parametro = campoTexto . g e t T e x t ( ) ; try { f l o a t p r e c i o = F l o a t . p a r s e F l o a t ( parametro ) ; System . out . p r i n t l n ( \ n R e s u l t a d o de l a busqueda : ) ; ResultSet r = cons . consultaCasas ( p r e c i o ) ; r . beforeFirst () ; w h i l e ( r . next ( ) ) { System . out . p r i n t ( F a m i l i a : + r . g e t S t r i n g ( 1 ) + \ t ) ; System . out . p r i n t ( Ciudad : + r . g e t S t r i n g ( 2 ) + \ t ) ; System . out . p r i n t ( Tipo : + r . g e t S t r i n g ( 3 ) + \ n ) ; } } c a t c h ( NumberFormatException ex ) { System . out . p r i n t l n ( No e s un n u mero v a l i d o ) ; } c a t c h ( SQLException ex ) { ex . p r i n t S t a c k T r a c e ( ) ; } } }

Ir al ndice

juan.gutierrez@uv.es

P agina: 26

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

// Se o b t i e n e e l c o n t e n t pane de l a v e n t a n a C o n t a i n e r cp = getContentPane ( ) ; // Indicamos l a forma de o r g a n i z a r l o s componentes en e l // c o n t e n t pane cp . s e t L a y o u t ( new FlowLayout ( ) ) ; // Se a n ade una e t i q u e t a de t e x t o cp . add ( new J L a b e l ( I n t r o d u c e p r e c i o : ) ) ; // Se c r e a y a n ade un campo de t e x t o campoTexto = new J T e x t F i e l d ( 2 0 ) ; cp . add ( campoTexto ) ; // Se c r e a y a n ade un b o t o n boton = new JButton ( Aceptar ) ; cp . add ( boton ) ; // R e g i s t r a m o s un o b j e t o de ManipulaMouseEvent como un e s c u c h a d o r // de e v e n t o s de r a t o n para e l b o t o n boton . a d d M o u s e L i s t e n e r ( new ManipulaMouseEvent ( ) ) ; setSize (500 ,300) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { ConsultaGUI ven = new ConsultaGUI ( ) ; ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; ven . show ( ) ; } }

Ejercicio 3 En una de las tablas se pod an introducir comentarios de los clientes sobre las casas. Se desea realizar una GUI para realizar buscar por una palabra (o palabras) dentro del comentario. La GUI debe contener una etiqueta, un campo de texto donde introducir la(s) palabra(s) y un bot on. El resultado de esta b usqueda ser an las casas que tienen un comentario que incluya la(s) palabra(s) introducidas. Este resultado se inserta en un JComboBox de forma que el usuario pueda seleccionar una casa. A su lado aparecer a un bot on para lanzar una b usqueda concreta para ver todos los comentarios concernientes a la casa seleccionada. Los comentarios deben aparecer en un area de texto. La siguiente gura muestra un posible dise no y su ejecuci on.

Ir al ndice

juan.gutierrez@uv.es

P agina: 27

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

5.2.

KeyListener

p u b l i c i n t e r f a c e KeyListener extends EventListener

Esta interfaz la deben implementar aquellas clases que est en interesadas en escuchar eventos del tipo KeyEvent El objeto de esta clase debe registrarse en un componente utilizando su m etodo addKeyListener. Los m etodos que dene esta interfaz son:
// Metodo l l a m a d o cuando s e p u l s a una t e c l a v o i d k e y P r e s s e d ( KeyEvent e ) // Metodo l l a m a d o cuando s e l i b e r a una t e c l a v o i d k e y R e l e a s e d ( KeyEvent e ) // Metodo l l a m a d o cuando s e p u l s a y l i b e r a una t e c l a v o i d keyTyped ( KeyEvent e )

En el siguiente ejemplo, cada vez que se pulsa una tecla sobre un area de texto se trata el evento que se lanza. Se realiza una estad stica para comprobar el n umero de letras y n umeros frente al uso de otras teclas.
import import import import j a v a . awt . ; j a v a . awt . e v e n t . ; j a v a x . swing . ; java . u t i l . Calendar ;

c l a s s E v e n t o s T e c l a d o e x t e n d s JFrame { p r i v a t e JTextArea a ; p r i v a t e i n t c o n t a d o r L e t r a s =0; p r i v a t e i n t c o n t a d o r O t r o s =0; p r i v a t e long t1 ; p r i v a t e long t2 ; EventosTeclado ( ) { a = new JTextArea ( ) ; c l a s s ManipulaKeyEvent i m p l e m e n t s K e y L i s t e n e r { p u b l i c v o i d k e y P r e s s e d ( KeyEvent e ) { char car ; c a r = e . getKeyChar ( ) ; i f ( ! ( Character . i s L e t t e r ( car ) ) & ! ( Character . i s D i g i t ( car ) ) ) { S t r i n g t e c l a = e . getKeyText ( e . getKeyCode ( ) ) ; i f ( t e c l a . compareTo ( R e t r o c e s o ) ==0) c o n t a d o r L e t r a s ; System . out . p r i n t ( t e c l a ) ; c o n t a d o r O t r o s ++; } } p u b l i c v o i d k e y R e l e a s e d ( KeyEvent e ) { } p u b l i c v o i d keyTyped ( KeyEvent e ) { char car ; c a r = e . getKeyChar ( ) ; i f ( ( Character . i s L e t t e r ( car ) ) | ( Character . i s D i g i t ( car ) ) ) { System . out . p r i n t ( c a r ) ;

Ir al ndice

juan.gutierrez@uv.es

P agina: 28

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

c o n t a d o r L e t r a s ++; } } } c l a s s ManipulaMouseEventInicio implements MouseListener { p u b l i c v o i d mouseEntered ( MouseEvent e ) { } p u b l i c v o i d mouseExited ( MouseEvent e ) { } p u b l i c v o i d mou seClicked ( MouseEvent e ) {} p u b l i c v o i d mouseReleased ( MouseEvent e ) {} p u b l i c v o i d mousePressed ( MouseEvent e ) { c o n t a d o r L e t r a s =0; c o n t a d o r O t r o s =0; t1 = Calendar . g e t I n s t a n c e ( ) . g e t T i m e I n M i l l i s ( ) ; } } c l a s s ManipulaMouseEventFin i m p l e m e n t s M o u s e L i s t e n e r { p u b l i c v o i d mouseEntered ( MouseEvent e ) { } p u b l i c v o i d mouseExited ( MouseEvent e ) { } p u b l i c v o i d mou seClicked ( MouseEvent e ) {} p u b l i c v o i d mouseReleased ( MouseEvent e ) {} p u b l i c v o i d mousePressed ( MouseEvent e ) { a . setText ( ) ; t2 = Calendar . g e t I n s t a n c e ( ) . g e t T i m e I n M i l l i s ( ) ; l o n g tiempo = t2 t 1 ; System . out . p r i n t l n ( \ n L e t r a s y numeros : + c o n t a d o r L e t r a s ) ; System . out . p r i n t l n ( Otras t e c l a s : + c o n t a d o r O t r o s ) ; System . out . p r i n t l n ( Tiempo ( m i l i s e g u n d o s ) : + tiempo ) ; } } ManipulaKeyEvent mce = new ManipulaKeyEvent ( ) ; a . a d d K e y L i s t e n e r ( mce ) ; getContentPane ( ) . add ( a , BorderLayout .CENTER) ; JButton b o t o n I n i c i o = new JButton ( I n i c i o ) ; getContentPane ( ) . add ( b o t o n I n i c i o , BorderLayout .NORTH) ; b o t o n I n i c i o . a d d M o u s e L i s t e n e r ( new M a n i p u l a M o u s e E v e n t I n i c i o ( ) ) ; JButton botonFin = new JButton ( R e s u l t a d o ) ; botonFin . a d d M o u s e L i s t e n e r ( new ManipulaMouseEventFin ( ) ) ; getContentPane ( ) . add ( botonFin , BorderLayout .SOUTH) ; setSize (400 ,400) ; s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; show ( ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new E v e n t o s T e c l a d o ( ) ; } }

5.3.

WindowListener

p u b l i c i n t e r f a c e WindowListener e x t e n d s E v e n t L i s t e n e r

Ir al ndice

juan.gutierrez@uv.es

P agina: 29

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Esta interfaz la deben implementar aquellas clases que est en interesadas en escuchar eventos del tipo WindowEvent El objeto de esta clase debe registrarse en un componente utilizando su m etodo addWindowListener. Los m etodos que dene esta interfaz son:
// Metodo l l a m a d o cuando s e a c t i v a l a v e n t a n a v o i d windowActivated ( WindowEvent e ) // Metodo l l a m a d o cuando s e ha c e r r a d o l a v e n t a n a v o i d windowClosed ( WindowEvent e ) // Metodo l l a m a d o cuando e l u s u a r i o c i e r r a l a v e n t a n a v o i d windowClosing ( WindowEvent e ) // Metodo l l a m a d o cuando l a v e n t a n a d e j a de e s t a r a c t i v a v o i d windowDeactivated ( WindowEvent e ) // Metodo l l a m a d o cuando l a v e n t a n a pasa de i c o n o a su e s t a d o normal v o i d w i n d o w D e i c o n i f i e d ( WindowEvent e ) // Metodo l l a m a d o cuando s e i c o n i f i c a l a v e n t a n a v o i d w i n d o w I c o n i f i e d ( WindowEvent e ) // Metodo l l a m a d o l a primera v e z que s e muestra l a v e n t a n a v o i d windowOpened ( WindowEvent e )

5.4.

ActionListener

p u b l i c i n t e r f a c e ActionListener extends EventListener

Esta interfaz la deben implementar aquellas clases que est en interesadas en escuchar eventos del tipo ActionEvent El objeto de esta clase debe registrarse en un componente utilizando su m etodo addActionListener. Los m etodos que dene esta interfaz son:
// Metodo l l a m a d o cuando o c u r r e una a c c i o n v o i d a c t i o n P e r f o r m e d ( ActionEvent e )

i m p o r t j a v a . awt . ; i m p o r t j a v a . awt . e v e n t . ; i m p o r t j a v a x . swing . ; c l a s s E v e n t o s A c c i o n e x t e n d s JFrame i m p l e m e n t s A c t i o n L i s t e n e r { p r i v a t e T e x t F i e l d c1 ; p r i v a t e T e x t F i e l d c2 ; p r i v a t e Button b ; EventosAccion ( ) { // Se c r e a una b a r r a de men us JMenuBar mb = new JMenuBar ( ) ;

Ir al ndice

juan.gutierrez@uv.es

P agina: 30

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

// Creamos un e l e m e n t o d e l men u JMenu a r c h i v o = new JMenu ( A rc hi v o ) ; a r c h i v o . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 2 0 ) ) ; // Creamos y a n adimos submen us JMenuItem nuevo = new JMenuItem ( Nuevo ) ; nuevo . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; nuevo . a d d A c t i o n L i s t e n e r ( t h i s ) ; a r c h i v o . add ( nuevo ) ;

JMenuItem a b r i r = new JMenuItem ( A b r i r ) ; a b r i r . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ; abrir . addActionListener ( t h i s ) ; a r c h i v o . add ( a b r i r ) ; mb . add ( a r c h i v o ) ; setJMenuBar (mb) ; setSize (300 ,300) ; s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; show ( ) ; } p u b l i c v o i d a c t i o n P e r f o r m e d ( ActionEvent e ) { // Comprobamos s i l a f u e n t e d e l e v e n t o e s un JMenuItem i f ( e . g e t S o u r c e ( ) i n s t a n c e o f JMenuItem ) { JMenuItem s o u r c e = ( JMenuItem ) ( e . g e t S o u r c e ( ) ) ; S t r i n g s e l e c c i o n a d o = source . getText ( ) ; // S i p u l s a s o b r e a b r i r mostramos una v e n t a n a para a b r i r f i c h e r o s i f ( s e l e c c i o n a d o . compareTo ( A b r i r ) ==0) { J F i l e C h o o s e r p i d e F i c h e r o = new J F i l e C h o o s e r ( ) ; i n t r e t u r n V a l = p i d e F i c h e r o . showOpenDialog ( E v e n t o s A c c i o n . t h i s ) ; i f ( r e t u r n V a l == J F i l e C h o o s e r .APPROVE OPTION) { System . out . p r i n t l n ( Has s e l e c c i o n a d o e l f i c h e r o : + p i d e F i c h e r o . g e t S e l e c t e d F i l e ( ) . getName ( ) ) ; } } } } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new E v e n t o s A c c i o n ( ) ; } }

5.5.

TextListener

p u b l i c i n t e r f a c e TextListener extends EventListener

Esta interfaz la deben implementar aquellas clases que est en interesadas en escuchar eventos del tipo TextEvent El objeto de esta clase debe registrarse en un componente utilizando su m etodo addTextListener. Los m etodos que dene esta interfaz son: Ir al ndice
juan.gutierrez@uv.es

P agina: 31

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

// Metodo l l a m a d o cuando e l t e x t o ha s i d o m o d i f i c a d o v o i d textValueChanged ( TextEvent e )

5.6.

ItemListener

p u b l i c i n t e r f a c e ItemListener extends EventListener

Esta interfaz la deben implementar aquellas clases que est en interesadas en escuchar eventos del tipo ItemEvent El objeto de esta clase debe registrarse en un componente utilizando su m etodo addItemListener. Los m etodos que dene esta interfaz son:
// Metodo l l a m a d o cuando e l t e x t o ha s i d o m o d i f i c a d o v o i d itemStateChanged ( ItemEvent e )

i m p o r t j a v a . awt . ; i m p o r t j a v a . awt . e v e n t . ; i m p o r t j a v a x . swing . ; c l a s s EventosItem e x t e n d s JFrame { p r i v a t e JCheckBox c h e c k ; p r i v a t e JComboBox comb ; p r i v a t e boolean s e l ; p r i v a t e String val1 ; c l a s s ManipulaMouseEvent i m p l e m e n t s M o u s e L i s t e n e r { p u b l i c v o i d mousePressed ( MouseEvent e ) { System . out . p r i n t l n ( s e l ) ; System . out . p r i n t l n ( v a l 1 ) ; } p u b l i c v o i d mouseReleased ( MouseEvent e ) {} p u b l i c v o i d mou seClicked ( MouseEvent e ) { } p u b l i c v o i d mouseEntered ( MouseEvent e ) { } p u b l i c v o i d mouseExited ( MouseEvent e ) { } } c l a s s ManipulaItemEvent i m p l e m e n t s I t e m L i s t e n e r { p u b l i c v o i d itemStateChanged ( ItemEvent e ) { i f ( e . g e t S o u r c e ( ) i n s t a n c e o f JCheckBox ) { i f ( e . g e t S t a t e C h a n g e ( ) == ItemEvent .SELECTED) sel =true ; else sel = false ; } e l s e // e s que l a f u e n t e e s e l JComboBox val1 = ( String ) e . getItem ( ) ; } } // El c o n s t r u c t o r EventosItem ( ) { C o n t a i n e r cp = getContentPane ( ) ;

Ir al ndice

juan.gutierrez@uv.es

P agina: 32

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

c h e c k = new JCheckBox ( A ) ; comb = new JComboBox ( ) ; comb . addItem ( Casa ) ; comb . addItem ( P i s o ) ; comb . addItem ( Adosado ) ; JButton b = new JButton ( Aceptar ) ; c h e c k . a d d I t e m L i s t e n e r ( new ManipulaItemEvent ( ) ) ; comb . a d d I t e m L i s t e n e r ( new ManipulaItemEvent ( ) ) ; b . a d d M o u s e L i s t e n e r ( new ManipulaMouseEvent ( ) ) ; cp . s e t L a y o u t ( new FlowLayout ( ) ) ; cp . add ( c h e c k ) ; cp . add ( comb ) ; cp . add ( b ) ; setSize (400 ,400) ; s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; show ( ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new EventosItem ( ) ; } }

Hay ocasiones en las que puede resultar inc omodo trabajar con estas interfaces si uno est a interesado en implementar un u nico m etodo, ya que hay que escribir el resto de los m etodos dej andolos vac os. Para algunas de estas interfaces se ofrecen clases que las implementan pero dejando vac os todos los m etodos. De esta forma, puede resultar m as c omodo extender estas clases que implementar las interfaces.

<<interface>>

XXXListener
O     

XXXAdapter

donde XXX es el tipo del evento. Las clases adaptadoras que se ofrecen son:

Ir al ndice

juan.gutierrez@uv.es

P agina: 33

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

<<interface>>

<<interface>>

<<interface>>

ComponentListener O   ComponentAdapter

ContainerListener O   ContainerAdapter

FocusListener O   FocusAdapter

<<interface>>

<<interface>>

<<interface>>

KeyListener O   KeyAdapter

MouseListener O   MouseAdapter

MouseMotionListener O   MouseMotionAdapter

<<interface>>

WindowListener O   WindowAdapter

El c odigo de la derecha y el de la izquierda son equivalentes:

Button b = new Button ( A c e p t a r ) ; class Oyente i m p l e m e n t e s M o u s e L i s t e n e r { void void void m o u s e C l i c k e d ( MouseEvent e ) { } mouseEntered ( MouseEvent e ) { }

Button b = new Button ( A c e p t a r ) ; class Oyente extends MouseAdapter {

public public public

p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) { System . o u t . p r i n t l n ( Boton p u l s a d o ) ; } }

m o u s e E x i t e d ( MouseEvent e ) { } b . a d d M o u s e L i s t e n e r ( new Oyente ( ) ) ;

p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) { System . o u t . p r i n t l n ( Boton p u l s a d o ) ; } public } b . a d d M o u s e L i s t e n e r ( new Oyente ( ) ) ; void m o u s e R e l e a s e d ( MouseEvent e ) { }

La u nica diferencia a nivel de c odigo es que en el caso de la derecha la clase implementa a la interfaz MouseListener y en el de la derecha la clase extiende a la clase MouseAdapter que a su vez implementa a la interfaz MouseListener. Cuando una clase oyente de eventos se va a utilizar en un punto muy espec co del c odigo y no se va a reutilizar en otras partes (o en otras clases) existe la posibilidad de realizarla mediante una clase an onima. Una clase an onima (como cabe esperar) es aquella a la que no se asigna un nombre. La creaci on del objeto y la especicaci on de la clase se realiza en el mismo momento, el este caso en el argumento de un m etodo. Vamos a ver c omo se puede utilizar una clase an onima con el ejemplo anterior:

Ir al ndice

juan.gutierrez@uv.es

P agina: 34

Interfaces Gr acas de Usuario en Java Julio 2004.

MySQL y Java Universitat de Val` encia

Button b = new Button ( Aceptar ) ; b . a d d M o u s e L i s t e n e r ( new MouseAdapter ( ) { p u b l i c v o i d mousePressed ( MouseEvent e ) { System . out . p r i n t l n ( Boton p u l s a d o ) ; } }

Debido a la duraci on del curso se han quedado algunas sin ver como por ejemplo: Pluggable Look and Feel. El patr on Model-View-Controller que utiliza Swing. Unos cuantos componentes Swing. Algunos gestores de organizaci on.

Ir al ndice

juan.gutierrez@uv.es

P agina: 35

También podría gustarte