Ohjelmointi

Java ja tapahtumien käsittely

Useimpien ohjelmien on oltava hyödyllisiä, jotta ne olisivat hyödyllisiä. Tätä varten Java-ohjelmat luottavat tapahtumiin, jotka kuvaavat käyttäjän toimia.

Viime kuussa osoitin, kuinka koota graafinen käyttöliittymä komponenteista, jotka tarjoaa Java-luokan kirjaston abstrakti ikkunointityökalu. Muutaman tällaisen käyttöliittymän kokoamisen jälkeen puhuin lyhyesti tapahtumankäsittelyn aiheesta, mutta lopetin lyhyen kuvauksen AWT: n toteuttamasta tapahtumien käsittelystä. Tässä kuussa aloitamme siitä, mihin jäimme.

Tapahtumavetoinen

Kaukaisessa menneisyydessä ohjelman, joka halusi tietää, mitä käyttäjä teki, oli itse kerättävä aktiivisesti tällaisia ​​tietoja. Käytännössä tämä tarkoitti sitä, että kun ohjelma oli alustanut itsensä, se tuli isoon silmukkaan, jossa se toistuvasti katsoi, tekikö käyttäjä jotain mielenkiintoista (esimerkiksi painaa painiketta, koskettaa näppäintä, liikuttaa liukusäädintä, liikuttaa hiirtä) ja ryhtyi sitten asianmukaisiin toimiin. Tämä tekniikka tunnetaan nimellä äänestys.

Äänestys saa työn tehtyä, mutta se on yleensä hankala käytettäessä nykypäivän sovelluksissa kahdesta asiaan liittyvästä syystä: Ensinnäkin, kyselyn käyttö pyrkii työntämään kaikki tapahtumankäsittelykoodit yhteen paikkaan (ison silmukan sisään); toiseksi tuloksena olevat vuorovaikutukset isossa silmukassa ovat yleensä monimutkaisia. Lisäksi kysely edellyttää, että ohjelma istuu silmukassa ja kuluttaa suorittimen jaksoja odottaen käyttäjän tekevän jotain - arvokkaan resurssin vakava tuhlaaminen.

AWT ratkaisi nämä ongelmat omaksumalla toisenlaisen paradigman, joka on kaikkien nykyaikaisten ikkunajärjestelmien taustalla: tapahtumavetoinen ohjelmointi. AWT: n sisällä kaikki käyttäjän toimet kuuluvat abstraktiin joukkoihin nimeltään Tapahtumat. Tapahtuma kuvaa riittävän yksityiskohtaisesti tietyn käyttäjän toiminnan. Sen sijaan, että ohjelma keräisi aktiivisesti käyttäjien luomia tapahtumia, Java-ajoaika ilmoittaa ohjelmalle mielenkiintoisen tapahtuman tapahtuessa. Ohjelmien, jotka käsittelevät käyttäjien vuorovaikutusta tällä tavalla, sanotaan olevan tapahtumavetoinen.

Tapahtuman luokka

Tapahtumaluokka on tapahtumapelin ensisijainen pelaaja. Se yrittää kaapata kaikkien käyttäjien luomien tapahtumien perusominaisuudet. pöytä 1 listaa luokan tapahtuman tarjoamat julkiset tietojäsenet.

TyyppiNimiKuvaus
EsinekohdeViittaus komponenttiin, joka alun perin vastaanotti tapahtuman.
pitkäkunAjankohta, jona tapahtuma tapahtui.
intidTapahtumatyyppi (katso lisätietoja kohdasta Tapahtumatyypit).
intxX-koordinaatti, jolla toiminta tapahtui, suhteessa komponenttiin, joka parhaillaan käsittelee tapahtumaa. Tietyn tapahtuman x-koordinaatin arvo muuttuu, kun tapahtuma siirtyy komponenttihierarkiassa ylöspäin. Koordinaattitason alkuperä on komponentin vasemmassa yläkulmassa.
intyY-koordinaatti, jolla toiminta tapahtui, suhteessa komponenttiin, joka parhaillaan prosessoi tapahtumaa. Tietyn tapahtuman y-koordinaatin arvo muuttuu, kun tapahtuma siirtyy komponenttihierarkiassa ylöspäin. Koordinaattitason alkuperä on komponentin vasemmassa yläkulmassa.
intavainNäppäimistötapahtumia varten näppäimen näppäinkoodi juuri painettiin. Sen arvo on tyypillisesti avaimen edustaman merkin Unicode-arvo. Muita mahdollisuuksia ovat erikoisnäppäinten HOME, END, F1, F2 ja niin edelleen arvot.
intmuokkaajatAritmeettisesti tai yhdistetty arvo SHIFT_MASK, CTRL_MASK, META_MASK ja ALT_MASK. Sen arvo edustaa shift-, control-, meta- ja alt-näppäinten tilaa.
intnapsautaCountPeräkkäisten hiiren napsautusten määrä. Tämä tietojäsen on merkittävä vain MOUSE_DOWN-tapahtumissa.
EsineargTapahtumasta riippuva argumentti. Painike-objekteille tämä objekti on merkkijono-objekti, joka sisältää painikkeen tekstimerkinnän.
Taulukko 1: Julkisten tietojen jäsenet luokan tapahtuman mukaan

