´
Indice
1. Introducci´on 1
2. Crear una ventana 2
3. Componentes swing 5
3.1. JPanel y JLabel. . . 6
3.2. ImageIcon . . . 7
3.3. JTextField. . . 7
3.4. JTextArea. . . 8
3.5. JButton . . . 8
3.6. JCheckBox . . . 9
3.7. JRadioButton. . . 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 19 5.1. MouseListener . . . 24
5.2. KeyListener . . . 28
5.3. WindowListener . . . 29
5.4. ActionListener . . . 30
5.5. TextListener. . . 31
5.6. ItemListener . . . 32
1.
Introducci´
on
En esta sesi´
on se van a ver algunos aspectos de JFC (Java Foundation Classes). JFC es un conjunto
de componentes para trabajo con interfaces gr´
aficas de usuario en Java.
Contiene:
Abstract Window Toolkit (AWT)
API para el dise˜no de interfaces gr´aficas de usuario que se integran en el sistema de ventanas nativo del sistema donde se ejecutan, incluyendo APIs para arrastrar y soltar.
APIs para trabajar con gr´aficos 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´aficas 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 loca-lizaci´on del usuario.
Aqu´ı vamos a ver algo de Swing y de AWT.
A grandes rasgos, los pasos para crear una interfaz gr´
afica de usuario son
Crear una ventana
Colocar componentes en la ventana
Organizar los componentes en los contenedores
Tratar los eventos
2.
Crear una ventana
Se puede crear una ventana (que servir´
a como contenedor de componentes) utilizando la clase
JFrame.
i m p o r t j a v a x . s w i n g .∗;
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 ( ){ s e t S i z e ( 3 0 0 , 2 0 0 ) ; }
}
El resultado al ejecutar esta aplicaci´
on es el siguiente:
Si se desea que en la ventana aparezca un t´ıtulo se puede poner como primera sentencia en el
constructor de
Ventana
la siguiente instrucci´
on:
s u p e r( ” Ventana ” ) ;
En este caso se ver´
a lo siguiente:
Las ventanas son contenedores de otros componentes tales como barras de men´
u, campos de texto,
botones, etc.
JFrame
JRoot
JLayeredPane
Content pane
Glass pane
Para a˜
nadir componentes a la ventana, primero se debe obtener el contenedor
content pane
y a
continuaci´
on a˜
nadir los componentes a ´
este.
Por ejemplo, supongamos que deseamos dibujar un rect´
angulo en la ventana. El rect´
angulo no se
puede dibujar directamente sobre un objeto del tipo
JFrame. En su lugar procederemos del siguiente
modo:
1.
Crearemos una clase que extienda a
JPanel
2.
Sobreescribiremos su m´
etodo
paintComponent(Graphics g)
3.
A˜
nadiremos un objeto de este tipo a la ventana.
El c´
odigo se muestra a continuaci´
on:
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a . awt .∗;
c l a s s MiPanel e x t e n d s J P a n e l{
p u b l i c v o i d paintComponent ( G r a p h i c s g ){
s u p e r. paintComponent ( g ) ; g . drawRect ( 2 0 , 2 0 , 8 0 , 8 0 ) ; }
}
c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ){
g e t C o n t e n t P a n e ( ) . add (new MiPanel ( ) ) ; s e t S i z e ( 3 0 0 , 2 0 0 ) ;
} }
p u b l i c c l a s s EjemploVentana2{
ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ; ven . show ( ) ;
} }
Se ha sobreescrito un m´
etodo de la clase
JPanel
donde especificamos 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 modifica 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´
afica y que puede ser mostrado por
pantalla y que puede utilizado por el usuario. Ejemplos de componentes son:
JButton,
JTextField,
JScro-llPane,
JTextArea,
1Utilizan como base la clase
java.awt.Component
que est´
a definida como abstracta. Todos los
compo-nentes (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 figura muestra la relaci´
on entre componentes y contenedores
1
Hay otra serie de clases que no empiezan por J: Button, TextField, TextArea,... que pertenecen a AWT.
2Contenedor
alto nivel
JFrame
JApplet
...
Contenedor
intermedio
JPanel
JScrollPane
...
}
}
}
}
}
}
}
}
}
...
Contenedor
intermedio
JPanel
JScrollPane
...
AAAA
AAAA
A
Componentes
JButton
JTextField
...
PPPPPP
PPPPPP
PPPPPP
PPPPPP
PPP
Componentes
JButton
JTextField
...
...
Componentes
JButton
JTextField
...
Vamos a ver algunos de los componentes que ofrece Swing.
3.1.
JPanel y JLabel
Un objeto de la clase
JPanel
sirve para contener otros componentes. La clase
JLabel
se utiliza para
crear etiquetas de texto.
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; c . s e t L a y o u t (new FlowLayout ( ) ) ;
J P a n e l p = new J P a n e l ( ) ;
p . add (new J L a b e l ( ” Ejemplo de J P a n e l ” ) ) ;
c . add ( p ) ;
s e t S i z e ( 2 0 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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.2.
ImageIcon
Objetos de esta clase se pueden utilizar para mostrar im´
agenes.
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; c . s e t L a y o u t (new FlowLayout ( ) ) ;
I m a g e I c o n i i = new I m a g e I c o n ( f i c h ) ;
c . add (new J L a b e l ( ” ” , i i , J L a b e l .CENTER) ) ;
s e t S i z e ( 6 5 0 , 5 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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 . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; 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 ) ;
s e t S i z e ( 3 5 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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.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 . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; 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 ) ;
s e t S i z e ( 3 5 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ){
new Ventana ( ) ; }
}
3.5.
JButton
Un objeto de esta clase representa un bot´
on.
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; c . s e t L a y o u t (new FlowLayout ( ) ) ;
JButton b1 = new JButton ( ” A c e p t a r ” ) ; JButton b2 = new JButton ( ” C a n c e l a r ” ) ;
c . add ( b1 ) ; c . add ( b2 ) ;
s e t S i z e ( 3 5 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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.6.
JCheckBox
Sirve para seleccionar elementos.
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; 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 ) ;
s e t S i z e ( 2 0 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ){
new Ventana ( ) ; }
}
3.7.
JRadioButton
Sirve para seleccionar elementos.
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; c . s e t L a y o u t (new FlowLayout ( ) ) ;
JRadioButton r b=new JRadioButton ( ” P i z a r r a ” ) ;
r b . s e t F o n t (new Font ( ” A r i a l ” , Font . PLAIN , 2 0 ) ) ;
c . add ( r b ) ;
s e t S i z e ( 2 0 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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.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 . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; 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 ” ) ; g a s . s e t F o n t ( f u e n t e ) ;
JRadioButton d i e = new JRadioButton ( ” D i e s e l ” ) ; d i e . s e t F o n t ( f u e n t e ) ;
// Agrupamos l o s b o t o n e s
ButtonGroup g ru p o = new ButtonGroup ( ) ; g ru p o . add ( g a s ) ;
g ru p o . add ( d i e ) ;
J P a n e l r a d i o P a n e l = new J P a n e l ( ) ;
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 ) ;
s e t S i z e ( 3 0 0 , 3 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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.9.
JComboBox
Sirve para mostrar una lista desplegable de elementos.
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; 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 ) ;
s e t S i z e ( 2 0 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . 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 = g e t C o n t e n t P a n e ( ) ; c . s e t L a y o u t (new FlowLayout ( ) ) ;
S t r i n g [ ] d a t o s = {” P i z a r r a ” , ” P a n t a l l a ” , ” P r o y e c t o r ”};
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 ) ;
s e t S i z e ( 2 0 0 , 2 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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
desplaza-miento.
i m p o r t j a v a x . s w i n g .∗;
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 = g e t C o n t e n t P a n e ( ) ; cp . s e t L a y o u t (new B o r d e r L a y o u t ( ) ) ;
// 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
O b j e c t [ ] [ ] d a t o s = {
{” 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 ”} };
J T a b l e t a b l a = new J T a b l e ( d a t o s , 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 . s e t R o w H e i g h t ( 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 ) ; // , v e r , h o r ) ;
cp . add ( j s p , B o r d e r L a y o u t .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 ){
new Ventana ( ) ; }
}
Ejercicio 1
Realizar una consulta en la que se muestren las familias del Reino Unido donde el precio de
estancia por d´ıa sea menor o igual a 18 euros, se debe seleccionar el nombre de la familia, la
ciudad y el tipo de casa.
El resultado se debe mostrar en una
JTable.
3.12.
JTree
Objetos de este tipo sirven para mostrar la informaci´
on en forma de ´
arbol.
i m p o r t j a v a x . s w i n g .∗;
i m p o r t j a v a x . s w i n g . t r e e .∗;
i m p o r t j a v a . awt .∗;
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p r i v a t e JTree a r b o l ;
p u b l i c Ventana ( ){
C o n t a i n e r c = g e t C o n t e n t P a n e ( ) ; c . s e t L a y o u t (new B o r d e r L a y o u t ( ) ) ;
// C o n s t r u c c i o n d e l a r b o l
D e f a u l t M u t a b l e T r e e N o d e a s i g = new D e f a u l t M u t a b l e T r e e N o d e ( ” E n l a c e s ” ) ;
D e f a u l t M u t a b l e T r e e N o d e tema = n u l l; D e f a u l t M u t a b l e T r e e N o d e s e c c i o n = n u l l;
tema = new D e f a u l t M u t a b l e T r e e N o d e ( ” B u s c a d o r e s ” ) ; a s i g . add ( tema ) ;
tema . add ( s e c c i o n ) ;
s e c c i o n = new D e f a u l t M u t a b l e T r e e N o d e ( ”Yahoo” ) ; tema . add ( s e c c i o n ) ;
tema = new D e f a u l t M u t a b l e T r e e N o d e ( ” Java ” ) ; a s i g . add ( tema ) ;
s e c c i o n = new D e f a u l t M u t a b l e T r e e N o d e ( ” Sun ” ) ; tema . add ( s e c c i o n ) ;
s e c c i o n = new D e f a u l t M u t a b l e T r e e N o d e ( ”IBM” ) ; tema . add ( s e c c i o n ) ;
s e c c i o n = new D e f a u l t M u t a b l e T r e e N o d e ( ” 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 , B o r d e r L a y o u t .CENTER) ;
s e t S i z e ( 4 0 0 , 6 0 0 ) ; s e t V i s i b l e (t r u e) ; }
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.13.
JMenu
i m p o r t j a v a . awt .∗;
i m p o r t j a v a x . s w i n g .∗;
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 ( ” A r c h i 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 ˜nadimos 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 ˜nadimos 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 ˜nadimos submen´us
JMenuItem c o p i a r = new JMenuItem ( ” C o p i a 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˜nadimos 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) ;
s e t S i z e ( 5 0 0 , 5 0 0 ) ; s e t V i s i b l e (t r u e) ;
}
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 ( ) ; }
4.
Organizaci´
on de los componentes
Cuando en una ventana hay muchos componentes hay que organizarlos de alg´
un modo.
Java proporciona diversos esquemas de organizaci´
on (
layout managers
) que pueden ser utilizados
para organizar los componentes dentro de los contenedores.
Los gestores de organizaci´
on se encargan de reorganizar los componentes en caso de que el usuario
cambie el tama˜
no de la ventana.
Los gestores de organizaci´
on que ofrece Java son:
BorderLayout, FlowLayout, BoxLayout, CardLayout, GridLayout, GridBagLayout
El procedimiento es siempre el mismo, se crea un objeto de alguna de estas clases y se le indica al
contenedor que organice los componentes utilizando el objeto (para ello los contenedores disponen del
m´
etodo
setLayout(LayoutManager m).
4.1.
BorderLayout
i m p o r t j a v a . awt .∗;
i m p o r t j a v a x . s w i n g .∗;
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 = g e t C o n t e n t P a n e ( ) ;
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 B o r d e r L a y o u t ( ) ) ;
c . add ( b1 , B o r d e r L a y o u t .NORTH) ; c . add ( b2 , B o r d e r L a y o u t .SOUTH) ; c . add ( b3 , B o r d e r L a y o u t .WEST) ; c . add ( b4 , B o r d e r L a y o u t . EAST) ; c . add ( b5 , B o r d e r L a y o u t .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 . s e t S i z e ( 3 0 0 , 3 0 0 ) ; v . show ( ) ;
} }
4.2.
FlowLayout
i m p o r t j a v a . awt .∗;
i m p o r t j a v a x . s w i n g .∗;
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 = g e t C o n t e n t P a n e ( ) ;
JButton b1 = new JButton ( ”A” ) ; JButton b2 = new JButton ( ”B” ) ;
JButton b3 = new JButton ( ” Bot´on m´as l a r g o ” ) ; JButton b4 = new JButton ( ”D” ) ;
JButton b5 = new 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 . s e t S i z e ( 2 0 0 , 2 0 0 ) ; v . show ( ) ;
} }
4.3.
GridLayout
Coloca los componentes en filas 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 . s w i n g .∗;
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 = g e t C o n t e n t P a n e ( ) ; 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 . s e t S i z e ( 3 0 0 , 3 0 0 ) ; v . show ( ) ;
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 especifican 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´
afica que se muestra en la siguiente figura.
5.
Tratamiento de eventos
Hasta ahora las interfaces gr´
aficas 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?
El bot´on es una fuente de eventos
En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este com-ponente es una fuente de eventos de rat´on.
1 El usuario pulsa el rat´on sobre el bot´on
2 Se lanza un evento del tipo MouseEvent
Si el usuario pulsa con el rat´on sobre el bot´on se lanza un evento del tipo MouseEvent. Si no hay ning´un objeto que recoja ese evento no sucede nada.
¿Qu´
e es lo que falta?
Falta especificar 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 GUI’s 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
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 especificados en la interfaz) ser´
an llamados.
El bot´on es una fuente de eventos
1 Registramos un
oyente de eventos de rat´on asociado al bot´on
En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este com-ponente es una fuente de eventos de rat´on. Ahora registramos un oyente de eventos de rat´on en el bot´on.
2 El usuario pulsa el rat´on sobre el bot´on
3 Se lanza un evento del tipo MouseEvent
4 El oyente
recibe la notificaci´on
del evento
Si el usuario pulsa con el rat´on sobre el bot´on se lanza un evento del tipo MouseEvent. Los oyentes que se hayan registrados son notificados 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.
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´ıfico 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´ıficos 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
Win-dowEvent
Los eventos sem´
anticos son:
ActionEvent ,AdjustmentEvent , ItemEvent, TextEvent
A continuaci´
on se muestran los eventos que se definen en AWT y cual es la acci´
on que los produce
Eventos AWT
Descripci´
on
ActionEvent
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.
AdjustmentEvent
Se genera cuando se manipula una barra de deslizamiento.
ItemEvent
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
.
TextEvent
Se genera cuando se cambia el valor de un ´
area de texto o de un campo
Eventos AWT
Descripci´
on
ComponentEvent
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).
ContainerEvent
Se genera cuando se a˜
nade o se elimina un componente de un
contene-dor. AWT trata este evento.
FocusEvent
Se genera cuando un componente gana o pierde la atenci´
on. Un
com-ponente tiene la atenci´
on al pulsar sobre ´
el con el rat´
on o por que se ha
llegado a ´
el pulsando la tecla de tabulaci´
on. El componente que tiene
la atenci´
on recibe los eventos de teclado.
Eventos AWT
Descripci´
on
KeyEvent
Es una subclase de
InputEvent
. Se genera cuando se pulsa una tecla o
libera una tecla.
MouseEvent
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.
MouseWheelEvent
Un evento que indica que la rueda del rat´
on se ha movido en un
com-ponente.
WindowEvent
Se genera cuando una ventana se activa, se desactiva, se cierra, se
mi-nimiza se maximiza o se sale de ella.
La jerarqu´ıa de estas clases se muestra en el siguiente diagrama:
Vamos a ver ahora algunas de las interfaces que se ofrecen en
java.awt
con el fin de especificar
los m´
etodos que deben poseer los objetos oyentes o auditores para cada uno de los eventos.
5.1.
MouseListener
p u b l i c i n t e r f a c e M o u s e L i s t e n e r e x t e n d s E v e n t L i s t e n e r
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 define 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 m o u s e C l i c k e d ( 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 m ou se Exi te d ( 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 m o u s e P r e s s e d ( 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 m o u s e R e l e a s e d ( 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 . s w i n g .∗;
c l a s s EventosRaton e x t e n d s JFrame{
p r i v a t e JButton b o t o n ;
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 m ou se Exi te d ( MouseEvent e ) { }
p u b l i c v o i d m o u s e C l i c k e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ){ System . o u t . p r i n t l n ( campoTexto . g e t T e x t ( ) ) ; }
}
C o n t a i n e r cp = g e t C o n t e n t P a n e ( ) ;
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 ) ;
b o to n = new JButton ( ” A c e p t a r ” ) ;
cp . add ( b o t o n ) ;
b o to n . a d d M o u s e L i s t e n e r (new ManipulaMouseEvent ( ) ) ;
s e t S i z e ( 5 0 0 , 3 0 0 ) ; }
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.
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 . s w i n g .∗;
i m p o r t j a v a . s q l .∗;
/∗ ∗ C l a s e de apoyo . En e l l a e n c a p s u l a m o s l a c o n e x i o n a l a b a s e de d a t o s y ∗ l a s c o n s u l t a s
∗/
c l a s s C o n s u l t a s{
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 p s ;
// C o n s t r u c t o r
C o n s u l t a s ( ){
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&p a s s w o r d=c l a v e ” ;
t r y{
C l a s s . forName ( ”com . mysql . j d b c . D r i v e r ” ) ;
con = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( u r l ) ;
p s = 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( C l a s s N o t F o u n d E x c e p t i o n 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 .
∗@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 ∗/
p u b l i c R e s u l t S e t c o n s u l t a C a s a s (f l o a t v a l o r ){
R e s u l t S e t r e s u l t a d o = n u l l;
t r y{
p s . s e t F l o a t ( 1 , v a l o r ) ;
r e s u l t a d o = p s . 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 ( ) ; }
r e t u r n r e s u l t a d o ; }
/∗ ∗ Metodo p a r a 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 ∗/
p u b l i c v o i d c i e r r a C o n e x i o n ( ){
t r y{
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 ( ) ; }
} }
/∗ ∗ E s t a 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 b o t o n ;
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 p a r a m a n i p u l a r 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 m ou se Exi te d ( MouseEvent e ) { }
p u b l i c v o i d m o u s e C l i c k e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ){
S t r i n g p a r a m e t r o = campoTexto . g e t T e x t ( ) ;
t r y{
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 ( p a r a m e t r o ) ;
System . o u t . p r i n t l n ( ”\n R e s u l t a d o de l a busqueda : ” ) ;
R e s u l t S e t r = c o n s . c o n s u l t a C a s a s ( p r e c i o ) ;
r . b e f o r e F i r s t ( ) ;
w h i l e ( r . n e x t ( ) ){
System . o u t . 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 . o u t . p r i n t ( ” Ciudad : ” + r . g e t S t r i n g ( 2 ) + ”\t ” ) ; System . o u t . 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 . o u t . p r i n t l n ( ”No e s un n´umero 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 ( ) ; }
// 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 = g e t C o n t e n t P a n e ( ) ;
// I n d i c a m o s 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 ˜nade 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 ˜nade 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 ˜nade un b o t o n
b o to n = new JButton ( ” A c e p t a r ” ) ; cp . add ( b o t o n ) ;
// 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 p a r a e l b o t o n
b o to n . a d d M o u s e L i s t e n e r (new ManipulaMouseEvent ( ) ) ;
s e t S i z e ( 5 0 0 , 3 0 0 ) ; }
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.
5.2.
KeyListener
p u b l i c i n t e r f a c e K e y L i s t e n e r e x t e n d s E v e n t L i s t e n e r
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 define 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.
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 . s w i n g .∗;
i m p o r t j a v a . u t i l . C a l e n d a r ;
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 l o n g t 1 ;
p r i v a t e l o n g t 2 ;
E v e n t o s T e c l a d o ( ){ 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 ) {
c h a r c a r ;
c a r = e . getKeyChar ( ) ;
i f ( ! ( C h a r a c t e r . i s L e t t e r ( c a r ) ) & ! ( C h a r a c t e r . i s D i g i t ( c a r ) ) ){ 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 . o u t . 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 ) {
c h a r c a r ;
c a r = e . getKeyChar ( ) ;
c o n t a d o r L e t r a s ++; }
} }
c l a s s M a n i p u l a M o u s e E v e n t I n i c i o 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 m ou se Exi te d ( MouseEvent e ) { }
p u b l i c v o i d m o u s e C l i c k e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e P r e s s e d ( 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;
t 1 = C a l e n d a r . 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 m ou se Exi te d ( MouseEvent e ) { }
p u b l i c v o i d m o u s e C l i c k e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ){
a . s e t T e x t ( ” ” ) ;
t 2 = C a l e n d a r . 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 t i e m p o = t2−t 1 ;
System . o u t . 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 . o u t . p r i n t l n ( ” O t r a s t e c l a s : ” + c o n t a d o r O t r o s ) ;
System . o u t . p r i n t l n ( ” Tiempo ( m i l i s e g u n d o s ) : ” + t i e m p o ) ; }
}
ManipulaKeyEvent mce = new ManipulaKeyEvent ( ) ; a . a d d K e y L i s t e n e r ( mce ) ;
g e t C o n t e n t P a n e ( ) . add ( a , B o r d e r L a y o u t .CENTER) ;
JButton b o t o n I n i c i o = new JButton ( ” I n i c i o ” ) ;
g e t C o n t e n t P a n e ( ) . add ( b o t o n I n i c i o , B o r d e r L a y o u t .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 b o t o n F i n = new JButton ( ” R e s u l t a d o ” ) ;
b o t o n F i n . a d d M o u s e L i s t e n e r ( new ManipulaMouseEventFin ( ) ) ; g e t C o n t e n t P a n e ( ) . add ( botonFin , B o r d e r L a y o u t .SOUTH) ;
s e t S i z e ( 4 0 0 , 4 0 0 ) ;
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
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 define 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 w i n d o w A c t i v a t e d ( 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 w i n d o w C l o s i n g ( 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 w i n d o w D e a c t i v a t e d ( WindowEvent e )
// Metodo l l a m a d o cuando l a v e n t a n a p a s a 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 p r i m e r a v e z que s e m u e s t r a l a v e n t a n a
v o i d windowOpened ( WindowEvent e )
5.4.
ActionListener
p u b l i c i n t e r f a c e A c t i o n L i s t e n e r e x t e n d s E v e n t L i s t e n e r
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 define 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 ( A c t i o n E v e n t 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 . s w i n g .∗;
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 c 1 ;
p r i v a t e T e x t F i e l d c 2 ;
p r i v a t e Button b ;
E v e n t o s A c c i o n ( ){
// Se c r e a una b a r r a de men´us
// 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 r c h i 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 ˜nadimos 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 ) ) ; a b r i r . 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 ( a b r i r ) ;
mb . add ( a r c h i v o ) ;
setJMenuBar (mb) ;
s e t S i z e ( 3 0 0 , 3 0 0 ) ;
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 ( A c t i o n E v e n t 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 = s o u r c e . g e t T e x t ( ) ;
// 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 p a r a 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 . o u t . p r i n t l n ( ” Has s e l e c c i o n a d o e l f i c h e r o : ” + p i d e F i c h e r o . g e t S e l e c t e d F i l e ( ) . getName ( ) ) ;
} } } }
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ){
new E v e n t o s A c c i o n ( ) ; }
}
5.5.
TextListener
p u b l i c i n t e r f a c e T e x t L i s t e n e r e x t e n d s E v e n t L i s t e n e r
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.
// 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 t e x t V a l u e C h a n g e d ( TextEvent e )
5.6.
ItemListener
p u b l i c i n t e r f a c e I t e m L i s t e n e r e x t e n d s E v e n t L i s t e n e r
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 define 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 i t e m S t a t e C h a n g e d ( 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 . s w i n g .∗;
c l a s s E v e n t o s I t e m 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 b o o l e a n s e l ;
p r i v a t e S t r i n g v a l 1 ;
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 m o u s e P r e s s e d ( MouseEvent e ){ System . o u t . p r i n t l n ( s e l ) ;
System . o u t . p r i n t l n ( v a l 1 ) ; }
p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ){}
p u b l i c v o i d m o u s e C l i c k e d ( 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 m ou s eExi te d ( 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 i t e m S t a t e C h a n g e d ( 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) s e l =t r u e;
e l s e
s e l = f a l s e; }
e l s e // e s que l a f u e n t e e s e l JComboBox
v a l 1 = ( S t r i n g ) e . g e t I t e m ( ) ; }
}
// E l c o n s t r u c t o r
E v e n t o s I t e m ( ){
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 ( ” A c e p t a r ” ) ;
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 ) ;
s e t S i z e ( 4 0 0 , 4 0 0 ) ;
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 I t e m ( ) ; }
}
Hay ocasiones en las que puede resultar inc´
omodo trabajar con estas interfaces si uno est´
a
inte-resado en implementar un ´
unico 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
XXXAdapter
OO
donde
XXX
es el tipo del evento.
<<interface>>
ComponentListener
ComponentAdapter
OO
<<interface>>ContainerListener
ContainerAdapter
OO
<<interface>>FocusListener
FocusAdapter
OO
<<interface>>KeyListener
KeyAdapter
OO
<<interface>>MouseListener
MouseAdapter
OO
<<interface>>MouseMotionListener
MouseMotionAdapter
OO
<<interface>>WindowListener
WindowAdapter
OO
El c´
odigo de la derecha y el de la izquierda son equivalentes:
B u t t o n b = n e w B u t t o n ( ” A c e p t a r ” ) ;
c l a s s 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{
p u b l i c v o i d m o u s e C l i c k e d ( MouseEvent e ) { }
p u b l i c v o i d m o u s e E n t e r e d ( MouseEvent e ) { }
p u b l i c v o i d m o u s e E x i t e d ( MouseEvent e ) { }
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) { System . o u t . p r i n t l n ( ” Boton p u l s a d o ” ) ; }
p u b l i c v o i d m o u s e R e l e a s e d ( MouseEvent e ) { } }
b . a d d M o u s e L i s t e n e r (n e w Oyente ( ) ) ;
B u t t o n b = n e w B u t t o n ( ” A c e p t a r ” ) ;
c l a s s Oyente e x t e n d s MouseAdapter{
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) { System . o u t . p r i n t l n ( ” Boton p u l s a d o ” ) ; }
}
b . a d d M o u s e L i s t e n e r (n e w Oyente ( ) ) ;
La ´
unica 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´ıfico 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 especificaci´
on de la clase se realiza en el mismo momento, el este caso
en el argumento de un m´
etodo.
Button b = new Button ( ” A c e p t a r ” ) ;
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 m o u s e P r e s s e d ( MouseEvent e ){ System . o u t . p r i n t l n ( ” Boton p u l s a d o ” ) ; }
}