Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Indice: Ir Al Indice
Indice: Ir Al Indice
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
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
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.
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
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 instrucci on:
s u p e r ( Ventana ) ;
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
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.
Ir al ndice
juan.gutierrez@uv.es
P agina: 4
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
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
P agina: 6
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 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
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
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
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
P agina: 9
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
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
P agina: 11
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
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
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
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
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
4.
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
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
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
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
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.
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
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.
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.
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
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
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
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.
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.
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
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
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
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
@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
// 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
5.2.
KeyListener
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
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
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
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
// 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
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
5.6.
ItemListener
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
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
<<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 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
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