Programiranje

Java in obdelava dogodkov

Večina programov se mora uporabiti, da se odzove na ukaze uporabnika. Za to se programi Java zanašajo na dogodke, ki opisujejo uporabniška dejanja.

Prejšnji mesec sem pokazal, kako sestaviti grafični uporabniški vmesnik iz komponent, ki jih ponuja zbirka orodij za odpiranje oken knjižnice razreda Java. Po sestavi nekaj takšnih vmesnikov sem na kratko spregovoril o temi ravnanja z dogodki, vendar se nisem ustavil pred popolnim opisom ravnanja z dogodki, kot ga izvaja AWT. Ta mesec nadaljujemo tam, kjer smo končali.

Da bo voden po dogodkih

V daljni preteklosti je moral program, ki je želel vedeti, kaj dela uporabnik, sam aktivno zbirati takšne informacije. V praksi je to pomenilo, da je po inicializiranju programa vstopil v veliko zanko, v kateri je večkrat pogledal, ali uporabnik počne kaj zanimivega (na primer pritisk gumba, dotik tipke, premikanje drsnika, premikanje miške) in nato ustrezno ukrepal. Ta tehnika je znana kot glasovanje.

Anketa opravi delo, vendar je v današnjih aplikacijah zaradi dveh povezanih razlogov ponavadi okorna: Prvič, uporaba ankete ponavadi potisne vso kodo za obdelavo dogodkov na eno mesto (znotraj velike zanke); drugič, posledične interakcije znotraj velike zanke so običajno zapletene. Poleg tega anketiranje zahteva, da program sedi v zanki in porabi ciklu procesorja, medtem ko čaka, da uporabnik nekaj naredi - resna izguba dragocenega vira.

AWT je te težave rešil tako, da je sprejel drugačno paradigmo, ki je osnova vseh sodobnih okenskih sistemov: programiranje na podlagi dogodkov. Znotraj AWT vsa uporabniška dejanja pripadajo abstraktnemu naboru imenovanih stvari dogodkov. Dogodek dovolj podrobno opisuje določeno dejanje uporabnika. Namesto da program aktivno zbira uporabniško ustvarjene dogodke, čas izvajanja Java obvesti program, ko pride do zanimivega dogodka. Programi, ki na ta način obravnavajo interakcijo z uporabniki, naj bi bili dogodek.

Razred dogodkov

Razred Event je glavni igralec v igri dogodkov. Poskuša zajeti temeljne značilnosti vseh uporabniško ustvarjenih dogodkov. Preglednica 1 našteva člane javnih podatkov, ki jih ponuja razred Event.

TipImeOpis
PredmetciljSklic na komponento, ki je prvotno prejela dogodek.
dolgakdajTočka, v kateri se je dogodek zgodil.
intidVrsta dogodka (za več informacij glejte razdelek Vrste dogodkov).
intxKoordinata x, pri kateri se je zgodilo dejanje, glede na komponento, ki trenutno obdeluje dogodek. Za določen dogodek se x koordinata spremeni v vrednosti, ko se dogodek pomakne navzgor po hierarhiji komponent. Začetek koordinatne ravnine je v zgornjem levem kotu komponente.
intyKoordinata y, pri kateri se je zgodilo dejanje glede na komponento, ki trenutno obdeluje dogodek. Za določen dogodek se bo koordinata y spremenila v vrednosti, ko se dogodek pomakne navzgor po hierarhiji komponent. Začetek koordinatne ravnine je v zgornjem levem kotu komponente.
inttipkoZa dogodke na tipkovnici je tipkovnica tipke, ki ste jo pravkar pritisnili. Njegova vrednost bo običajno vrednost Unicode znaka, ki ga predstavlja ključ. Druge možnosti vključujejo vrednosti za posebne tipke HOME, END, F1, F2 itd.
intmodifikatorjiAritmetično kombinirana vrednost vrednosti SHIFT_MASK, CTRL_MASK, META_MASK in ALT_MASK. Njegova vrednost predstavlja stanje tipk shift, control, meta in alt.
intklikniteCountŠtevilo zaporednih klikov z miško. Ta podatkovni član je pomemben samo za dogodke MOUSE_DOWN.
PredmetargArgument, odvisen od dogodka. Za predmete Button je ta objekt String, ki vsebuje teksturno oznako gumba.
Tabela 1: Člani javnih podatkov, ki jih zagotavlja razred Event

Kot bom pojasnil v poglavju z naslovom Pošiljanje in širjenje dogodkov, primerek razreda Event običajno ustvari sistem za izvajanje Java. Vendar lahko program ustvari in pošlje dogodke komponentam prek svojih postEvent () metoda.

Vrste dogodkov

Kot je bilo omenjeno zgoraj, je razred Event model dogodka v uporabniškem vmesniku. Dogodki naravno spadajo v kategorije glede na vrsto dogodka (vrsta dogodka je označena z id podatkovni član). V tabeli 2 so navedeni vsi dogodki, ki jih definira AWT, razvrščeni po kategorijah.

