Programmēšana

Java un notikumu apstrāde

Lai lielākā daļa programmu būtu noderīgas, tām jāatbild uz lietotāja komandām. Lai to izdarītu, Java programmas paļaujas uz notikumiem, kas apraksta lietotāju darbības.

Pagājušajā mēnesī es parādīju, kā no Java klases bibliotēkas abstraktā ievades rīkkopa piedāvātajiem komponentiem savākt grafisko lietotāja saskarni. Pēc dažu šādu saskarņu salikšanas es īsi runāju par notikumu apstrādes tēmu, bet es apstājos līdz pilnīgam notikumu apstrādes aprakstam, kā to īstenoja AWT. Šomēnes mēs turpinām turpināties, kur beidzām.

Jābūt notikumu virzītam

Tālā pagātnē programmai, kas vēlējās uzzināt, ko dara lietotājs, pašai bija aktīvi jāapkopo šāda informācija. Praksē tas nozīmēja, ka pēc programmas inicializācijas tā ievadīja lielu cilpu, kurā atkārtoti meklēja, vai lietotājs dara kaut ko interesantu (piemēram, nospiežot pogu, pieskaroties taustiņam, pārvietojot slīdni, pārvietojot peli). un pēc tam veica atbilstošās darbības. Šī tehnika ir pazīstama kā aptauja.

Aptaujā darbs tiek paveikts, taču tā parasti ir apgrūtinoša, ja to izmanto mūsdienu lietojumprogrammās divu saistītu iemeslu dēļ: Pirmkārt, aptaujas izmantošana mēdz visu notikumu apstrādes kodu ievietot vienā vietā (lielās cilpas iekšpusē); otrkārt, iegūtā mijiedarbība lielajā cilpā mēdz būt sarežģīta. Turklāt aptaujas veikšanai ir nepieciešama programma, kas sēž cilpā, patērējot CPU ciklus, vienlaikus gaidot, kad lietotājs kaut ko dara - nopietna vērtīga resursa izšķiešana.

AWT atrisināja šīs problēmas, pieņemot citu paradigmu, kas ir visu mūsdienu logu sistēmu pamatā: uz notikumiem balstīta programmēšana. AWT ietvaros visas lietotāja darbības pieder abstraktam lietu kopumam, ko sauc notikumiem. Notikums pietiekami detalizēti apraksta konkrētu lietotāja darbību. Tā vietā, lai programma aktīvi apkopotu lietotāju veidotus notikumus, Java izpildes laiks paziņo programmai, kad notiek interesants notikums. Tiek uzskatīts, ka programmas, kas šādā veidā apstrādā lietotāju mijiedarbību notikuma vadīts.

Pasākuma klase

Pasākuma klase ir galvenais spēlētājs pasākuma spēlē. Tas mēģina uztvert visu lietotāju ģenerēto notikumu pamatīpašības. 1. tabula uzskaita publisko datu dalībniekus, kurus nodrošina klases Event.

TipsNosaukumsApraksts
ObjektsmērķisAtsauce uz komponentu, kas sākotnēji saņēma notikumu.
ilgikadLaiks, kurā notikums notika.
intidNotikuma veids (papildinformāciju skatiet sadaļā Notikumu veidi).
intxX koordināta, kurā notikusi darbība, salīdzinājumā ar komponentu, kas pašlaik apstrādā notikumu. Dotam notikumam x koordinātas vērtība mainīsies, notikumam virzoties uz augšu komponentu hierarhijā. Koordinātu plaknes izcelsme ir komponenta augšējā kreisajā stūrī.
intyY koordināta, kurā notikusi darbība, salīdzinājumā ar komponentu, kas pašlaik apstrādā notikumu. Noteiktam notikumam y koordinātas vērtība mainīsies, notikumam virzoties uz augšu komponentu hierarhijā. Koordinātu plaknes izcelsme ir komponenta augšējā kreisajā stūrī.
inttaustiņuTastatūras notikumiem tikko nospieda taustiņa atslēgas kodu. Tās vērtība parasti būs atslēgas pārstāvētā rakstura Unicode vērtība. Citas iespējas ietver īpašo taustiņu HOME, END, F1, F2 un tā tālāk vērtības.
intmodifikatoriAritmētiski vai mainīta vērtību SHIFT_MASK, CTRL_MASK, META_MASK un ALT_MASK kombinācija. Tās vērtība norāda attiecīgi nobīdes, vadības, meta un alt taustiņu stāvokli.
intnoklikšķiniet uzSkaitītSecīgu peles klikšķu skaits. Šis datu dalībnieks ir nozīmīgs tikai MOUSE_DOWN notikumos.
ObjektsargNo notikuma atkarīgs arguments. Pogas objektiem šis objekts ir virkne, kas satur pogas tekstūras etiķeti.
1. tabula. Publisko datu dalībnieki, kas norādīti pēc notikuma klases

