Kamis, 15 Desember 2011

Event dan Listener


Event

Event adalah inti dari pemrograman GUI. GUI program tidak memiliki alur apa yang akan terjadi ketika program dijalankan, dalam arti langkah per langkah dari awal hingga akhir. Akan tetapi, program harus bisa bereaksi akan berbagai event (kejadian) yang bisa berasal dari mouse atau keyboard. User bisa menekan tombol keyboard apa saja, menggeser mouse, atau menekan tombol mouse. User bisa melakukannya kapan saja, dan komputer harus bisa bereaksi dengan tepat.

Dalam Java, event dilambangkan oleh objek. Ketika suatu event terjadi, sistem akan mengumpulkan informasi yang sesuai dengan even tersebut, kemudian membuat objek yang berisi informasi ini. Jenis even berbeda dilambangkan oleh objek dengan kelas yang berbeda pula. Setelah objek event dibuat, ia akan diberikan sebagai parameter pada subrutin yang ditugaskan untuk menangani event tersebut. Dengan menulis subrutin ini, programmer bisa memberi tahu apa yang harus dilakukan jika mouse diklik atau keyboard ditekan, misalnya.

Sebagai programmer Java, kita hanya melihat even dari sisi yang lebih umum. Banyak sekali hal yang terjadi antara tombol ditekan hingga subrutin yang kita buat melakukan tugasnya. Secara garis besar, dalam metode main() kita harus menuliskan perulangan dalam bentuk seperti :
ketika program masih berjalan:
    Tunggu hingga even berikutnya terjadi
    Panggil subrutin untuk menangai event tersebut
Perulangan ini disebut perulangan event. Pada SWT kita harus menulis sendiri perulangan event ini pada metode main() kita dalam bentuk
while (!shell.isDisposed())
    if (!display.readAndDispatch())
        display.sleep();

SWT memiliki dua jenis event, yaitu event tanpa tipe dan event bertipe.

