Tipi di eventi, interfacce listener.


Java Sun

Earthweb
(ex Gamelan)

Jars

Java Boutique

Java World

PIP






 JSem: 4.2

   Da Java 1.1 in poi abbiamo vari tipi di eventi predefiniti (vedremo dopo come definire un proprio tipo di evento), ma non tutti i componenti possono generare un dato tipo di evento.


Tipi di eventi
ActionEvent FocusEvent MouseMotionEvent
AdjustmentEvent ItemEvent TextEvent
ComponentEvent KeyEvent WindowEvent
ContainerEvent MouseEvent

I più usati sono ActionEvent, MouseEvent e MouseMotionEvent.

Come già detto non tutti i componenti possono generare un dato tipo di evento.

Componente AWT tipo di eventi che può generare
Button action, component, focus, key, mouse, mousemotion
Canvas component, focus, key, mouse, mousemotion
Checkbox component, focus, item, key, mouse, mousemotion
CheckBoxMenuItem item
Choice component, focus, item, key, mouse, mousemotion
Component component, focus, key, mouse, mousemotion
Container component, container, focus, key, mouse, mousemotion
Dialog component, container, focus, key, mouse, mousemotion,window
Frame component, container, focus, key, mouse, mousemotion, window
Label component, focus, key, mouse, mousemotion
List action, component, focus, item, key, mouse, mousemotion
MenuItem action
Panel component, container, focus, key, mouse, mousemotion
ScrollBar adjustment, component, focus, key, mouse, mousemotion
TextArea component, focus, key, mouse, mousemotion, text
TextField action, component, focus, key, mouse, mousemotion, text
Window component, container, focus, key, mouse, mousemotion, window

In particolare vediamo che possono generare degli ActionEvent solo i seguenti componenti: Button, List, MenuItem, TextField; invece la lista dei componenti in grado di generare dei MouseEvent è decisamente più lunga.

Interfacce

Ad ogni tipo di evento corrisponde un'interfaccia con relativi metodi; tutti questi metodi dovranno essere definiti dalle classi che implementano l'interfaccia.
Interfacce listener e i loro metodi.
Interfaccia Metodi
ActionListener actionPerformed(ActionEvent)
AdjustmentListener adjustmentValueChanged(AdjustmentEvent)
ComponentListener componentHidden(ComponentEvent)
componentMoved(ComponentEvent)
componentResized(ComponentEvent)
componentShown(ComponentEvent)
ContainerListener componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
FocusListener focusGained(FocusEvent)
focusLost(FocusEvent)
ItemListener itemStateChanged(ItemEvent)
KeyListener keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
TextListener textValueChanged(TextEvent)
WindowListener windowActivated(WindowEvent)
windowClosed(WindowEvent)
windowClosing(WindowEvent)
windowDeactivated(WindowEvent)
windowDeiconified(WindowEvent)
windowIconified(WindowEvent)
windowOpened(WindowEvent)

   Osserviamo che mentre l'interfaccia ActionListener ha un unico metodo, l'interfaccia MouseListener ha ben cinque metodi. Questo comporta un piccolo problema: supponiamo di essere interessati solo ai clicks del mouse, in questo caso bisognerà senz'altro definire il metodo mouseClicked, a priori gli altri quattro metodi non c'interessano. Però siccome stiamo implementando un'interfaccia, dobbiamo definire tutti i suoi metodi! La soluzione più ovvia consiste nel scriverli ma lasciandoli vuoti:

//metodo vuoto
public void mousePressed(MouseEvent e){}
//metodo vuoto
public void mouseEntered(MouseEvent e){}
//metodo vuoto
public void mouseExited(MouseEvent e){}
//metodo vuoto
public void mouseReleased(MouseEvent e){}
//l'unico metodo che c'interessa
public void mouseClicked(MouseEvent e){
.........codice..
	}

Questo procedimento è corretto, anche se non molto elegante; chi vuole evitare di scrivere metodi vuoti deve usare degli addattatori (adapter class) o delle classi interne.
Troverete qui sotto due files .java che implementano le interfacce MouseListener e MouseMotionListener (si osserverà un leggero lampeggiamento nell'applet MouseMotionEs dovuto alla mancanza di doppia bufferizzazione). Per scaricare MouseMotionEs.java, MouseClickEs.java.



 next		content		previous