JavaBeans-hendelser blir signalisert når det forekommer en aktivitet, for eksempel at en knapp trykkes eller et vindu lukkes. Det visuelle redigeringsprogrammet for Java viser hendelser i visningen Java-bønner, og du kan bruke denne visningen til å legge til og fjerne hendelser.
Listen over definerte hendelser for en JavaBean er beskrevet i BeanInfo-klassen, som også styrer de mest brukte eller foretrukne hendelsene.
Du kan legge til en hendelse i en JavaBean hvis du vil at noe skal skje når JavaBean blir generert, for eksempel at en database oppdateres når en knapp trykkes. Java-bønnen som forårsaker hendelsen, er kilden, og objektet som blir kalt tilbake når hendelsen forekommer, kalles en lytter. Hver JavaBean har et grensesnitt som gjør at den kan gi beskjed til lytterne om hver hendelse, i tillegg til metoder for å legge til og fjerne lyttere.
Hvis en kilde-JavaBean har metoden XXX, er det vanligvis et lyttergrensesnitt, XXXListener, og to metoder. Det er viktig at XXXListener utvider java.util.EventListener. Hvis den ikke gjør det, og det ikke er oppgitt en bestemt BeanInfo, blir ikke hendelsen oppdaget.
Metodene på selve XXXListener-grensesnittet avhenger av hendelsens semantikk, men konvensjonen er at signaturen er void <eventOccurenceMethodName>(<EventStateObjectType> evt);. Det er viktig at XXXListener utvider java.util.EventObject. Hvis den ikke gjør det, og det ikke er oppgitt en bestemt BeanInfo, blir ikke hendelsen oppdaget.
Et eksempel på en hendelse er JavaBean java.awt.Component, som forårsaker hendelser når musen flyttes over den. Lyttergrensesnittet, java.awt.event.MouseMotionListener, implementerer følgende to metoder:
Hvis du skal legge til en muselytter, har java.awt.Component følgende to metoder:
Den andre hendelsesstilen blir generert av en JavaBean når en egenskapsverdi endres. Et eksempel på dette er egenskapen 'enabled' i javax.swing.JButton. En egenskap som starter en hendelse når verdien endres, kalles en bundet egenskap. I stedet for å ha et eget lyttergrensesnitt for hver bundet egenskap, finnes det et generisk lyttergrensesnitt java.beans.PropertyChangeListener som har en enkelt tilbakekallmetode void propertyCanged(PropertyChangeEvent evt); Argumentet PropertyChangeEvent har tre metoder som metodemottakeren kan spørre etter:
String getPropertyName() | Navnet på egenskapen som ble endret i JavaBean som førte til at hendelsen startet |
Object getNewValue() | Den nye verdien til egenskapen |
Object getOldValue() | Verdien til egenskapen før den ble endret |
Det er to metoder for å registrere interesse for en endret JavaBean-egenskap: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);
Den første av disse metodene finnes alltid i en JavaBean som har bundne egenskaper. Men den andre er valgfri og avhenger av hvilken hendelsesregistreringsstil forfatteren av JavaBean har brukt. AWT-komponenter bruker for eksempel den første stilen for registrering av hendelsesendringer, mens Swing-komponenter bruker begge stiler.
Det er tre objekter knyttet til bruk av en hendelse:
Vanligvis kombineres de to siste, slik at klassen som utfører logikken, enten implementerer lyttergrensesnittet direkte eller bruker en indre klasse. Kodestilene som det visuelle redigeringsprogrammet for Java gjenkjenner og genererer, er beskrevet i delen som omhandler hendelseskodegenerering.
Det er mange lyttergrensesnitt som har flere tilbakekallmetoder. Et eksempel er java.awt.FocusListener, som har to metoder: focusGained(java.awt.FocusEvent event) og focusLost(java.awt.FocusEvent event). Når du oppretter en lytterklasse som implementerer grensesnittet, insisterer Java-kompilatoren på at alle grensesnittmetodene blir implementert, noe som ofte resulterer i at det blir opprettet mange tomme metoder for at kravet skal tilfredsstilles, selv om bare en eller noen av metodene faktisk inneholder kode. Følgende setning viser en FocusListener som blir brukt til å utføre logikk når en Java-bønne får fokus. En tom focusLost-metode må imidlertid oppgis.
javaBean.addFocusListener(new java.awt.event.FocusListener() { public void focusGained(java.awt.event.FocusEvent e) { doFocusGainedCode(); } public void focusLost(java.awt.event.FocusEvent e) { } });
For å unngå at det er mange lyttere som får mange tomme lyttermetoder, finnes det Adapter-klasser. Disse implementerer lyttergrensesnittet og oppgir tom implementering av metodene. Fordelen er at lytteren kan utvide disse, og bare spesialisere valgte metoder, uten å måtte oppgi standardimplementering for resten (disse blir arvet fra adapteren).
javaBean.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent e) { doFocusGainedCode(); } });