Programavimas

Java ir renginių tvarkymas

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“.

Tipasvardasapibūdinimas
ObjektastaikinysNuoroda į komponentą, kuris iš pradžių gavo įvykį.
ilgaskadaLaikas, kada įvykis įvyko.
tarptidĮvykio tipas (daugiau informacijos rasite skyriuje Įvykių tipai).
tarptxX 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.
tarptyY 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.
tarptRaktasKlaviatū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.
tarptmodifikatoriaiAritmetiniu 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ą.
tarptspustelėkiteSuskaičiuotiNuoseklių pelės paspaudimų skaičius. Šis duomenų narys reikšmingas tik MOUSE_DOWN įvykiuose.
ObjektasargNuo įvykio argumentas. „Button“ objektams šis objektas yra „String“ objektas, kuriame yra mygtuko tekstūrinė etiketė.
1 lentelė: Viešųjų duomenų nariai, pateikiami pagal klasės įvykį

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.

2 lentelė: AWT apibrėžti įvykiai, rūšiuojami 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.

ĮvykisevtKitas įvykis susietame įvykių sąraše.
Langų įvykiai
Lango įvykiai generuojami atsižvelgiant į lango, rėmelio ar dialogo būsenos pokyčius.
ĮvykisID
WINDOW_DESTROY201
WINDOW_EXPOSE202
WINDOW_ICONIFY203
WINDOW_DEICONIFY204
WINDOW_MOVED205
Klaviatūros įvykiai
Klaviatūros įvykiai generuojami reaguojant į paspaudžiamus ir atleidžiamus klavišus, kai komponentas turi įvesties dėmesį.
ĮvykisID
MYGTUKO PASPAUDIMAS401
PAGRINDINIS PRANEŠIMAS402
KEY_ACTION403
KEY_ACTION_RELEASE404
Pelės įvykiai
Pelės įvykiai generuojami reaguojant į pelės veiksmus, vykstančius komponento ribose.
ĮvykisID
PELĖ_ŽEMYN501
PELĖ_UP502
PELĖS_MOVE503
PELĖ_ENTERIS504
MOUSE_EXIT505
PELĖ_DRAG506
Slinkite įvykius
Slinkimo įvykiai generuojami reaguojant į manipuliavimą slinkties juostomis.
ĮvykisID
SCROLL_LINE_UP601
SCROLL_LINE_DOWN602
SCROLL_PAGE_UP603
SCROLL_PAGE_DOWN604
SCROLL_ABSOLUTE605
Išvardinkite įvykius
Sąrašo įvykiai generuojami atsižvelgiant į sąrašo pasirinkimus.
ĮvykisID
LIST_SELECT701
LIST_DESELECT702
Įvairūs renginiai
Įvairūs įvykiai generuojami reaguojant į įvairius veiksmus.
ĮvykisID
ACTION_EVENT1001
LOAD_FILE1002
IŠSAUGOTI FAILĄ1003
GOT_FOCUS1004
LOST_FOCUS1005
Toddas Sundstedas programavo nuo tada, kai kompiuteriai tapo prieinami darbalaukio modeliuose. Nors Toddas iš pradžių domėjosi paskirstytų objektų programų kūrimu C ++, Toddas persikėlė į „Java“ programavimo kalbą, kai „Java“ tapo akivaizdžiu pasirinkimu tokiems dalykams. Be rašymo, Toddas teikia interneto ir žiniatinklio programų konsultavimo paslaugas JAV pietryčių įmonėms.

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“.

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