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 :
AddKeyPressed
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 :
ChooseNextComponent
Memilih komponen selanjutnya yang harus menerima focus

AddFocusHandler
Menambahkan focus handler menggunakan KeyStroke Editor NetBeans

HasilAkhirPropertiesPallete
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

  • Share/Bookmark
Print This Post

2 Responses to “Swing Component Focus Handler Using KeyStroke Editor”

  1. @Mas Toha : Hm… saya pribadi belum pernah ngoprek maven terlalu dalam mas, tapi menurut saya. Komponen ini kan bentuk-nya jar, harusnya sih tidak ada masalah loh. Oh iya, cuma sekedar mengingatkan. Apakah library-nya udah ditambahkan ke dalam classpath project ??

  2. Mudzakkir says:

    Ooo.. Ini yang saya cari. Tidak capek menulis ulang. Makasih banyak mas.
    Saya contek nih, maklum newbie…
    Mas Martin : Asyik bukan ??
    MTH : Asyik bangeeetttsss…
    ada pertanyaan mas, saya menggunakan build maven, kenapa kok tidak bisa di drag ya? Kelas mTextField ke palete netbeans matisse gui builder?
    Kalau pakai ant bisa, kalau maven tdk bisa??,.

Leave a Reply

[+] adsenseid emoticons by Martinus Ady H. Modified from nartzco source code.