Kuten selitän osiossa nimeltä Tapahtumien lähettäminen ja eteneminen, luokan tapahtuman esiintymä luodaan tyypillisesti Java-ajonaikaisen järjestelmän avulla. Ohjelma voi kuitenkin luoda ja lähettää tapahtumia komponentteihin niiden kautta postEvent () menetelmä.

Tapahtumatyypit

Kuten edellä mainittiin, Event-luokka on malli käyttöliittymän tapahtumasta. Tapahtumat luokitellaan luonnollisesti luokkiin tapahtuman tyypin perusteella (tapahtuman tyyppi osoitetaan id tietojäsen). Taulukossa 2 luetellaan kaikki AWT: n määrittelemät tapahtumat luokittain.

Taulukko 2: AWT: n määrittelemät tapahtumat luokittain

Voi olla opettavaista nähdä tapahtumien luominen toiminnassa. Kun painetaan kuvan 1 painiketta, se luo tapahtumaselaimen, joka näyttää tapahtuman tiedot selaimen vastaanottamista tapahtumista. Tapahtumaselaimen lähdekoodi on saatavilla täältä.

Tarvitset Java-yhteensopivan selaimen nähdäksesi tämän sovelman

Kuva 1: Tapahtuman luominen toiminnassa

Tapahtumien lähettäminen ja levittäminen

Tarkastellaan kuvion 2 sovetta. Se koostuu kahdesta Button-luokan esiintymästä, upotettuna paneeliluokan esiintymään. Tämä paneeliluokan esiintymä on upotettu toiseen paneeliluokan esiintymään. Paneeliluokan jälkimmäinen esiintymä on luokan TextArea esiintymän alapuolella, ja molemmat esiintymät upotetaan Applet-luokan ilmentymään. Kuvassa 3 on esitetty tämän sovelman muodostavat elementit, jotka on asetettu puuksi, lehdinä TextArea- ja Button-esiintymät ja juurena Applet-esiintymä. (Lisätietoja käyttöliittymän komponenttien hierarkkisesta asettelusta on AWT: n viime kuukauden johdannossa.)

Tarvitset Java-yhteensopivan selaimen nähdäksesi tämän sovelman

Kuva 2: Luokkiin upotetut luokat

Kuva 3: Aplet-elementtien puu (hierarkia)

Kun käyttäjä on vuorovaikutuksessa kuvion 2 sovelman kanssa, Java-ajoaikajärjestelmä luo luokan tapahtuman esiintymän ja täyttää sen datajäsenet toimintaa kuvaavilla tiedoilla. Java-ajonaikainen järjestelmä antaa sitten sovelman hoitaa tapahtuman. Se alkaa komponentilla, joka alun perin vastaanotti tapahtuman (esimerkiksi napsautetun painikkeen) ja liikkuu komponenttipuusta ylöspäin komponentti kerrallaan, kunnes se saavuttaa puun yläosassa olevan säiliön. Matkan varrella jokaisella komponentilla on mahdollisuus jättää tapahtuma huomiotta tai reagoida siihen yhdellä (tai useammalla) seuraavista tavoista:

  • Muokkaa tapahtuman esiintymän tietojäseniä
  • Toimi ja suorita laskelmia tapahtuman sisältämien tietojen perusteella
  • Ilmoita Java-ajonaikaiselle järjestelmälle, että tapahtuman ei pitäisi levitä enää puuhun

