Events, listeners en adapterklassen

JavaBeans-events worden gegenereerd bij bepaalde activiteiten, bijvoorbeeld als u een knop indrukt of een venster sluit. De Visual Editor geeft de events weer in de view Java-beans. In deze view kunt u events toevoegen of verwijderen.

De lijst met gedefinieerde events voor een Java-bean is beschreven in de bijbehorende klasse BeanInfo, die ook de veelgebruikte events of voorkeursevents beheert.

U kunt een event aan een Java-bean toevoegen als u wilt dat er iets gebeurt bij het genereren van de Java-bean, bijvoorbeeld het bijwerken van een database als er op een knop wordt gedrukt. De Java-bean die de event veroorzaakt is de bron en het object dat wordt aangeroepen bij het ontstaan van de event, heet de listener. Iedere Java-bean heeft een interface waarmee de listener van de events op de hoogte gesteld kan worden. Ook heeft een Java-bean methoden om listeners toe te voegen of te verwijderen.

Als de bron-Java-bean een methode XXX heeft, zijn er normaal ook een listenerinterface, XXXListener, en twee methoden. Het is belangrijk dat XXXListener java.util.EventListener uitbreidt. Als dit niet het geval is en geen specifieke BeanInfo is opgegeven, wordt de event niet waargenomen.

De methode in de XXXListener-interface zelf zijn afhankelijk van de semantiek van de event, maar volgens de conventie is de handtekening void <eventOccurenceMethodName>(<EventStateObjectType> evt);. Het is belangrijk dat XXXListener java.util.EventObject uitbreidt. Als dit niet het geval is en geen specifieke BeanInfo is opgegeven, wordt de event niet waargenomen.

Een voorbeeld van een event is de Java-bean java.awt.Component, die events genereert als de muisaanwijzer erop wordt geplaatst. De listenerinterface java.awt.event.MouseMotionListener implementeert de volgende twee methoden:

Voor het toevoegen van een muislistener heeft java.awt.Component de volgende twee methoden:

De tweede eventstijl wordt gegenereerd door een Java-bean als de waarde van een eigenschap wordt gewijzigd. Een voorbeeld hiervan is de 'ingeschakelde' eigenschap in javax.swing.JButton. Een eigenschap die een event veroorzaakt als de waarde wordt gewijzigd, wordt een gebonden (bound) eigenschap genoemd. In plaats van een afzonderlijke listenerinterface voor iedere gebonden eigenschap kunt u de generieke listenerinterface java.beans.PropertyChangeListener gebruiken, die één reagerende methode heeft: void propertyCanged(PropertyChangeEvent evt);. Het argument PropertyChangeEvent heeft drie methoden waarop gezocht kan worden door de ontvanger van de methode:

String getPropertyName() De naam van de eigenschap die is gewijzigd in de Java-bean die de event heeft veroorzaakt
Object getNewValue() De nieuwe waarde van de eigenschap
Object getOldValue() De waarde van de eigenschap voordat deze werd gewijzigd

Er zijn twee methoden om wijzigingen van Java-beaneigenschappen te registreren: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

De eerste van deze methoden is altijd aanwezig in een Java-bean met gebonden eigenschappen. De tweede methode is optioneel en is afhankelijk van de stijl van eventregistratie in de Java-bean. AWT-componenten gebruiken bijvoorbeeld de eerste stijl voor registratie van eigenschappenwijziging, terwijl Swing-componenten beide stijlen gebruiken.

Er zijn drie objecten betrokken bij het gebruik van events:

  1. De Java-bean die de event initieert (de bron)
  2. De klasse die de melding van de bron ontvangt (de listener)
  3. De klasse die de logica implementeert die optreedt als de listener een reactie ontvangt.

Meestal worden de laatste twee gecombineerd, zodat de klasse die de logica uitvoert, de listenerinterface direct implementeert of een binnenklasse gebruikt. De codestijlen die de Visual Editor herkent en genereert, worden besproken in het gedeelte over het genereren van eventcode.

Adapterklassen

Veel listenerinterfaces hebben meer dan één reagerende methode. Een voorbeeld is java.awt.FocusListener, die twee methoden heeft: focusGained(java.awt.FocusEvent event) en focusLost(java.awt.FocusEvent event). Als u een listenerklasse maakt die de interface implementeert, vereist het Java-compileerprogramma dat alle interfacemethoden worden geïmplementeerd. Dit heeft vaak tot gevolg dat veel lege methoden worden gemaakt om te voldoen aan die eisen en dat slechts weinig methoden in feite code bevatten. De volgende instructie bevat een FocusListener die wordt gebruikt om een bepaalde logica uit te voeren als een Java-bean de focus krijgt. Er moet echter een lege focusLost-methode worden gemaakt.

javaBean.addFocusListener(new java.awt.event.FocusListener() {      
    public void focusGained(java.awt.event.FocusEvent e) {          
        doFocusGainedCode();      
     }          
        public void focusLost(java.awt.event.FocusEvent e) {      
     }  
});

Om te voorkomen dat er veel lege methoden voor listeners worden gemaakt, zijn adapterklassen ontwikkeld. Deze implementeren de listenerinterface en bevatten lege implementaties van de methoden. Het voordeel is dat de listener ze kan uitbreiden en alleen bepaalde methoden specificeert zonder de standaardimplementaties te hoeven toevoegen voor de rest (deze zijn overgenomen van de adapter).

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });
Verwante taken
Events voor een component bekijken
Events toevoegen aan een component
Events verwijderen uit een component
Bron van een event bekijken

(C) Copyright IBM Corporation 1999, 2004. Alle rechten voorbehouden.