Kamis, 15 Desember 2011

Kontrol Fokus

Program GUI menggunakan fokus input untuk menentukan komponen mana yang yang harus menangani event dari keyboard. Pada suatu saat, hanya ada elemen pada layar yang bisa menerima input, yaitu di mana semua event dari keyboard akan diarahkan. Mungkin merupakan sesuatu yang baik untuk memberi user sedikit bantuan untuk mengetahui apakah suatu komponen memiliki fokus input. Misalnya, jika komponen tersebut adalah tempat mengetik pada program pengolah kata, maka biasanya kursornya akan berubah menjadi bentuk I dan berkedip-kedip. Contoh lainnya adalah misalnya dalam suatu formulir, input teks yang sedang dalam fokus memiliki warna latar belakang yang berbeda dengan input teks yang tidak memiliki fokus.

Untuk memberikan fokus kepada suatu komponen, kita bisa menggunakan metode setFocus() yang terdapat pada hampir semua widget. Jika kontrol adalah objek bertipe suatu widget yang bisa menerima fokus dan sukses adalah variabel bertipeboolean, maka
sukses = kontrol.setFocus();

memberi perintah kepada kontrol untuk mencoba mengambil fokus input. Jika kontrol atau salah satu komponen yang ditampungnya berhasil mengambil fokus, fungsi ini akan mengembalikan true. Jika gagal, maka false akan dikembalikan.

Widget komposit (yaitu widget yang bisa berisi widget-widget lain) akan berusaha untuk memberi fokus kepada widget yang ditampungnya sebelum mengambil fokus untuk dirinya sendiri. Beberapa widget lain, seperti label, biasanya tidak mengambil fokus. Suatu kontrol tidak bisa mengambil fokus jika ia tidak aktif atau disembunyikan, atau jika input diblokade karena modalitas (atau karena kontrol lain tidak mengijinkan fokus berpindah tempat).

Fungsi lain kontrol.isFocusControl() mengembalikan true jika kontrol tersebut sedang memegang fokus atau false jika tidak. Kita juga bisa mencari tahu kontrol mana yang sedang memiliki fokus dengan menggunakan metode pada kelas Displayyaitu Display.getFocusControl().

Berikut ini adalah daftar event dan listener yang berkaitan dengan fokus.
Kelas Event (event bertipe)Interface/Kelas Listener(listener bertipe)Metode (listener bertipe)Jenis event (event tanpa tipe)Penjelasan
FocusEventFocusListener (dan FocusAdapter)focusGained(FocusEvent)SWT.FocusInWidget menerima fokus dari keyboard
focusLost(FocusEvent)SWT.FocusOutWidget kehilangan fokus dari keyboard
Mari kita lihat contoh berikut ini untuk memahami lebih lanjut tentang fokus input. Kita akan buat 2 widget yang berupa input teks. Ketika input teks atas menerima fokus, maka judul aplikasi kita ganti dengan "Fokus pada input teks atas". Ketika input teks bawah menerima fokus, maka judul aplikasi kita ganti dengan "Fokus pada input teks bawah". Jika input teks atas kehilangan fokus, kita isi input teks yang kehilangan fokus dengan "Saya kehilangan fokus", begitu input teks atas menerima fokus kembali, kita akan hapus kalimat tersebut.

Contoh program ini dapat Anda unduh di sini, untuk diimport pada Eclipse. Pembahasan detail tentang contoh program ini akan dibahas kemudian.

Event pada Tombol

Ketika suatu tombol pada keyboard ditekan, event tombol akan dibuat dan diberikan kepada aplikasi kita. Akan tetapi, tergantung pada platformnya, kedaerahan (locale), dan kombinasi tombol, ada kalanya event tidak terjadi. Misalnya, pada karakter Eropa yang memiliki aksen, mesin pengolah karakter dari sistem operasi akan mengambil tombol tersebut untuk diolah. Misalnya pada kedaerahan Jerman jika karakter ^ ditekan kemudian diikuti dengan tombol e, maka karakter ê akan ditampilkan. Demikian juga jika tombol bantu ditekan untuk mengolah bahasa Jepang, IME akan mengolah urutan karakter menjadi karakter Kanji.

Dengan kata lain, event tingkat rendah seperti ini sangat bergantung pada platform dan sistem operasi, sehingga tidak terlalu berguna untuk kebanyakan program. SWT menyembunyikan event sistem operasi dan hanya menampilkan satu event tombol saja setelah sistem operasi selesai mengolah tombol tersebut.

Berikut ini adalah daftar event dan listener yang berkaitan dengan tombol.
Kelas Event (event bertipe)Interface/Kelas Listener(listener bertipe)Metode (listener bertipe)Jenis event (event tanpa tipe)Penjelasan
KeyEventKeyListener (dan KeyAdapter)keyPressed(KeyEvent)SWT.KeyDownTombol ditekan
keyReleased(keyEvent)SWT.KeyUpTombol dilepaskan

Event SWT.KeyDown dan SWT.KeyUp merupakan representasi tingkat tinggi dari tombol yang ditekan dan dilepaskan. Event-event ini berguna jika kita ingin mencegat suatu tombol tertentu dan melakukan aksi khusus ketika tombol itu ditekan.