Kā es paskaidrošu sadaļā ar nosaukumu Notikumu nosūtīšana un izplatīšana, klases Event gadījumu parasti izveido Java izpildlaika sistēma. Tomēr programmai ir iespējams izveidot un nosūtīt notikumus komponentiem, izmantojot tos postEvent () metodi.

Pasākumu veidi

Kā minēts iepriekš, klase Event ir lietotāja saskarnes notikuma modelis. Notikumi, protams, iedalās kategorijās atkarībā no notikuma veida (notikuma veidu norāda id datu biedrs). 2. tabulā ir uzskaitīti visi AWT noteiktie notikumi, sakārtoti pēc kategorijām.

2. tabula: Notikumi, kurus nosaka AWT, sakārtoti pēc kategorijām

Var būt pamācoši redzēt notikumu ģenerēšanu darbībā. Poga 1. attēlā, nospiežot, izveido notikumu pārlūku, kurā tiek parādīta notikumu informācija par pārlūka saņemtajiem notikumiem. Notikuma pārlūka avota kods ir pieejams šeit.

Lai apskatītu šo sīklietotni, jums ir nepieciešama Java pārlūkprogramma

1. attēls: Notikuma ģenerēšana darbībā

Notikumu nosūtīšana un izplatīšana

Apsveriet sīklietotni 2. attēlā. Tas sastāv no diviem pogas klases gadījumiem, kas iegulti paneļa klases instancē. Šis paneļa klases gadījums pats par sevi ir iestrādāts citā paneļa klases instancē. Pēdējais paneļa klases gadījums atrodas zem klases TextArea gadījuma, un abi gadījumi ir iegulti Applet klases instancē. 3. attēlā ir parādīti elementi, kas veido šo sīklietotni, kas izvietoti kā koks, ar lapām TextArea un Button gadījumus un kā sakni Applet instanci. (Lai iegūtu papildinformāciju par komponentu hierarhisko izkārtojumu lietotāja saskarnē, lasiet iepriekšējā mēneša ievadu AWT.)

Lai apskatītu šo sīklietotni, jums ir nepieciešama Java pārlūkprogramma

2. attēls: Nodarbībās iegultās klases

3. attēls: sīklietotņu elementu koks (hierarhija)

Kad lietotājs mijiedarbojas ar 2. attēlā redzamo sīklietotni, Java izpildlaika sistēma izveido klases Event gadījumu un piepilda savus datu dalībniekus ar informāciju, kas apraksta darbību. Tad Java izpildlaika sistēma ļauj sīklietotnei rīkoties ar notikumu. Tas sākas ar komponentu, kas sākotnēji saņēma notikumu (piemēram, pogu, uz kuras tika noklikšķināts), un pa komponentu koku pārvietojas uz augšu, līdz tas sasniedz konteineru koka augšpusē. Katram komponentam ir iespēja ignorēt notikumu vai reaģēt uz to vienā (vai vairākos) no šiem veidiem:

  • Mainīt notikuma instances datu dalībniekus
  • Veiciet darbības un veiciet nelielu aprēķinu, pamatojoties uz notikumā ietverto informāciju
  • Norādiet Java izpildlaika sistēmai, ka notikumam nevajadzētu virzīties tālāk pa koku

