Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Gui PDF
Gui PDF
Indice
1. Introduccion 1
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
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. Introduccion
En esta sesion se van a ver algunos aspectos de JFC (Java Foundation Classes). JFC es un conjunto
de componentes para trabajo con interfaces graficas de usuario en Java.
Contiene:
API para el diseno de interfaces graficas de usuario que se integran en el sistema de ventanas nativo del sistema
donde se ejecutan, incluyendo APIs para arrastrar y soltar.
Java 2D
APIs para trabajar con graficos 2D, trabajo con imagenes, texto e impresion.
Swing
APIs que extienden AWT para proporcionar una biblioteca de componentes para el diseno de interfaces graficas de
usuario enteramente realizadas en Java.
Accesibilidad
APIs para permitir que las aplicaciones sean accesibles a las personas con discapacidades.
Internacionalizacion
Todas estas APIs incluyen soporte para crear aplicaciones que puedan ser utilizadas independientemente de la loca-
lizacion del usuario.
A grandes rasgos, los pasos para crear una interfaz grafica de usuario son
Se puede crear una ventana (que servira como contenedor de componentes) utilizando la clase
JFrame.
El siguiente codigo muestra como se puede crear una ventana con tamano 300 por 200 pixels.
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 ttulo se puede poner como primera sentencia en el
constructor de Ventana la siguiente instruccion:
s u p e r ( Ventana ) ;
Las ventanas son contenedores de otros componentes tales como barras de menu, campos de texto,
botones, etc.
JFrame
JRoot
JLayeredPane
Content pane
Glass pane
Para anadir componentes a la ventana, primero se debe obtener el contenedor content pane y a
continuacion anadir los componentes a este.
i m p o r t j a v a x . swing . ;
i m p o r t j a v a . awt . ;
c l a s s MiPanel e x t e n d s JPanel {
p u b l i c v o i d paintComponent ( G r a p h i c s g ) {
s u p e r . paintComponent ( g ) ;
g . drawRect ( 2 0 , 2 0 , 8 0 , 8 0 ) ;
}
}
c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
getContentPane ( ) . add ( new MiPanel ( ) ) ;
setSize (300 ,200) ;
}
}
p u b l i c c l a s s EjemploVentana2 {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
Ventana ven = new Ventana ( ) ;
Se ha sobreescrito un metodo de la clase JPanel donde especificamos que se debe realizar cuando
haya que mostrar este componente, pero... donde llamamos a este metodo?.
La respuesta es: en ningun sitio. Este metodo es llamado automaticamente cada vez que hay que
pintar el componente y esto ocurre cada vez que:
...
3. Componentes swing
Un componente es un objeto que tiene una representacion grafica y que puede ser mostrado por
pantalla y que puede utilizado por el usuario. Ejemplos de componentes son: JButton, JTextField, JScro-
llPane, JTextArea, 1
Utilizan como base la clase java.awt.Component que esta definida como abstracta. Todos los compo-
nentes (excepto los menus) extienden a esta clase.
Otro conjunto esta 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.
Contenedor
alto nivel
JFrame
JApplet PPP
PPP
... AA PPP
}} AA PPP
}}} AA PPP
PPP
}} AA PPP
}} A PP
Contenedor Contenedor PPPP
Componentes
intermedio intermedio
... JButton
JPanel JPanel
JTextField
JScrollPane JScrollPane
...
... ...
Componentes Componentes
JButton ... JButton
JTextField JTextField
... ...
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 ( ) ) ;
c . add ( p ) ;
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 ( ) ) ;
3.3. JTextField
Objetos de esta clase se utilizan para que el usuario pueda introducir datos a la aplicacion.
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 ) ;
3.4. JTextArea
Objetos de esta clase se utilizan para que el usuario pueda introducir datos tipo texto de gran
tamano.
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 ( O b s e r v a c i o n e s ) ) ;
c . add ( a r e a ) ;
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 ( ) ) ;
c . add ( b1 ) ;
c . add ( b2 ) ;
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 ( ) ) ;
c . add ( cb ) ;
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 ( ) ) ;
c . add ( rb ) ;
3.8. ButtonGroup
Se pueden agrupar una serie de JRadioButton de forma que solo 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 ) ) ;
// 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 ) ;
c . add ( r a d i o P a n e l ) ;
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 ( ) ) ;
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.
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 ( l i s t a ) ;
Objetos del tipo JTable sirven para mostrar informacion 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 . swing . ;
i m p o r t j a v a . awt . ;
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
C o n t a i n e r cp = getContentPane ( ) ;
cp . s e t L a y o u t ( new BorderLayout ( ) ) ;
// Nombres de l a s columnas
f i n a l S t r i n g [ ] nombreCol = { S e s i o n , Tema , Fecha , Aula } ;
// Datos
Object [ ] [ ] datos = {
{ 1 , MySQL , 120704 , 5 } ,
{ 2 , MySQL , 130704 , 5 } ,
{ 3 , JDBC , 140704 , 5 } ,
{ 4 , GUI , 150704 , 5 } ,
{ 5 , P r o y e c t o , 160704 , 5 } } ;
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 da 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
i m p o r t j a v a x . swing . ;
i m p o r t j a v a x . swing . t r e e . ;
i m p o r t j a v a . awt . ;
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p r i v a t e JTree a r b o l ;
p u b l i c Ventana ( ) {
C o n t a i n e r c = getContentPane ( ) ;
c . s e t L a y o u t ( new BorderLayout ( ) ) ;
// C o n s t r u c c i o n d e l a r b o l
DefaultMutableTreeNode tema = n u l l ;
DefaultMutableTreeNode s e c c i o n = n u l l ;
tema . add ( s e c c i o n ) ;
a r b o l = new JTree ( a s i g ) ;
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 menus
mb = new JMenuBar ( ) ;
// Creamos un e l e m e n t o d e l menu
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 o t r o e l e m e n t o d e l menu
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 ) ) ;
// Anadimos 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) ;
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 ( ) ;
}
}
Cuando en una ventana hay muchos componentes hay que organizarlos de algun modo.
Java proporciona diversos esquemas de organizacion (layout managers) que pueden ser utilizados
para organizar los componentes dentro de los contenedores.
Los gestores de organizacion se encargan de reorganizar los componentes en caso de que el usuario
cambie el tamano de la ventana.
4.1. BorderLayout
Se puede utilizar para colocar en un contenedor cinco componentes como maximo ya que propor-
ciona cinco posiciones donde colocar los componentes, estas son: NORTH (arriba), SOUTH (abajo),
WEST (izquierda), EAST (derecha) y CENTER (en el centro).
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 ( ) ;
c . s e t L a y o u t ( new BorderLayout ( ) ) ;
4.2. FlowLayout
Coloca los componentes de izquierda a derecha conforme se van anadiendo a la ventana. El tamano
de los componentes se ajusta a su contenido.
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 ( ) ;
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 filas y columnas en funcion de los valores pasados al constructor. Todas
las celdas tendran el mismo tamano.
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 ( ) ;
}
}
4.4. CardLayout
Se puede utilizar para mostrar de forma condicional unos elementos u otros, de forma que se puede
controlar que elementos seran visibles. Una ilustracion es una pila de cartas en las que solo la superior
es visible en un instante dado.
4.5. GridBagLayout
Este es un organizador complejo que permite ajustar la posicion de los componentes. Al colocar
los componentes en los contenedores se especifican las restricciones que se deben cumplir ( posicion
del componente, anchura y altura del componente, separacion entre los componentes, posicion dentro
del espacio que ocupa, ...).
Ejercicio 2
Se pide construir la interfaz grafica que se muestra en la siguiente figura.
5. Tratamiento de eventos
Hasta ahora las interfaces graficas que se han mostrado tienen poca utilidad ya que no responden
a las acciones del usuario.
Pues con lo que hemos hecho hasta ahora, aparentemente no sucede nada, no se obtiene ninguna
respuesta.
En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este com-
ponente es una fuente de eventos de raton.
Si el usuario pulsa con el raton sobre el boton se lanza un evento del tipo MouseEvent. Si no hay ningun
objeto que recoja ese evento no sucede nada.
Falta especificar que es lo que se debe realizar cuando se produzcan determinados eventos sobre
los componentes que se coloquen en la ventana.
Cualquier sistema operativo que soporte GUIs monitoriza los eventos que se producen, como por
ejemplo pulsaciones sobre las teclas o pulsaciones con un boton del raton.
El sistema operativo informa sobre estos eventos a los programas que estan en ejecucion.
Cada programa decide que hacer (si es que debe hacer algo) en respuesta a estos eventos.
El modelo de delegacion de eventos se basa en que los componentes disparan eventos que pueden
ser tratados por escuchadores (o manipuladores).
Una vez que el escuchador ha sido anadido al componente, cuando se produzca un evento, los
metodos apropiados del manipulador (que han sido especificados en la interfaz) seran llamados.
1
Registramos un
oyente de
eventos de raton
asociado al boton
En una GUI colocamos una serie de componentes entre los cuales se encuentra un JButton. Este com-
ponente es una fuente de eventos de raton. Ahora registramos un oyente de eventos de raton en el
boton.
4
El oyente
recibe la
notificacion
del evento
Si el usuario pulsa con el raton sobre el boton 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.
Esta clase tiene dos metodos: getSource() que devuelve el objeto que genero el evento y toString().
Es la superclase de todos los eventos basados en AWT utilizados por el modelo de delegacion de
eventos.
Eventos semanticos no son tan especficos como los anteriores y no son disparados
necesariamente por una accion atomica tal y como una pulsacion del raton. 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.
A continuacion se muestran los eventos que se definen en AWT y cual es la accion que los produce
EventObject
O
<<abstract>>
l; O aC hQ
5 AWTEvent CC QQQQ
lll xx
l l lll xxx CC QQQ
CC QQQ
l ll xx CC QQQ
ll l xx QQQ
lll x x CC
lll x CC QQQ
lll x x CC QQQ
lll xx C QQQ
ll x C QQQ
lll xx C
AdjustmentEvent ComponentEvent
ActionEvent 5 < O aCChPPP ItemEvent TextEvent
l llllxxx CC PPP
l xx CC PPPP
lll
l l lll xxxx CC
CC
PPP
PPP
lllll xx x CC PPP
ll x CC PPP
llll xx C PPP
ll x x C PPP
lllll xx CC
C PPP
ll xx <<abstract>>
ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent
x< aCC
xxx CC
CC
xx CC
xxx CC
xx CC
xxx CC
x CC
xx CC
xx
KeyEvent MouseEvent
Vamos a ver ahora algunas de las interfaces que se ofrecen en java.awt con el fin de especificar
los metodos 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 esten interesadas en escuchar eventos del
tipo MouseEvent
// 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 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 raton sobre el boton. 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 estandar.
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 ( ) ) ;
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 ) ;
cp . add ( boton ) ;
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 continuacion 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 sesion de JDBC pero ahora se utiliza un
PreparedStatement.
import j a v a . awt . e v e n t . ;
import j a v a . awt . ;
import j a v a x . swing . ;
import 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 () {
try {
con = DriverManager . g e t C o n n e c t i o n ( u r l ) ;
} 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 ( ) ;
}
}
@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 ;
}
/ 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 ( ) {
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 ) ;
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 numero 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 = getContentPane ( ) ;
// 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
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 ( ) ) ;
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 podan 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 boton. El
resultado de esta busqueda seran 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 aparecera un boton para lanzar una busqueda concreta para ver todos los comentarios
concernientes a la casa seleccionada. Los comentarios deben aparecer en un area de texto.
La siguiente figura muestra un posible diseno y su ejecucion.
5.2. KeyListener
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo KeyEvent
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 estadstica para comprobar el numero de letras y numeros frente al uso
de otras teclas.
import j a v a . awt . ;
import j a v a . awt . e v e n t . ;
import j a v a x . swing . ;
import 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 ) ;
c o n t a d o r L e t r a s ++;
}
}
}
t1 = Calendar . g e t I n s t a n c e ( ) . g e t T i m e I n M i l l i s ( ) ;
}
}
c l a s s ManipulaMouseEventFin i m p l e m e n t s M o u s e L i s t e n e r {
p u b l i c v o i d mouseEntered ( MouseEvent e ) { }
p u b l i c v o i d mouseExited ( MouseEvent e ) { }
p u b l i c v o i d mou seClicked ( MouseEvent e ) {}
p u b l i c v o i d mouseReleased ( MouseEvent e ) {}
p u b l i c v o i d mousePressed ( MouseEvent e ) {
a . setText ( ) ;
t2 = Calendar . g e t I n s t a n c e ( ) . g e t T i m e I n M i l l i s ( ) ;
l o n g tiempo = t2t 1 ;
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
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo WindowEvent
// 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 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 )
5.4. ActionListener
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo ActionEvent
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 menus
JMenuBar mb = new JMenuBar ( ) ;
// Creamos un e l e m e n t o d e l menu
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 ) ) ;
mb . add ( a r c h i v o ) ;
setJMenuBar (mb) ;
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 ( ) ;
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 esten interesadas en escuchar eventos del
tipo TextEvent
// Metodo l l a m a d o cuando e l t e x t o ha s i d o m o d i f i c a d o
v o i d textValueChanged ( TextEvent e )
5.6. ItemListener
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo ItemEvent
// 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 ( ) ;
c h e c k = new JCheckBox ( A ) ;
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 ) ;
Hay ocasiones en las que puede resultar incomodo trabajar con estas interfaces si uno esta inte-
resado en implementar un unico metodo, ya que hay que escribir el resto de los metodos dejandolos
vacos.
Para algunas de estas interfaces se ofrecen clases que las implementan pero dejando vacos todos
los metodos.
De esta forma, puede resultar mas comodo extender estas clases que implementar las interfaces.
<<interface>>
XXXListener
O
XXXAdapter
<<interface>>
WindowListener
O
WindowAdapter
b . a d d M o u s e L i s t e n e r ( new Oyente ( ) ) ;
La unica diferencia a nivel de codigo 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 especfico del codigo y no se
va a reutilizar en otras partes (o en otras clases) existe la posibilidad de realizarla mediante una clase
anonima.
Una clase anonima (como cabe esperar) es aquella a la que no se asigna un nombre.
La creacion del objeto y la especificacion de la clase se realiza en el mismo momento, el este caso
en el argumento de un metodo.
Vamos a ver como se puede utilizar una clase anonima con el ejemplo anterior:
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 duracion del curso se han quedado algunas sin ver como por ejemplo: