Kamis, 15 Desember 2011

Traversal

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 :
Button tombol1 = new Button(shell, SWT.PUSH);
tombol1.setText("&Klik saya");
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.
Kelas Event (event bertipe)Interface/Kelas Listener(listener bertipe)Metode (listener bertipe)Jenis event (event tanpa tipe)Penjelasan
TraverseEventTraverseListenerkeyTraversed(TraverseEvent)SWT.TraverseNavigasi pada keyboard dideteksi
Berikut ini adalah isi event ketika event traversal terjadi.
Nama FieldPenjelasan
detailDetail traversal yang terjadi
doitSuatu boolean yang bisa digunakan untuk membatalkan aksi traversal
detail berisi salah satu dari nilai-nilai berikut.
isi detailPenjelasan
SWT.TRAVERSE_ESCAPETraversal yang terjadi ditutupnya suatu kotak dialog, misalnya dengan menekan tombol Cancel atau tombol
SWT.TRAVERSE_RETURNTraversal yang terjadi ketika kotak dialog selesai diisi misalnya setelah menekan tombol OK atau tombol
SWT.TRAVERSE_TAB_PREVIOUSTraversal yang terjadi ketika fokus pindah ke group tab sebelumnya
SWT.TRAVERSE_TAB_NEXTTraversal yang terjadi ketika fokus pindah ke group tab sesudahnya
SWT.TRAVERSE_ARROW_PREVIOUSTraversal yang terjadi ketika fokus pindah ke item sebelumnya
SWT.TRAVERSE_ARROW_NEXTTraversal yang terjadi ketika fokus pindah ke item sesudahnya
SWT.TRAVERSE_MNEMONICTraversal mnemonik terjadi
SWT.TRAVERSE_PAGE_PREVIOUSTraversal yang terjadi ketika untuk pindah ke halaman sebelumnya pada kotak dialog
SWT.TRAVERSE_PAGE_NEXTTraversal yang terjadi ketika untuk pindah ke halaman berikutnya pada kotak dialog
SWT.TRAVERSE_NONETraversal tidak terjadi
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.
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