Java izpildlaika sistēma nodod notikuma informāciju komponentam, izmantojot komponenta handleEvent () metodi. Visi derīgi handleEvent () metodēm jābūt pēc formas

publiskais būla pārraksts Event (notikums e) 

Notikumu apstrādātājam ir nepieciešama viena informācija: atsauce uz notikumu klases gadījumu, kurā ir informācija par tikko notikušo notikumu.

Vērtība, kas atgriezta no handleEvent () metode ir svarīga. Java izpildlaika sistēmai tas norāda, vai notikums ir pilnībā apstrādāts notikumu apstrādātājā. Patiesa vērtība norāda, ka notikums ir apstrādāts un pavairošana jāpārtrauc. Nepatiesa vērtība norāda, ka notikums tika ignorēts, to nevarēja apstrādāt vai tas tika apstrādāts nepilnīgi, un tam jāturpina augšup pa koku.

Apsveriet šādu iedomātas lietotāja mijiedarbības ar sīklietotni aprakstu 2. attēlā. Lietotājs noklikšķina uz pogas ar nosaukumu "Viens". Java valodas izpildlaika sistēma apkopo informāciju par notikumu (klikšķu skaitu, klikšķa atrašanās vietu, klikšķa iestāšanās laiku un komponentu, kas saņēmis klikšķi) un šo informāciju iesaiņo notikuma klases instancē. Pēc tam Java izpildlaika sistēma sākas ar komponentu, uz kura tika noklikšķināts (šajā gadījumā poga apzīmēta ar "Viens"), un, veicot zvanu komponenta handleEvent () metode piedāvā komponentam iespēju reaģēt uz notikumu. Ja komponents neapstrādā notikumu vai apstrādā notikumu nepilnīgi (norāda atgriežamo vērtību false), Java izpildlaika sistēma piedāvā notikuma gadījumu nākamajam augstākajam komponentam kokā - šajā gadījumā Paneļa klase. Java izpildlaika sistēma šādā veidā turpinās, līdz notikums tiek apstrādāts vai izpildes laika sistēmā nav komponentu, kurus izmēģināt. 4. attēlā ir parādīts šī notikuma ceļš, kad sīklietotne mēģina to apstrādāt.

4. attēls: notikuma ceļš

Katrs komponents, kas veido 2. attēlā esošo sīklietotni, objektam TextArea pievieno līniju, kas norāda, ka tā ir saņēmusi notikumu. Pēc tam tas ļauj notikumam pāriet uz nākamo koka komponentu. 1. sarakstā ir tipiska koda kods handleEvent () metodi. Pilns šīs sīklietotnes avota kods ir pieejams šeit.

public boolean handleEvent (Event evt) {if (evt.id == Event.ACTION_EVENT) {ta.appendText ("Panel" + str + "zāģēšanas darbība ... \ n"); } else if (evt.id == Notikums.MOUSE_DOWN) {ta.appendText ("Panelis" + str + "zāģa pele uz leju ... \ n"); }

atgriešanās super.handleEvent (evt); }

1. saraksts: tipisks handleEvent () metodi

Pasākumu palīgu metodes

The handleEvent () metode ir viena vieta, kur programmētājs var ievietot lietojumprogrammas kodu notikumu apstrādei. Reizēm komponentu tomēr interesēs tikai noteikta veida notikumi (piemēram, peles notikumi). Šādos gadījumos programmētājs kodu var ievietot a palīga metode, nevis ievietot to handleEvent () metodi.

Šeit ir saraksts ar programmētājiem pieejamajām palīgu metodēm. Noteiktu veidu notikumiem nav palīgu metožu.

darbība (notikuma evt, objekts ko)

gotFocus (notikuma evt, objekts ko)

lostFocus (notikuma evt, objekts ko)

mouseEnter (notikuma evt, int x, int y)

mouseExit (notikuma evt, int x, int y)

