Java-beans-aktiviteter signaleres, når en aktivitet forekommer, f.eks. når en knap trykkes, eller et vindue lukkes. Visuel editor til Java viser aktiviteter i oversigten Java-beans, og du kan bruge denne oversigt til at tilføje eller fjerne aktiviteter.
Listen over definerede aktiviteter for en JavaBean er beskrevet i dens BeanInfo-klasse, som også styrer de aktiviteter, der oftest bruges, eller de foretrukne aktiviteter.
Du kan tilføje en aktivitet til en JavaBean, hvis du ønsker, at noget bestemt skal ske, når Javabean'en genereres, f.eks. en databaseopdatering, når der trykkes på en knap. Den Java-bean, der skaber aktiviteten, er kilden, og det objekt, der kaldes tilbage, når aktiviteten skabes, kaldes lytteren. Hver JavaBean har en grænseflade, der tillader den at underrette lyttere om hver enkelt aktivitet samt metoder til brug for tilføjelse og fjernelse af lyttere.
Hvis kilde-Javabean'en har en metode XXX, er der typisk en lyttergrænseflade, XXXListener, og to metoder. Det er vigtigt, at XXXListener udvider java.util.EventListener. Gør den ikke det, og medmindre en specifik BeanInfo angives, opdages aktiviteten ikke.
Metoderne i selve XXXListener-grænsefladen er afhængige af aktivitetens semantik, men som regel er deres signatur void <eventOccurenceMethodName>(<EventStateObjectType> evt);. Det er vigtigt, at XXXListener udvider java.util.EventObject. Gør den ikke det, og medmindre en specifik BeanInfo angives, opdages aktiviteten ikke.
Et eksempel på en aktivitet er JavaBean java.awt.Component, som opretter aktiviteter, når musen flyttes hen over den. Lyttergrænsefladen, java.awt.event.MouseMotionListener, implementerer følgende to metoder:
java.awt.Component har følgende to metoder til brug for tilføjelse af en muselytter>
Den anden type aktivitet genereres af en JavaBean, når en egenskabsværdi ændres. Et eksempel på dette er egenskaben 'enabled' i javax.swing.JButton. En egenskab, der aktiverer en aktivitet, når dens værdi ændres, kaldes en bunden egenskab. I stedet for at have en separat lyttergrænseflade for hver bunden egenskab er der en generisk grænseflade java.beans.PropertyChangeListener, som har en enkelt tilbagekaldsmetode void propertyCanged(PropertyChangeEvent evt). Argumentet PropertyChangeEvent har tre metoder, som modtageren af metoden kan forespørge på:
String getPropertyName() | Navnet på den egenskab, der er ændret i Javabean'en, som bevirkede, at aktiviteten blev aktiveret |
Object getNewValue() | Egenskabens nye værdi |
Object getOldValue() | Egenskabens værdi inden ændring |
Der er to metoder til brug for at registrere interesse i en JavaBeans egenskabsændringer: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);
Den første af disse metoder er altid til stede i en JavaBean, der har bundne egenskaber. Den anden er valgfri og afhænger af den type aktivitetsregistrering, der er benyttet af forfatteren til Javabean'en. AWT-komponenter bruger f.eks. den første type registrering af egenskabsændringer, mens Swing-komponenter bruger begge dele.
For at bruge en aktivitet er der tre objekter:
Som regel kombineres de to sidste to, så klassen, der udfører logikken, enten implementer lyttergrænsefladen direkte, eller også bruger den en inderklasse. De typer kode, som den visuelle editor til Java genkender og genererer, er dækket i afsnittet, der omhandler generering af aktivitetskode.
Mange lyttergrænseflader har mere end en tilbagekaldsmetode. Et eksempel er java.awt.FocusListener, som har to metoder: focusGained(java.awt.FocusEvent-aktivitet) og focusLost(java.awt.FocusEvent-aktivitet). Når du opretter en lytterklasse, der implementerer grænsefladen, insisterer Java-compileren på, at alle grænseflademetoder implementeres. Det resulterer ofte i, at mange tomme metoder oprettes for at opfylde kravene, og kun en eller få af metoderne faktisk indeholder kode. Følgende sætning viser en FocusListener, som bruges til at udføre logik, når en Java-bean opnår fokus. Men en tom focusLost-metode skal angives.
javaBean.addFocusListener(new java.awt.event.FocusListener() { public void focusGained(java.awt.event.FocusEvent e) { doFocusGainedCode(); } public void focusLost(java.awt.event.FocusEvent e) { } });
Adapterklasser stilles til rådighed for at undgå mange tomme lyttermetode for mange lyttere. Disse implementerer lyttergrænsefladen og stiller ikke-funktionel implementering af dens metoder til rådighed. Fordelen ved det er, at lytteren kan udvide dem og nøjes med at specialisere udvalgte metoder uden at skulle stille standardimplementeringer til rådighed for resten (disse overtages fra adapteren).
javaBean.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent e) { doFocusGainedCode(); } });