Kamis, 15 Desember 2011

Penanganan Mouse


Semua sistem operasi di mana SWT diimplementasikan mendukung perangkat tunjuk. Biasanya berbentuk mouse, akan tetapi bisa jadi berupa trackball, trackpad, atau jenis perangkat keras lainnya. Pada komputer genggam, perangkat tunjuk bisa jadi berupa stylus. Untuk mempermudah pembahasan, kita akan gunakan mouse sebagai perangkat tunjuk, tidak peduli bagaimana perangkat aslinya.

Posisi suatu mouse biasanya digambarkan dalam bentuk ikon kecil pada layar yang disebut kursor. Hal ini berlaku untuk semua platform, kecuali pada Windows CE, karena perangkat Windows CE biasanya berupa perangkat tunjuk "langsung", seperti stylys, yang tidak membutuhkan kursor.

Mouse biasanya memiliki tiga tombol (kecuali pada Macintosh yang hanya memiliki satu tombol, walaupun sebenarnya mouse lebih dari 1 tombol pun bisa digunakan). Mouse digunakan untuk menunjuk, klik, geser (drag) dan memilih komponen kontrol GUI. Bisa juga digunakan untuk menampilkan menu konteks yang biasanya ditampilkan dengan mengklik kanan suatu mouse. Perilaku "drag-and-drop" mouse kurang lebih sangat bergantung pada platformnya.

Ketika kita menggeser mouse, kursor akan berbah bentuk, tergantung dari kontrol apa di bawahnya. Misalnya, widget teks akan mengubah tampilan kursor seperti huruf I untuk menunjukkan bahwa user bisa mengetikkan sesuatu pada widget tersebut. Di dalam kursor, ada titik pusat yang menunjukkan koordinat x dan y suatu mouse ketika event pada mouse terjadi.

Event pada Mouse

Ketika tombol mouse ditekan atau mouse digerakkan, event mouse dibuat dan akan diberikan kepada widget yang ada di bawahnya. Akan tetapi ketika tombol mouse ditekan dan ditahan (terus ditekan), dan mouse berada di luar widget (mungkin ada di widget lain atau pada aplikasi lain di desktop), eventnya akan diberikan kepada widget awal di mana mouse tersebut ditekan. Pengalihan event sementara ini disebut pengambilan mouse. Widget yang menerima event disebut widget pengambil. Pengambilan mouse terhadi secara otomatis pada SWT. (Ini mungkin bukan sesuatu masalah, akan tetapi sebagai informasi saja kepada Anda).

Tabel - Isi Event Mouse ketika suatu tombol mouse ditekan, dilepaskan atau mouse digeser
Nama FieldPenjelasan
buttonTombol yang ditekan atau dilepaskan
xKoordinat x ketika event terjadi
yKoordinat y ketika event terjadi
stateMaskBit mask yang menyatakan kondisi keyboard dan mouse sebelum event terjadi

Ketika mouse ditekan atau dilepas, field bernama "button" akan diisi oleh tombol mana yang ditekan. Tombol mouse diberi nomor dari kiri ke kanan yang dimulai dari 1. Untuk user kidal (dan mengkonfigurasi sistem operasi untuk orang kidal), penomoran tombol tetap sama, akan tetapi dimulai dari kanan ke kiri. Pemetaan tombol untuk orang kidal ini tidak tampak oleh SWT dan aplikasi kita, karena dilakukan secara otomatis oleh sistem operasi.

Ketika terjadi event pada mouse, koordinat x dan y-nya juga dilaporkan dalam event. Koordinat yang dilaporkan adalah koordinat relatif widget ketika event tersebut dibuat (bukan koordinat global layar atau aplikasi kita). Karena user mungkin telah memindahkan mouse setelah menekan tombol, maka lokasi sebenarnya ketika event ini ditangani mungkin berbeda dengan ketika event dibuat. Hal ini untuk menghindari program kita untuk bertindak terlalu sensitif terhadap pergerakan mouse. (Jika kita membutuhkan lokasi yang aktual pada saat-saat tertentu, kita bisa menggunakan metode getCursorLocation() yang dimiliki oleh kelas Display.)

Event pada mouse juga menggunakan field lain yang dinamakan stateMask untuk menunjukkan keadaan mouse. Seperti pada penanda tombol, stateMask berisi keadaan mouse sebelum terjadinya suatu event. Misalnya, jika tidak ada tombol mouse yang ditekan atau tombol keyboard lain yang ditekan ketika tombol kiri mouse ditekan, maka event mouse akan diisi dengan buttonbernilai 1 dan stateMask bernilai 0. stateMask tidak berisi "tombol 1". Akan tetapi ketika terjadi event lain ketika mouse kiri sedang ditekan, maka stateMask akan berisi 1.

