Swing Component Focus Handler Using KeyStroke Editor
Buat teman-teman yang sering membangun aplikasi menggunakan GUI Toolkit Swing pasti sudah tahu bagaimana caranya menambahkan focus handler pada komponen Swing. Sebagai contohnya, kita ingin menambahkan focus pada JTextField agar ketika kita menekan ENTER maka focus akan berpindah ke komponen yang lain. Nah biasanya, langkah yang kita lakukan adalah sebagai berikut :
1. Klik kanan pada JTextField kemudian memilih Event > Key > Key Pressed seperti gambar dibawah ini :

Menambahkan Focus Handler Secara Manual
2. Setelah itu kita tambahkan handler untuk mendeteksi penekanan tombol ENTER kemudian secara manual memindahkan focus ke komponen yang lain seperti kode dibawah ini:
156 157 158 159 160 161 | private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { if (evt.getKeyChar() == KeyEvent.VK_ENTER) { /* Pindahkan focus ke jTextField2 */ jTextField2.requestFocusInWindow(); } } |
Nah sekarang bayangkan bagaimana jika ada beberapa komponen lain yang harus kita tambahkan focusnya dengan cara seperti diatas ?? Tentunya pasti capek, karena kita harus mengetikkan kode yang sama berulang-ulang
Dengan membuat sebuah custom komponen sendiri dan memanfaatkan fasilitas KeyStroke Editor yang terdapat pada NetBeans IDE, sekarang kita bisa menambahkan focus handler dengan mudah seperti gambar dibawah ini :

Memilih komponen selanjutnya yang harus menerima focus

Menambahkan focus handler menggunakan KeyStroke Editor NetBeans

Hasil akhir yang terlihat pada Pallete Properties NetBeans
dan kode yang ditambahkan oleh NetBeans adalah seperti berikut :
88 89 90 | mTextField1.setText("mTextField1"); mTextField1.setNextComponent(jTextField2); mTextField1.setNextComponentHandler(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER, 0)); |
Hm… lebih mudah bukan ?? Karena kita sudah tidak perlu melakukan proses ketik-mengetik lagi
Dan sekarang, bagaimana caranya membuat agar custom komponen kita seperti diatas ?? Caranya sangat mudah, yaitu kita tinggal meng-extends komponen Swing yang ingin kita gunakan dan tambahkan 2 buah property seperti kode dibawah ini :
45 46 47 48 49 50 51 52 53 54 55 56 | /** * * @author martin */ public class MTextField extends javax.swing.JTextField implements Serializable { .... .... private KeyStroke nextComponentHandler; private Component nextComponent; .... .... |
Setelah menambahkan 2 buah property seperti diatas, sekarang tambahkan method getter dan setter untuk menerima inputan dari user dan agar terlihat dari Pallete Properties milik NetBeans seperti dibawah ini:
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | public Component getNextComponent() { return nextComponent; } public void setNextComponent(Component nextComponent) { this.nextComponent = nextComponent; } public KeyStroke getNextComponentHandler() { return nextComponentHandler; } public void setNextComponentHandler(KeyStroke nextComponentHandler) { this.nextComponentHandler = nextComponentHandler; } |
Sekarang buatlah sebuah protected class yang meng-implements-kan KeyListener dan menangkap aksi keyPressed yang terjadi seperti kode dibawah ini:
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | //////////////////////////////////////////////////////////////////////////// // NextComponentHandler ini digunakan untuk memindahkan focus sekarang ke // komponen selanjutnya berdasarkan KeyStroke yang diberikan oleh client // melalui method setNextComponentHandler(); /////////////////////////////////////////////////////////////////////////// protected class NextComponentHandler implements KeyListener { public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void keyPressed(KeyEvent e) { if (nextComponentHandler != null && nextComponent != null) { if (e.getKeyCode() == nextComponentHandler.getKeyCode()) { nextComponent.requestFocusInWindow(); } } } } |
Langkah terakhir yang harus kita lakukan yaitu menambahkan class NextComponentHandler ini pada custom komponen kita dengan cara menambahkannya pada constructor komponen kita seperti kode dibawah ini:
58 59 60 61 62 63 64 65 66 67 68 69 70 | ......
......
public MTextField(Document doc, String text, int columns) {
super(doc, text, columns);
addActionHandler();
}
......
......
private void addActionHandler() {
addKeyListener(new NextComponentHandler());
} |
Setelah selesai, sekarang coba lakukan proses build agar kita mendapatkan file *.jar dari custom komponen kita kemudian tambahkanlah ke NetBeans Pallete dan coba gunakan. Asyik bukan ??
Related Link:
- Source Lengkap MTextField
- Sample NetBeans Project Focus
- Membuat dan Menambahkan Swing Custom Component Ke NetBeans Pallete