关键事件验证时Swing中的问题

时间:2014-03-28 02:49:17

标签: java regex swing validation keyevent

当我尝试验证文本字段时,在空文本字段中是否 我按,退格键或按Ctrl键,它会发出警告信息 在输入数字时必须实际给出字母而不是字母。

如何避免这些警报?

我正在验证使用正则表达式

fname.getText().matches("^[ A-z]+$")

另一个Textfield

zipcode.getText().matches("[ 0-9a-zA-Z]{7}")

帮我解决问题,或者如果有更好的解决方案可用于验证,请提出建议。

1 个答案:

答案 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();
            }
        });
    }
}