Java-ajonaikainen järjestelmä välittää tapahtuman tiedot komponentille komponenttien kautta kahvaEvent () menetelmä. Kaikki voimassa kahvaEvent () menetelmien on oltava muodoltaan

public boolean handleEvent (Tapahtuma e) 

Tapahtumankäsittelijä tarvitsee yhden tiedon: viittauksen Tapahtuma-luokan ilmentymään, joka sisältää tietoja juuri tapahtuneesta tapahtumasta.

Palautettu arvo kahvaEvent () menetelmä on tärkeä. Se osoittaa Java-ajonaikaiselle järjestelmälle, onko tapahtuma käsitelty kokonaan tapahtumakäsittelijässä. Todellinen arvo osoittaa, että tapahtuma on käsitelty ja etenemisen pitäisi lopettaa. Väärä arvo osoittaa, että tapahtuma on ohitettu, sitä ei voitu käsitellä tai se on käsitelty puutteellisesti ja että sen pitäisi jatkua puun yläpuolella.

Harkitse seuraavaa kuvaa kuvitellun käyttäjän vuorovaikutuksesta sovelman kanssa kuvassa 2. Käyttäjä napsauttaa painiketta "Yksi". Java-kielen ajonaikainen järjestelmä kerää tietoja tapahtumasta (napsautusten lukumäärä, napsautuksen sijainti, napsautuksen aika ja napsautuksen saanut komponentti) ja pakkaa nämä tiedot tapahtumaluokan esiintymään. Java-ajonaikainen järjestelmä alkaa sitten napsautetusta komponentista (tässä tapauksessa painikkeesta "Yksi") ja komponentin kahvaEvent () menetelmä tarjoaa komponentille mahdollisuuden reagoida tapahtumaan. Jos komponentti ei käsittele tapahtumaa tai käsittelee tapahtumaa epätäydellisesti (ilmaistuna palauttamisarvolla false), Java-ajoaikajärjestelmä tarjoaa Tapahtuma-ilmentymän puun seuraavalle korkeammalle komponentille - tässä tapauksessa Paneeliluokka. Java-ajonaikainen järjestelmä jatkuu tällä tavalla, kunnes tapahtuma käsitellään tai ajonaikaisen järjestelmän komponentit loppuvat kokeilemaan. Kuva 4 kuvaa tämän tapahtuman polun, kun sovelma yrittää käsitellä sitä.

Kuva 4: Tapahtuman polku

Jokainen kuvion 2 sovelman muodostava komponentti lisää TextArea-objektiin rivin, joka osoittaa, että se on vastaanottanut tapahtuman. Sen jälkeen tapahtuma voi edetä puun seuraavaan komponenttiin. Listaus 1 sisältää tyypin koodin kahvaEvent () menetelmä. Tämän sovelman täydellinen lähdekoodi on saatavilla täältä.

public boolean handleEvent (Event evt) {if (evt.id == Event.ACTION_EVENT) {ta.appendText ("Paneeli" + str + "sahatoiminto ... \ n"); } else if (evt.id == Tapahtuma.MOUSE_DOWN) {ta.appendText ("Paneeli" + str + "sahahiiri alas ... \ n"); }

paluu super.handleEvent (evt); }

Listaus 1: Tyypillinen kahvaEvent () menetelmä

Tapahtuman auttajamenetelmät

kahvaEvent () menetelmä on yksi paikka, jonka ohjelmoija voi laittaa sovelluskoodin tapahtumien käsittelyä varten. Toisinaan komponentti on kuitenkin kiinnostunut vain tietyntyyppisistä tapahtumista (esimerkiksi hiirtapahtumista). Näissä tapauksissa ohjelmoija voi sijoittaa koodin kohtaan a auttaja menetelmäsen sijaan, että asetat sen kahvaEvent () menetelmä.

Tässä on luettelo ohjelmoijien käytettävissä olevista auttajamenetelmistä. Tietyntyyppisille tapahtumille ei ole auttajamenetelmiä.

toiminta (Tapahtuman evt, Object what)

gotFocus (Tapahtuman evt, Object what)

lostFocus (Tapahtuman evt, Object what)

mouseEnter (Tapahtuman evt, int x, int y)

mouseExit (Tapahtuman evt, int x, int y)

