当我尝试验证文本字段时,在空文本字段中是否 我按,退格键或按Ctrl键,它会发出警告信息 在输入数字时必须实际给出字母而不是字母。
如何避免这些警报?
我正在验证使用正则表达式
fname.getText().matches("^[ A-z]+$")
另一个Textfield
zipcode.getText().matches("[ 0-9a-zA-Z]{7}")
帮我解决问题,或者如果有更好的解决方案可用于验证,请提出建议。
答案 0 :(得分:3)
“或者如果有任何更好的解决方案可用于验证,请建议。”
不要将KeyListener
用于JTextFields
对于“实时验证”,您应该考虑使用DocumentFilter
作为基础Document
JTextField
的。{
此处有许多示例,您可以搜索。
<强>更新强>
以下是使用正则表达式的示例,其中最多只能包含7个字母和数字
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class ValidateTextField {
public ValidateTextField() {
JFrame frame = new JFrame();
JTextField field = createTextField();
frame.setLayout(new GridBagLayout());
frame.add(field);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JTextField createTextField() {
final JTextField field = new JTextField(15);
((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
int length = field.getDocument().getLength();
if (length + str.length() <= 7) {
fb.insertString(off, str.replaceAll("[^0-9a-zA-Z]", ""), attr); // remove non-digits
}
}
@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
int length = field.getDocument().getLength();
if (length + str.length() <= 7) {
fb.replace(off, len, str.replaceAll("[^0-9a-zA-Z]", ""), attr); // remove non-digits
}
}
});
return field;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ValidateTextField();
}
});
}
}