Acara dan pendengar

Bagaimana anda membuat acara khusus, dan bagaimana anda mengaktifkannya sehingga komponen dapat memperoleh acara?

Sebelum melihat peristiwa khusus, mari lihat peristiwa yang sudah ada: the ActionEvent.

Komponen seperti Buttondan JButtonmematikan ActionEventsuntuk menunjukkan beberapa jenis tindakan yang ditentukan komponen. Contohnya, Buttonapi akan dimatikan ActionEventsetiap kali pengguna menekannya. Keseluruhan titik acara adalah untuk memberitahu pendengar bahawa sesuatu telah terjadi pada komponen dalam GUI. Suatu peristiwa merangkumi semua maklumat yang diperlukan pendengar untuk mengetahui apa yang berlaku dan kepada siapa kejadian itu (apa dan siapa peristiwa itu). Suatu peristiwa mesti memberi maklumat yang cukup untuk menggambarkan dirinya sepenuhnya. Dengan cara itu, pendengar dapat mengetahui apa yang sebenarnya berlaku dan bertindak balas dengan cara yang bermakna.

Ini ActionEventmerangkumi kaedah untuk mempelajari rentetan arahan tindakan, pengubah, dan rentetan pengenalan. The getActionCommand()Cara mengembalikan rentetan arahan yang menunjukkan tindakan yang diharapkan oleh acara itu, seperti cetak atau salinan (apa). The getSource()Cara mengembalikan objek yang menjana acara (yang).

Untuk menerima ActionEvent, pendengar mesti melaksanakan ActionListenerantara muka dan mendaftarkan dirinya dengan komponen. Selanjutnya, komponen mesti mengawasi pendengarnya untuk memberitahu mereka tentang suatu peristiwa.

Dengan menggunakan ActionEventcontoh sebagai model, kita dapat dengan mudah melihat potongan yang diperlukan untuk komponen untuk menghasilkan acara dan pendengar untuk mendengarkan suatu peristiwa. Pada tahap tinggi, terdapat tiga bahagian:

  1. Komponen
  2. Kelas acara
  3. Antara muka pendengar

Mari kita perhatikan masing-masing secara berasingan.

Komponen

Komponen menghasilkan peristiwa. Suatu peristiwa adalah cara komponen untuk memberitahu pendengar bahawa sesuatu telah berlaku. Oleh itu, komponen mesti menyediakan mekanisme untuk mendaftar dan membatalkan pendaftaran pendengar acara. Komponen itu juga mesti mengesan pendengarnya dan menyampaikan peristiwa kepada pendengar tersebut.

Mekanik pendaftaran / pembatalan pendaftaran dan penjejakan diserahkan kepada komponen individu. Walau bagaimanapun, komponen biasanya mempunyai addXXXListenerdan removeXXXListeneruntuk setiap jenis peristiwa yang dihasilkannya. Secara dalaman, komponen tersebut dapat menyimpan pendengar namun ia memilih; biasanya, komponen menyimpan pendengar di java.util.Vectoratau javax.swing.event.EventListenerList. Untuk mengaktifkan acara kepada pendengarnya, komponen tersebut hanya melancarkan senarai pendengarnya dan menyampaikan acara tersebut kepada setiap pendengar dengan memanggil kaedah pengiriman acara pendengar.

Sudah tiba masanya untuk contoh:

... EventListenerList xxxListeners = new EventListnerList(); public void addXXXListener(XXXListener listener) { xxxListeners.add(XXXListener.class, listener); } public void removeXXXListener(XXXListener listener) { xxxListeners.remove(XXXListener.class, listener); } protected void fireXXX(XXXEvent xxxEvent) { Object[] listeners = xxxListeners.getListenerList(); // loop through each listener and pass on the event if needed Int numListeners = listeners.length; for (int i = 0; i
    

This example shows how to register, deregister, and fire events of type XXXEvent. Listeners can register and deregister themselves through the addXXXListener() and removeXXXListener() methods. When an event occurs, the component creates an event object and passes it to the fireXXX() method, where it is passed to the listeners.

The example defines a generic recipe that all components can follow. However, in order for the example to work, you must define an XXXEvent and an XXXListener interface.

The event class

The event holds all of the information necessary for a listener to figure out what happened. The information included is really event specific. Just think about the event carefully and design the event class to hold whatever information is necessary to fully describe the event to a listener. Events normally extend the java.awt.AWTEvent event class.

The listener interface

An event listener interface defines the methods used by a component to dispatch events. Each event type will have at least one corresponding dispatch method in a listener interface.

A listener interface takes the following generic format:

public interface XXXListener extends EventListener { // event dispatch methods somethingHappened(XXXEvent e); somethingElseHappened(XXXEvent e); ... } 

To listen for an event, a listener must implement the XXXListener interface and register itself with the component. When an event occurs, the component will call the proper dispatch method. The methods are defined in an interface so that any object can receive the event. As long as the listener implements the interface, the component will know how to dispatch the event to the listener.

Wrap-up

As you can see, there are dependencies between some of the pieces. The listener interface corresponds directly to the event. The event is necessarily the dispatch method's argument.

The component corresponds directly with the event and listener. It needs to know about each so that it can create events, dispatch events, and register listeners.

Unlike the other two pieces, the event object is independent. As a result, many components are free to fire off the event type. Furthermore, multiple interfaces may define methods to dispatch the event.

Tony Sintes is a principal consultant at BroadVision. Tony, a Sun-certified Java 1.1 programmer and Java 2 developer, has worked with Java since 1997.

This story, "Events and listeners" was originally published by JavaWorld .