Tutorial : Auto Request Focus ke Komponen berikutnya Ketika menekan tombol Enter di Java

Berjumpa kembali diblog ini, kali saya akan membagikan ilmu tentang bagaimana caranya ketika kita menekan tombol enter, misalkan pada textfield, akan otomatis loncat pada komponen textfield, combobox, maupun textarea berikutnya. Java standarnya tidak menyediakan fasilitas otomatis ini, jadi kita sekarang akan mencoba memainkan rangkaian code untuk dapat merealisasikan hal tersebut.
Tanpa berlama-lama lagi silahkan kalian lihat source code dibawah ini. Kode dibawah ini cukup ditambahkan dibagian utama program atau aplikasi, misalkan di Mainframe. Silahkan dilihat dan dipelajari dengan seksama.


public class Mainframe extends Mainframe{
  
  private KeyEventPostProcessor postProcessor;  

  public Mainframe() {
     installKeyEventPostProcessor();
     // Uraian Kode lainnya
  }

  private void installKeyEventPostProcessor() {
     if (postProcessor != null) {
          return;
     }
     postProcessor = new KeyEventPostProcessor() {

       public boolean postProcessKeyEvent(KeyEvent e) {
          KeyStroke stroke = KeyStroke.getKeyStrokeForEvent(e);
          if (stroke.equals(KeyStroke.getKeyStroke("ENTER"))) {
                   KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
                }
                return false;
            }
        };
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(postProcessor);
    }

}

Dengan kode diatas sebenarnya kalian langsung mendapatkan hasil yang baik, namun ada satu trik lagi yang harus kalian perhatikan. Kalau misalkan komponen yang kalian susun memang berurutan tidak akan jadi masalah, namun misalkan komponennya ada yang dikiri terus ada yang dikanan, hal ini akan menghasilkan ketidak-beraturan perpindahan komponen. Untuk mengatasi hal tersebut, misalkan kita mempunyai komponen 2 textfield, kemudian 2 combobox, kemudian satu textarea secara berurutan dari atas sampai bawah. Kita harus mendefinisikan FocusTraversalPolicy untuk masing-masing komponen seperti yang terlihat di kode dibawah ini.

//....

    private void defineCustomFocusTraversalPolicy() {
        ArrayList<Component> comp = new ArrayList<Component>();
        comp.add(textfield1);
        comp.add(textfield2);
        comp.add(combo1.getEditor().getEditorComponent());
        comp.add(combo2.getEditor().getEditorComponent());
        comp.add(textarea1);

        MyTraversalPolicy policy = new MyFocusTraversalPolicy(comp);
        mainframe.setFocusTraversalPolicy(policy);
    }

 //....

Untuk kode diatas misalkan urutannya berbeda silahkan disesuaikan dengan keinginan kalian. Sedangkan untuk kode class MyTraversalPolicy bisa dilihat dibawah ini.

package org.motekar.util.user.misc;

import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import java.util.ArrayList;

/**
 *
 * @author Muhamad Wibawa
 */
public class MyFocusTraversalPolicy extends FocusTraversalPolicy {

    ArrayList<Component> order;

    public MyFocusTraversalPolicy(ArrayList<Component> order) {
        this.order = new ArrayList<component>(order.size());
        this.order.addAll(order);
    }

    public Component getComponentAfter(Container focusCycleRoot,
            Component aComponent) {
        int idx = (order.indexOf(aComponent) + 1) % order.size();
        return order.get(idx);
    }

    public Component getComponentBefore(Container focusCycleRoot,
            Component aComponent) {
        int idx = order.indexOf(aComponent) - 1;
        if (idx < 0) {
            idx = order.size() - 1;
        }
        return order.get(idx);
    }

    public Component getDefaultComponent(Container focusCycleRoot) {
        return order.get(0);
    }

    public Component getLastComponent(Container focusCycleRoot) {
        return order.get(order.size() - 1);
    }

    public Component getFirstComponent(Container focusCycleRoot) {
        return order.get(0);
    }
}

Kemudian yang harus diperhatikan juga, misalkan interframe yang kalian tampilkan sangat banyak. Kalian harus menambahkan addComponentListener pada panel atau addInternalFrameListener pada InternalFrame. Kemudian pada method internalFrameDeactivated (InternalFrame) atau componentHidden (Panel) seperti dibawah ini. Jika kalian tidak mengimplementasikan kode dibawah ini, misalkan ada dua InternalFrame yang dibuka, pada saat kalian menekan enter pada InternalFrame pertama berhasil namun untuk InternalFrame yang kedua akan gagal. Kenapa ? Karena Focus masih berada di InternalFrame yang pertama, oleh karena itu kita harus menghapus dulu data Focus yang lama kemudian definisikan kembali untuk InternalFrame yang kita buka atau aktifkan.

mainframe.setFocusTraversalPolicy(null);
   //

Cukup sekian uraian yang lumayan panjang ini, selamat mencoba, semoga bermanfaat dan semoga kita dapat berjumpa kembali ditutorial yang lain.


Wassalam,
Muhamad Wibawa


Tablet Android Honeycomb Terbaik Murah