Manipularea evenimentelor utilizând clase interne anonime

Java: Articole Manipularea evenimentelor folosind clase interne anonime

Atunci când dezvoltați o interfață grafică (GUI) în Java, o mulțime de lucruri se desfășoară în configurarea procesatorilor de evenimente pentru fiecare componentă ale cărei evenimente doriți să le urmăriți. În mod obișnuit, aceasta include implementarea unuia sau mai multor agenți de procesare a evenimentelor și supraîncărcarea metodelor necesare acestor componente în implementarea clasei.

Dacă aveți mai multe componente, gestionarea acestor operatori de evenimente generează adesea o durere de cap mare. De exemplu, luați în considerare un applet Java care are mai multe butoane, fiecare dintre acestea, atunci când este apăsat, efectuează o sarcină unică. Pentru fiecare buton, trebuie să alocăm unui ActionListener să proceseze clicurile de mouse ale utilizatorului și să supraîncărcă metoda actionPerformed.

Dacă există în punerea în aplicare de clasă și aplicarea ActionListener actionPerformed metoda de suprasarcină noastre, vom procesa toate evenimentele butonul din cadrul applet-ului nostru. Din păcate, pentru că fiecare buton este monitorizat de tot asa ActionListener, metoda noastră actionPerformed trebuie să efectueze mai multe comparații pentru a determina care buton a fost apăsat. De obicei, se transformă comutator urât sau dacă / declarație altfel, după cum se arată mai jos, și nu este într-adevăr o bună abordare orientată spre obiect.

O altă abordare este crearea unei clase separate pentru fiecare componentă, al cărui singur scop este de a gestiona evenimentele din această componentă. Această abordare este mai bună în sensul că este mai orientată spre obiecte, dar creează o grămadă de fișiere noi de clasă pe care trebuie să le monitorizați. În plus, prin procesarea evenimentelor într-o clasă separată, veți pierde accesul la toate câmpurile din applet. În plus, utilizarea acestei abordări mărește și numărul de cereri HTTP pe care un browser trebuie să le execute pentru a descărca un applet.

Deci, ce facem? Acum, dacă am putea construi toate prelucrările evenimentelor din cadrul clasei noastre de aplicații, fără a sacrifica abordarea orientată spre obiecte. Putem face acest lucru folosind clase interne anonime.

Clasele anonime sunt clase fără nume, formate nu numai de către constructor, ci și direct de definiția clasei. Dacă nu ați mai folosit niciodată clase anonime, atunci sintaxa poate părea un pic ciudat pentru dvs.

Fiecare component are acum propria acțiuneListener, nu există dovezi dăunătoare if / else aici. În partea de sus, toate manipularea evenimentului este centralizată într-o singură clasă, făcând această clasă mult mai ușor de gestionat. Dacă adăugați o nouă componentă la această clasă ale cărei evenimente trebuie procesate, pur și simplu trebuie să creați un nou handler de evenimente anonime.

Ca o parte nota: JBuilder - una dintre puținele medii de dezvoltare integrate, care, în mod implicit utilizează clase interioare anonime la definirea manipulare eveniment. De exemplu, atunci când se utilizează proiectantul GUI, dacă faceți dublu clic pe componenta de buton, acesta va genera automat codul pentru o clasă internă anonimă, care acționează ca o tratare a evenimentului pentru această componentă.


Avertizare. mysql_connect () [function.mysql-connect]: Nu se poate conecta la serverul MySQL local prin socket '/tmp/mysql.sock' (2), în /pub/home/javaport/javaportal/books/show2b.php pe linia 11

Avertizare. mysql_db_query () [function.mysql-db-interogare]: Nu se poate conecta la serverul MySQL local prin socket '/tmp/mysql.sock' (2), în /pub/home/javaport/javaportal/books/show2b.php pe linia 19

Avertizare. mysql_db_query () [function.mysql-db-interogare]: Un link către serverul nu a putut fi stabilită în /pub/home/javaport/javaportal/books/show2b.php pe linia 19

Avertizare. mysql_fetch_array (): argumentul furnizat nu este valid Resource Resource MySQL în /pub/home/javaport/javaportal/books/show2b.php on line 30
Aflați la ce vă gândiți cu adevărat acum.


[a apărut o eroare în timpul procesării acestei directive]


Avertizare. mysql_connect () [function.mysql-connect]: Nu se poate conecta la serverul MySQL local prin socket '/tmp/mysql.sock' (2), în /pub/home/javaport/javaportal/news/worldnews.php pe linia 91

Avertizare. mysql_db_query () [function.mysql-db-interogare]: Nu se poate conecta la serverul MySQL local prin socket '/tmp/mysql.sock' (2), în /pub/home/javaport/javaportal/news/worldnews.php pe linia 93

Avertizare. mysql_db_query () [function.mysql-db-interogare]: Un link către serverul nu a putut fi stabilită în /pub/home/javaport/javaportal/news/worldnews.php pe linia 93

Avertizare. mysql_fetch_array (): argumentul furnizat nu este valabil MySQL Resource în /pub/home/javaport/javaportal/news/worldnews.php on line 95