Události JavaBeans jsou signalizovány, jakmile dojde k aktivitě, jako je např. stisknutí tlačítka nebo zavření okna. Vizuální editor pro prostředí Java zobrazuje události v pohledu Java Beans a vy můžete tento pohled použít k přidání a odebrání událostí.
Seznam definovaných událostí pro objekt JavaBean je popsán v jeho třídě BeanInfo, která také řídí obvykle používané nebo upřednostňované události.
Je možné, že budete chtít přidat událost do objektu JavaBean, chcete-li, aby se při generování JavaBean provedla nějaká činnost, jako například aktualizace databáze při stisknutí tlačítka. Objekt Java Bean, který vyvolává událost, je zdrojový kód a objekt, který je vyvolán zpět při vyvolání události, je označován jako listener. Každý objekt JavaBean má rozhraní, které mu umožňuje oznámit listenery pro každou událost, stejně jako metody pro přidání a odebrání listenerů.
Obvykle platí, že pokud má zdrojový objekt JavaBean metodu XXX, existuje k němu rozhraní listeneru, XXXListener a dvě metody. Je důležité, aby XXXListener rozšiřoval java.util.EventListener. Pokud tomu tak není a pokud není poskytnut specifický objekt BeanInfo, událost nebude zjištěna.
Metody na rozhraní XXXListener jsou závislé na sémantice události, ale pravidlo je takové, že jejich podpis je void <eventOccurenceMethodName>(<EventStateObjectType> evt);. Je důležité, aby XXXListener rozšiřoval java.util.EventObject. Pokud tomu tak není a pokud není poskytnut specifický objekt BeanInfo, událost nebude zjištěna.
Příkladem události je objekt JavaBean java.awt.Component, který vyvolává události, pokud se přes něj přejede myší. Rozhraní listeneru java.awt.event.MouseMotionListener implementuje následující dvě metody:
Pro přidání listeneru myši má java.awt.Component následující dvě metody:
Druhý styl události je generován objektem JavaBean při změně hodnoty vlastnosti. Příkladem je vlastnost "zpřístupněno" na javax.swing.JButton. Vlastnost, která spouští událost při změně její hodnoty se označuje jako vlastnost vazby. Namísto samostatného rozhraní listeneru pro každou vlastnost vazby je použito obecné rozhraní listeneru java.beans.PropertyChangeListener, které má jednoduchou metodu zpětného volání void propertyCanged(PropertyChangeEvent evt); Argument PropertyChangeEvent má tři metody, které mohou být dotazovány příjemcem této metody:
| String getPropertyName() | Název vlastnosti, která byla změněna na objektu JavaBean, který způsobil spuštění události |
| Object getNewValue() | Nová hodnota vlastnosti |
| Object getOldValue() | Hodnota vlastnosti před její změnou |
Pro registraci sledování změny vlastností objektu JavaBean existují dvě metody: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);
První z těchto metod je vždy přítomná na objektu JavaBean, který má vlastnosti vazby. Avšak druhá je volitelná a závisí na stylu registrace události, použitém autorem JavaBean. Například komponenty AWT používají první styl registrace změn vlastností, zatímco komponenty Swing používají oba styly.
Pro použití události existují tři objekty:
Poslední dva uvedené objekty jsou obvykle kombinovány, aby třída provádějící logiku implementovala rozhraní listeneru přímo nebo s použitím vnitřní třídy. Styly kódu, který rozpoznává a generuje vizuální editor pro jazyk Java jsou popsány v oddíle o generování kódů událostí.
Mnoho rozhraní listeneru má více než jednu metodu zpětného volání. Příkladem je java.awt.FocusListener se dvěma metodami: focusGained(java.awt.FocusEvent event) a focusLost(java.awt.FocusEvent event). Při vytváření třídy listeneru implementující dané rozhraní kompilátor Java trvá na tom, aby byly implementovány všechny metody rozhraní, což často vede k vytvoření velkého množství prázdných metod pro uspokojení jeho požadavků, přičemž pouze jedna nebo pouze několik málo metod opravdu obsahuje kód. Následující příkaz zobrazuje FocusListener, který se používá k provádění některé logiky, když objekt Java bean získá fokus. Nicméně musí být poskytnuta prázdná metoda focusLost.
javaBean.addFocusListener(new java.awt.event.FocusListener() {
public void focusGained(java.awt.event.FocusEvent e) {
doFocusGainedCode();
}
public void focusLost(java.awt.event.FocusEvent e) {
}
});
Aby se zabránilo výskytu mnoha prázdných metod listeneru pro mnoho listenerů, jsou poskytnuty třídy adaptéru. Tyto třídy implementují rozhraní listeneru a poskytují prázdnou implementaci (no-op) jeho metod. Výhodou je to, že listener může tyto metody rozšířit a specializovat pouze vybrané metody bez nutnosti poskytnout výchozí implementace pro zbytek metod (jsou děděny z adaptéru).
javaBean.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent e) {
doFocusGainedCode();
}
});