Tapahtumat, kuuntelutoiminnot ja sovitinluokat

JavaBean-tapahtumista ilmoitetaan tapahtuman ilmenemishetkellä, kuten silloin, kun painiketta painetaan tai kun ikkuna suljetaan. Graafinen Java-muokkausohjelma näyttää tapahtumat Java-bean-komponentti-näkymässä, ja voit käyttää tätä näkymää tapahtumien lisäykseen ja poistoon.

Java-bean-komponentille määritettyjen tapahtumien luettelo on kuvattu sen BeanInfo-luokassa, joka myös ohjaa yleisesti käytettyjä tai suosittuja tapahtumia.

Voit esimerkiksi haluta lisätä tapahtuman Java-bean-komponenttiin, jos haluat jotakin tapahtuvan Java-bean-komponentin muodostuksen yhteydessä, kuten tietokannan päivityksen painiketta painettaessa. Tapahtuman aiheuttava Java-bean-komponentti on lähde, ja vastakutsun saava objekti on kuuntelutoiminto. Kullakin Java-bean-komponentilla on rajapinta, jonka avulla komponentti voi ilmoittaa kustakin tapahtumasta sekä kuuntelutoimintojen lisäys- ja poistometodeista kuuntelutoiminnoille.

Yleensä jos Java-bean-lähdekomponentilla on metodi XXX, sille on vastaava kuuntelutoiminnon rajapinta, XXXListener ja kaksi metodia. XXXListener-kuuntelutoiminnon on laajennettava metodi java.util.EventListener. Jos tätä ei ole määritetty eikä määrättyä BeanInfo-luokkaa ole annettu, järjestelmä ei tunnista tapahtumaa.

XXXListener-kuuntelutoiminnon metodit määräytyvät tapahtuman semantiikan perusteella, mutta käytäntö on, että niiden tunnus on void <eventOccurenceMethodName>(<EventStateObjectType> evt);. XXXListener-kuuntelutoiminnon on laajennettava metodi java.util.EventObject. Jos tätä ei ole määritetty eikä määrättyä BeanInfo-luokkaa ole annettu, järjestelmä ei tunnista tapahtumaa.

Yksi esimerkki tapahtumasta on Java-bean-komponentti java.awt.Component, joka aiheuttaa tapahtumat, kun hiiriosoitin siirretään sen päälle. Kuuntelutoimintoliittymä, java.awt.event.MouseMotionListener, toteuttaa kaksi seuraavaa metodia:

java.awt.Component käyttää kahta seuraavaa metodia hiiren kuuntelutoiminnon lisäykseen:

Java-bean-komponentti luo toisen tapahtumalajin, kun ominaisuusarvo muuttuu. Esimerkiksi metodin javax.swing.JButton "käytössä"-ominaisuus on tällainen. Ominaisuus, joka käynnistää tapahtuman sen arvon muuttuessa, on sidottu ominaisuus. Kullekin sidotulle ominaisuudelle ei ole erillistä kuuntelutoimintoliittymää, vaan kaikilla on yleinen kuuntelutoimintoliittymä java.beans.PropertyChangeListener, jolla on yksittäinen vastakutsumetodi void propertyCanged(PropertyChangeEvent evt);. Argumentilla PropertyChangeEvent on kolme metodia, joita metodin vastaanottaja voi kysellä: 

String getPropertyName() Sen ominaisuuden nimi, joka muuttui tapahtuman käynnistäneessä Java-bean-komponentissa
Object getNewValue() Ominaisuuden uusi arvo
Object getOldValue() Ominaisuuden arvo, ennen kuin se muutettiin

Java-bean-komponentin ominaisuusmuutosten merkityksellisyyden voi rekisteröidä kahdella metodilla: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

Ensimmäinen näistä metodeista on aina mukana Java-bean-komponentissa, jolla on sidottuja ominaisuuksia. Toinen on kuitenkin valinnainen ja määräytyy Java-bean-komponentin tekijän käyttämän tapahtuman rekisteröintityylin perusteella. Esimerkiksi AWT-komponentit käyttävät ensimmäistä ominaisuusmuutoksen rekisteröintityyliä, kun taas Swing-komponentit käyttävät molempia tyylejä.

Tapahtuman käyttöön on kolme objektia:

  1. Java-bean-komponentti, joka aiheuttaa tapahtuman (lähde)
  2. luokka, joka vastaanottaa ilmoituksen lähteeltä (kuuntelutoiminto)
  3. luokka, joka toteuttaa kuuntelutoiminnon vastakutsun seurauksena ilmenevän logiikan.

Yleensä nämä kaksi on yhdistetty, joten luokka, joka ajaa logiikan, toteuttaa kuuntelutoimintoliittymän joko suoraan tai käyttää sisäistä luokkaa. Graafisen Java-muokkausohjelman tunnistaman ja muodostaman koodin tyylit on kuvattu tapahtumakoodin muodostusta käsittelevässä osassa.

Sovitinluokat

Useilla kuuntelutoimintoliittymillä on useita vastakutsumetodeja. Esimerkiksi rajapinnalla java.awt.FocusListener on kaksi metodia, focusGained(java.awt.FocusEvent event) ja focusLost(java.awt.FocusEvent event). Kun luot kuuntelutoimintoluokan, joka toteuttaa rajapinnan, Java-kääntäjä edellyttää, että kaikki rajapintametodit toteutetaan, mikä usein luo useita tyhjiä metodeja vaatimusten täyttämiseksi, kun vain yksi tai jotkin sen metodeista sisältävät koodia. Seuraavassa lauseessa on FocusListener-metodi, jota käytetään tietyn logiikan toteutukseen, kun Java-bean-komponentti on tarkennettu. Lauseeseen on sisällytettävä kuitenkin tyhjä focusLost-metodi.

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

Tyhjien kuuntelutoimintometodien ilmeneminen useissa kuuntelutoiminnoissa on estettävissä sovitinluokkien avulla. Ne toteuttavat kuuntelutoimintoliittymän ja tyhjäkäskyn sen metodeille. Tästä on se hyöty, että kuuntelutoiminto voi laajentaa nämä ja erikoistua vain valittuihin metodeihin toimittamatta oletustoteutuksia lopuille metodeille (nämä peritään sovittimelta).

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });
Aiheeseen liittyviä tehtäviä
Komponentin tapahtumien tarkastelu
Tapahtumien lisäys komponenttiin
Tapahtumien poisto komponentista
Tapahtuman lähteen tarkastelu

(C) Copyright IBM Corporation 1999, 2004. All rights reserved.