对jtextfield代码强制使用有限的字符范围

时间:2019-05-23 16:04:34

标签: java swing keyevent

我正在尝试使用KeyEvent来限制jTextField中的字符,以使用以下代码将其用作KeyTyped事件的输入:


private void userIDFieldKeyTyped(java.awt.event.KeyEvent evt) {                                     
        char c = evt.getKeyChar();
        if(c!=KeyEvent.VK_BACK_SPACE && c!=KeyEvent.VK_DELETE){
            if (Character.isLetter(c) && Character.isDigit(c)){
            } else {
                evt.consume();
            }
        }
    }

但是上面的代码没有按预期工作,它没有接受任何字符,因为从我试图仅输入AlphaNumeric字符的代码中可以明显看出,有什么办法可以消除此问题?我也尝试过使用KeyEvent.VK_ALPHANUMERIC,但是它也不起作用。

编辑: 我限制字符的意思是,文本字段只能输入我允许的某些字符,而不能输入已经输入一定数量的字符后停止输入。

1 个答案:

答案 0 :(得分:0)

我认为JFormattedTextField能满足您的所有要求。它可以限制输入的字符数,并过滤掉不需要的字符。这是一个小例子。 MaskFormatter负责处理所需的限制。

import java.awt.EventQueue;
import java.text.ParseException;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.text.MaskFormatter;

/**
 * For testing class {@code javax.swing.JFormattedTextField}
 */
public class FmTxtFld implements Runnable {
    private JFrame frame;
    private JFormattedTextField  fmtTxtFld;

    @Override // java.lang.Runnable
    public void run() {
        try {
            showGui();
        }
        catch (ParseException xParse) {
            xParse.printStackTrace();
        }
    }

    private void showGui() throws ParseException {
        frame = new JFrame("FmTxtFld");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        // Ten alphanumeric characters, i.e. letter or digit.
        MaskFormatter formatter = new MaskFormatter("AAAAAAAAAA"); //throws java.text.ParseException

        fmtTxtFld = new JFormattedTextField(formatter);
        fmtTxtFld.setColumns(10);
        JLabel label = new JLabel("JFormattedTextField");
        JPanel panel = new JPanel();
        panel.add(label);
        panel.add(fmtTxtFld);
        frame.add(panel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        FmTxtFld instance = new FmTxtFld();
        EventQueue.invokeLater(instance);
    }
}

如果运行上面的代码,您将看到文本字段仅回显有效字符,即仅字母和数字,并且不接受超过10个字符。