Membatasi Input Angka pada JTextField

Kita bahas trik lawas yak… trik apa?! Ya… sesuai judul postingan aja. Biar agak beda, di sini, gw pake 2 cara dan ngebahas beberapa hal terkait 2 cara tersebut. Langsung ajah, bentuk GUI kayak gini:

1. Contoh AplikasiKlik kanan di bagian teks buat Key Event, Pilih “Events” → “Key” → “Key Typed”, ntar muncul satu kode kayak gini:

2. Kode Key EventDalam logikanya, tulisin gini:

        char c = evt.getKeyChar();
        if (!((Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))) {
            evt.consume();
        }

Seperti yang kamu semua liat, di sana dipakein 3 kondisi:

  1. Cek kalo karakter yang di-type ama user gak termasuk ke dalam bentuk digit. Digit yang dimaksud masuk dalam ISO-LATIN, Arabic-Indic, Extended Arabic-Indic, Devanagari, dan Fullwidth.
  2. Cek karakter yang ditekan itu merupakan karakter backspace.
  3. Cek karakter yang ditekan itu merupakan karakter delete.

Kalo aja salah satu kondisi tersebut terpenuhi, yaaa… bakal dimasukin ke teks field. Kalo gak, yaaa… gak bakal kebaca sebagai karakter yang dimasukin. Kelemahannya apa?! Kelemahannya, karakter lain tetep bisa dimasukin. Caranya?! Simple… Copy-Paste… Nih yah, gambarnya gw tunjukin. Text field-nya dah gw pakein key event, tapi tetep bisa masuk karakter lain.

3. Kelemahan Event Type

Cara ngatasinya?! Yaaaa.. kamu cari tau aja sendiri. Tapi kalo emang kamu segitu mohon2nya ama gw, baiklah… gw kasi tau caranya. Caranya, cukup setTransferHandle jadi null untuk komponen terkait. Kode ini, bisa diletakin di bagian konstruktor.

Best practice-nya gini, anggap text field yang mau kamu pake namanya jTextField1, jadi di bagian konstruktor, tambahin kode gini:

jTextField1.setTransferHandler(null);

Tapi kode di atas jugak gak memungkinkan kamu buat ngelakuin copy yah. Ati2 ajah. Terus gimana alternatifnya?! Solusi lain yang bisa kamu lakukan, dengan tidak melakukan apa pun ketika tombol Ctrl+V ditekan. Ini punya kelemahan juga c… Bayangin kalo di suatu mesin, paste gak di-peta-in pake tombol Ctrl+V, ini bakal jadi masalah. Tapi, beruntungnya… copy/paste sifatnya universal untuk tiap mesin. Jadi… moga aman lhah… 😀

Oke… best practice-nya, bikin suatu key stroke, dan petain ke aksi yang gak ngelakuin apa pun. Kalo gw, nambahin kodenya deket2 konstruktor. Gini nih kodenya. Yang warnanya biru, itu yang gw tambahin. Lebihnya, itu standar bentuk JFrame awal.

    public NewJFrame() {
        initComponents();
        KeyStroke ks = KeyStroke.getKeyStroke("control V");
        jTextField1.getInputMap().put(ks, "dummy");

    }
    Action dummy = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //do nothing
        }
    };

4. Key Stroke
Kalo udah nambahin kayak yang di atas, copy bisa dilakuin, tapi paste udah gak bisa. Jangan lupa buat uncomment kode setTransferHandle, plus import package terkait yak… Paling gak, kamu musti import 5 class ini:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.KeyStroke;

Okeh… itu cara pertama yah… Cara yang kedua, pake PlainDocument.

Deklarasiin sebuah objek dari PlainDocument, kayak gini:

    PlainDocument pd = new PlainDocument() {
        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            if (str.matches("[0-9]*")) {
                super.insertString(offs, str, a);
            } else {
                // do nothing
            }
        }
    };

Terus, kalo udah deklarasiin satu dokumen, berikutnya hubungkan objek PlainDocument ke text field yang diinginkan (di tulisan ini, maksudnya jTextField2). Jadi, gw tambahin kode kayak gini, di baris paling akhir sebelum kurung kerawal tutup dari konstruktor.

jTextField2.setDocument(pd);

Kekurangannya?! Hummm… hampir gak ada c, copy/paste udah terlarang di sini. Karena bukan cuma key event yang ditangani, tapi konten dokumennya jugak. Yang jadi permasalahan, even gak bisa paste, tapi kalo kamu blok semua karakter (pake Ctrl+A), terus kamu tekan Ctrl+V, dokumen semuanya bakal ilang. Cara nanganin?! Hmmm… pake aja cara penanganan sebelumnya. Selesai deh.

Oke, segitu ajah.. Moga ngebantu yak.

Sumber:
https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html
http://www.coderanch.com/t/341695/GUI/java/enable-CTRL-perform-action-coping
http://stackoverflow.com/questions/316673/disabling-paste-in-a-jtextfield
http://www.atwiwit.net/2013/10/java-programming-cara-membuat-input.html
http://khannedy.com/2010/06/28/agar-jtextfield-tidak-menerima-input-selain-angka/

Valid: Yap
Kadaluarsa: (?)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s