Java dan penanganan acara

Kebanyakan program, agar berguna, harus merespon perintah dari pengguna. Untuk melakukannya, program Java mengandalkan peristiwa yang menjelaskan tindakan pengguna.

Bulan lalu saya mendemonstrasikan cara merakit antarmuka pengguna grafis dari komponen yang disediakan oleh toolkit windowing abstrak perpustakaan kelas Java. Setelah merakit beberapa antarmuka seperti itu, saya berbicara singkat tentang topik penanganan acara, tetapi saya berhenti menjelaskan deskripsi lengkap tentang penanganan acara seperti yang diterapkan oleh AWT. Bulan ini, kami melanjutkan dari yang terakhir kami tinggalkan.

Menjadi event driven

Di masa lalu, program yang ingin mengetahui apa yang dilakukan pengguna harus secara aktif mengumpulkan informasi tersebut sendiri. Dalam praktiknya, ini berarti bahwa setelah program diinisialisasi sendiri, ia memasuki lingkaran besar yang berulang kali melihat apakah pengguna melakukan sesuatu yang menarik (misalnya, menekan tombol, menyentuh tombol, menggerakkan slider, menggerakkan mouse) dan kemudian mengambil tindakan yang sesuai. Teknik ini disebut polling .

Polling menyelesaikan pekerjaan tetapi cenderung sulit digunakan dalam aplikasi modern karena dua alasan terkait: Pertama, penggunaan polling cenderung mendorong semua kode penanganan peristiwa ke satu lokasi (di dalam loop besar); kedua, interaksi yang dihasilkan dalam loop besar cenderung kompleks. Selain itu, polling memerlukan program untuk duduk dalam satu putaran, memakan siklus CPU, sambil menunggu pengguna melakukan sesuatu - pemborosan serius dari sumber daya yang berharga.

AWT memecahkan masalah ini dengan merangkul paradigma yang berbeda, yang mendasari semua sistem jendela modern: pemrograman berbasis peristiwa. Di dalam AWT, semua tindakan pengguna termasuk dalam kumpulan abstrak hal-hal yang disebut peristiwa . Peristiwa menjelaskan, dengan cukup detail, tindakan pengguna tertentu. Alih-alih program secara aktif mengumpulkan peristiwa yang dibuat pengguna, waktu proses Java memberi tahu program saat peristiwa yang menarik terjadi. Program yang menangani interaksi pengguna dengan cara ini dikatakan didorong oleh peristiwa .

Kelas acara

Kelas Acara adalah pemain utama dalam game acara. Ini mencoba untuk menangkap karakteristik dasar dari semua kejadian yang dibuat pengguna. Tabel 1 daftar anggota data publik yang disediakan oleh acara kelas.

Tipe Nama Deskripsi
Obyek target Referensi ke komponen yang pertama kali menerima acara.
panjang kapan Titik waktu terjadinya peristiwa.
int Indo Jenis peristiwa (lihat bagian Jenis Peristiwa untuk informasi selengkapnya).
int x Koordinat x tempat tindakan terjadi relatif terhadap komponen yang saat ini memproses peristiwa tersebut. Untuk peristiwa tertentu, koordinat x akan berubah nilainya saat peristiwa tersebut naik ke hierarki komponen. Asal dari bidang koordinat berada di pojok kiri atas komponen.
int y Koordinat y tempat tindakan terjadi relatif terhadap komponen yang saat ini memproses peristiwa tersebut. Untuk kejadian tertentu, koordinat y akan berubah nilainya saat kejadian naik pada hierarki komponen. Asal dari bidang koordinat berada di pojok kiri atas komponen.
int kunci Untuk acara keyboard, kode tombol tombol baru saja ditekan. Nilainya biasanya berupa nilai Unicode dari karakter yang diwakili oleh kunci tersebut. Kemungkinan lain termasuk nilai untuk kunci khusus HOME, END, F1, F2, dan seterusnya.
int pengubah Kombinasi aritmatika atau kombinasi nilai SHIFT_MASK, CTRL_MASK, META_MASK, dan ALT_MASK. Nilainya masing-masing mewakili status tombol shift, control, meta, dan alt.
int clickCount Jumlah klik mouse berturut-turut. Anggota data ini hanya signifikan dalam acara MOUSE_DOWN.
Obyek arg Argumen yang bergantung pada peristiwa. Untuk objek Button, objek ini adalah objek String yang berisi label tekstur tombol.
Tabel 1: Anggota data publik disediakan oleh acara kelas

