Java - 如何强制JTextField具有字母数字值

时间:2014-09-11 08:27:09

标签: java swing jtextfield

我希望JTextField只接受字母和数字。但它应该包含两者。它不应该只包含字母和数字。

3 个答案:

答案 0 :(得分:3)

你应该使用DocumentFilter来实时过滤文本字段的输入。

查看其他一些swing+jtextfield+documentfilter标记的问题。

这是一个简单的例子

public class FieldFilterDemo {

    public static void main(String[] args) {
        JTextComponent field = getFilteredField();
        JOptionPane.showMessageDialog(null, field);

    }

    static JTextComponent getFilteredField() {
        JTextField field = new JTextField(15);
        AbstractDocument doc = (AbstractDocument) field.getDocument();
        doc.setDocumentFilter(new DocumentFilter() {
            public void replace(FilterBypass fb, int offs, int length,
                    String str, AttributeSet a) throws BadLocationException {
                super.replace(fb, offs, length,
                        str.replaceAll("[^0-9a-zA-Z]+", ""), a);
            }

            public void insertString(FilterBypass fb, int offs, String str,
                    AttributeSet a) throws BadLocationException {
                super.insertString(fb, offs,
                        str.replaceAll("[^0-9a-zA-Z]+", ""), a);
            }
        });
        return field;
    }
}

答案 1 :(得分:2)

1)尝试在文本字段中添加一个键监听器。看它是否有帮助。
用户完成输入后,检查两个标志的值。

private boolean hasLetter = false;
private boolean hasDigit = false;

public void keyTyped(KeyEvent evt) {
        char c = evt.getKeyChar();

        if (Character.isLetter(c)) {
            // OK
            hasLetter = true;
        } else if (Character.isDigit(c)) {
            // OK
            hasDigit = true;                
        } else {
            // Ignore this character
            evt.consume();
        }
}

2)或者,只需接受任何字符并在最后验证 当用户完成输入时。为此,您可以使用正则表达式。

"a1b2c".matches("^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+$")
"123".matches("^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+$")
"abc".matches("^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+$")

答案 2 :(得分:1)

尝试将JFormattedTextField 与相应的NumberFormat一起使用。