我希望JTextField只接受字母和数字。但它应该包含两者。它不应该只包含字母和数字。
答案 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一起使用。