Programmering

Begivenheder og lyttere

Hvordan opretter du en brugerdefineret begivenhed, og hvordan fyrer du den, så en komponent kan få en begivenhed?

Før vi ser på en brugerdefineret begivenhed, kan vi se på en allerede eksisterende begivenhed: ActionEvent.

Komponenter som f.eks Knap og JButton fyr af ActionEvents for at angive en slags komponentdefineret handling. F.eks Knap affyrer en ActionEvent når brugeren trykker på den. Hele pointen med en begivenhed er at informere en lytter om, at der er sket noget med en komponent i GUI. En begivenhed indeholder alle de oplysninger, som en lytter har brug for for at finde ud af, hvad der skete, og for hvem det skete (hvad og hvem af begivenheden). En begivenhed skal give tilstrækkelig information til fuldt ud at beskrive sig selv. På den måde kan en lytter finde ud af, hvad der præcist skete, og reagere på en meningsfuld måde.

Det ActionEvent inkluderer metoder til at lære handlingens kommandostreng, modifikatorer og identifikationsstreng. Det getActionCommand () metode returnerer kommandostrengen, der angiver begivenhedens tilsigtede handling, f.eks. udskriv eller kopi (hvad). Det getSource () metoden returnerer det objekt, der genererer begivenheden (hvem).

For at modtage en ActionEvent, skal en lytter implementere ActionListener interface og registrere sig selv med komponenten. Desuden skal en komponent holde styr på sine lyttere for at underrette dem om en begivenhed.

Ved hjælp af ActionEvent eksempel, som en model, kan vi let se de stykker, der er nødvendige for, at en komponent kan generere en begivenhed, og en lytter til at lytte efter en begivenhed. På et højt niveau er der tre stykker:

  1. Komponenten
  2. Begivenhedsklassen
  3. Lyttergrænsefladen

Lad os se på hver enkelt separat.

Komponenten

Komponenter genererer begivenheder. En begivenhed er en komponents måde at lade en lytter vide, at der er sket noget. Derfor skal en komponent tilvejebringe en mekanisme til registrering og afregistrering af begivenhedslyttere. Komponenten skal også spore sine lyttere og videregive begivenhederne til disse lyttere.

Mekanikken ved registrering / afregistrering og sporing overlades til den enkelte komponent. Imidlertid vil en komponent normalt have en addXXXListener og fjernXXXListener for hver type begivenhed, den genererer. Internt kan komponenten gemme en lytter, uanset hvordan den vælger; normalt gemmer komponenter imidlertid lyttere i en java.util.Vector eller javax.swing.event.EventListenerList. For at affyre en begivenhed til sine lyttere, løber komponenten simpelthen gennem listen over lyttere og sender begivenheden til hver lytter ved at ringe til lytterens afsendelsesmetode.

Det er tid til et eksempel:

... EventListenerList xxxListeners = ny EventListnerList (); offentlig ugyldig addXXXListener (XXXListener lytter) {xxxListeners.add (XXXListener.class, lytter); } offentlig tomrum fjerneXXXListener (XXXListener lytter) {xxxListeners.remove (XXXListener.class, lytter); } beskyttet ugyldigt fireXXX (XXXEvent xxxEvent) {Object [] lyttere = xxxListeners.getListenerList (); // løbe gennem hver lytter og viderebringe begivenheden om nødvendigt Int numListeners = lyttere.længde; for (int i = 0; i

Dette eksempel viser, hvordan man registrerer, afregistrerer og affyrer af typen XXXEvent. Lyttere kan registrere sig og afmelde sig via addXXXListener () og fjernXXXListener () metoder. Når en begivenhed opstår, opretter komponenten et begivenhedsobjekt og sender det til fireXXX () metode, hvor den sendes til lytterne.

Eksemplet definerer en generisk opskrift, som alle komponenter kan følge. For at eksemplet skal fungere, skal du dog definere en XXXEvent og en XXXListener interface.

Begivenhedsklassen

Arrangementet indeholder alle de oplysninger, der er nødvendige for, at en lytter kan finde ud af, hvad der skete. De inkluderede oplysninger er virkelig hændelsesspecifikke. Tænk bare på begivenheden nøje og design begivenhedsklassen, så den indeholder de oplysninger, der er nødvendige for at beskrive begivenheden fuldt ud for en lytter. Begivenheder udvider normalt java.awt.AWTEvent begivenhedsklasse.

Lyttergrænsefladen

En interface til begivenhedslytter definerer de metoder, som en komponent bruger til at sende begivenheder. Hver begivenhedstype vil have mindst en tilsvarende afsendelsesmetode i en lyttergrænseflade.

En lyttergrænseflade har følgende generiske format:

offentlig grænseflade XXXListener udvider EventListener {// begivenhedsforsendelsesmetoder somethingHappened (XXXEvent e); somethingElseHappened (XXXEvent e); ...} 

For at lytte til en begivenhed skal en lytter implementere XXXListener interface og registrere sig selv med komponenten. Når en begivenhed opstår, kalder komponenten den korrekte forsendelsesmetode. Metoderne er defineret i en grænseflade, så ethvert objekt kan modtage begivenheden. Så længe lytteren implementerer grænsefladen, vil komponenten vide, hvordan man sender begivenheden til lytteren.

Afslutning

Som du kan se, er der afhængigheder mellem nogle af stykkerne. Lyttergrænsefladen svarer direkte til begivenheden. Begivenheden er nødvendigvis forsendelsesmetodens argument.

Komponenten svarer direkte til begivenheden og lytteren. Det skal vide om hver enkelt, så den kan oprette begivenheder, sende begivenheder og registrere lyttere.

I modsætning til de to andre stykker er begivenhedsobjektet uafhængigt. Som et resultat er mange komponenter fri til at affyre begivenhedstypen. Desuden kan flere grænseflader definere metoder til afsendelse af begivenheden.

Tony Sintes er hovedkonsulent hos BroadVision. Tony, en Sun-certificeret Java 1.1-programmør og Java 2-udvikler, har arbejdet med Java siden 1997.

Denne historie, "Begivenheder og lyttere" blev oprindeligt udgivet af JavaWorld.