Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Indice
1. Introduccin o 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. Organizacin de los componentes o 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
1.
Introduccin o
En esta sesin se van a ver algunos aspectos de JFC (Java Foundation Classes). JFC es un conjunto o de componentes para trabajo con interfaces grcas de usuario en Java. a Contiene: Abstract Window Toolkit (AWT)
API para el diseo de interfaces grcas de usuario que se integran en el sistema de ventanas nativo del sistema n a donde se ejecutan, incluyendo APIs para arrastrar y soltar.
Java 2D Ir al ndice
juan.gutierrez@uv.es
Pgina: 1 a
APIs para trabajar con grcos 2D, trabajo con imgenes, texto e impresin. a a o
Swing
APIs que extienden AWT para proporcionar una biblioteca de componentes para el diseo de interfaces grcas de n a usuario enteramente realizadas en Java.
Accesibilidad
APIs para permitir que las aplicaciones sean accesibles a las personas con discapacidades.
Internacionalizacin o
Todas estas APIs incluyen soporte para crear aplicaciones que puedan ser utilizadas independientemente de la localizacin del usuario. o
Aqu vamos a ver algo de Swing y de AWT. A grandes rasgos, los pasos para crear una interfaz grca de usuario son a Crear una ventana Colocar componentes en la ventana Organizar los componentes en los contenedores Tratar los eventos
2.
JFrame.
El siguiente cdigo muestra cmo se puede crear una ventana con tamao 300 por 200 pixels. o o n Ir al ndice
juan.gutierrez@uv.es
Pgina: 2 a
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) ; } }
Si se desea que en la ventana aparezca un t tulo se puede poner como primera sentencia en el constructor de Ventana la siguiente instruccin: o
s u p e r ( Ventana ) ;
Las ventanas son contenedores de otros componentes tales como barras de men, campos de texto, u botones, etc. De hecho una ventana est constituida por una serie de capas: a
Ir al ndice
juan.gutierrez@uv.es
Pgina: 3 a
Para aadir componentes a la ventana, primero se debe obtener el contenedor content pane y a n continuacin aadir los componentes a ste. o n e Por ejemplo, supongamos que deseamos dibujar un rectngulo en la ventana. El rectngulo no se a a 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 mtodo paintComponent(Graphics g) e 3. Aadiremos un objeto de este tipo a la ventana. n
Ir al ndice
juan.gutierrez@uv.es
Pgina: 4 a
Se ha sobreescrito un mtodo de la clase JPanel donde especicamos qu se debe realizar cuando e e haya que mostrar este componente, pero... donde llamamos a este mtodo?. e La respuesta es: en ningn sitio. Este mtodo es llamado automticamente cada vez que hay que u e a pintar el componente y esto ocurre cada vez que:
Cuando hay que mostrarlo por primera vez Cuando se modica el tamao de la ventana n Cuando la ventana estaba minimizada y se vuelve a mostrar. Cuando otra aplicacin que cubre a la ventana se mueve. o ...
3.
Componentes swing
Un componente es un objeto que tiene una representacin grca y que puede ser mostrado por o a 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 denida como abstracta. Todos los compoa nentes (excepto los mens) extienden a esta clase. u Los componentes se pueden dividir en dos categor as: Un conjunto de componentes est formado por widgets 2 . a Otro conjunto est formado por contenedores. Estos componentes extienden a la clase java.awt.Container a (que es una clase abstracta que extiende a Component). Los contenedores son componentes que pueden incluir otros componentes. La siguiente gura muestra la relacin entre componentes y contenedores o
Hay otra serie de clases que no empiezan por J: Button, TextField, TextArea,... que pertenecen a AWT. Contraccin de Window y gadget. Una representacin visible de un componente que puede ser manipulada por el o o usuario. Botones, campos de texto y barras de desplazamiento son ejemplos de widgets
2 1
Ir al ndice
juan.gutierrez@uv.es
Pgina: 5 a
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
...
...
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
Pgina: 6 a
3.2.
ImageIcon
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 aplicacin. o
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
Pgina: 7 a
3.4.
JTextArea
Objetos de esta clase se utilizan para que el usuario pueda introducir datos tipo texto de gran tamao. n
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
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
Pgina: 8 a
3.6.
JCheckBox
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
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
Pgina: 9 a
3.8.
ButtonGroup
Se pueden agrupar una serie de JRadioButton de forma que slo pueda estar seleccionado uno de o 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
Pgina: 10 a
3.9.
JComboBox
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
Pgina: 11 a
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 informacin en forma tabular. o 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 , 120704 , 5 } , { 2 , MySQL , 130704 , 5 } , { 3 , JDBC , 140704 , 5 } , { 4 , GUI , 150704 , 5 } , { 5 , P r o y e c t o , 160704 , 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
Pgina: 12 a
Ejercicio 1 Realizar una consulta en la que se muestren las familias del Reino Unido donde el precio de estancia por d sea menor o igual a 18 euros, se debe seleccionar el nombre de la familia, la a ciudad y el tipo de casa. El resultado se debe mostrar en una JTable.
3.12.
JTree
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
Pgina: 13 a
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
Pgina: 14 a
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 s u 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 adimos submen s n u 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 adimos a r c h i v o a l a b a r r a de menus n 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 adimos submen s n u 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 adimos e d i t a r a l a b a r r a de menu n 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
Pgina: 15 a
4.
Java proporciona diversos esquemas de organizacin (layout managers) que pueden ser utilizados o para organizar los componentes dentro de los contenedores. Los gestores de organizacin se encargan de reorganizar los componentes en caso de que el usuario o cambie el tamao de la ventana. n Los gestores de organizacin que ofrece Java son: o
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 mtodo setLayout(LayoutManager m). e
4.1.
BorderLayout
Se puede utilizar para colocar en un contenedor cinco componentes como mximo ya que propora ciona 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
Pgina: 16 a
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 aadiendo a la ventana. El tamao n n de los componentes se ajusta a su contenido.
Ir al ndice
juan.gutierrez@uv.es
Pgina: 17 a
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 n ms l a r g o ) ; o a 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 funcin de los valores pasados al constructor. Todas o las celdas tendrn el mismo tamao. a n
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
Pgina: 18 a
4.4.
CardLayout
Se puede utilizar para mostrar de forma condicional unos elementos u otros, de forma que se puede controlar qu elementos sern visibles. Una ilustracin es una pila de cartas en las que slo la superior e a o o es visible en un instante dado.
4.5.
GridBagLayout
Este es un organizador complejo que permite ajustar la posicin de los componentes. Al colocar o los componentes en los contenedores se especican las restricciones que se deben cumplir ( posicin o del componente, anchura y altura del componente, separacin entre los componentes, posicin dentro o o del espacio que ocupa, ...). Ejercicio 2 Se pide construir la interfaz grca que se muestra en la siguiente gura. a
5.
Tratamiento de eventos
Hasta ahora las interfaces grcas que se han mostrado tienen poca utilidad ya que no responden a a las acciones del usuario. Qu ocurre si pulsamos sobre un botn? e o Qu ocurre si pulsamos sobre una celda de la tabla? e Qu ocurre si pulsamos sobre un elemento de un men? e 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
Pgina: 19 a
En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este componente es una fuente de eventos de ratn. o
Si el usuario pulsa con el ratn sobre el botn se lanza un evento del tipo MouseEvent. Si no hay ningn o o u objeto que recoja ese evento no sucede nada.
Qu es lo que falta? e Falta especicar qu es lo que se debe realizar cuando se produzcan determinados eventos sobre e 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 botn del ratn. o o El sistema operativo informa sobre estos eventos a los programas que estn en ejecucin. a o Cada programa decide qu hacer (si es que debe hacer algo) en respuesta a estos eventos. e En Java se utiliza un modelo conocido como modelo de delegacin de eventos. s o El modelo de delegacin de eventos se basa en que los componentes disparan eventos que pueden o ser tratados por escuchadores (o manipuladores).
Ir al ndice
juan.gutierrez@uv.es
Pgina: 20 a
Los escuchadores se registran en un componente. Por ejemplo, en un botn podemos registrar un o escuchador de eventos de ratn. o Una vez que el escuchador ha sido aadido al componente, cuando se produzca un evento, los n mtodos apropiados del manipulador (que han sido especicados en la interfaz) sern llamados. e a
En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este componente es una fuente de eventos de ratn. Ahora registramos un oyente de eventos de ratn en el o o botn. o
Si el usuario pulsa con el ratn sobre el botn se lanza un evento del tipo MouseEvent. Los oyentes que o o 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 mtodos: getSource() que devuelve el objeto que gener el evento y toString(). e o 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
Pgina: 21 a
Es la superclase de todos los eventos basados en AWT utilizados por el modelo de delegacin de o 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 ratn sobre un componente, al o ganar o perder la atencin,... o Eventos semnticos no son tan espec a cos como los anteriores y no son disparados necesariamente por una accin atmica tal y como una pulsacin del ratn. Las acciones o o o o 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
A continuacin se muestran los eventos que se denen en AWT y cual es la accin que los produce o o Eventos AWT ActionEvent Descripcin o Se genera cuando el usuario pulsa un botn, pulsa Return en un campo o de texto, selecciona un elemento de un men o cuando un elemento de u 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 rea de texto o de un campo a de texto. Los objetos fuente de este evento son: TextField y TextArea.
AdjustmentEvent ItemEvent
TextEvent
Ir al ndice
juan.gutierrez@uv.es
Pgina: 22 a
ContainerEvent FocusEvent
Descripcin o Un evento que indica que un componente ha sido movido, ha cambiado de tamao o ha sido ocultado. AWT maneja este evento (es decir que n aunque expl citamente tratemos este evento, AWT tambin lo har). e a Se genera cuando se aade o se elimina un componente de un contenen dor. AWT trata este evento. Se genera cuando un componente gana o pierde la atencin. Un como ponente tiene la atencin al pulsar sobre l con el ratn o por que se ha o e o llegado a l pulsando la tecla de tabulacin. El componente que tiene e o la atencin recibe los eventos de teclado. o
Descripcin o 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 ratn se mueve, o se pulsa, se arrastra, o cuando entra o sale el ratn de un componente. o Un evento que indica que la rueda del ratn se ha movido en un como ponente. Se genera cuando una ventana se activa, se desactiva, se cierra, se minimiza se maximiza o se sale de ella.
ContainerEvent
CC QQQQ lll x CC QQQ lll xx QQQ CC lll xxxx l QQQ CC lll x x ll QQQ CC x ll QQQ CC xx lll x ll QQQ l CC x QQQ lll xx CC x QQQ lll C xx lll ComponentEvent AdjustmentEvent ActionEvent ItemEvent TextEvent ll5 x< O aCChPPPPP CC P lll xxx CC PPPP lll x CC PPP lll xxx lll PPP CC x ll PPP xx CC lll PPP ll xx CC l PPP xx lll CC ll PPP xx CC ll PPP xx lll C ll xx <<abstract>>
FocusEvent
<<abstract>> ; O aC 5 AWTEvent hQ
KeyEvent
< xx xx x xx xx x xx xx x xx xx
InputEvent
aCC CC CC CC CC CC CC CC CC
PaintEvent
WindowEvent
MouseEvent
Ir al ndice
juan.gutierrez@uv.es
Pgina: 23 a
Vamos a ver ahora algunas de las interfaces que se ofrecen en java.awt con el n de especicar los mtodos que deben poseer los objetos oyentes o auditores para cada uno de los eventos. e
5.1.
MouseListener
Esta interfaz la deben implementar aquellas clases que estn interesadas en escuchar eventos del e tipo MouseEvent El objeto de esta clase debe registrarse en un componente utilizando su mtodo addMouseListener. e Los mtodos que dene esta interfaz son: e
// 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 ratn sobre el botn. Lo que o o 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 estndar. a
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
Pgina: 24 a
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 continuacin se muestra un ejemplo en el que se realiza una consulta a la base de datos utilizando o 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 sesin de JDBC pero ahora se utiliza un o
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
Pgina: 25 a
@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 mero v a l i d o ) ; u } 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
Pgina: 26 a
// 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 introducir comentarios de los clientes sobre las casas. Se desea an 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 botn. El o resultado de esta bsqueda sern las casas que tienen un comentario que incluya la(s) palabra(s) u a introducidas. Este resultado se inserta en un JComboBox de forma que el usuario pueda seleccionar una casa. A su lado aparecer un botn para lanzar una bsqueda concreta para ver todos los comentarios a o u concernientes a la casa seleccionada. Los comentarios deben aparecer en un rea de texto. a La siguiente gura muestra un posible diseo y su ejecucin. n o
Ir al ndice
juan.gutierrez@uv.es
Pgina: 27 a
5.2.
KeyListener
Esta interfaz la deben implementar aquellas clases que estn interesadas en escuchar eventos del e tipo KeyEvent El objeto de esta clase debe registrarse en un componente utilizando su mtodo addKeyListener. e Los mtodos que dene esta interfaz son: e
// 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 rea de texto se trata el evento a que se lanza. Se realiza una estad stica para comprobar el nmero de letras y nmeros frente al uso u u 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
Pgina: 28 a
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 = t2t 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
Pgina: 29 a
Esta interfaz la deben implementar aquellas clases que estn interesadas en escuchar eventos del e tipo WindowEvent El objeto de esta clase debe registrarse en un componente utilizando su mtodo addWindowListener. e Los mtodos que dene esta interfaz son: e
// 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
Esta interfaz la deben implementar aquellas clases que estn interesadas en escuchar eventos del e tipo ActionEvent El objeto de esta clase debe registrarse en un componente utilizando su mtodo addActionListener. e Los mtodos que dene esta interfaz son: e
// 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 s u JMenuBar mb = new JMenuBar ( ) ;
Ir al ndice
juan.gutierrez@uv.es
Pgina: 30 a
// 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 adimos submen s n u 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
Esta interfaz la deben implementar aquellas clases que estn interesadas en escuchar eventos del e tipo TextEvent El objeto de esta clase debe registrarse en un componente utilizando su mtodo addTextListener. e Los mtodos que dene esta interfaz son: e Ir al ndice
juan.gutierrez@uv.es
Pgina: 31 a
5.6.
ItemListener
Esta interfaz la deben implementar aquellas clases que estn interesadas en escuchar eventos del e tipo ItemEvent El objeto de esta clase debe registrarse en un componente utilizando su mtodo addItemListener. e Los mtodos que dene esta interfaz son: e
// 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
Pgina: 32 a
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 incmodo trabajar con estas interfaces si uno est inteo a resado en implementar un unico mtodo, ya que hay que escribir el resto de los mtodos dejndolos e e a vac os. Para algunas de estas interfaces se ofrecen clases que las implementan pero dejando vac todos os los mtodos. e De esta forma, puede resultar ms cmodo extender estas clases que implementar las interfaces. a o
<<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
Pgina: 33 a
<<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
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 ) { }
La unica diferencia a nivel de cdigo es que en el caso de la derecha la clase implementa a la interfaz o 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 cdigo y no se o va a reutilizar en otras partes (o en otras clases) existe la posibilidad de realizarla mediante una clase annima. o Una clase annima (como cabe esperar) es aquella a la que no se asigna un nombre. o La creacin del objeto y la especicacin de la clase se realiza en el mismo momento, el este caso o o en el argumento de un mtodo. e Vamos a ver cmo se puede utilizar una clase annima con el ejemplo anterior: o o
Ir al ndice
juan.gutierrez@uv.es
Pgina: 34 a
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 duracin del curso se han quedado algunas sin ver como por ejemplo: o Pluggable Look and Feel. El patrn Model-View-Controller que utiliza Swing. o Unos cuantos componentes Swing. Algunos gestores de organizacin. o
Ir al ndice
juan.gutierrez@uv.es
Pgina: 35 a