Event tanpa tipe diwakili oleh kelas Event. Kelas ini menyimpan informasi yang berbeda-beda tergantung dari jenis. Akan tetapi secara umum semua event jenis apapun memiliki informasi berikut :
InformasiPenjelasan
displayDisplay di mana event ini terjadi
widgetWidget di mana event ini terjadi
typeJenis event yang terjadi
Jenis event yang terjadi beserta penjelasannya dirangkum dalam tabel berikut ini :
Jenis EventPenjelasan
SWT.KeyDownTombol ditekan
SWT.KeyUpTombol dilepaskan
SWT.MouseDownTombol mouse ditekan
SWT.MouseUpTombol mouse dilepaskan
SWT.MouseMoveMouse berpindah posisi
SWT.MouseEnterMouse masuk ke wilayah klien
SWT.MouseHoverMouse berada di sekitar klien
SWT.MouseExitMouse keluar dari wilayah klien
SWT.MouseDoubleClickMouse di-double click
SWT.PaintSuatu widget diberi perintah untuk menggambar dirinya
SWT.MovePosisi suatu widget berubah
SWT.ResizeUkuran widget berubah
SWT.DisposeWidget dihapus
SWT.SelectionSuatu aksi pemilihan dilakukan dalam widget (misalnya memilih item pada drop down list
SWT.DefaultSelectionAda pilihan awal pada suatu widget
SWT.FocusInWidget menerima fokus dari keyboard
SWT.FocusOutWidget kehilangan fokus dari keyboard
SWT.ExpandItem pada pohon dikembangkan
SWT.CollapseItem pada pohon ditutup
SWT.IconifyJendela Shell diminimasi
SWT.DeiconifyJendela Shell dibuka (restore)
SWT.CloseJendela Shell ditutup (dengan tombol X)
SWT.ShowWidget bisa dilihat
SWT.HideWidget disembunyikan
SWT.ModifyTeks berubah pada suatu kontrol
SWT.VerifyInput teks sedang diverifikasi
SWT.ActivateWidget sedang diaktifkan
SWT.DeactivateWidget dimatikan
SWT.HelpUser meminta pertolongan tentang suatu widget
SWT.DragDetectAksi drag-and-drop dideteksi
SWT.MenuDetectUser menekan tombol kik kanan untuk mengaktifkan menu konteks
SWT.ArmItem pada menu digambarkan
SWT.TraverseNavigasi pada keyboard dideteksi
SWT.HardKeyDownTombol pada hardware ditekan (untuk perangkat genggam)
SWT.HardKeyUpTombol pada hardware dilepas (untuk perangkat genggam)

Suatu event juga bisa memiliki tipe. Artinya event yang dihasilkan merupakan objek bertipe suatu kelas, misalnya MouseEvent, bukan hanya bertipe kelas Event yang jenisnya disimpan dalam variabel tertentu. Event bertipe mengikuti pola JavaBeans standar. Kelas-kelas ini terdapat dalam paket org.eclipse.swt.events

Tabel berikut menggambarkan perbandingan antara event bertipe dan jenis event dari event tanpa tipe.
Event BertipeJenis Event Tanpa Tipe
ArmEventSWT.Arm
ControlEvent
SWT.Move
SWT.Resize
DisposeEventSWT.Dispose
FocusEvent
SWT.FocusIn
SWT.FocusOut
HelpEventSWT.Help
KeyEvent
SWT.KeyDown
SWT.KeyUp
MenuEvent
SWT.Hide
SWT.Show
ModifyEventSWT.Modify
MouseEvent
SWT.MouseDoubleClick
SWT.MouseDown
SWT.MouseUp
MouseEventSWT.MouseMove
MouseEvent
SWT.MouseEnter
SWT.MouseExit
SWT.MouseHover
PaintEventSWT.Paint
SelectionEvent
SWT.DefaultSelection
SWT.Selection
ShellEvent
SWT.Activate
SWT.Close
SWT.Deactivate
SWT.Iconify
SWT.Deiconify
TraverseEventSWT.Traverse
TreeEvent
SWT.Collapse
SWT.Expand
VerifyEventSWT.Verify
Pertanyannya kenapa ada dua jenis event yang berbeda?

Pada versi awal SWT, hanya ada satu jenis yaitu jenis tanpa tipe. Setelah diskusi yang cukup antar beberapa programmer Eclipse, komunitas user SWT dan developernya, maka akhirnya diputuskan untuk menambahkan jenis bertipe seperti pada JavaBeans. Alasannya adalah untuk memudahkan pemrograman SWT bagi programmer yang sudah terlanjur terbiasa dengan AWT/Swing. Jenis tanpa tipe masih tetap ada seperti biasa.

Listener

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.

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 berikutremoveListener(int jenisEvent, 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 metodenotifyListeners, yang memiliki bentuk sepertinotifyListeners(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 sepertiaddDisposeListener(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 event) {
        // 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() danwidgetDefaultSelected, yang keduanya mengambil argumen bertipe SelectionEvents. Dalam hal ini kelasSelectionAdapter 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 bentukremoveDisposeListener(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 BertipeInterface ListenerMetodeJenis Event Tanpa Tipe
ArmEventArmListenerwidgetArmed(ArmEvent)SWT.Arm
ControlEventControlListener (dan ControlAdapter)
controlMoved(ControlEvent)
controlResized(ControlEvent)
SWT.Move
SWT.Resize
DisposeEventDisposeListenerwidgetDisposed(DisposeEvent)SWT.Dispose
FocusEventFocusListener (dan FocusAdapter)
focusGained(FocusEvent)
focusLost(FocusEvent)
SWT.FocusIn
SWT.FocusOut
HelpEventHelpListenerhelpRequested(HelpEvent)SWT.Help
KeyEventKeyListener (dan KeyAdapter)
keyPressed(KeyEvent)
keyReleased(keyEvent)
SWT.KeyDown
SWT.KeyUp
MenuEventMenuListener (dan MenuAdapter)
menuHidden(MenuEvent)
menuShown(MenuEvent)
SWT.Hide
SWT.Show
ModifyEventModifyListenermodifyText(ModifyEvent)SWT.Modify
MouseEventMouseListener (dan MouseAdapter)
mouseDoubleClick(MouseEvent)
mouseDown(MouseEvent)
mouseUp(MouseEvent)
SWT.MouseDoubleClick
SWT.MouseDown
SWT.MouseUp
MouseEventMouseMoveListenermouseMove(MouseEvent)SWT.MouseMove
MouseEventMouseTrackListener (dan MouseTrackAdapter)
mouseEnter(MouseEvent)
mouseExit(MouseEvent)
mouseHover(MouseEvent)
SWT.MouseEnter
SWT.MouseExit
SWT.MouseHover
PaintEventPaintListenerpaintControl(PaintEvent)SWT.Paint
SelectionEventSelectionListener (dan SelectionAdapter)
widgetDefaultSelected(SelectionEvent)
widgetSelected(SelectionEvent)
SWT.DefaultSelection
SWT.Selection
ShellEventShallListener (dan ShellAdapter)
shellActivated(ShellEvent)
shellClosed(ShellEvent)
shellDeactivated(ShellEvent)
shellIconified(ShellEvent)
shellDeiconified(ShellEvent)
SWT.Activate
SWT.Close
SWT.Deactivate
SWT.Iconify
SWT.Deiconify
TraverseEventTraverseListenerkeyTraversed(TraverseEvent)SWT.Traverse
TreeEventTreeListener (dan TreeAdapter)
treeCollapsed(TreeEvent)
treeExpanded(TreeEvent)
SWT.Collapse
SWT.Expand
VerifyEventVerifyListenerverifyText(VerifyEvent)SWT.Verify

Tidak ada komentar:

Posting Komentar