Tabela 2: Dogodki, ki jih definira AWT, razvrščeni po kategorijah

Poučno je videti, kako ustvarjanje dogodkov deluje. Ko pritisnete gumb na sliki 1, ustvari brskalnik dogodkov, ki prikazuje informacije o dogodkih o dogodkih, ki jih brskalnik prejme. Izvorna koda za brskalnik dogodkov je na voljo tukaj.

Za ogled tega programčka potrebujete brskalnik, ki podpira Java

Slika 1: Ustvarjanje dogodkov v akciji

Pošiljanje in širjenje dogodkov

Upoštevajte programček na sliki 2. Sestavljen je iz dveh primerkov razreda Button, ki sta vdelana v primerek razreda Panel. Ta primerek razreda Panel je sam vdelan v drug primerek razreda Panel. Slednji primerek razreda Panel je pod primerkom razreda TextArea, oba primera pa sta vdelana v primerek razreda Applet. Na sliki 3 so predstavljeni elementi, ki sestavljajo ta programček, postavljen kot drevo, z primerki TextArea in Button kot listi, primerek Applet pa kot koren. (Za več informacij o hierarhični postavitvi komponent v uporabniškem vmesniku preberite prejšnji mesec uvod v AWT.)

Za ogled tega programčka potrebujete brskalnik, ki podpira Java

Slika 2: Razredi, vdelani v razrede

Slika 3: Drevo elementov apletov (hierarhija)

Ko uporabnik sodeluje z programčkom na sliki 2, sistem teka Java ustvari primerek razreda Event in svoje člane podatkov napolni z informacijami, ki opisujejo dejanje. Izvajalni sistem Java nato dovoli, da programček obdela dogodek. Začne se s komponento, ki je prvotno prejela dogodek (na primer gumb, na katerega smo kliknili), in se premakne navzgor po drevesu komponent po komponentah, dokler ne doseže vsebnika na vrhu drevesa. Na tej poti ima vsaka komponenta priložnost prezreti dogodek ali se nanj odzvati na enega (ali več) načinov:

  • Spremenite podatkovne člane primerka dogodka
  • Ukrepajte in izvedite nekaj izračuna na podlagi informacij, ki jih vsebuje dogodek
  • Nakažite sistemu Java, da se dogodek ne sme širiti naprej po drevesu

Izvajalni sistem Java posreduje informacije o dogodkih komponenti prek komponent handleEvent () metoda. Vse veljavno handleEvent () metode morajo biti v obliki

javni logični handleEvent (dogodek e) 

Obdelovalec dogodkov zahteva en sam podatek: sklic na primerek razreda Event, ki vsebuje informacije o dogodku, ki se je pravkar zgodil.

Vrednost, vrnjena iz handleEvent () metoda je pomembna. Sistemu za izvajanje Java kaže, ali je bil dogodek v celoti obdelan znotraj upravljalnika dogodkov ali ne. Resnična vrednost pomeni, da je bil dogodek obdelan in se mora širjenje ustaviti. Napačna vrednost pomeni, da je bil dogodek prezrt, ga ni bilo mogoče obdelati ali je bil obdelan nepopolno in naj nadaljuje po drevesu.

Upoštevajte naslednji opis namišljene interakcije uporabnika z programčkom na sliki 2. Uporabnik klikne gumb z napisom "One". Jezikovni sistem Java zbira informacije o dogodku (število klikov, lokacijo klika, čas, do katerega je prišlo, in komponento, ki je prejela klik) ter pakira te informacije v primerek razreda Event. Nato se sistem za zagon Java začne pri komponenti, ki je bila kliknjena (v tem primeru je gumb z oznako "Ena") in s klicem komponente handleEvent () metoda komponenti ponudi priložnost, da se odzove na dogodek. Če komponenta ne obdeluje dogodka ali ga obdeluje nepopolno (označeno z vrnjeno vrednostjo false), sistem za izvajanje Java ponudi primerek dogodka naslednji višji komponenti v drevesu - v tem primeru primerku Razred plošče. Sistem teka Java se nadaljuje na ta način, dokler se ne obravnava dogodek ali dokler sistemu za izvajanje ne zmanjka komponent za preizkus. Slika 4 prikazuje pot tega dogodka, ko ga aplet poskuša obdelati.

Slika 4: Pot dogodka

Vsaka komponenta, ki sestavlja programček na sliki 2, doda predmet TextArea vrstico, ki označuje, da je prejela dogodek. Nato omogoči razširitev dogodka na naslednjo komponento v drevesu. Seznam 1 vsebuje kodo za tipično handleEvent () metoda. Popolna izvorna koda za ta programček je na voljo tukaj.