Seperti yang akan saya jelaskan di bagian berjudul Pengiriman dan penyebaran acara , contoh acara kelas biasanya dibuat oleh sistem run-time Java. Namun, dimungkinkan bagi program untuk membuat dan mengirim acara ke komponen melalui postEvent()metode mereka .

Jenis acara

Seperti disebutkan di atas, kelas acara adalah model acara antarmuka pengguna. Acara biasanya dikategorikan berdasarkan jenis acara (jenis acara ditunjukkan oleh idanggota data). Tabel 2 mencantumkan semua peristiwa yang ditentukan oleh AWT, diurutkan berdasarkan kategori.

Tabel 2: Acara yang ditentukan oleh AWT, diurutkan berdasarkan kategori

Ini bisa menjadi pelajaran untuk melihat pembuatan acara beraksi. Tombol pada Gambar 1, ketika ditekan, membuat browser acara yang menampilkan informasi acara tentang acara yang diterima browser. Kode sumber untuk browser acara tersedia di sini.

Anda memerlukan browser yang mendukung Java untuk melihat applet ini

Gambar 1: Pembuatan acara beraksi

Pengiriman dan penyebaran acara

Pertimbangkan applet pada Gambar 2. Ini terdiri dari dua instance kelas Tombol, tertanam dalam sebuah instance kelas Panel. Contoh kelas Panel ini sendiri tertanam dalam contoh lain dari kelas Panel. Instance terakhir dari kelas Panel berada di bawah sebuah instance dari kelas TextArea, dan kedua instance tersebut disematkan dalam sebuah instance dari kelas Applet. Gambar 3 menyajikan elemen yang membentuk applet ini yang ditata sebagai pohon, dengan instance TextArea dan Button sebagai daunnya, dan instance Applet sebagai root. (Untuk informasi lebih lanjut tentang tata letak hierarki komponen di antarmuka pengguna, baca pengantar AWT bulan lalu.)

Anda memerlukan browser yang mendukung Java untuk melihat applet ini

Gambar 2: Kelas tertanam di dalam kelas

Gambar 3: Pohon elemen applet (hierarki)

Ketika seorang pengguna berinteraksi dengan applet pada Gambar 2, sistem run-time Java membuat instance kelas Event dan mengisi anggota datanya dengan informasi yang menjelaskan tindakan tersebut. Sistem run-time Java kemudian mengizinkan applet untuk menangani acara tersebut. Ini dimulai dengan komponen yang awalnya menerima peristiwa (misalnya, tombol yang diklik) dan bergerak ke atas pohon komponen, komponen demi komponen, hingga mencapai wadah di bagian atas pohon. Sepanjang jalan, setiap komponen memiliki kesempatan untuk mengabaikan peristiwa atau bereaksi dengan satu (atau lebih) cara berikut:

  • Ubah anggota data dari contoh Acara
  • Ambil tindakan dan lakukan beberapa perhitungan berdasarkan informasi yang terkandung dalam acara tersebut
  • Tunjukkan pada sistem run-time Java bahwa peristiwa tersebut harus menyebar tidak lebih jauh ke atas pohon

Sistem run-time Java meneruskan informasi acara ke komponen melalui metode komponen handleEvent(). Semua handleEvent()metode yang valid harus dalam bentuk

public boolean handleEvent (Event e) 

Penangan peristiwa memerlukan satu bagian informasi: referensi ke instance kelas Peristiwa yang berisi informasi tentang peristiwa yang baru saja terjadi.

Nilai yang dikembalikan dari handleEvent()metode itu penting. Ini menunjukkan ke sistem run-time Java apakah acara telah sepenuhnya ditangani dalam pengendali kejadian. Nilai benar menunjukkan bahwa acara telah ditangani dan penyebaran harus dihentikan. Nilai palsu menunjukkan bahwa acara telah diabaikan, tidak dapat ditangani, atau telah ditangani secara tidak lengkap dan harus dilanjutkan ke atas pohon.

Consider the following description of an imaginary user's interaction with the applet in Figure 2. The user clicks on the button labeled "One." The Java language run-time system gathers information about the event (the number of clicks, the location of the click, the time the click occurred, and the component that received the click) and packages that information in an instance of the Event class. The Java run-time system then begins at the component that was clicked (in this case, the Button labeled "One") and, via a call to the component's handleEvent() method, offers the component a chance to react to the event. If the component does not handle the event or handles the event incompletely (indicated by a return value of false), the Java run-time system offers the Event instance to the next higher component in the tree -- in this case an instance of the Panel class. The Java run-time system continues in this manner until the event is handled or the run-time system runs out of components to try. Figure 4 illustrates the path of this event as the applet attempts to handle it.

