将JTextField限制为仅接受某些字符

时间:2015-06-12 22:03:54

标签: java swing jtextfield

我有4 JTextFields只能接受某些字符:

  1. 二进制数字(01
  2. 八进制数字,所以(0 - 7
  3. 所有数字(0 - 9
  4. 所有十六进制字符(0 - 9a - fA - F
  5. 用户必须无法输入禁止的字符。

    我知道如何在之后验证输入,但不知道如何过滤它。

    我尝试使用MaskFormatter,但我根本无法输入任何内容。

    MaskFormatter binaryFormatter = new MaskFormatter();
    binaryFormatter.setValidCharacters("01");
    JFormattedTextField binaryText = new JFormattedTextField(binaryFormatter);
    

1 个答案:

答案 0 :(得分:2)

您不想格式化值,您想要过滤内容。在DocumentFilter

上的平原上使用JTextField

首先查看Implementing a DocumntFilterExamples了解更多详情......

例如,"二进制过滤器",只接受01

public class BinaryDocumentFilter extends DocumentFilter {

    @Override
    public void insertString(DocumentFilter.FilterBypass fb, int offset,
            String text, AttributeSet attr)
            throws BadLocationException {
        StringBuilder buffer = new StringBuilder(text.length());
        for (int i = buffer.length() - 1; i >= 0; i--) {
        char ch = buffer.charAt(i);
        if (ch == '0' || ch == '1') {
            buffer.append(ch);
        }
        }
        super.insertString(fb, offset, buffer.toString(), attr);
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb,
            int offset, int length, String string, AttributeSet attr) throws BadLocationException {
        if (length > 0) {
        fb.remove(offset, length);
        }
        insertString(fb, offset, string, attr);
    }
}

可以直接应用于字段Document

JTextField binaryField = new JTextField(10);
((AbstractDocument)binaryField.getDocument()).setDocumentFilter(new BinaryDocumentFilter());