Daugelis programų, kad būtų naudingos, turi atsakyti į vartotojo komandas. Norėdami tai padaryti, „Java“ programos remiasi įvykiais, apibūdinančiais vartotojo veiksmus.
Praėjusį mėnesį aš parodžiau, kaip surinkti grafinę vartotojo sąsają iš komponentų, kuriuos pateikia „Java“ klasės bibliotekos abstraktus langų rinkinys. Surinkęs kelias tokias sąsajas, trumpai kalbėjau apie įvykių tvarkymo temą, tačiau nustojau trumpai aprašyti įvykių tvarkymą, kurį įgyvendino AWT. Šį mėnesį mes tęsiamės ten, kur baigėme.
Būti įvykių varomam
Tolimoje praeityje programa, norėjusi sužinoti, ką daro vartotojas, turėjo pati aktyviai rinkti tokią informaciją. Praktiškai tai reiškė, kad po programos inicijavimo ji pateko į didelę kilpą, kurioje ji ne kartą žiūrėjo, ar vartotojas daro ką nors įdomaus (pavyzdžiui, paspaudęs mygtuką, palietęs klavišą, judindamas slankiklį, judindamas pelę). ir tada ėmėsi atitinkamų veiksmų. Ši technika yra žinoma kaip apklausa.
Apklausa atliks darbą, tačiau dažniausiai būna nepatogus, kai naudojamas šiuolaikinėse programose dėl dviejų susijusių priežasčių: Pirma, naudojant apklausą visas įvykių tvarkymo kodas yra nukreipiamas į vieną vietą (didžiosios kilpos viduje); antra, susidariusios sąveikos didžiojoje kilpoje būna sudėtingos. Be to, norint atlikti apklausą, reikia, kad programa sėdėtų cikle ir suvartotų procesoriaus ciklus, o lauktų, kol vartotojas ką nors padarys - rimtas vertingo ištekliaus švaistymas.
AWT šias problemas išsprendė taikydama kitokią paradigmą, kuri yra visų šiuolaikinių langų sistemų pagrindas: programavimas pagal įvykius. AWT viduje visi vartotojo veiksmai priklauso abstrakčiam vadinamų dalykų rinkiniui įvykius. Įvykis pakankamai išsamiai apibūdina konkretų vartotojo veiksmą. Užuot programa aktyviai renka vartotojo sugeneruotus įvykius, „Java“ vykdymo laikas praneša programai, kai įvyksta įdomus įvykis. Teigiama, kad programos, kurios taip tvarko vartotojo sąveiką įvykio varomas.
Renginio klasė
Renginio klasė yra pagrindinis žaidėjas žaidime. Ji bando užfiksuoti pagrindines visų vartotojo sukurtų įvykių savybes. 1 lentelė išvardijami viešieji duomenų nariai, kuriuos pateikia klasės „Event“.
Tipas | vardas | apibūdinimas |
Objektas | taikinys | Nuoroda į komponentą, kuris iš pradžių gavo įvykį. |
ilgas | kada | Laikas, kada įvykis įvyko. |
tarpt | id | Įvykio tipas (daugiau informacijos rasite skyriuje Įvykių tipai). |
tarpt | x | X koordinatė, kurioje įvyko veiksmas, palyginti su šiuo metu įvykį apdorojančiu komponentu. Tam tikro įvykio atveju x koordinatės vertė pasikeis, kai įvykis juda aukštyn komponentų hierarchijoje. Koordinatės plokštumos pradžia yra komponento viršutiniame kairiajame kampe. |
tarpt | y | Y koordinatė, kurioje įvyko veiksmas, palyginti su šiuo metu įvykį apdorojančiu komponentu. Tam tikro įvykio y koordinačių vertė pasikeis, kai įvykis juda aukštyn komponentų hierarchijoje. Koordinatės plokštumos pradžia yra komponento viršutiniame kairiajame kampe. |
tarpt | Raktas | Klaviatūros įvykiams klavišo raktų kodas ką tik paspaustas. Jo vertė paprastai bus simbolio, kurį reiškia raktas, „Unicode“ vertė. Kitos galimybės apima specialiųjų klavišų HOME, END, F1, F2 ir pan. Vertes. |
tarpt | modifikatoriai | Aritmetiniu būdu atliktas reikšmių SHIFT_MASK, CTRL_MASK, META_MASK ir ALT_MASK derinys. Jo vertė reiškia atitinkamai „Shift“, „Control“, „Meta“ ir „Alt“ klavišų būseną. |
tarpt | spustelėkiteSuskaičiuoti | Nuoseklių pelės paspaudimų skaičius. Šis duomenų narys reikšmingas tik MOUSE_DOWN įvykiuose. |
Objektas | arg | Nuo įvykio argumentas. „Button“ objektams šis objektas yra „String“ objektas, kuriame yra mygtuko tekstūrinė etiketė. |
Kaip paaiškinsiu skyriuje pavadinimu Įvykių išsiuntimas ir platinimas, klasės įvykio egzempliorių paprastai sukuria „Java“ vykdymo laiko sistema. Tačiau programa gali sukurti ir siųsti įvykius komponentams per juos postEvent ()
metodas.
Įvykių tipai
Kaip minėta aukščiau, „Event“ klasė yra vartotojo sąsajos įvykio modelis. Įvykiai natūraliai skirstomi į kategorijas pagal įvykio tipą (įvykio tipą nurodo id
duomenų narys). 2 lentelėje išvardyti visi AWT apibrėžti įvykiai, surūšiuoti pagal kategorijas.
Gali būti pamokoma matyti įvykio generavimą. Paspaudus mygtuką 1 paveiksle, sukuriama įvykių naršyklė, rodanti įvykių informaciją apie įvykius, kuriuos gauna naršyklė. Renginio naršyklės šaltinio kodą galite rasti čia.
Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę1 pav. Įvykio generavimas
Įvykių išsiuntimas ir platinimas
Panagrinėkime 2 paveiksle esančią programėlę. Ją sudaro du mygtukų klasės egzemplioriai, įterpti į „Panel“ klasės egzempliorių. Šis „Panel“ klasės egzempliorius pats yra įterptas į kitą „Panel“ klasės egzempliorių. Pastarasis skydo klasės egzempliorius yra po klasės „TextArea“ egzemplioriumi, o abu egzemplioriai yra įterpti į „Applet“ klasės egzempliorių. 3 paveiksle pateikiami elementai, sudarantys šią programėlę, išdėstyti kaip medis, su lapais „TextArea“ ir „Button“ egzemplioriais, o kaip šaknis - „Applet“ egzemplioriumi. (Norėdami gauti daugiau informacijos apie komponentų hierarchinį išdėstymą vartotojo sąsajoje, skaitykite praėjusio mėnesio AWT įvadą.)
Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę2 paveikslas: Klasėse įdėtos klasės
3 paveikslas: Appletų elementų medis (hierarchija)
Kai vartotojas sąveikauja su 2 paveiksle esančia programėle, „Java“ vykdymo laiko sistema sukuria klasės „Event“ egzempliorių ir užpildo savo duomenų narius informacija, apibūdinančia veiksmą. Tada „Java“ vykdymo laiko sistema leidžia programėlei tvarkyti įvykį. Jis prasideda komponentu, kuris iš pradžių gavo įvykį (pvz., Mygtuku, kuris buvo spustelėtas) ir juda aukštyn komponento medžiu, komponentas po komponento, kol pasiekia medžio viršuje esantį konteinerį. Kiekvienas komponentas turi galimybę ignoruoti įvykį arba reaguoti į jį vienu (ar daugiau) iš šių būdų:
- Keisti įvykio egzemplioriaus duomenų narius
- Imkitės veiksmų ir atlikite tam tikrą skaičiavimą, remdamiesi įvykyje esančia informacija
- Nurodykite „Java“ vykdymo laiko sistemai, kad įvykis neturėtų plisti toliau medžiu
„Java“ vykdymo laiko sistema perduoda įvykio informaciją komponentui per komponentą „rankEvent“ ()
metodas. Visi galioja „rankEvent“ ()
metodai turi būti tokios formos
viešoji loginė rankena „Event“ (įvykis e)
Įvykių tvarkytojui reikalinga viena informacija: nuoroda į įvykių klasės egzempliorių, kuriame pateikiama informacija apie ką tik įvykusį įvykį.
Vertė, grąžinta iš „rankEvent“ ()
metodas yra svarbus. Tai rodo „Java“ vykdymo laiko sistemai, ar įvykis buvo visiškai tvarkomas įvykių tvarkytuvėje. Tikra reikšmė rodo, kad įvykis buvo tvarkomas ir sklaida turėtų būti sustabdyta. Klaidinga reikšmė rodo, kad įvykis buvo ignoruojamas, jo nebuvo galima tvarkyti arba jis buvo apdorotas nepilnai ir turėtų tęsti medį.
Apsvarstykite šį įsivaizduojamo vartotojo sąveikos su programėle aprašymą 2 paveiksle. Vartotojas paspaudžia mygtuką „Vienas“. „Java“ kalbos vykdymo laiko sistema renka informaciją apie įvykį (paspaudimų skaičių, paspaudimo vietą, paspaudimo laiką ir paspaudimą gavusį komponentą) ir supakuoja šią informaciją į įvykių klasės egzempliorių. Tada „Java“ vykdymo laiko sistema prasideda nuo komponento, kurį spustelėjote (šiuo atveju mygtukas pažymėtas „Vienas“), ir paskambinus į komponento „rankEvent“ ()
metodas suteikia komponentui galimybę reaguoti į įvykį. Jei komponentas netvarko įvykio arba tvarko įvykį ne iki galo (nurodoma klaidinga grąžinimo reikšmė), „Java“ vykdymo laiko sistema siūlo įvykio egzempliorių kitam aukštesniam medžio komponentui - šiuo atveju Skydo klasė. „Java“ vykdymo laiko sistema tęsiasi tokiu būdu, kol įvykis bus tvarkomas arba vykdymo laiko sistemoje nebebus bandomų komponentų. 4 paveiksle pavaizduotas šio įvykio kelias, kai programėlė bando jį tvarkyti.
4 paveikslas: Įvykio kelias
Kiekvienas komponentas, sudarantis 2 paveiksle esančią programėlę, prideda eilutę prie „TextArea“ objekto, nurodančio, kad jis gavo įvykį. Tada jis leidžia įvykiui išplisti į kitą medžio komponentą. 1 sąraše yra tipinio kodas „rankEvent“ ()
metodas. Visą šios programėlės šaltinio kodą galite rasti čia.
public boolean handleEvent (Event evt) {if (evt.id == Event.ACTION_EVENT) {ta.appendText ("Skydelis" + str + "pjūklo veiksmas ... \ n"); } else if (evt.id == Įvykis.MOUSE_DOWN) {ta.appendText ("Skydelis" + str + "pjūklas nusileido žemyn ... \ n"); }
grįžti super.handleEvent (evt); }
1 sąrašas: tipiškas „rankEvent“ ()
metodas
Renginių pagalbininkų metodai
„rankEvent“ ()
metodas yra ta vieta, kur programuotojas gali įdėti programos kodą įvykiams tvarkyti. Tačiau kartais komponentą domina tik tam tikro tipo įvykiai (pavyzdžiui, pelės įvykiai). Tokiais atvejais programuotojas gali įdėti kodą į a pagalbininko metodas, o ne įdėti į „rankEvent“ ()
metodas.
Čia yra programuotojams prieinamų pagalbinių metodų sąrašas. Tam tikrų tipų įvykiams nėra pagalbinių metodų.
veiksmas (įvykio evt, objektas ką)
„gotFocus“ (įvykio evt, objektas ką)
lostFocus (įvykio evt, objektas ką)
„mouseEnter“ (įvykio evt, int x, int y)
„mouseExit“ (įvykio evt, int x, int y)
„mouseMove“ (įvykio evt, int x, int y)
„mouseUp“ (įvykio evt, int x, int y)
„mouseDown“ (įvykio evt, int x, int y)
„mouseDrag“ (įvykio evt, int x, int y)
keyDown (įvykio evt, int raktas)
keyUp (įvykio evt, int raktas)
melagingas, nurodantis, kad pagalbinis metodas įvykio neįvykdė.
Programos įgyvendinimas „rankEvent“ ()
„Component“ klasės pateiktas metodas naudoja kiekvieną pagalbininko metodą. Dėl šios priežasties svarbu iš naujo apibrėžti „rankEvent“ ()
metodas išvestinėse klasėse visada baigiasi teiginiu
grįžti super.handleEvent (e);
2 sąrašo kodas iliustruoja šią taisyklę.
public boolean handleEvent (e įvykis) {if (e.target MyButton egzempliorius) {// padaryti ką nors ... grįžti tiesa; }
grįžti super.handleEvent (e); }
2 sąrašas: Taisyklė, skirta baigti sakinį „rankEvent“ ()
metodas
Nesilaikant šios paprastos taisyklės bus išvengta tinkamo pagalbininkų metodų taikymo.
5 paveiksle yra programėlė, kuri valdo pelės įvykius tik per kodą, įdėtą pagalbininkų metoduose. Šaltinio kodą galite rasti čia.
Įvykis | evt | Kitas įvykis susietame įvykių sąraše. |
Langų įvykiai | ||
Lango įvykiai generuojami atsižvelgiant į lango, rėmelio ar dialogo būsenos pokyčius. | ||
Įvykis | ID | |
WINDOW_DESTROY | 201 | |
WINDOW_EXPOSE | 202 | |
WINDOW_ICONIFY | 203 | |
WINDOW_DEICONIFY | 204 | |
WINDOW_MOVED | 205 | |
Klaviatūros įvykiai | ||
Klaviatūros įvykiai generuojami reaguojant į paspaudžiamus ir atleidžiamus klavišus, kai komponentas turi įvesties dėmesį. | ||
Įvykis | ID | |
MYGTUKO PASPAUDIMAS | 401 | |
PAGRINDINIS PRANEŠIMAS | 402 | |
KEY_ACTION | 403 | |
KEY_ACTION_RELEASE | 404 | |
Pelės įvykiai | ||
Pelės įvykiai generuojami reaguojant į pelės veiksmus, vykstančius komponento ribose. | ||
Įvykis | ID | |
PELĖ_ŽEMYN | 501 | |
PELĖ_UP | 502 | |
PELĖS_MOVE | 503 | |
PELĖ_ENTERIS | 504 | |
MOUSE_EXIT | 505 | |
PELĖ_DRAG | 506 | |
Slinkite įvykius | ||
Slinkimo įvykiai generuojami reaguojant į manipuliavimą slinkties juostomis. | ||
Įvykis | ID | |
SCROLL_LINE_UP | 601 | |
SCROLL_LINE_DOWN | 602 | |
SCROLL_PAGE_UP | 603 | |
SCROLL_PAGE_DOWN | 604 | |
SCROLL_ABSOLUTE | 605 | |
Išvardinkite įvykius | ||
Sąrašo įvykiai generuojami atsižvelgiant į sąrašo pasirinkimus. | ||
Įvykis | ID | |
LIST_SELECT | 701 | |
LIST_DESELECT | 702 | |
Įvairūs renginiai | ||
Įvairūs įvykiai generuojami reaguojant į įvairius veiksmus. | ||
Įvykis | ID | |
ACTION_EVENT | 1001 | |
LOAD_FILE | 1002 | |
IŠSAUGOTI FAILĄ | 1003 | |
GOT_FOCUS | 1004 | |
LOST_FOCUS | 1005 |
Sužinokite daugiau apie šią temą
- „Java“ pamoka pateikė Mary Campione ir Kathy Walrath. Internetinę juodraštinę versiją galima rasti adresu //java.sun.com/tutorial/index.html.
Šią istoriją „Java ir įvykių tvarkymas“ iš pradžių paskelbė „JavaWorld“.