mouseMove (notikuma evt, int x, int y)

mouseUp (notikuma evt, int x, int y)

mouseDown (notikuma evt, int x, int y)

mouseDrag (Notikuma evt, int x, int y)

keyDown (notikuma evt, int atslēga)

keyUp (notikuma evt, int atslēga)

nepatiesa, lai norādītu, ka palīga metode nav rīkojusies ar notikumu.

Programmas ieviešana handleEvent () klases sniegtā metode Komponents izsauc katru palīga metodi. Šī iemesla dēļ ir svarīgi, lai no jauna definētu handleEvent () metode atvasinātajās klasēs vienmēr beidzas ar apgalvojumu

atgriešanās super.handleEvent (e);

2. saraksta kods ilustrē šo kārtulu.

public boolean handleEvent (Event e) {if (e.Mana pogas mērķa instance) {// do something ... return true; }

atgriešanās super.handleEvent (e); }

2. saraksts: noteikuma izbeigšana handleEvent () metodi

Šī vienkāršā noteikuma neievērošana novērsīs pareizu palīgu metožu izmantošanu.

5. attēlā ir sīklietotne, kas apstrādā peles notikumus, tikai izmantojot kodu, kas ievietots palīgmetodēs. Avota kods ir pieejams šeit.

NotikumsevtNākamais notikums saistītajā notikumu sarakstā.
Logu pasākumi
Logu notikumi tiek ģenerēti, reaģējot uz izmaiņām loga, rāmja vai dialoga stāvoklī.
NotikumsID
WINDOW_DESTROY201
WINDOW_EXPOSE202
WINDOW_ICONIFY203
WINDOW_DEICONIFY204
WINDOW_MOVED205
Tastatūras pasākumi
Tastatūras notikumi tiek ģenerēti, reaģējot uz taustiņu nospiešanu un atlaišanu, kamēr komponentam ir ievades fokuss.
NotikumsID
KEY_PRESS401
ATSLĒGŠANA402
KEY_ACTION403
KEY_ACTION_RELEASE404
Peles notikumi
Peles notikumi tiek ģenerēti, reaģējot uz peles darbībām, kas notiek komponenta robežās.
NotikumsID
MOUSE_DOWN501
PELES_UP502
PELE_MOVE503
PELES_ENTERIS504
MOUSE_EXIT505
PELE_DRAG506
Ritināt pasākumus
Ritināšanas notikumi tiek ģenerēti, reaģējot uz ritjoslu manipulācijām.
NotikumsID
SCROLL_LINE_UP601
SCROLL_LINE_DOWN602
SCROLL_PAGE_UP603
SCROLL_PAGE_DOWN604
SCROLL_ABSOLUTE605
Uzskaitiet notikumus
Saraksta notikumi tiek ģenerēti, reaģējot uz sarakstā izdarītajām atlasēm.
NotikumsID
LIST_SELECT701
LIST_DESELECT702
Dažādi pasākumi
Dažādi notikumi tiek ģenerēti, reaģējot uz dažādām darbībām.
NotikumsID
ACTION_EVENT1001
LOAD_FILE1002
SAGLABĀT FAILU1003
GOT_FOCUS1004
LOST_FOCUS1005
Tods Sundsteds ir programmējis kopš datori kļuva pieejami galddatoru modeļos. Lai arī sākotnēji Tods interesējās par izplatītu objektu lietojumprogrammu izveidi C ++, Tods pārcēlās uz Java programmēšanas valodu, kad Java kļuva par acīmredzamu izvēli šāda veida lietām. Papildus rakstīšanai Tods sniedz konsultācijas par interneta un tīmekļa lietojumprogrammām uzņēmumiem ASV dienvidaustrumos.

Uzziniet vairāk par šo tēmu

  • Java apmācība autori Mērija Kampione un Keitija Valrata. Tiešsaistes melnraksta versija ir pieejama vietnē //java.sun.com/tutorial/index.html.

Šo stāstu "Java un notikumu apstrāde" sākotnēji publicēja JavaWorld.

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