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