Figure 4: The path of an event

Each component making up the applet in Figure 2 adds a line to the TextArea object that indicates it received an event. It then allows the event to propagate to the next component in the tree. Listing 1 contains the code for a typical handleEvent() method. The complete source code for this applet is available here.

public boolean handleEvent(Event evt) { if (evt.id == Event.ACTION_EVENT) { ta.appendText("Panel " + str + " saw action...\n"); } else if (evt.id == Event.MOUSE_DOWN) { ta.appendText("Panel " + str + " saw mouse down...\n"); }

return super.handleEvent(evt); }

Listing 1: A typical handleEvent() method

Event helper methods

The handleEvent() method is one place a programmer can put application code for handling events. Occasionally, however, a component will only be interested in events of a certain type (for example, mouse events). In these cases, the programmer can place the code in a helper method, rather than placing it in the handleEvent() method.

Here is a list of the helper methods available to programmers. There are no helper methods for certain types of events.

action(Event evt, Object what)

gotFocus(Event evt, Object what)

lostFocus(Event evt, Object what)

mouseEnter(Event evt, int x, int y)

mouseExit(Event evt, int x, int y)

mouseMove(Event evt, int x, int y)

mouseUp(Event evt, int x, int y)

mouseDown(Event evt, int x, int y)

mouseDrag(Event evt, int x, int y)

keyDown(Event evt, int key)

keyUp(Event evt, int key)

false to indicate that the helper method did not handle the event.

The implementation of the handleEvent() method provided by class Component invokes each helper method. For this reason, it is important that the redefined implementations of the handleEvent() method in derived classes always end with the statement

return super.handleEvent(e);

The code in Listing 2 illustrates this rule.

public boolean handleEvent(Event e) { if (e.target instanceof MyButton) { // do something... return true; }

return super.handleEvent(e); }

Listing 2: Rule for ending statement in handleEvent() method

Failure to follow this simple rule will prevent the proper invocation of helper methods.

Figure 5 contains an applet that handles mouse events solely through code placed in helper methods. The source code is available here.

Event evt The next event in a linked list of events.
Window events
Window events are generated in response to changes in the state of a window, frame, or dialog.
Event ID
WINDOW_DESTROY 201
WINDOW_EXPOSE 202
WINDOW_ICONIFY 203
WINDOW_DEICONIFY 204
WINDOW_MOVED 205
Keyboard events
Keyboard events are generated in response to keys pressed and released while a component has input focus.
Event ID
KEY_PRESS 401
KEY_RELEASE 402
KEY_ACTION 403
KEY_ACTION_RELEASE 404
Mouse events
Mouse events are generated in response to mouse actions occurring within the boundary of a component.
Event ID
MOUSE_DOWN 501
MOUSE_UP 502
MOUSE_MOVE 503
MOUSE_ENTER 504
MOUSE_EXIT 505
MOUSE_DRAG 506
Scroll events
Scroll events are generated in response to manipulation of scrollbars.
Event ID
SCROLL_LINE_UP 601
SCROLL_LINE_DOWN 602
SCROLL_PAGE_UP 603
SCROLL_PAGE_DOWN 604
SCROLL_ABSOLUTE 605
List events
List events are generated in response to selections made to a list.
Event ID
LIST_SELECT 701
LIST_DESELECT 702
Miscellaneous events
Miscellaneous events are generated in response to a variety of actions.
Event ID
ACTION_EVENT 1001
LOAD_FILE 1002
SAVE_FILE 1003
GOT_FOCUS 1004
LOST_FOCUS 1005
Todd Sundsted telah memprogram sejak komputer tersedia dalam model desktop. Meskipun awalnya tertarik untuk membangun aplikasi objek terdistribusi di C ++, Todd pindah ke bahasa pemrograman Java ketika Java menjadi pilihan yang jelas untuk hal semacam itu. Selain menulis, Todd menyediakan layanan konsultasi aplikasi Internet dan Web kepada perusahaan-perusahaan di Amerika Serikat bagian tenggara.

Pelajari lebih lanjut tentang topik ini

  • Tutorial Java oleh Mary Campione dan Kathy Walrath. Versi draf online tersedia di //java.sun.com/tutorial/index.html.

Cerita ini, "Java dan penanganan acara" pada awalnya diterbitkan oleh JavaWorld.