允许textfield仅输入数字[Java]

允许textfield仅输入数字[Java],java,jtextfield,Java,Jtextfield,我知道这个问题已经被问过很多次了,但是我仍然不能得到我真正需要的答案。希望这次有人能帮助我,我提前向你表示感谢。:) 这就是我希望在我的程序中,我希望用户只输入数字。每当他们输入字母和其他内容时,都会出现提示信息。我可以这样做,有一个字母和其他字符提示消息,但输入值仍然保留,我希望它被清除 请看我的密码 private void txtQty1KeyTyped(java.awt.event.KeyEvent evt) {

我知道这个问题已经被问过很多次了,但是我仍然不能得到我真正需要的答案。希望这次有人能帮助我,我提前向你表示感谢。:)

这就是我希望在我的程序中,我希望用户只输入数字。每当他们输入字母和其他内容时,都会出现提示信息。我可以这样做,有一个字母和其他字符提示消息,但输入值仍然保留,我希望它被清除

请看我的密码

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

}    
private void txtQty1KeyTyped(java.awt.event.KeyEvent evt){
addKeyListener(新的KeyAdapter(){});
char char_input=evt.getKeyChar();
如果(((字符输入<'0')| |(字符输入>'9'))&&(字符输入!='\b'))
{
JOptionPane.showMessageDialog(此“仅限数字!”,“无效输入”,JOptionPane.ERROR_消息);
txtQty1.setText(“”);
}
}    
虽然我清除了文本字段,但输入的字符仍会出现。 任何帮助都将不胜感激。谢谢!:)

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

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


要禁用在
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(" ");                
        }
    }

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

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


要禁用在
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(" ");                
        }
    }

} 

您需要创建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);
            }
        }
    }
}

您需要创建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);
            }
        }
    }
}


evt.consume();应该使用
DocumentFilter
,如中所示。OP用一个工作过滤器更新了问题。evt.consume();应该使用
DocumentFilter
,如中所示。OP用一个有效的过滤器更新了这个问题。您好@developerBuwan,非常感谢。我已经得到了我所需要的。:)@nhix,不要使用KeyListener。这不是解决问题的办法。例如,尝试将无效文本字符串粘贴到文本字段中。您的编辑无效。@camickr谢谢!我试过了,你是对的。我应该使用什么事件?@camickr抱歉我忽略了。谢谢!:)我同意这不是一个好答案,它永远不会被黑客攻击。下面是正确的安全和“swingish”方式(Document或DocumentFilter)Hi@developerBuwan,非常感谢。我已经得到了我所需要的。:)@nhix,不要使用KeyListener。这不是解决问题的办法。例如,尝试将无效文本字符串粘贴到文本字段中。您的编辑无效。@camickr谢谢!我试过了,你是对的。我应该使用什么事件?@camickr抱歉我忽略了。谢谢!:)我同意这不是一个好答案,它永远不会被黑客攻击。下面是正确的安全和“swingish”方法(文档或文档过滤器)。较新的方法是使用
DocumentFilter
,而不是创建自定义文档。
DocumentFilter
可以添加到任何
AbstractDocument
@camickr哦,这对我来说是新的,谢谢。我试试看。的确,我很久以前就使用定制的jtextfield:)例如,请参阅。示例过滤器可用于JTextField、JTextArea或JTextPane。不需要不同的类来扩展不同的文档。已更新答案以使用DocumentFilter。你知道这和以前的方法很相似,只是你只是把1类的子类化了,而不是把2类的子类化了。谢谢你@george_h和camickr。即使我尝试粘贴文本,我也尝试过,而且效果很好。较新的方法是使用
DocumentFilter
,而不是创建自定义文档。
DocumentFilter
可以添加到任何
AbstractDocument
@camickr哦,这对我来说是新的,谢谢。我试试看。的确,我很久以前就使用定制的jtextfield:)例如,请参阅。示例过滤器可用于JTextField、JTextArea或JTextPane。不需要不同的类来扩展不同的文档。已更新答案以使用DocumentFilter。你知道这和以前的方法很相似,只是你只是把1类的子类化了,而不是把2类的子类化了。谢谢你@george_h和camickr。我已经试过了,而且真的很好,即使我试着粘贴文本。