• No se han encontrado resultados

MySQL y Java Universitat de Val`

N/A
N/A
Protected

Academic year: 2019

Share "MySQL y Java Universitat de Val`"

Copied!
35
0
0

Texto completo

(1)

´

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.

(2)

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.

(3)

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.

(4)

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.

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{

(5)

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,

1

Utilizan 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.

2

(6)

Contenedor

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 ( ) ; }

(7)

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 ( ) ; }

(8)

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 ( ) ; }

(9)

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 ( ) ; }

(10)

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 ( ) ; }

(11)

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

(12)

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) ;

(13)

}

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 ) ;

(14)

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 ( ) ; }

(15)

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 ( ) ; }

(16)

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

etodo

setLayout(LayoutManager m).

4.1.

BorderLayout

(17)

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

(18)

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 ( ) ;

(19)

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?

(20)

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

(21)

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

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.

(22)

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

(23)

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:

(24)

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 ( ) ;

(25)

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 .

(26)

∗@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 ( ) ; }

(27)

// 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.

(28)

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 ( ) ;

(29)

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

(30)

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

(31)

// 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.

(32)

// 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 ( ){

(33)

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.

(34)

<<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.

(35)

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 ” ) ; }

}

Debido a la duraci´

on del curso se han quedado algunas sin ver como por ejemplo:

Pluggable Look and Feel.

El patr´

on Model-View-Controller que utiliza Swing.

Unos cuantos componentes Swing.

Referencias

Documento similar

Se dice que la Administración no está obligada a seguir sus pre- cedentes y puede, por tanto, conculcar legítimamente los principios de igualdad, seguridad jurídica y buena fe,

Este documento destaca nuestra visión colectiva sobre la Transición Energética Justa, tal como debatieron las/os participantes y se expresó en los seminarios virtuales de Amigos de

o esperar la resolución expresa&#34; (artículo 94 de la Ley de procedimiento administrativo). Luego si opta por esperar la resolución expresa, todo queda supeditado a que se

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

Primeros ecos de la Revolución griega en España: Alberto Lista y el filohelenismo liberal conservador español 369 Dimitris Miguel Morfakidis Motos.. Palabras de clausura

Volviendo a la jurisprudencia del Tribunal de Justicia, conviene recor- dar que, con el tiempo, este órgano se vio en la necesidad de determinar si los actos de los Estados

Para ayudar a los alumnos a desarrollar el pensamiento algorítmico, se propuso desarrollar un sistema que facilitara la resolución de problemas y experimentación