Gli eventi JavaBeans sono segnalati al verificarsi di un'attività, ad esempio quando viene premuto un pulsante o viene chiusa una finestra. Gli eventi sono visualizzati nella vista Bean Java dell'editor visivo per Java; tale vista può essere utilizzata anche per aggiungere e rimuovere eventi.
L'elenco di eventi definiti per un JavaBean è descritto nella classe BeanInfo, che consente di controllare anche gli eventi preferiti o utilizzati più frequentemente.
È possibile che si preferisca aggiungere un evento a un JavaBean se si vuole eseguire un'operazione quando viene generato il JavaBean, ad esempio l'aggiornamento di un database quando viene premuto un pulsante. Il bean Java che genera l'evento è il codice di origine, mentre l'oggetto che viene richiamato quando viene generato l'evento è noto come listener. Ogni JavaBean dispone di un'interfaccia, che consente di notificare ogni evento ai listener, e di metodi per aggiungere e rimuovere listener.
In genere, se il JavaBean di origine dispone di un metodo XXX, esistono allora un'interfaccia listener, XXXListener, e due metodi. È importante che XXXListener estenda java.util.EventListener. In caso contrario, e a meno che non venga fornita una specifica BeanInfo, l'evento non verrà rilevato.
I metodi sull'interfaccia XXXListener dipendono dalla semantica dell'evento, ma la convenzione è che la relativa firma sia void <eventOccurenceMethodName>(<EventStateObjectType> evt);. È importante che XXXListener estenda java.util.EventObject. In caso contrario, e a meno che non venga fornita una specifica BeanInfo, l'evento non verrà rilevato.
Un esempio di evento è il JavaBean java.awt.Component, che genera eventi quando si sposta il mouse su di esso. L'interfaccia listener, java.awt.event.MouseMotionListener, implementa i seguenti due metodi:
Per aggiungere un listener per il mouse, java.awt.Component dispone dei seguenti due metodi:
Il secondo stile di evento è generato da un JavaBean quando viene modificato un valore di proprietà. Un esempio è la proprietà 'enabled' in javax.swing.JButton. Una proprietà che attiva un evento al variare di un proprio valore è nota come proprietà associata. Invece di avere un'interfaccia listener distinta per ogni proprietà associata, esiste un'interfaccia listener generica java.beans.PropertyChangeListener con un unico metodo di callback void propertyCanged(PropertyChangeEvent evt);. L'argomento PropertyChangeEvent dispone di tre metodi, relativamente ai quali il destinatario del metodo può effettuare una query:
| String getPropertyName() | Il nome della proprietà variata nel JavaBean che ha causato l'attivazione dell'evento |
| Object getNewValue() | Il nuovo valore della proprietà |
| Object getOldValue() | Il valore della proprietà prima della variazione |
Per registrare le modifiche alle proprietà di un JavaBean esistono due metodi: void addPropertyChangeListener(PropertyChangeListener listener); e void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);
Il primo di questi metodi è sempre presente in un JavaBean che dispone di proprietà associate. Il secondo, però, è facoltativo e dipende dallo stile della registrazione degli eventi utilizzato dall'autore del JavaBean. Ad esempio, i componenti AWT utilizzano il primo stile di registrazione delle modifiche di proprietà, mentre i componenti Swing utilizzano entrambi gli stili.
Per utilizzare un evento, sono disponibili tre oggetti:
Di solito, gli ultimi due oggetti sono combinati, in modo che la classe che esegue la logica implementi direttamente l'interfaccia listener oppure utilizzi una classe interna. Gli stili di codice riconosciuti e generati dall'editor visivo per Java sono illustrati nella sezione relativa alla generazione di codice per eventi.
Molte interfacce listener dispongono di più metodi di callback. Un esempio è java.awt.FocusListener che dispone di due metodi: focusGained(java.awt.FocusEvent event) e focusLost(java.awt.FocusEvent event). Quando si crea una classe listener che implementa l'interfaccia, il compilatore Java fa in modo che vengano implementati tutti i metodi di interfaccia; il risultato è che vengono creati numerosi metodi vuoti per soddisfarne i requisiti, mentre solo uno o alcuni di essi contengono effettivamente codice. L'istruzione indicata di seguito mostra un FocusListener utilizzato per eseguire logica quando viene selezionato un bean Java. È necessario, tuttavia, fornire un metodo focusLost vuoto.
javaBean.addFocusListener(new java.awt.event.FocusListener() {
public void focusGained(java.awt.event.FocusEvent e) {
doFocusGainedCode();
}
public void focusLost(java.awt.event.FocusEvent e) {
}
});
Per evitare di avere molti metodi listener vuoti per molti listener, vengono fornite le classi di adattatori. Queste implementano l'interfaccia listener e forniscono l'implementazione vuota no-op dei relativi metodi. Il vantaggio che ne deriva è che il listener può estenderli e specializzare solo i metodi di scelta senza dover fornire implementazioni predefinite per i restanti metodi ( questi sono ereditati da Adapter ).
javaBean.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent e) {
doFocusGainedCode();
}
});