Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GUI Manipular Programas en Java
GUI Manipular Programas en Java
Julio 2004.
MySQL y Java
Universitat de Val`encia
Indice
1. Introducci
on
3. Componentes swing
3.2. ImageIcon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. JTextField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4. JTextArea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5. JButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.6. JCheckBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.7. JRadioButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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
19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.2. KeyListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.3. WindowListener
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.4. ActionListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.5. TextListener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.6. ItemListener
1.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Introducci
on
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:
Abstract Window Toolkit (AWT)
Java 2D
Ir al ndice
juan.gutierrez@uv.es
Pagina: 1
MySQL y Java
Universitat de Val`encia
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.
Internacionalizacion
Todas estas APIs incluyen soporte para crear aplicaciones que puedan ser utilizadas independientemente de la localizaci
on del usuario.
2.
JFrame.
El siguiente codigo muestra como se puede crear una ventana con tama
no 300 por 200 pixels.
Ir al ndice
juan.gutierrez@uv.es
Pagina: 2
MySQL y Java
Universitat de Val`encia
i m p o r t j a v a x . swing . ;
p u b l i c c l a s s EjemploVentana {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
Ventana ven = new Ventana ( ) ;
ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ;
ven . show ( ) ;
}
}
c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
setSize (300 ,200) ;
}
}
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 men
u, campos de texto,
botones, etc.
De hecho una ventana esta constituida por una serie de capas:
Ir al ndice
juan.gutierrez@uv.es
Pagina: 3
MySQL y Java
Universitat de Val`encia
JFrame
JRoot
JLayeredPane
Content pane
Glass pane
Para a
nadir componentes a la ventana, primero se debe obtener el contenedor content pane y a
continuacion a
nadir los componentes a este.
Por ejemplo, supongamos que deseamos dibujar un rectangulo en la ventana. El rectangulo no se
puede dibujar directamente sobre un objeto del tipo JFrame. En su lugar procederemos del siguiente
modo:
p u b l i c c l a s s EjemploVentana2 {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
Ventana ven = new Ventana ( ) ;
Ir al ndice
juan.gutierrez@uv.es
Pagina: 4
MySQL y Java
Universitat de Val`encia
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 ning
un 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, JScrollPane, JTextArea, 1
Utilizan como base la clase java.awt.Component que esta definida como abstracta. Todos los componentes (excepto los men
us) extienden a esta clase.
Los componentes se pueden dividir en dos categoras:
Un conjunto de componentes esta formado por widgets 2 .
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.
La siguiente figura muestra la relacion entre componentes y contenedores
1
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
Ir al ndice
juan.gutierrez@uv.es
Pagina: 5
MySQL y Java
Universitat de Val`encia
Contenedor
alto nivel
JFrame
JApplet
Contenedor
intermedio
}}
}}
}
}}
}}
JPanel
JScrollPane
...
...
PPP
PPP
PPP
AA
PPP
AA
PPP
AA
PPP
AA
PPP
A
PP
Contenedor PPPP
Componentes
intermedio
JPanel
JScrollPane
...
...
Componentes
Componentes
JButton
JTextField
JButton
JTextField
...
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
Pagina: 6
3.2.
MySQL y Java
Universitat de Val`encia
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 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 ) ;
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
Pagina: 7
3.4.
MySQL y Java
Universitat de Val`encia
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
Pagina: 8
3.6.
MySQL y Java
Universitat de Val`encia
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
Pagina: 9
3.8.
MySQL y Java
Universitat de Val`encia
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 ) ) ;
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
Pagina: 10
3.9.
MySQL y Java
Universitat de Val`encia
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
Pagina: 11
MySQL y Java
Universitat de Val`encia
i m p o r t j a v a x . swing . ;
i m p o r t j a v a x . swing . e v e n t . ;
i m p o r t j a v a . awt . ;
p u b l i c c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
C o n t a i n e r c = getContentPane ( ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
String [ ] datos = { Pizarra , Pantalla ,
Proyector };
J L i s t l i s t a = new J L i s t ( d a t o s ) ;
c . add ( l i s t a ) ;
setSize (200 ,200) ;
setVisible ( true ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
new Ventana ( ) ;
}
}
3.11.
JTable y JScrollPane
Objetos del tipo JTable sirven para mostrar informacion 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 , 120704 , 5 } ,
{ 2 , MySQL , 130704 , 5 } ,
{ 3 , JDBC , 140704 , 5 } ,
{ 4 , GUI , 150704 , 5 } ,
{ 5 , P r o y e c t o , 160704 , 5 } } ;
JTable t a b l a = new JTable ( d at os , nombreCol ) ;
t a b l a . s e t F o n t ( new Font ( A r i a l , Font .BOLD, 1 8 ) ) ;
t a b l a . setRowHeight ( 2 4 ) ;
J S c r o l l P a n e j s p = new J S c r o l l P a n e ( t a b l a ) ; // , ver , hor ) ;
cp . add ( j s p , BorderLayout .CENTER) ;
setSize (500 ,300) ;
setVisible ( true ) ;
Ir al ndice
juan.gutierrez@uv.es
Pagina: 12
MySQL y Java
Universitat de Val`encia
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
new Ventana ( ) ;
}
}
Ejercicio 1
Realizar una consulta en la que se muestren las familias del Reino Unido donde el precio de
estancia por 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 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
Pagina: 13
MySQL y Java
Universitat de Val`encia
tema . add ( s e c c i o n ) ;
s e c c i o n = new DefaultMutableTreeNode ( Yahoo ) ;
tema . add ( s e c c i o n ) ;
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
Pagina: 14
3.13.
MySQL y Java
Universitat de Val`encia
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
Pagina: 15
4.
MySQL y Java
Universitat de Val`encia
Organizaci
on de los componentes
Cuando en una ventana hay muchos componentes hay que organizarlos de alg
un 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 tama
no de la ventana.
Los gestores de organizacion que ofrece Java son:
BorderLayout, FlowLayout, BoxLayout, CardLayout, GridLayout, GridBagLayout
4.1.
BorderLayout
Se puede utilizar para colocar en un contenedor cinco componentes como maximo 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
Pagina: 16
MySQL y Java
Universitat de Val`encia
i m p o r t j a v a . awt . ;
i m p o r t j a v a x . swing . ;
c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
C o n t a i n e r c = getContentPane ( ) ;
JButton
JButton
JButton
JButton
JButton
b1
b2
b3
b4
b5
=
=
=
=
=
new
new
new
new
new
JButton ( A ) ;
JButton ( B ) ;
JButton ( C ) ;
JButton ( D ) ;
JButton ( E ) ;
c . s e t L a y o u t ( new BorderLayout ( ) ) ;
c . add ( b1 , BorderLayout .NORTH) ;
c . add ( b2 , BorderLayout .SOUTH) ;
c . add ( b3 , BorderLayout .WEST) ;
c . add ( b4 , BorderLayout . EAST) ;
c . add ( b5 , BorderLayout .CENTER) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
Ventana v = new Ventana ( ) ;
v . setSize (300 ,300) ;
v . show ( ) ;
}
}
4.2.
FlowLayout
Ir al ndice
juan.gutierrez@uv.es
Pagina: 17
MySQL y Java
Universitat de Val`encia
i m p o r t j a v a . awt . ;
i m p o r t j a v a x . swing . ;
c l a s s Ventana e x t e n d s JFrame{
p u b l i c Ventana ( ) {
C o n t a i n e r c = getContentPane ( ) ;
JButton
JButton
JButton
JButton
JButton
b1
b2
b3
b4
b5
=
=
=
=
=
new
new
new
new
new
JButton ( A ) ;
JButton ( B ) ;
JButton ( Bot
o n m
as l a r g o ) ;
JButton ( D ) ;
JButton ( E ) ;
c . s e t L a y o u t ( new FlowLayout ( ) ) ;
c . add ( b1 ) ;
c . add ( b2 ) ;
c . add ( b3 ) ;
c . add ( b4 ) ;
c . add ( b5 ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
Ventana v = new Ventana ( ) ;
v . setSize (200 ,200) ;
v . show ( ) ;
}
}
4.3.
GridLayout
Coloca los componentes en filas y columnas en funcion de los valores pasados al constructor. Todas
las celdas tendran 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
Pagina: 18
4.4.
MySQL y Java
Universitat de Val`encia
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 ( posici
on
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.
Que ocurre si pulsamos sobre un boton?
Que ocurre si pulsamos sobre una celda de la tabla?
Que 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
Pagina: 19
MySQL y Java
Universitat de Val`encia
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.
Ir al ndice
juan.gutierrez@uv.es
Pagina: 20
MySQL y Java
Universitat de Val`encia
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 componente es una fuente de eventos de rat
on. Ahora registramos un oyente de eventos de rat
on en el
bot
on.
4
El oyente
recibe la
notificacion
del 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 metodos: getSource() que devuelve el objeto que genero el evento y toString().
Los paquetes relacionados con los eventos en AWT son java.awt.event.
La clase abstracta AWTEvent definida en el paquete java.awt es una subclase de EventObject.
Ir al ndice
juan.gutierrez@uv.es
Pagina: 21
MySQL y Java
Universitat de Val`encia
Es la superclase de todos los eventos basados en AWT utilizados por el modelo de delegaci
on de
eventos.
Hay dos clases de eventos:
Eventos de componente o de bajo nivel ocurren cuando ocurre algo especfico en un
componente. Por ejemplo al moverse, entrar o salir el raton sobre un componente, al
ganar o perder la atencion,...
Eventos sem
anticos 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.
Los eventos de componente o de bajo nivel son:
ComponentEvent, ContainerEvent, FocusEvent, InputEvent, KeyEvent, MouseEvent, MouseWheelEvent y WindowEvent
A continuacion se muestran los eventos que se definen en AWT y cual es la accion que los produce
Eventos AWT
ActionEvent
AdjustmentEvent
ItemEvent
TextEvent
Ir al ndice
Descripci
on
Se genera cuando el usuario pulsa un boton, 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.
juan.gutierrez@uv.es
Pagina: 22
Eventos AWT
ComponentEvent
ContainerEvent
FocusEvent
Eventos AWT
KeyEvent
MouseEvent
MouseWheelEvent
WindowEvent
MySQL y Java
Universitat de Val`encia
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 explcitamente tratemos este evento, AWT tambien lo hara).
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 atencion. Un componente tiene la atencion al pulsar sobre el con el raton o por que se ha
llegado a el pulsando la tecla de tabulacion. El componente que tiene
la atencion 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 raton se mueve,
se pulsa, se arrastra, o cuando entra o sale el raton de un componente.
Un evento que indica que la rueda del raton 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.
<<abstract>>
; O aC hQ
5 AWTEvent
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 < O aCChPPP
lllxxx
PPP
C
l
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>>
ContainerEvent
FocusEvent
InputEvent
x<
xx
x
xx
xx
x
xx
xx
x
x
xx
xx
KeyEvent
Ir al ndice
PaintEvent
aCC
CC
CC
CC
CC
CC
CC
CC
CC
WindowEvent
MouseEvent
juan.gutierrez@uv.es
Pagina: 23
MySQL y Java
Universitat de Val`encia
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
El objeto de esta clase debe registrarse en un componente utilizando su metodo addMouseListener.
Los metodos 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 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 )
Ir al ndice
juan.gutierrez@uv.es
Pagina: 24
MySQL y Java
Universitat de Val`encia
cp . add ( new J L a b e l ( I n t r o d u c e p r e c i o : ) ) ;
campoTexto = new J T e x t F i e l d ( 2 0 ) ;
cp . add ( campoTexto ) ;
boton = new JButton ( Aceptar ) ;
cp . add ( boton ) ;
boton . a d d M o u s e L i s t e n e r ( new ManipulaMouseEvent ( ) ) ;
setSize (500 ,300) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
EventosRaton ven = new EventosRaton ( ) ;
ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ;
ven . show ( ) ;
}
}
A 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
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
Pagina: 25
MySQL y Java
Universitat de Val`encia
@return un o b j e t o d e l t i p o R e s u l t S e t con e l r e s u l t a d o de l a c o n s u l t a
/
public ResultSet consultaCasas ( f l o a t valor ) {
ResultSet resultado = n u l l ;
try {
ps . s e t F l o a t ( 1 , v a l o r ) ;
r e s u l t a d o = ps . e x e c u t e Q u e r y ( ) ;
} c a t c h ( SQLException ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
return resultado ;
}
/ Metodo para c e r r a r l a c o n e x i o n con l a b a s e de d a t o s /
public void cierraConexion () {
try {
con . c l o s e ( ) ;
} c a t c h ( SQLException ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
}
}
/ Esta e s l a v e n t a n a /
c l a s s ConsultaGUI e x t e n d s JFrame{
p r i v a t e JButton boton ;
p r i v a t e J T e x t F i e l d campoTexto ;
p r i v a t e C o n s u l t a s c o n s = new C o n s u l t a s ( ) ;
p u b l i c ConsultaGUI ( ) {
// Creamos una c l a s e para manipular e v e n t o s de r a t o n
c l a s s ManipulaMouseEvent i m p l e m e n t s M o u s e L i s t e n e r {
p u b l i c v o i d mouseEntered ( MouseEvent e ) { }
p u b l i c v o i d mouseExited ( MouseEvent e ) { }
p u b l i c v o i d mou seClicked ( MouseEvent e ) {}
p u b l i c v o i d mouseReleased ( MouseEvent e ) {}
p u b l i c v o i d mousePressed ( MouseEvent e ) {
S t r i n g parametro = campoTexto . g e t T e x t ( ) ;
try {
f l o a t p r e c i o = F l o a t . p a r s e F l o a t ( parametro ) ;
System . out . p r i n t l n ( \n R e s u l t a d o de l a busqueda : ) ;
ResultSet r = cons . consultaCasas ( p r e c i o ) ;
r . beforeFirst () ;
w h i l e ( r . next ( ) ) {
System . out . p r i n t ( F a m i l i a : + r . g e t S t r i n g ( 1 ) + \ t ) ;
System . out . p r i n t ( Ciudad : + r . g e t S t r i n g ( 2 ) + \ t ) ;
System . out . p r i n t ( Tipo :
+ r . g e t S t r i n g ( 3 ) + \n ) ;
}
} c a t c h ( NumberFormatException ex ) {
System . out . p r i n t l n ( No e s un n
u mero v a l i d o ) ;
} c a t c h ( SQLException ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
}
}
Ir al ndice
juan.gutierrez@uv.es
Pagina: 26
MySQL y Java
Universitat de Val`encia
// Se o b t i e n e e l c o n t e n t pane de l a v e n t a n a
C o n t a i n e r cp = getContentPane ( ) ;
// Indicamos l a forma de o r g a n i z a r l o s componentes en e l
// c o n t e n t pane
cp . s e t L a y o u t ( new FlowLayout ( ) ) ;
// Se a n
ade una e t i q u e t a de t e x t o
cp . add ( new J L a b e l ( I n t r o d u c e p r e c i o : ) ) ;
// Se c r e a y a n
ade un campo de t e x t o
campoTexto = new J T e x t F i e l d ( 2 0 ) ;
cp . add ( campoTexto ) ;
// Se c r e a y a n
ade un b o t o n
boton = new JButton ( Aceptar ) ;
cp . add ( boton ) ;
// R e g i s t r a m o s un o b j e t o de ManipulaMouseEvent como un e s c u c h a d o r
// de e v e n t o s de r a t o n para e l b o t o n
boton . a d d M o u s e L i s t e n e r ( new ManipulaMouseEvent ( ) ) ;
setSize (500 ,300) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
ConsultaGUI ven = new ConsultaGUI ( ) ;
ven . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ;
ven . show ( ) ;
}
}
Ejercicio 3
En una de las tablas se 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 b
usqueda 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 b
usqueda 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 dise
no y su ejecucion.
Ir al ndice
juan.gutierrez@uv.es
Pagina: 27
5.2.
MySQL y Java
Universitat de Val`encia
KeyListener
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo KeyEvent
El objeto de esta clase debe registrarse en un componente utilizando su metodo addKeyListener.
Los metodos 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 estadstica 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
Pagina: 28
MySQL y Java
Universitat de Val`encia
c o n t a d o r L e t r a s ++;
}
}
}
c l a s s ManipulaMouseEventInicio implements MouseListener {
p u b l i c v o i d mouseEntered ( MouseEvent e ) { }
p u b l i c v o i d mouseExited ( MouseEvent e ) { }
p u b l i c v o i d mou seClicked ( MouseEvent e ) {}
p u b l i c v o i d mouseReleased ( MouseEvent e ) {}
p u b l i c v o i d mousePressed ( MouseEvent e ) {
c o n t a d o r L e t r a s =0;
c o n t a d o r O t r o s =0;
t1 = Calendar . g e t I n s t a n c e ( ) . g e t T i m e I n M i l l i s ( ) ;
}
}
c l a s s ManipulaMouseEventFin i m p l e m e n t s M o u s e L i s t e n e r {
p u b l i c v o i d mouseEntered ( MouseEvent e ) { }
p u b l i c v o i d mouseExited ( MouseEvent e ) { }
p u b l i c v o i d mou seClicked ( MouseEvent e ) {}
p u b l i c v o i d mouseReleased ( MouseEvent e ) {}
p u b l i c v o i d mousePressed ( MouseEvent e ) {
a . setText ( ) ;
t2 = Calendar . g e t I n s t a n c e ( ) . g e t T i m e I n M i l l i s ( ) ;
l o n g tiempo = t2t 1 ;
System . out . p r i n t l n ( \ n L e t r a s y numeros : + c o n t a d o r L e t r a s ) ;
System . out . p r i n t l n ( Otras t e c l a s : + c o n t a d o r O t r o s ) ;
System . out . p r i n t l n ( Tiempo ( m i l i s e g u n d o s ) : + tiempo ) ;
}
}
ManipulaKeyEvent mce = new ManipulaKeyEvent ( ) ;
a . a d d K e y L i s t e n e r ( mce ) ;
getContentPane ( ) . add ( a , BorderLayout .CENTER) ;
JButton b o t o n I n i c i o = new JButton ( I n i c i o ) ;
getContentPane ( ) . add ( b o t o n I n i c i o , BorderLayout .NORTH) ;
b o t o n I n i c i o . a d d M o u s e L i s t e n e r ( new M a n i p u l a M o u s e E v e n t I n i c i o ( ) ) ;
JButton botonFin = new JButton ( R e s u l t a d o ) ;
botonFin . a d d M o u s e L i s t e n e r ( new ManipulaMouseEventFin ( ) ) ;
getContentPane ( ) . add ( botonFin , BorderLayout .SOUTH) ;
setSize (400 ,400) ;
s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ;
show ( ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
new E v e n t o s T e c l a d o ( ) ;
}
}
5.3.
WindowListener
p u b l i c i n t e r f a c e WindowListener e x t e n d s E v e n t L i s t e n e r
Ir al ndice
juan.gutierrez@uv.es
Pagina: 29
MySQL y Java
Universitat de Val`encia
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo WindowEvent
El objeto de esta clase debe registrarse en un componente utilizando su metodo addWindowListener.
Los metodos 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 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 esten interesadas en escuchar eventos del
tipo ActionEvent
El objeto de esta clase debe registrarse en un componente utilizando su metodo addActionListener.
Los metodos 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 ( 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
Pagina: 30
MySQL y Java
Universitat de Val`encia
// Creamos un e l e m e n t o d e l men
u
JMenu a r c h i v o = new JMenu ( A rc hi v o ) ;
a r c h i v o . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 2 0 ) ) ;
// Creamos y a
n adimos submen
us
JMenuItem nuevo = new JMenuItem ( Nuevo ) ;
nuevo . s e t F o n t ( new Font ( A r i a l , Font . PLAIN , 1 6 ) ) ;
nuevo . a d d A c t i o n L i s t e n e r ( t h i s ) ;
a r c h i v o . add ( nuevo ) ;
5.5.
TextListener
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo TextEvent
El objeto de esta clase debe registrarse en un componente utilizando su metodo addTextListener.
Los metodos que define esta interfaz son:
Ir al ndice
juan.gutierrez@uv.es
Pagina: 31
MySQL y Java
Universitat de Val`encia
// Metodo l l a m a d o cuando e l t e x t o ha s i d o m o d i f i c a d o
v o i d textValueChanged ( TextEvent e )
5.6.
ItemListener
Esta interfaz la deben implementar aquellas clases que esten interesadas en escuchar eventos del
tipo ItemEvent
El objeto de esta clase debe registrarse en un componente utilizando su metodo addItemListener.
Los metodos 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 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
Pagina: 32
MySQL y Java
Universitat de Val`encia
c h e c k = new JCheckBox ( A ) ;
comb = new JComboBox ( ) ;
comb . addItem ( Casa ) ;
comb . addItem ( P i s o ) ;
comb . addItem ( Adosado ) ;
JButton b = new JButton ( Aceptar ) ;
c h e c k . a d d I t e m L i s t e n e r ( new ManipulaItemEvent ( ) ) ;
comb . a d d I t e m L i s t e n e r ( new ManipulaItemEvent ( ) ) ;
b . a d d M o u s e L i s t e n e r ( new ManipulaMouseEvent ( ) ) ;
cp . s e t L a y o u t ( new FlowLayout ( ) ) ;
cp . add ( c h e c k ) ;
cp . add ( comb ) ;
cp . add ( b ) ;
setSize (400 ,400) ;
s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ;
show ( ) ;
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
new EventosItem ( ) ;
}
}
Hay ocasiones en las que puede resultar incomodo trabajar con estas interfaces si uno esta interesado en implementar un u
nico 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
Ir al ndice
juan.gutierrez@uv.es
Pagina: 33
<<interface>>
<<interface>>
<<interface>>
ComponentListener
O
ComponentAdapter
ContainerListener
O
ContainerAdapter
FocusListener
O
FocusAdapter
MySQL y Java
Universitat de Val`encia
<<interface>>
<<interface>>
<<interface>>
KeyListener
O
KeyAdapter
MouseListener
O
MouseAdapter
MouseMotionListener
O
MouseMotionAdapter
<<interface>>
WindowListener
O
WindowAdapter
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 {
class
public
void
m o u s e C l i c k e d ( MouseEvent e ) { }
public
void
mouseEntered ( MouseEvent e ) { }
public
void
m o u s e E x i t e d ( MouseEvent e ) { }
Oyente
extends
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 ( new Oyente ( ) ) ;
p u b l i c v o i d m o u s e P r e s s e d ( MouseEvent e ) {
System . o u t . p r i n t l n ( Boton p u l s a d o ) ;
}
public
void
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 ( new Oyente ( ) ) ;
La u
nica 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
an
onima.
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:
Ir al ndice
juan.gutierrez@uv.es
Pagina: 34
MySQL y Java
Universitat de Val`encia
Debido a la duracion del curso se han quedado algunas sin ver como por ejemplo:
Pluggable Look and Feel.
El patron Model-View-Controller que utiliza Swing.
Unos cuantos componentes Swing.
Algunos gestores de organizacion.
Ir al ndice
juan.gutierrez@uv.es
Pagina: 35