Membatasi Karakter pada JTextField

Repost dari artikel saya di PC Mild 22/2010

Bermain dengan package Swing memang tidak ada habisnya. Paradigma pemrograman berorientasi object yang digunakan memberikan ruang berkreasi yang semakin besar. Setiap komponen dapat dibuat bentuk modifikasinya dengan cara membuat turunan dari komponen yang ingin dimodifikasi. Salah satunya adalah menurunkan JTextField untuk membuat komponen yang otomatis membatasi jumlah karakter yang masuk.

Logo Java

Secara default, JTextField tidak menyediakan property ataupun method untuk membatasi jumlah karakter yang dimasukkan. Namun Anda bisa membuat sendiri fungsi tersebut. Memang ada banyak cara untuk melakukannya. Hal yang paling sering dilakukan adalah mencegat event pada saat pengetikan pada keyboard. Ada wacana bahwa melakukan hal tersebut kurang efisien, karena mengakibatkan seluruh proses pengetikan harus melewati mekanisme tersebut. Selain itu, cara tersebut dapat ditembus dengan mengcopy-paste teks ke textfield tersebut.

Pada artikel ini, Penulis akan menyajikan dengan cara yang berbeda, namun lebih efektif dan bisa digunakan di mana saja. Ikuti langkah-langkah berikut ini.

  1. Buatlah sebuah class dengan nama “TextFieldUtil”. Class ini hanya berfungsi sebagai class bantu untuk membatasi karakter dalam JTextField. Constructor dibuat dengan modifier private untuk mencegah pembuatan instance dari class ini.
    public class TextFieldUtil {
      private TextFieldUtil() {
        
      }
    }
  2. Langkah berikutnya adalah membuat static method untuk membuat JTextField memiliki jumlah karakter yang terbatas. Dengan method static, tanpa membuat turunan dari JTextField pun, Anda bisa membuat JTextField dengan jumlah karakter yang terbatas. Letakkan baris ini di dalam class LimitedTextField sebelumnya.
    public static void limitTextFieldChar(JTextField field, final int numChar) {
    
    }
  3. Dalam method tersebutlah proses “rekayasa” JTextField dilakukan. Idenya adalah karena JTextField menggunakan PlainDocument sebagai penyimpan teksnya, maka Anda hanya perlu mengubah PlainDocument yang digunakan oleh JTextField tersebut. Jika numChar berisi nol, maka JTextField akan menggunakan PlainDocument biasa tanpa batasan karakter. Sedangkan jika tidak, maka akan diatur sebuah PlainDocument yang telah dimodifikasi untuk hanya mampu menerima karakter sebatas jumlah yang diinginkan.
      public static void limitTextFieldChar(JTextField field, final int numChar) {
        if (numChar == 0) {
          field.setDocument(new PlainDocument());
          return;
        }
    
        PlainDocument pd = new PlainDocument() {
    
          private static final long serialVersionUID = 1L;
          private int limit = numChar;
    
          @Override
          public void insertString(int offs, String str, AttributeSet a)
              throws BadLocationException {
            if (str == null) {
              return;
            }
            if ((getLength() + str.length()) <= limit) {
              super.insertString(offs, str, a);
            }
          }
        };
        field.setDocument(pd);
      }

    Caranya adalah mencegat event pada saat karakter dimasukkan dalam PlainDocument. Cara mencegatnya dengan meng-override method insertString() yang selalu dipanggil ketika JTextField mengisikan karakter ke PlainDocument miliknya. Setelah PlainDocument baru terbentuk, maka instance-nya dimasukkan sebagai PlainDocument milik JTextField yang ingin diatur panjang karakternya dengan memanggil setDocument().

  4. Jangan lupa untuk mendefinisikan import untuk library yang dibutuhkan dalam class TextFieldUtil tersebut.
    import javax.swing.JTextField;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;
  5. Setelah itu, Anda bisa langsung menggunakan method tersebut dengan cara yang mudah.
        JTextField tf = new JTextField();
        TextFieldUtil.limitTextFieldChar(tf, 10);
  6. Jika Anda ingin menggunakannya dalam berbagai aplikasi, Anda bisa membuat turunan class JTextField dan tetap memberikan method getter dan setter agar bisa langsung digunakan sebagai parameter dalam IDE yang mendukung GUI.
    import javax.swing.JTextField;
    
    public class LimitedTextField extends JTextField {
      private int limit;
    
      public int getLimit() {
        return limit;
      }
    
      public void setLimit(int limit) {
        this.limit = limit;
        firePropertyChange("limit", getLimit(), limit);
        TextFieldUtil.limitTextFieldChar(this, limit);
      }
    }
  7. Setelah itu, Anda bisa mencobanya baik dengan IDE seperti NetBeans maupun membuat program seperti biasa. Untuk penggunaan dengan IDE, Anda harus mengatur komponen yang dimasukkan dalam pallete sebagai Beans.
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import javax.swing.JPanel;
    
    public class Test extends javax.swing.JFrame {
      public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
          public void run() {
            new Test().setVisible(true);
          }
        });
      }
    
      public Test() {
        setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        setTitle("http://haqqi.net");
        setLayout(new java.awt.BorderLayout());
        JPanel jp = new JPanel();
        JPanel jp2 = new JPanel();
        jp.setPreferredSize(new Dimension(300, 100));
        jp2.setPreferredSize(new Dimension(300, 100));
        tf = new LimitedTextField();
        TextFieldUtil.limitTextFieldChar(tf, 10);
        add(tf, BorderLayout.CENTER);
        add(jp, BorderLayout.NORTH);
        add(jp2, BorderLayout.SOUTH);
        pack();
        setLocationRelativeTo(null);
      }
    
      LimitedTextField tf;
    }

    Hasil percobaan JTextField dengan karakter terbatas

    Property tersedia pada IDE

Selamat mencoba.

Download source code secara keseluruhanArtikel ini telah dipublikasikan di media cetak tabloid PC Mild edisi 22 tahun 2010 lalu.

2 Comments

  1. Mantab gan artikelnya!

    Oia, ada sedikit koreksi di langkah no. 2. “Letakkan baris ini di dalam class LimitedTextField sebelumnya.” seharusnya “di dalam class TextFieldUtil sebelumnya”. Bukan begitu?

    Nice share!

    Reply

Leave a Comment.