Traversal atau penelusuran berarti memindahkan fokus dari satu kontrol ke kontrol lain. Tombol traversal berbeda dengan tombol akselerasi dan tombol sistem jendela (yang akan dibahas nanti), yaitu : Suatu kontrol bebas memilih apakah akan menjalankan operasi traversal atau mengolah tombol yang ditekan. Jika kontrol memilih untuk menjalankan operasi traversal maka tombol tersebut tidak akan diproses lebih lanjut.
Ada dua jenis traversal, yaitu mnemonik dan tab.
Traversal Mnemonik
Mnemonik biasanya tertulis sebagai karakter yang diberi garis bawah pada label suatu widget. Suatu aksi akan dilakukan jika user menekan kombinasi tombol yang cocok dengan mnemonik tersebut, biasanya dengan menekan tombol bersamaan dengan karakter yang digaris bawah tersebut.
Gambar berikut adalah contoh mnemonik pada program OpenOffice ketika kita membuka kotak dialog Format Font
Jika kita menekan + H maka tampilan Help akan ditampilkan.
Menekan tombol kombinasi untuk memanggil mnemonik sama dengan mengaktifkan widget tersebut. Pada contoh di atas, mnemonik + H diterapkan pada tombol, yang artinya ketika kita menekan + H, sama dengan kita menekan tombol Help. Beberapa widget yang tidak bisa menerima pilihan, seperti label dan kotak grup masih bisa menerima mnemonik, akan tetapi fungsinya hanya untuk memindahkan fokus ke widget tersebut.
Bagaimana caranya menambahkan mnemonik? Mudah saja. Cukup tambahkan '&' di depan karakter yang akan kita tandai sebagai mnemonik, kemudian masukkan string ini sebagai argumen pada metode setText() suatu widget. Misalnya pada perintah berikut :
akan membuat tombol dengan mnemonik + K, seperti pada gambar berikut ini :
Untuk membuat mnemonik pada karakter '&' sendiri, gunakan '&&', misalnya "Ini && Itu" akan menghasilkan "Ini & Itu"
Traversal Tab
Traversal tab didukung pada semua platform. Tidak seperti pada mnemonik, pada traversal tab, kita tidak perlu mendefinisikan apa-apa, karena setiap platform memiliki cara sendiri bagaimana memindahkan fokus dari satu widget ke widget lain. Misalnya, ketika kita menekan tombol, maka fokus akan otomatis pindah ke widget berikutnya. Ketika sampai pada widget terakhir, maka fokus akan diulang dari widget pertama.
Nama traversal tab mungkin agak sedikit salah sasaran, karena sepertinya hanya tombol saja yang bisa digunakan untuk memindahkan fokus dari satu widget ke widget lain. Pada beberapa platform, menekan tombol panah juga memindahkan fokus.
Beberapa tombol lain seperti digunakan untuk menutup kotak dialog, dan sebenarnya termasuk dalam tombol traversal tab juga.
Berikut ini adalah daftar event dan listener yang berkaitan dengan traversal.
Berikut ini adalah isi event ketika event traversal terjadi.
detail berisi salah satu dari nilai-nilai berikut.
Variabel detail bukan hanya untuk dibaca akan tetapi kita juga bisa mengisinya apabila kita ingin mengubah jenis traversal. Misalnya kita ingin mengubah tombol bukan untuk menutup dialog akan tetapi untuk memindahkan fokus ke widget lain, kita bisa mengisi variabel detail dengan SWT.TRAVERSE_ARROW_PREVIOUS.
doit digunakan untuk membatalkan traversal jika variabel ini diisi false. Akan tetapi lihat bahwa pada variabel detail juga bisaSWT.TRAVERSE_NONE. Apa perbedaannya? Ingat bahwa tombol yang tidak digunakan untuk traversal akan diberikan kepada widget yang menerima traversal untuk diolah lebih lanjut.
Artinya jika event doit kita isi dengan true, traversal akan dilakukan dan tombol akan "dikonsumsi" (tidak diberikan kepada widget untuk diproses kembali). Jika doit kita isi denga false, traversal tidak dilakukan dan tombol akan diberikan kepada widget untuk diproses.
Apa yang terjadi jika detail juga diisi dengan SWT.TRAVERSE_NONE? Jika detail diisi dengan SWT.TRAVERSE_NONE maka widget tidak akan melakukan traversal, tidak peduli apakah isi doit berisi true atau false. Akan tetapi, variabel doitmenentukan apakah tombol akan diberikan kepada widget untuk diproses.
Jadi jika doit berisi false dan detail berisi SWT.TRAVERSE_NONE, maka tombol akan diberikan kepada widget, dan traversal tidak dilakukan. Akan tetapi jika doit berisi true dan detail berisi SWT.TRAVERSE_NONE, maka traversal tidak dilakukan, dan tombol akan dikonsumsi dan tidak akan diberikan kepada widget.
Berikut ini adalah contoh penggunaan traversal.
Program ini akan membuat 6 tombol. Coba tekan tombol . Fokus akan pindah ke tombol berikutnya setiap kali Anda menekan tombol . Ketika Anda melewati tombol 4 atau tombol 6, akan tercetak "Button {4} ditelusuri". Jika Anda menekan tombol + fokus akan berpindah ke tombol sebelumnya. Akan tetapi jika Anda sampai pada tombol 4 atau tombol 6, event traversal yang terjadi akan ditangkap dan traversal akan diabaikan. Akibatnya Anda tidak akan bisa pindah dari tombol 4 ke tombol 3 atau tombol 6 ke tombol 5. Pada saat yang sama di konsol akan tercetak "Anda tidak bisa kembali!".
Program lengkapnya adalah sebagai berikut, yang bisa diunduh di sini.
Ada dua jenis traversal, yaitu mnemonik dan tab.
Traversal Mnemonik
Mnemonik biasanya tertulis sebagai karakter yang diberi garis bawah pada label suatu widget. Suatu aksi akan dilakukan jika user menekan kombinasi tombol yang cocok dengan mnemonik tersebut, biasanya dengan menekan tombol
Gambar berikut adalah contoh mnemonik pada program OpenOffice ketika kita membuka kotak dialog Format Font
Jika kita menekan
Menekan tombol kombinasi untuk memanggil mnemonik sama dengan mengaktifkan widget tersebut. Pada contoh di atas, mnemonik
Bagaimana caranya menambahkan mnemonik? Mudah saja. Cukup tambahkan '&' di depan karakter yang akan kita tandai sebagai mnemonik, kemudian masukkan string ini sebagai argumen pada metode setText() suatu widget. Misalnya pada perintah berikut :
Button tombol1 = new Button(shell, SWT.PUSH); tombol1.setText("&Klik saya");
Untuk membuat mnemonik pada karakter '&' sendiri, gunakan '&&', misalnya "Ini && Itu" akan menghasilkan "Ini & Itu"
Traversal Tab
Traversal tab didukung pada semua platform. Tidak seperti pada mnemonik, pada traversal tab, kita tidak perlu mendefinisikan apa-apa, karena setiap platform memiliki cara sendiri bagaimana memindahkan fokus dari satu widget ke widget lain. Misalnya, ketika kita menekan tombol
Nama traversal tab mungkin agak sedikit salah sasaran, karena sepertinya hanya tombol
Beberapa tombol lain seperti
Berikut ini adalah daftar event dan listener yang berkaitan dengan traversal.
Kelas Event (event bertipe) | Interface/Kelas Listener(listener bertipe) | Metode (listener bertipe) | Jenis event (event tanpa tipe) | Penjelasan |
TraverseEvent | TraverseListener | keyTraversed(TraverseEvent) | SWT.Traverse | Navigasi pada keyboard dideteksi |
Nama Field | Penjelasan |
detail | Detail traversal yang terjadi |
doit | Suatu boolean yang bisa digunakan untuk membatalkan aksi traversal |
isi detail | Penjelasan |
SWT.TRAVERSE_ESCAPE | Traversal yang terjadi ditutupnya suatu kotak dialog, misalnya dengan menekan tombol Cancel atau tombol |
SWT.TRAVERSE_RETURN | Traversal yang terjadi ketika kotak dialog selesai diisi misalnya setelah menekan tombol OK atau tombol |
SWT.TRAVERSE_TAB_PREVIOUS | Traversal yang terjadi ketika fokus pindah ke group tab sebelumnya |
SWT.TRAVERSE_TAB_NEXT | Traversal yang terjadi ketika fokus pindah ke group tab sesudahnya |
SWT.TRAVERSE_ARROW_PREVIOUS | Traversal yang terjadi ketika fokus pindah ke item sebelumnya |
SWT.TRAVERSE_ARROW_NEXT | Traversal yang terjadi ketika fokus pindah ke item sesudahnya |
SWT.TRAVERSE_MNEMONIC | Traversal mnemonik terjadi |
SWT.TRAVERSE_PAGE_PREVIOUS | Traversal yang terjadi ketika untuk pindah ke halaman sebelumnya pada kotak dialog |
SWT.TRAVERSE_PAGE_NEXT | Traversal yang terjadi ketika untuk pindah ke halaman berikutnya pada kotak dialog |
SWT.TRAVERSE_NONE | Traversal tidak terjadi |
doit digunakan untuk membatalkan traversal jika variabel ini diisi false. Akan tetapi lihat bahwa pada variabel detail juga bisaSWT.TRAVERSE_NONE. Apa perbedaannya? Ingat bahwa tombol yang tidak digunakan untuk traversal akan diberikan kepada widget yang menerima traversal untuk diolah lebih lanjut.
Artinya jika event doit kita isi dengan true, traversal akan dilakukan dan tombol akan "dikonsumsi" (tidak diberikan kepada widget untuk diproses kembali). Jika doit kita isi denga false, traversal tidak dilakukan dan tombol akan diberikan kepada widget untuk diproses.
Apa yang terjadi jika detail juga diisi dengan SWT.TRAVERSE_NONE? Jika detail diisi dengan SWT.TRAVERSE_NONE maka widget tidak akan melakukan traversal, tidak peduli apakah isi doit berisi true atau false. Akan tetapi, variabel doitmenentukan apakah tombol akan diberikan kepada widget untuk diproses.
Jadi jika doit berisi false dan detail berisi SWT.TRAVERSE_NONE, maka tombol akan diberikan kepada widget, dan traversal tidak dilakukan. Akan tetapi jika doit berisi true dan detail berisi SWT.TRAVERSE_NONE, maka traversal tidak dilakukan, dan tombol akan dikonsumsi dan tidak akan diberikan kepada widget.
Berikut ini adalah contoh penggunaan traversal.
Program lengkapnya adalah sebagai berikut, yang bisa diunduh di sini.
package com.lyracc.traversalkustom; import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.*; public class TraversalKustom { /** * @param args */ public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setSize(300, 200); Button b1 = new Button(shell, SWT.PUSH); Button b2 = new Button(shell, SWT.PUSH); Button b3 = new Button(shell, SWT.PUSH); Button b4 = new Button(shell, SWT.PUSH); Button b5 = new Button(shell, SWT.PUSH); Button b6 = new Button(shell, SWT.PUSH); b1.setBounds(10,10,50,50); b2.setBounds(100,10,50,50); b3.setBounds(200,10,50,50); b4.setBounds(10,100,50,50); b5.setBounds(100,100,50,50); b6.setBounds(200,100,50,50); b1.setText("1"); b2.setText("2"); b3.setText("3"); b4.setText("4"); b5.setText("5"); b6.setText("6"); TraverseListener traverseListener = new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { System.out.println("Anda tidak bisa kembali!"); e.doit = false; } System.out.println(e.widget + " ditelusuri"); } }; b4.addTraverseListener(traverseListener); b6.addTraverseListener(traverseListener); shell.open(); while (!shell.isDisposed()) if (!display.readAndDispatch()) display.sleep(); display.dispose(); } }
Tidak ada komentar:
Posting Komentar