Események, figyelők és illesztőosztályok

A Java komponensek eseményei egy tevékenység bekövetkeztekor, például egy gomb megnyomásakor vagy egy ablak bezárásakor váltódnak ki. A Visual Editor for Java az eseményeket a Java Beans nézetben jeleníti meg, és ugyanitt vehet fel illetve törölhet eseményeket.

Egy Java komponenshez meghatározott eseményeket a BeanInfo osztály írja le, és ez határozza meg a gyakran használt illetve preferált eseményeket is.

Ha el kívánja érni, hogy a JavaBean létrejöttekor valamilyen tevékenység lefusson, például egy gomb megnyomásakor adatbázis-frissítés történjen, akkor adjon hozzá egy eseményt a komponenshez. Az eseményt kiváltó Java komponens a forrás, a meghívott objektum pedig a figyelő. Minden Java komponens rendelkezik egy felülettel, amely biztosítja az eseményekhez tartozó figyelők értesítését, valamint az új figyelők felvételére és a meglévők eltávolítására szolgáló metódusokat.

Jellemzően ha a forrás Java komponensnek van XXX nevű metódusa, akkor az XXXListener felületet és az alábbi két metódust biztosítja. Fontos, hogy az XXXListener a java.util.EventListener szülőt terjessze ki. Ellenkező esetben, hacsak nincsenek megadva erre vonatkozó BeanInfo információk, az esemény nem lesz megtalálható.

Az XXXListener felület metódusai az esemény szemantikájától függnek, azonban az aláírásuk megállapodás szerint a következő: void <bekövetkezettEseményMetódusnév>(<EseményÁllapotObjektumTípus> esm);. Fontos, hogy az XXXListener a java.util.EventObject szülőt terjessze ki. Ellenkező esetben, hacsak nincsenek megadva erre vonatkozó BeanInfo információk, az esemény nem lesz megtalálható.

Jó példa a java.awt.Component Java komponens, amely eseményeket vált ki, ahogyan a felhasználó mozgatja felette az egeret. A figyelő felület (java.awt.event.MouseMotionListener) az alábbi két metódust valósítja meg:

Új egérfigyelő felvételéhez a java.awt.Component a következő két metódust kínálja:

A második típusú eseményeket a Java komponens egy tulajdonságának megváltozásakor váltja ki. Erre egy remek példa a javax.swing.JButton 'enabled' tulajdonsága. Az értékének megváltozásakor eseményt kiváltó tulajdonságok neve kapcsolt tulajdonság. A kapcsolt tulajdonságok egy közös általános felülettel rendelkeznek (java.beans.PropertyChangeListener), melyben egyetlen visszahívási metódus található, a void propertyCanged(PropertyChangeEvent evt);. A PropertyChangeEvent argumentumnak három metódusa van, melyeket a metódus fogadója meghívhat:

String getPropertyName() Az eseményt kiváltó Java komponens megváltozott tulajdonságának neve
Object getNewValue() A tulajdonság új értéke
Object getOldValue() A tulajdonság értéke a változás előtt

A Java komponens egy tulajdonságának megváltozása iránti érdeklődését két metódus segítségével rögzítheti: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

Az első metódus mindig jelen van a kapcsolt tulajdonságokkal rendelkező Java komponensekben. A második azonban elhagyható, és a Java komponens szerzője által használt esemény bejegyzési módtól függ. Az AWT komponensek például az első stílusú eseményváltozás bejegyzést használják, míg a Swing mindkét típust.

Az esemény használatában három objektum vesz részt:

  1. Az eseményt kiváltó Java komponens (a forrás)
  2. Az az osztály, amely fogadja az értesítést a forrástól (a figyelő)
  3. A figyelő visszahívásakor végrehajtandó logikát megvalósító osztály.

Az utolsó kettőt a fejlesztők általában kombinálják, vagyis a logikát tartalmazó osztály vagy közvetlenül valósítja meg a figyelő felületet, vagy belső osztályt használ. A Visual Editor for Java által létrehozott illetve felismert kódstílusról részletesen az eseménykódok előállításáról szóló szakaszban olvashat.

Illesztőosztályok

Számos figyelő felület több visszahívási metódussal is rendelkezik. A java.awt.FocusListener például két metódussal rendelkezik: a focusGained(java.awt.FocusEvent event) és a focusLost(java.awt.FocusEvent event). A felületet megvalósító figyelő osztály létrehozásakor a Java fordító ragaszkodik hozzá, hogy a felület összes metódusa meg legyen valósítva, ami gyakran számos üres metódus létrehozásához vezet, miközben tényleges kódot csak néhány metódus tartalmaz. Az alábbi példában látható FocusListener megvalósítás végrehajt bizonyos logikát, mikor a Java komponens megkapja a fókuszt. Azonban az üres focusLost metódust is meg kell adni.

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

Az illesztőosztályok közbeiktatásával elkerülhető, hogy fölöslegesen meg kelljen adni az üres figyelő metódusokat. Az illesztőosztályok a figyelő felületet valósítják meg, és tartalmazzák a metódusok üres megvalósítását. A figyelő ezeket az osztályokat terjeszti ki, és csak a valóban szükséges metódusokat kell specializálnia. A többi metódus alapértelmezett megvalósítását nem kell megadnia, mert ezeket az illesztőosztálytól örökli.

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });
Kapcsolódó feladatok
Komponens eseményeinek megtekintése
Események hozzáadása komponenshez
Események törlése egy komponensből
Esemény forráskódjának megtekintése

(C) Copyright IBM Corporation 1999, 2004. Minden jog fenntartva.