允许textfield仅输入数字[Java]

时间:2015-09-17 07:54:49

标签: java jtextfield

我知道这已被多次询问和回答,但我仍然无法得到我真正需要的答案。希望这次,有人可以帮助我,我提前感谢你。 :)

这是我想要的程序,我希望用户限制只输入数字。每当他们输入信件和其他信息时,都会有一条提示信息。我可以这样做,有一个字母和其他字符的提示信息,但输入的值仍然存在,我希望它被清除。

请参阅我的代码。

private void txtQty1KeyTyped(java.awt.event.KeyEvent evt) {                                 
    txtQty1.addKeyListener(new KeyAdapter() {});
    char char_input = evt.getKeyChar();
    if (((char_input < '0') || (char_input > '9')) && (char_input != '\b'))
    {
        JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE);
        txtQty1.setText(" ");
    }

}    

虽然我清除了我的文本字段,但我输入的字符仍然显示。 任何帮助将非常感激。谢谢! :)

2 个答案:

答案 0 :(得分:4)

您需要创建DocumentFilter类的子类,并使用正则表达式匹配每个插入的字符串/字符(如果它们是否为数字)并相应地执行操作。

以下是此工作的完整工作示例代码。感谢@camickr指出使用DocumentFilter比扩展JTextField以获得相同结果的旧方法更新。

import java.awt.BorderLayout;
import java.util.regex.Pattern;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class TestDocumentFilter {

    public static void main(String... args) {
        new TestDocumentFilter();
    }

    public TestDocumentFilter() {
        JTextField textField = new JTextField(10);
        ((AbstractDocument) textField.getDocument()).setDocumentFilter(new CustomDocumentFilter());

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout(5, 5));
        frame.getContentPane().add(textField, BorderLayout.NORTH);
        frame.setSize(400, 200);
        frame.setVisible(true);
    }

    private class CustomDocumentFilter extends DocumentFilter {

        private Pattern regexCheck = Pattern.compile("[0-9]+");

        @Override
        public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException {
            if (str == null) {
                return;
            }

            if (regexCheck.matcher(str).matches()) {
                super.insertString(fb, offs, str, a);
            }
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs)
                throws BadLocationException {
            if (str == null) {
                return;
            }

            if (regexCheck.matcher(str).matches()) {
                fb.replace(offset, length, str, attrs);
            }
        }
    }
}

答案 1 :(得分:1)

在代码中添加行evt.consume(),如下所示:

 JOptionPane.showMessageDialog(this, "Number only!","Invalid Input",JOptionPane.ERROR_MESSAGE);
 txtQty1.setText(" ");
 evt.consume(); //consume the key type event

详细信息http://docs.oracle.com/javase/7/docs/api/java/awt/event/InputEvent.html#consume()

要禁用在txtQty1文字字段中粘贴错误输入,您可以使用caretUpdate事件,如下所示:

注意:如果您使用Netbeans GUI表单,只需创建caretUpdate事件。

private void txtQty1CaretUpdate(javax.swing.event.CaretEvent evt) {                                    

    String text = txtQty1.getText();
    if(text != null) {
        if(!text.matches("[0-9]*")) {
            txtQty1.setText(" ");                
        }
    }

}