Programmering

Arrangementer og lyttere

Hvordan lager du en tilpasset hendelse, og hvordan fyrer du den slik at en komponent kan få en hendelse?

Før vi ser på en egendefinert hendelse, kan vi se på en eksisterende hendelse: ActionEvent.

Komponenter som Knapp og JButton fyre av ActionEvents for å indikere en slags komponentdefinert handling. For eksempel Knapp fyrer av en ActionEvent når brukeren trykker på den. Hele poenget med en hendelse er å informere en lytter om at noe har skjedd med en komponent i GUI. En begivenhet inkluderer all informasjon som en lytter trenger for å finne ut hva som skjedde og hvem det skjedde (hva og hvem av arrangementet). Et arrangement må gi nok informasjon til å beskrive seg selv fullt ut. På den måten kan en lytter finne ut hva som skjedde og svare på en meningsfull måte.

De ActionEvent inkluderer metoder for å lære handlingens kommandostreng, modifikatorer og identifikasjonsstreng. De getActionCommand () metoden returnerer kommandostrengen som indikerer hendelsens tiltenkte handling, for eksempel skrive ut eller kopiere (hva). De getSource () metoden returnerer objektet som genererer hendelsen (hvem).

For å motta en ActionEvent, må en lytter implementere ActionListener grensesnitt og registrere seg selv med komponenten. Videre må en komponent holde oversikt over lytterne for å varsle dem om et arrangement.

Ved å bruke ActionEvent eksempel, som en modell, kan vi enkelt se brikkene som er nødvendige for at en komponent skal generere en hendelse og en lytter til å lytte etter en hendelse. På høyt nivå er det tre stykker:

  1. Komponenten
  2. Arrangementsklassen
  3. Lyttergrensesnittet

La oss ta en titt på hver enkelt separat.

Komponenten

Komponenter genererer hendelser. En hendelse er en komponents måte å fortelle en lytter om at noe har skjedd. Derfor må en komponent gi en mekanisme for å registrere og avregistrere hendelseslyttere. Komponenten må også spore lytterne og videreformidle hendelsene til lytterne.

Mekanikken til registrering / avregistrering og sporing overlates til den enkelte komponent. Imidlertid vil en komponent normalt ha en addXXXListener og fjerneXXXListener for hver type hendelse den genererer. Internt kan komponenten lagre en lytter uansett hva den velger; vanligvis lagrer imidlertid komponenter lyttere i en java.util.Vector eller javax.swing.event.EventListenerList. For å avfeie en hendelse til lytterne, slår komponenten ganske enkelt gjennom listen over lyttere og sender hendelsen til hver lytter ved å ringe lytterens hendelsesutsendelsesmetode.

Det er tid for et eksempel:

... EventListenerList xxxListeners = ny EventListnerList (); offentlig ugyldig addXXXListener (XXXListener lytter) {xxxListeners.add (XXXListener.class, lytter); } offentlig tomrom fjerneXXXListener (XXXListener lytter) {xxxListeners.remove (XXXListener.class, lytter); } beskyttet ugyldig fireXXX (XXXEvent xxxEvent) {Object [] lyttere = xxxListeners.getListenerList (); // løpe gjennom hver lytter og videreformidle eventet om nødvendig Int numListeners = lyttere.lengde; for (int i = 0; i

Dette eksemplet viser hvordan du registrerer, avregistrerer og avfyrer hendelser av typen XXXEvent. Lyttere kan registrere seg og avregistrere seg gjennom addXXXListener () og fjerneXXXListener () metoder. Når en hendelse oppstår, lager komponenten et hendelsesobjekt og sender det til fireXXX () metode, der den sendes til lytterne.

Eksemplet definerer en generisk oppskrift som alle komponentene kan følge. For at eksemplet skal fungere, må du imidlertid definere en XXXEvent og en XXXListener grensesnitt.

Arrangementsklassen

Arrangementet inneholder all informasjonen som er nødvendig for at en lytter kan finne ut hva som skjedde. Informasjonen som er inkludert er virkelig hendelsesspesifikk. Bare tenk nøye på arrangementet og utform arrangementsklassen slik at den inneholder all informasjon som er nødvendig for å fullstendig beskrive hendelsen til en lytter. Arrangementer utvider normalt java.awt.AWTEvent arrangementsklasse.

Lyttergrensesnittet

Et hendelseslyttergrensesnitt definerer metodene som brukes av en komponent for å sende hendelser. Hver hendelsestype vil ha minst én tilsvarende utsendelsesmetode i et lyttergrensesnitt.

Et lyttergrensesnitt har følgende generelle format:

offentlig grensesnitt XXXListener utvider EventListener {// hendelsesforsendelsesmetoder somethingHappened (XXXEvent e); somethingElseHappened (XXXEvent e); ...} 

For å lytte etter et arrangement, må en lytter implementere XXXListener grensesnitt og registrere seg selv med komponenten. Når en hendelse inntreffer, vil komponenten kalle riktig forsendelsesmetode. Metodene er definert i et grensesnitt slik at ethvert objekt kan motta hendelsen. Så lenge lytteren implementerer grensesnittet, vil komponenten vite hvordan hendelsen skal sendes til lytteren.

Innpakning

Som du kan se, er det avhengigheter mellom noen av brikkene. Lyttergrensesnittet tilsvarer hendelsen. Arrangementet er nødvendigvis forsendelsesmetodens argument.

Komponenten samsvarer direkte med hendelsen og lytteren. Den trenger å vite om hver, slik at den kan lage hendelser, sende hendelser og registrere lyttere.

I motsetning til de to andre brikkene er hendelsesobjektet uavhengig. Som et resultat er mange komponenter fritt til å fyre av hendelsestypen. Videre kan flere grensesnitt definere metoder for å sende hendelsen.

Tony Sintes er hovedkonsulent i BroadVision. Tony, en Sun-sertifisert Java 1.1-programmerer og Java 2-utvikler, har jobbet med Java siden 1997.

Denne historien, "Events and listeners", ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found