Berikut ini adalah isi event keyboard ketika ditekan/dilepaskan.
Nama FieldPenjelasan
characterNilai Unicode dari karakter yang ditekan
keyCodeKonstanta yang menunjukkan tombol mana yang ditekan, misalnya SWT.PAGE_UP
stateMaskMelambangkan tombol tambahan, misalnya SWT.SHIFT
doitSuatu boolean yang bisa digunakan untuk membatalkan aksi penekanan tombol
character berisi karakter yang kita masukkan lewat keyboard setelah diolah oleh sistem operasi. Misalnya jika kita menekan tombol maka character berisi 'a'. Jika tombol dan ditekan, maka character berisi 'A'. Jika tombol dan ditekan, maka character akan diisi karakter yang bersesuaian dengan Ctrl+a, yaitu karakter dengan kode Unicode '\u0001' (atau SOH). Beberapa tombol seperti Enter, Backspace, Tab, memiliki kode karakter Unicode tersendiri. SWT juga memiliki konstanta untuk mewakili tombol-tombol ini, yaitu
Konstanta characterPenjelasan
SWT.BSTombol backspace
SWT.CRTombol Enter
SWT.DELTombol Del
SWT.ESCTombol Esc
SWT.LFTombol LF
SWT.TABTombol Tab
keyCode berisi karakter yang tidak bisa diwakilkan dengan karakter Unicode, misalnya tombol , tombol , tombol , dan lain-lain termasuk tombol angka pada keypad dan tombol <+> <-> <*> pada keypad. Beberapa tombol tersebut dilambangkan dalam konstanta sebagai berikut. Khusus untuk keypad, apabila tombol <+> ditekan, maka selainkeyCode berisi SWT.KEYPADD_ADD, character juga berisi '+'.
SWT.F1SWT.F11SWT.PAGE_DOWNSWT.KEYPAD_0SWT.KEYPAD_EQUAL
SWT.F2SWT.F12SWT.HOMESWT.KEYPAD_1SWT.KEYPAD_CR
SWT.F3SWT.F13SWT.ENDSWT.KEYPAD_2SWT.HELP
SWT.F4SWT.F14SWT.INSERTSWT.KEYPAD_3SWT.CAPS_LOCK
SWT.F5SWT.F15SWT.KEYPAD_MULTIPLYSWT.KEYPAD_4SWT.NUM_LOCK
SWT.F6SWT.ARROW_UPSWT.KEYPAD_ADDSWT.KEYPAD_5SWT.SCROLL_LOCK
SWT.F7SWT.ARROW_DOWNSWT.KEYPAD_SUBTRACTSWT.KEYPAD_6SWT.PAUSE
SWT.F8SWT.ARROW_LEFTSWT.KEYPAD_DECIMALSWT.KEYPAD_7SWT.BREAK
SWT.F9SWT.ARROW_RIGHTSWT.KEYPAD_DIVIDESWT.KEYPAD_8SWT.PRINT_SCREEN
SWT.F10SWT.PAGE_UPSWT.KEYPAD_0SWT.KEYPAD_9

stateMask berisi tombol sebelum tombol ditekan, yang biasanya , , , . Pada kebanyakan keyboard hanya ada 3 tombol pertama, akan tetapi ada juga yang memiliki lebih dari 3 tombol. Tombol-tombol ini disebut tombol pengubah.

SWT membuat tombol-tombol ini menjadi kode seperti
stateMaskPenjelasan
SWT.MOD1Tombol pengubah pertama ditekan (biasanya SWT.CONTROL pada Windows atau SWT.COMMAND pada Macintosh)
SWT.MOD2Tombol pengubah kedua ditekan (biasanya SWT.SHIFT)
SWT.MOD3Tombol pengubah ketiga ditekan (biasanya SWT.ALT)
SWT.MOD4Tombol pengubah keempat ditekan (biasanya 0)
SWT.MODIFIER_MASKGabungan dari keempatnya (menggunakan bitwise OR)
Dengan representasi seperti ini, maka SWT bisa dijalankan pada beberapa platform, dan tidak bergantung dengan tombol apa yang ada pada suatu sistem operasi. Bayangkan jika Anda ingin menggunakan + untuk membuat karakter menjadi tebal, akan tetapi tombol tidak tersedia pada Macintosh.

Untuk menguji tombol pengubah mana yang ditekan, kita bisa menggunakan bitwise AND, misalnya (e.stateMask &SWT.SHIFT).

Berikut ini adalah contoh program pelacak keyboard yang akan melaporkan tombol apa yang Anda tekan dan lepaskan. Contoh program ini dapat Anda
unduh di sini untuk mengimportnya ke dalam Eclipse. Jalankan program ini pada Eclipse, kemudian ketik apa saja di program Anda, perhatikan "Console" di Eclipse akan penuh dengan berbagai laporan tentang tombol yang ditekan dan dilepaskan.

Kadang kala dalam kondisi yang sangat langka, kita harus mengolah sendiri tombol kita sebelum diolah oleh suatu wudget. Karena SWT menggunakan widget bawaan sistem operasi, pengolahan tombol terjadi di level sistem operasi. Misalnya, ketika user mengetik pada widget teks, listener SWT.KeyDown akan dijalankan, kemudian sistem operasi akan memasukkan karakter dan menggambarnya kembali dijalankan oleh sistem operasi. Dengan menggunakan doit, kita bisa membuang karakter tersebut untuk tidak meneruskannya ke sistem operasi.

Contoh berikut akan menghalangi user untuk memasukkan karakter pada widget teks dengan mengeset doit menjadi falsesetiap kali event SWT.KeyDown terjadi.
package com.lyracc.penghalangtombol;
 
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
 
public class PenghalangTombol {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        Text text = new Text(shell, SWT.SINGLE | SWT.BORDER);
 
        text.addListener(SWT.KeyDown, new Listener() {
            public void handleEvent(Event event) {
                event.doit = false;
            }
        });
 
        text.pack();
        shell.pack();
 
        shell.open();
        while (!shell.isDisposed())
            if (!display.readAndDispatch()) 
                display.sleep();
        display.dispose();        
    }
}

Tidak ada komentar:

Posting Komentar