mouseMove (Tapahtuman evt, int x, int y)

mouseUp (tapahtuma evt, int x, int y)

mouseDown (Tapahtuman evt, int x, int y)

mouseDrag (Tapahtuman evt, int x, int y)

keyDown (Tapahtuman evt, int-avain)

keyUp (tapahtuman evt, int-avain)

väärä osoittaa, että auttaja-menetelmä ei käsitellyt tapahtumaa.

Ohjelman täytäntöönpano kahvaEvent () luokan toimittama menetelmä käyttää kutakin auttajamenetelmää. Tästä syystä on tärkeää, että kahvaEvent () menetelmä johdetuissa luokissa päättyy aina lauseeseen

return super.handleEvent (e);

Listing 2: n koodi kuvaa tätä sääntöä.

public boolean handleEvent (Tapahtuma e) {if (e.tavoittimen OmaButton) {// tee jotain ... return true; }

return super.handleEvent (e); }

Listaus 2: Säännön lauseen lopettamiseksi kahvaEvent () menetelmä

Tämän yksinkertaisen säännön noudattamatta jättäminen estää auttajamenetelmien oikean kutsumisen.

Kuvio 5 sisältää sovelman, joka käsittelee hiiren tapahtumia yksinomaan auttajamenetelmiin sijoitetun koodin kautta. Lähdekoodi on saatavilla täältä.

TapahtumaevtSeuraava tapahtuma linkitetyssä tapahtumaluettelossa.
Ikkunatapahtumat
Ikkunatapahtumat luodaan vastauksena ikkunan, kehyksen tai valintaikkunan tilan muutoksiin.
TapahtumaHenkilötunnus
WINDOW_DESTROY201
WINDOW_EXPOSE202
WINDOW_ICONIFY203
WINDOW_DEICONIFY204
WINDOW_MOVED205
Näppäimistötapahtumat
Näppäimistötapahtumat luodaan vastauksena näppäinten painamiseen ja vapauttamiseen, kun komponentilla on tulokeskeisyys.
TapahtumaHenkilötunnus
KEY_PRESS401
KEY_RELEASE402
KEY_ACTION403
KEY_ACTION_RELEASE404
Hiirtapahtumat
Hiirtapahtumat luodaan vastauksena komponentin rajoissa tapahtuviin hiiritoimintoihin.
TapahtumaHenkilötunnus
HIIRI_ALAS501
HIIRI_UP502
HIIRI_MOVE503
MOUSE_ENTER504
MOUSE_EXIT505
MOUSE_DRAG506
Vieritä tapahtumia
Vieritystapahtumat luodaan vastauksena vierityspalkkien manipulointiin.
TapahtumaHenkilötunnus
SCROLL_LINE_UP601
SCROLL_LINE_DOWN602
SCROLL_PAGE_UP603
SCROLL_PAGE_DOWN604
SCROLL_ABSOLUTE605
Luettele tapahtumat
Luettelotapahtumat luodaan vastauksena luetteloon tehtyihin valintoihin.
TapahtumaHenkilötunnus
LIST_SELECT701
LIST_DESELECT702
Erilaisia ​​tapahtumia
Erilaisia ​​tapahtumia syntyy vastauksena erilaisiin toimiin.
TapahtumaHenkilötunnus
ACTION_EVENT1001
LOAD_FILE1002
TALLENNA TIEDOSTO1003
GOT_FOCUS1004
LOST_FOCUS1005
Todd Sundsted on ohjelmoinut siitä lähtien, kun tietokoneita tuli saataville työpöytämalleihin. Vaikka Todd oli alun perin kiinnostunut hajautettujen objektisovellusten rakentamisesta C ++ -sovelluksessa, Todd muutti Java-ohjelmointikielelle, kun Java-ohjelmasta tuli ilmeinen valinta sellaiselle. Kirjoituksen lisäksi Todd tarjoaa Internet- ja verkkosovelluskonsultointipalveluja Yhdysvaltojen kaakkoisosissa toimiville yrityksille.

Lisätietoja tästä aiheesta

  • Java-opetusohjelma kirjoittanut Mary Campione ja Kathy Walrath. Online-luonnosversio on saatavana osoitteesta //java.sun.com/tutorial/index.html.

Tämän tarinan "Java ja tapahtumien käsittely" julkaisi alun perin JavaWorld.