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.
Tip | Ime | Opis |
Predmet | cilj | Sklic na komponento, ki je prvotno prejela dogodek. |
dolga | kdaj | Točka, v kateri se je dogodek zgodil. |
int | id | Vrsta dogodka (za več informacij glejte razdelek Vrste dogodkov). |
int | x | Koordinata 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. |
int | y | Koordinata 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. |
int | tipko | Za 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. |
int | modifikatorji | Aritmetično kombinirana vrednost vrednosti SHIFT_MASK, CTRL_MASK, META_MASK in ALT_MASK. Njegova vrednost predstavlja stanje tipk shift, control, meta in alt. |
int | klikniteCount | Število zaporednih klikov z miško. Ta podatkovni član je pomemben samo za dogodke MOUSE_DOWN. |
Predmet | arg | Argument, odvisen od dogodka. Za predmete Button je ta objekt String, ki vsebuje teksturno oznako gumba. |
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.
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 JavaSlika 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 JavaSlika 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.
Dogodek | evt | Naslednji dogodek na povezanem seznamu dogodkov. |
Dogodki oken | ||
Dogodki okna se ustvarijo kot odziv na spremembe stanja okna, okvira ali pogovornega okna. | ||
Dogodek | ID | |
WINDOW_DESTROY | 201 | |
WINDOW_EXPOSE | 202 | |
WINDOW_ICONIFY | 203 | |
WINDOW_DEICONIFY | 204 | |
WINDOW_MOVED | 205 | |
Dogodki na tipkovnici | ||
Dogodki na tipkovnici se ustvarijo kot odziv na pritisnjene in sproščene tipke, medtem ko ima komponenta fokus na vhodu. | ||
Dogodek | ID | |
KEY_PRESS | 401 | |
KEY_RELEASE | 402 | |
KEY_ACTION | 403 | |
KEY_ACTION_RELEASE | 404 | |
Miški dogodki | ||
Miški dogodki se ustvarijo kot odziv na dejanja miške, ki se zgodijo znotraj meja komponente. | ||
Dogodek | ID | |
MIŠICA_ DOL | 501 | |
MOUSE_UP | 502 | |
MIŠKA_POMAK | 503 | |
MOUSE_ENTER | 504 | |
IZHOD MIŠICE | 505 | |
MOUSE_DRAG | 506 | |
Pomaknite se po dogodkih | ||
Dogodki drsenja se ustvarijo kot odziv na manipulacijo drsnikov. | ||
Dogodek | ID | |
SCROLL_LINE_UP | 601 | |
SCROLL_LINE_DOWN | 602 | |
SCROLL_PAGE_UP | 603 | |
SCROLL_PAGE_DOWN | 604 | |
SCROLL_ABSOLUTE | 605 | |
Seznam dogodkov | ||
Dogodki na seznamu se ustvarijo kot odgovor na izbire na seznamu. | ||
Dogodek | ID | |
LIST_SELECT | 701 | |
LIST_DESELECT | 702 | |
Razni dogodki | ||
Razni dogodki se ustvarijo kot odziv na različne ukrepe. | ||
Dogodek | ID | |
ACTION_EVENT | 1001 | |
LOAD_FILE | 1002 | |
SHRANITE DATOTEKO | 1003 | |
GOT_FOCUS | 1004 | |
LOST_FOCUS | 1005 |
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.