javni logični handleEvent (dogodek evt) {if (evt.id == Event.ACTION_EVENT) {ta.appendText ("Panel" + str + "saw action ... \ n"); } sicer če (evt.id == Event.MOUSE_DOWN) {ta.appendText ("Panel" + str + "videl miško navzdol ... \ n"); }

vrni super.handleEvent (evt); }

Seznam 1: Tipičen handleEvent () metoda

Metode pomožnih dogodkov

The handleEvent () metoda je eno mesto, kamor lahko programer postavi kodo aplikacije za obdelavo dogodkov. Občasno pa komponento zanimajo le dogodki določene vrste (na primer dogodki z miško). V teh primerih lahko programer kodo postavi v pomožna metoda, namesto da bi ga postavili v handleEvent () metoda.

Tu je seznam pomožnih metod, ki so na voljo programerjem. Za nekatere vrste dogodkov ni pomožnih metod.

dejanje (dogodek evt, objekt kaj)

gotFocus (dogodek evt, objekt kaj)

lostFocus (dogodek evt, objekt kaj)

mouseEnter (dogodek evt, int x, int y)

mouseExit (dogodek evt, int x, int y)

mouseMove (dogodek evt, int x, int y)

mouseUp (dogodek evt, int x, int y)

mouseDown (dogodek evt, int x, int y)

mouseDrag (dogodek evt, int x, int y)

keyDown (dogodek evt, int ključ)

keyUp (dogodek evt, int ključ)

false pomeni, da pomožna metoda ni obdelala dogodka.

Izvajanje handleEvent () metoda, ki jo ponuja razred Component, prikliče vsako pomožno metodo. Iz tega razloga je pomembno, da so na novo opredeljene izvedbe handleEvent () metoda v izpeljanih razredih vedno konča s stavkom

vrni super.handleEvent (e);

Koda v seznamu 2 ponazarja to pravilo.

javni logični handleEvent (dogodek e) {if (e.target instanceof MyButton) {// naredi nekaj ... vrni true; }

vrni super.handleEvent (e); }

Seznam 2: Pravilo za končni stavek v handleEvent () metoda

Neupoštevanje tega preprostega pravila bo preprečilo pravilno klicanje pomožnih metod.

Na sliki 5 je programček, ki obravnava dogodke miške izključno prek kode, nameščene v pomožnih metodah. Izvorna koda je na voljo tukaj.

DogodekevtNaslednji dogodek na povezanem seznamu dogodkov.
Dogodki oken
Dogodki okna se ustvarijo kot odziv na spremembe stanja okna, okvira ali pogovornega okna.
DogodekID
WINDOW_DESTROY201
WINDOW_EXPOSE202
WINDOW_ICONIFY203
WINDOW_DEICONIFY204
WINDOW_MOVED205
Dogodki na tipkovnici
Dogodki na tipkovnici se ustvarijo kot odziv na pritisnjene in sproščene tipke, medtem ko ima komponenta fokus na vhodu.
DogodekID
KEY_PRESS401
KEY_RELEASE402
KEY_ACTION403
KEY_ACTION_RELEASE404
Miški dogodki
Miški dogodki se ustvarijo kot odziv na dejanja miške, ki se zgodijo znotraj meja komponente.
DogodekID
MIŠICA_ DOL501
MOUSE_UP502
MIŠKA_POMAK503
MOUSE_ENTER504
IZHOD MIŠICE505
MOUSE_DRAG506
Pomaknite se po dogodkih
Dogodki drsenja se ustvarijo kot odziv na manipulacijo drsnikov.
DogodekID
SCROLL_LINE_UP601
SCROLL_LINE_DOWN602
SCROLL_PAGE_UP603
SCROLL_PAGE_DOWN604
SCROLL_ABSOLUTE605
Seznam dogodkov
Dogodki na seznamu se ustvarijo kot odgovor na izbire na seznamu.
DogodekID
LIST_SELECT701
LIST_DESELECT702
Razni dogodki
Razni dogodki se ustvarijo kot odziv na različne ukrepe.
DogodekID
ACTION_EVENT1001
LOAD_FILE1002
SHRANITE DATOTEKO1003
GOT_FOCUS1004
LOST_FOCUS1005
Todd Sundsted programira, odkar so računalniki na voljo v namiznih modelih. Čeprav se je Todd prvotno zanimal za gradnjo porazdeljenih objektnih aplikacij v jeziku C ++, se je Todd preselil v programski jezik Java, ko je Java postala očitna izbira za takšno stvar. Poleg pisanja Todd podjetjem na jugovzhodu ZDA ponuja storitve internetnega in spletnega svetovanja.

Preberite več o tej temi

  • Vadnica za Java avtorjev Mary Campione in Kathy Walrath. Spletna različica osnutka je na voljo na //java.sun.com/tutorial/index.html.

To zgodbo "Java in ravnanje z dogodki" je prvotno objavil JavaWorld.

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