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.
Tips | Nosaukums | Apraksts |
Objekts | mērķis | Atsauce uz komponentu, kas sākotnēji saņēma notikumu. |
ilgi | kad | Laiks, kurā notikums notika. |
int | id | Notikuma veids (papildinformāciju skatiet sadaļā Notikumu veidi). |
int | x | X 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ī. |
int | y | Y 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ī. |
int | taustiņu | Tastatū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. |
int | modifikatori | Aritmē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. |
int | noklikšķiniet uzSkaitīt | Secīgu peles klikšķu skaits. Šis datu dalībnieks ir nozīmīgs tikai MOUSE_DOWN notikumos. |
Objekts | arg | No notikuma atkarīgs arguments. Pogas objektiem šis objekts ir virkne, kas satur pogas tekstūras etiķeti. |
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.
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ūkprogramma1. 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ūkprogramma2. 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.
Notikums | evt | Nā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ī. | ||
Notikums | ID | |
WINDOW_DESTROY | 201 | |
WINDOW_EXPOSE | 202 | |
WINDOW_ICONIFY | 203 | |
WINDOW_DEICONIFY | 204 | |
WINDOW_MOVED | 205 | |
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. | ||
Notikums | ID | |
KEY_PRESS | 401 | |
ATSLĒGŠANA | 402 | |
KEY_ACTION | 403 | |
KEY_ACTION_RELEASE | 404 | |
Peles notikumi | ||
Peles notikumi tiek ģenerēti, reaģējot uz peles darbībām, kas notiek komponenta robežās. | ||
Notikums | ID | |
MOUSE_DOWN | 501 | |
PELES_UP | 502 | |
PELE_MOVE | 503 | |
PELES_ENTERIS | 504 | |
MOUSE_EXIT | 505 | |
PELE_DRAG | 506 | |
Ritināt pasākumus | ||
Ritināšanas notikumi tiek ģenerēti, reaģējot uz ritjoslu manipulācijām. | ||
Notikums | ID | |
SCROLL_LINE_UP | 601 | |
SCROLL_LINE_DOWN | 602 | |
SCROLL_PAGE_UP | 603 | |
SCROLL_PAGE_DOWN | 604 | |
SCROLL_ABSOLUTE | 605 | |
Uzskaitiet notikumus | ||
Saraksta notikumi tiek ģenerēti, reaģējot uz sarakstā izdarītajām atlasēm. | ||
Notikums | ID | |
LIST_SELECT | 701 | |
LIST_DESELECT | 702 | |
Dažādi pasākumi | ||
Dažādi notikumi tiek ģenerēti, reaģējot uz dažādām darbībām. | ||
Notikums | ID | |
ACTION_EVENT | 1001 | |
LOAD_FILE | 1002 | |
SAGLABĀT FAILU | 1003 | |
GOT_FOCUS | 1004 | |
LOST_FOCUS | 1005 |
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.