Keadaan suatu mouse dilambangkan oleh konstanta pada kelas SWT, seperti pada tabel berikut :
stateMaskPenjelasan
SWT.BUTTON1Tombol 1 ditekan
SWT.BUTTON2Tombol 2 ditekan
SWT.BUTTON3Tombol 3 ditekan
SWT.BUTTON_MASKBitwise-OR dari tombol-tombol yang ditekan
Berikut ini adalah event pada mouse yang disediakan oleh SWT. Seperti disebutkan pada bagian sebelumnya, event dan listener SWT terdiri dari event/listener tanpa tipe dan event/listener bertipe. Keduanya disarikan dalam tabel berikut :
Kelas Event (event bertipe)Interface/Kelas Listener(listener bertipe)Metode (listener bertipe)Jenis event (event tanpa tipe)Penjelasan
MouseEventMouseListener (dan MouseAdapter)
mouseDoubleClick(MouseEvent)
SWT.MouseDoubleClick
Mouse di-double click
mouseDown(MouseEvent)SWT.MouseDownTombol mouse ditekan
mouseUp(MouseEvent)SWT.MouseUpTombol mouse dilepaskan
MouseEventMouseMoveListenermouseMove(MouseEvent)SWT.MouseMoveMouse berpindah posisi
MouseEventMouseTrackListener (dan MouseTrackAdapter)
mouseEnter(MouseEvent)
SWT.MouseEnter
Mouse masuk ke wilayah klien
mouseExit(MouseEvent)
SWT.MouseExit
Mouse berada di sekitar klien
mouseHover(MouseEvent)
SWT.MouseHover
Mouse keluar dari wilayah klien
Mari kita lihat contoh penggunaan mouse event pada program berikut. Anda bisa mengunduh program ini dan mengimportnya pada Eclipse di sini.
package net.lyracc.pelacakmouse;
 
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
 
public class PelacakMouse {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // Membuat display dan shell baru
        Display display = new Display();
        Shell shell = new Shell(display);
 
        // Kelas Listener baru, menggunakan listener tanpa tipe
        Listener mouseListener = new Listener() {
 
            // metode handleEvent pada interface Listener harus diimplementasikan
            public void handleEvent(Event e) {
                String output = "UNKNOWN";
                switch (e.type) {
                    case SWT.MouseDown: output = "DOWN"; break;
                    case SWT.MouseUp: output = "UP"; break;
                    case SWT.MouseMove: output = "MOVE"; break;
                    case SWT.MouseDoubleClick:
                        output = "DOUBLE";
                        break;
                    case SWT.MouseEnter: output="ENTER"; break;
                    case SWT.MouseExit: output = "EXIT"; break;
                    case SWT.MouseHover: output="HOVER"; break;
                }
 
                // Mengambil stateMask pada event, kemudian menampilkannya 
                // dalam bentuk heksadesimal
                output += ": stateMask=0x"
                    + Integer.toHexString(e.stateMask);
 
                // Jika tombol Ctrl ditekan, tambahkan CTRL pada keluarannya
                if ((e.stateMask & SWT.CTRL) != 0)
                    output += " CTRL";
 
                // Jika tombol Alt ditekan, tambahkan ALT pada keluarannya
                if ((e.stateMask & SWT.ALT) != 0)
                    output += " ALT";
 
                // Jika tombol Shift ditekan, tambahkan SHIFT pada keluarannya
                if ((e.stateMask & SWT.SHIFT) != 0)
                    output += " SHIFT";
 
                // Jika tombol Command ditekan, tambahkan COMMAND pada keluarannya
                if ((e.stateMask & SWT.COMMAND) != 0)
                    output += " COMMAND";
 
                // Jika tombol kiri mouse ditekan, tambahkan BUTTON1 pada keluarannya
                if ((e.stateMask & SWT.BUTTON1) != 0)
                    output += " BUTTON1";
 
                // Jika tombol tengah mouse ditekan, tambahkan BUTTON2 pada keluarannya
                if ((e.stateMask & SWT.BUTTON2) != 0)
                    output += " BUTTON2";
 
                // Jika tombol kanan mouse ditekan, tambahkan BUTTON3 pada keluarannya
                if ((e.stateMask & SWT.BUTTON3) != 0)
                    output += " BUTTON3";
 
                // Mengambil field button pada event, kemudian menampilkannya 
                // dalam bentuk heksadesimal
                output += ", button=0x"
                    + Integer.toHexString(e.button);
 
                // Mengambil koordinat x dan y
                output += ", x=" + e.x + ", y=" + e.y;
 
                // Menampilkan pesan keluaran pada konsol
                System.out.println(output);
            }
 
        };
 
        // Tambahkan listener pada setiap event yang ingin kita pantau
        shell.addListener(SWT.MouseDown, mouseListener);
        shell.addListener(SWT.MouseUp, mouseListener);
        shell.addListener(SWT.MouseMove, mouseListener);
        shell.addListener(SWT.MouseDoubleClick, mouseListener);
        shell.addListener(SWT.MouseEnter, mouseListener);
        shell.addListener(SWT.MouseExit, mouseListener);
        shell.addListener(SWT.MouseHover, mouseListener);
 
        // Ubah ukuran jendela menjadi 200 x 200 piksel
        shell.setSize(200, 200);
 
        // Perintah "standar" SWT, harus ada pada setiap aplikasi SWT
        shell.open();
        while (!shell.isDisposed())
            if (!display.readAndDispatch()) 
                display.sleep();
        display.dispose();
    }
}

Program di atas akan melacak aktivitas mouse kemudian menampilkannya pada konsol. Jangan lupa untuk menambahkan pustaka SWT sebelum menjalankan program ini seperti dibahas pada bagian ini.

Klik Run pada Eclipse dan jalankan sebagai Java Application. Setelah jendela aplikasi yang kita buat keluar, coba jalankan mouse dan perhatikan "Console" pada Eclipse seperti gambar berikut.

Tidak ada komentar:

Posting Komentar