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 visuale 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.
E' possibile che si preferisca aggiungere un evento a un JavaBean se si vuole che accada qualcosa 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. E' 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);. E' 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 esprimere interesse nelle modifiche alle proprietà di un JavaBean esistono due metodi: void addPropertyChangeListener(PropertyChangeListener listener); 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 visuale 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. E' 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 empty 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(); Â Â Â } });
L'editor visuale è in grado di riconoscere e utilizzare le classi di adattatori; nella sezione Eventi BeanInfo è illustrato il modo in cui è possibile associare le classi di adattatori per i propri eventi all'editor visuale.
Argomento principale: Gestione di eventi con l'editor visuale