Supaya suatu event berarti, suatu program harus bisa mendeteksi event dan bereaksi akan event tersebut. Untuk mendeteksi suatu event, suatu program harus mendengarkannya. Mendengarkan event ini dilakukan oleh objek yang berna,a
pendengar event (event listener). Objek listener harus memiliki metode instansi untuk menangani event yang didengarkannya. Bentuknya bervariasi tergantung dari jenis event yang ditanganinya.
Ada beberapa hal detail yang harus diingat untuk bisa bekerja dengan event. Beberapa langkah yang harus diingat :
1. Menambahkan import paket yang dibutuhkan, misalnya "org.eclipse.swt.events"
2. Mendeklarasikan kelas yang mengimplementasikan interface suatu listener
3. Menambahkan aksi yang dilakukan oleh kelas baru tersebut. Aksi ini adalah aksi yang dilakukan untuk menangani suatu event
4. Mendaftarkan event tersebut ke komponen yang mungkin memberikan event.
Objek apapun bisa bertindah sebagai event listener asalkan ia mengimplementasikan interface yang tepat. Suatu komponen dapat mendengarkan event yang dihasilkannya sendiri. Suatu kelas dapat dibuat secara khusus hanya untuk mendengarkan suatu event. Kebanyakan orang menganggap lebih mudah untuk menggunakan kelas bertingkat anonim untuk mendengarkan suatu objek. (Kelas bertingkat anonim telah dibahas sebelumnya
di sini).
Seperti hanya Event, SWT memiliki dua jenis listener : tanpa tipe dan bertipe. Masing-masing digunakan untuk menangani event tanpa tipe dan event bertipe.
Listener Tanpa Tipe (untuk menangani event tanpa tipe)
nterface generik yang digunakan untuk menangai event tanpa tipe dinamakan
Listener
. Listener tanpa tipe dapat ditambahkan pada suatu widget dengan menggunakan metode
addListener()
.
Metode
addListener()
memiliki bentuk seperti
addListener(int jenisEvent, Listener listener)
Metode ini akan menambah
listener
ke dalam koleksi listener yang akan dipanggil ketika event tipe tertentu terjadi. Ketika suatu event terjadi, maka listener akan dipanggil dengan menggunakan metode
handleEvent()
.
Contoh berikut mengilustrasikan bagaimana menambah suatu Listener ke dalam suatu widget, yang akan dipanggil ketika event SWT.Dispose terjadi.
widget.addListener(SWT.Dispose, new Listener() {
public void handleEvent(Event event) {
// widget was disposed
}
});
Perhatikan bahwa bentuk di atas menggunakan kelas anonim yang langsung diturunkan dari interface Listener. Di dalam kelas anonim tersebut, metode
handleEvent()
harus diimplementasikan, di mana implementasinya adalah tugas yang harus dilakukan ketika widget dihapus.
Jika beberapa listener ditambahkan, maka mereka akan dipanggil dengan urutan ketika mereka ditambahkan (first in first called). Artinya listener pertama diberi kesempatan untuk mengolah event (mungkin untuk memfilter sejumlah data) sebelum listener lain melakukan tugasnya. Kita juga bisa menambah listener yang sama beberapa kali, yang artinya listener tersebut akan dipanggil beberapa kali.
Kita bisa menghapus listener dari suatu widget dengan menggunakan metode
removeListener()
. Bentuknya adalah sebagai berikut
removeListener(int jenhsEvent, Listener listener)
Untuk menghapus suatu listener, kita harus memberikan instansi yang persisi sama ketika listener tersebut ditambahkan. JIka beberapa instansi listener yang sama sudah ditambahkan sebelumnya, maka kita harus menghapusnya berulang kali sejumlah ia ditambahkan. Secara umum, menghapus suatu listener mungkin tidak diperlukan. Listener akan diambil oleh pemulung memori ketika suatu widget dihapus dan listener ini tidak lagi digunakan di manapun di dalam program.
Kita juga bisa memanggil suatu listener untuk melakukan tugas tertentu, yaitu dengan menggunakan metode
notifyListeners
, yang memiliki bentuk seperti
notifyListeners(int jenisEvent, Event event)
jenisEvent
adalah jenis event yang akan dilakukan, dan Event adalah objek yang berisi event yang akan dilakukan. Hal penting yang harus dicatat adalah memanggil metode
notifyListeners()
tidak menyebabkan event akan benar-benar terjadi. Misalnya memanggil
notifyListeners()
dengan jenis
SWT.MouseDown
tidak akan menyebabkan tombol terlihat seperti ditekan. Dan juga memanggil
notifyListeners()
tidak menjamin bahwa semua data pada event terinisialisasi seperti pada event sesungguhnya.
Listener Bertipe (untuk menangani Event bertipe)
Karena event bertipe dibuat mengikuti pola listener pada JavaBeans, penggunaan listener bertipe sangat mirip dengan penggunaan listener pada AWT/Swing.
Misalnya untuk mendengarkan event ketika suatu widget dihapus, maka aplikasi bisa menggunakan
addDisposeListener()
, yang memiliki bentuk seperti
addDisposeListener(DisposeListener listener)
Metode ini menambahkan listener ke dalam koleksi listener yang akan dipanggil ketike suatu widget dihapus. Ketika suatu widget dihapus, maka listener akan dipanggil dengan memanggil metode widgetDisposed()
.
Potongan kode berikut digunakan untuk menangani event ketika suatu widget dihapus.
widget.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent dvent) {
// widget was disposed
}
});
DisposeListener
adalah suatu interface. Jika ada lebih dari satu metode yang didefinisikan dalam listener, maka SWT akan secara otomatis menambahkan kelas adapter yang berisi implementasi kosong dari metode-metode yang didefinisikan pada interface tersebut. Misalnya interface
SelectionListener
memiliki dua metode, yaitu
widgetSelected()
dan
widgetDefaultSelected
, yang keduanya mengambil argumen bertipe
SelectionEvents
. Dalam hal ini kelas
SelectionAdapter
tersedia untuk memberikan implementasi kosong untuk setiap metode. Kelas adapter ini hanyalah sebagai kelas bantu yang sesuai dengan konvensi pada listener JavaBeans.
Listener bertipe bisa dihapus dengan menggunakan metode penghapus untuk setiap listner. Misalnya, listener untuk event ketika suatu widget dihapus bisa dibuang dengan menggunakan
removeDisposeListener()
, yang memiliki bentuk
removeDisposeListener(DisposeListener listener)
listener
adalah objek listener yang akan dihapus dari koleksi listener yang dipanggil ketika widget dihapus.
Tabel berikut merangkum event bertipe, nama interface listener yang menanganinya, serta metode pada interface tersebut, dibandingkan dengan listener tanpa tipe.
Event Bertipe | Interface Listener | Metode | Jenis Event Tanpa Tipe |
ArmEvent | ArmListener | widgetArmed(ArmEvent) | SWT.Arm |
ControlEvent | ControlListener (dan ControlAdapter) | controlMoved(ControlEvent)
controlResized(ControlEvent) | SWT.Move
SWT.Resize |
DisposeEvent | DisposeListener | widgetDisposed(DisposeEvent) | SWT.Dispose |
FocusEvent | FocusListener (dan FocusAdapter) | focusGained(FocusEvent)
focusLost(FocusEvent) | SWT.FocusIn
SWT.FocusOut |
HelpEvent | HelpListener | helpRequested(HelpEvent) | SWT.Help |
KeyEvent | KeyListener (dan KeyAdapter) | keyPressed(KeyEvent)
keyReleased(keyEvent) | SWT.KeyDown
SWT.KeyUp |
MenuEvent | MenuListener (dan MenuAdapter) | menuHidden(MenuEvent)
menuShown(MenuEvent) | SWT.Hide
SWT.Show |
ModifyEvent | ModifyListener | modifyText(ModifyEvent) | SWT.Modify |
MouseEvent | MouseListener (dan MouseAdapter) | mouseDoubleClick(MouseEvent)
mouseDown(MouseEvent)
mouseUp(MouseEvent) | SWT.MouseDoubleClick
SWT.MouseDown
SWT.MouseUp |
MouseEvent | MouseMoveListener | mouseMove(MouseEvent) | SWT.MouseMove |
MouseEvent | MouseTrackListener (dan MouseTrackAdapter) | mouseEnter(MouseEvent)
mouseExit(MouseEvent)
mouseHover(MouseEvent) | SWT.MouseEnter
SWT.MouseExit
SWT.MouseHover |
PaintEvent | PaintListener | paintControl(PaintEvent) | SWT.Paint |
SelectionEvent | SelectionListener (dan SelectionAdapter) | widgetDefaultSelected(SelectionEvent)
widgetSelected(SelectionEvent) | SWT.DefaultSelection
SWT.Selection |
ShellEvent | ShallListener (dan ShellAdapter) | shellActivated(ShellEvent)
shellClosed(ShellEvent)
shellDeactivated(ShellEvent)
shellIconified(ShellEvent)
shellDeiconified(ShellEvent) | SWT.Activate
SWT.Close
SWT.Deactivate
SWT.Iconify
SWT.Deiconify |
TraverseEvent | TraverseListener | keyTraversed(TraverseEvent) | SWT.Traverse |
TreeEvent | TreeListener (dan TreeAdapter) | treeCollapsed(TreeEvent)
treeExpanded(TreeEvent) | SWT.Collapse
SWT.Expand |
VerifyEvent | VerifyListener | verifyText(VerifyEvent) | SWT.Verify |