当前位置: 首页 > 知识库问答 >
问题:

JTextField只接受数字和一个点

汪志业
2023-03-14

我希望我的文本字段只接受数字(数字)和一个点,因为这是一个用户可以在其中写入产品价格的字段。我有这个代码,但它不能很好地工作,它只接受数字和删除。

char c=evt.getKeyChar();
if(!(Character.isDigit(c))||(c==KeyEvent.VK_BACK_SPACE)||(c==KeyEvent.VK_DELETE)){
    getToolkit().beep();
    evt.consume();
}

有人能帮我修一下吗?

共有3个答案

习阳
2023-03-14

私有void textFieldKeyTyped(java.awt.event.KeyEvent evt){

获取键入的密钥并将其传递给validate方法。

        if(!validate(evt.getKeyChar())){

Char或keytyped不是有效的输入,所以让它被使用。

            evt.consume();
        }

这限制了小数点的输入,只能输入一个小数点;

        if(evt.getKeyChar()==KeyEvent.VK_DECIMAL || evt.getKeyChar()==KeyEvent.VK_PERIOD){
            

在文本字段中输入整个字符串;

            String field = textField.getText();

获取点的索引(.或十进制/句点)。如果字符串没有任何点或小数点,indexOf()方法将返回-1。

            int index = field.indexOf(".");


            if(!(index==-1)){ //index is not equal to -1
                evt.consume(); //consume
            }
          
        }
    }  

每次按键,这个方法都会被调用。

private boolean validate(char ch){

这确定字符是否具有与整数、小数点、退格或删除匹配的值。如果char是整数、小数、删除或退格,则返回true,否则返回false。但是它不限制可以输入多少个小数点。

            if(!(Character.isDigit(ch)
                    || ch==KeyEvent.VK_BACKSPACE 
                    || ch==KeyEvent.VK_DELETE 
                    || ch==KeyEvent.VK_DECIMAL
                    || ch==KeyEvent.VK_PERIOD)){
                return false;
            }
        
            return true;
            }     

以下是完整的代码,我已经提供了一些评论,希望这些会有所帮助。

private void textFieldKeyTyped(java.awt.event.KeyEvent evt) {                               

        if(!validate(evt.getKeyChar())){ //get char or keytyped
            evt.consume();
        }
        //limit one dot or decimal point can be entered
        if(evt.getKeyChar()==KeyEvent.VK_DECIMAL || evt.getKeyChar()==KeyEvent.VK_PERIOD){
            
            String field = textField.getText(); //get the string in textField
            int index = field.indexOf("."); //find the index of dot(.) or decimal point
            if(!(index==-1)){ //if there is any
                evt.consume(); //consume the keytyped. this prevents the keytyped from appearing on the textfield;
            }
          
        }
    }     
    //determine if keytyped is a valid input
     private boolean validate(char ch){
        
            if(!(Character.isDigit(ch)
                    || ch==KeyEvent.VK_BACKSPACE 
                    || ch==KeyEvent.VK_DELETE  
                    || ch==KeyEvent.VK_DECIMAL 
                    || ch==KeyEvent.VK_PERIOD 
                    )){

                return false; //return false, because char is invalid           
            }
        
            return true; // return true, when the if statement above does not meet its conditions  
            }  
云远
2023-03-14

不要使用KeyListener。这是使用AWT时的旧代码

Swing有更新更好的API。

最简单的方法是使用JFormattedTextField。阅读Swing教程中关于如何使用格式化文本字段的部分,了解更多信息和工作示例。

另一种选择是使用DocumentFilter。阅读Swing教程中关于实现DocumentFilter的部分。

松思源
2023-03-14

我找到了解决这个问题的方法:这是我写的代码

char c=evt.getKeyChar();
        if((Character.isDigit(c))||(c==KeyEvent.VK_PERIOD)||(c==KeyEvent.VK_BACK_SPACE)){
            int punto=0;
            if(c==KeyEvent.VK_PERIOD){ 
                        String s=pricefield.getText();
                        int dot=s.indexOf('.');
                        punto=dot;
                        if(dot!=-1){
                            getToolkit().beep();
                            evt.consume();
                        }
                    }
        }
        else{    
            getToolkit().beep();
            evt.consume();
        }
 类似资料:
  • 我正在开发一个数独小程序,我想制作它的单元格(扩展JTextField),以便它只接受0-9和长度为1之间的整数。稍后我会对它进行更多限制(以便它符合游戏规则)。我从: 在这里,我试图过滤输入,对于开始,我只是试图将其限制为整数和一个数字,但似乎我可以输入任意多的数字,而最后一行不会被触发。 想在这里得到一些帮助,谢谢:

  • 我有一个文本字段,我只接受键盘上的数字,但现在我必须更改它,因为它是“价格文本字段”,我还需要接受一个点”。“对于任何价格。 我怎样才能改变这个以得到我需要的?

  • 问题内容: 我希望用户仅输入字母或空格(如果用户输入其他字符),我想给jOptionPane消息,我已经搜索过,并且尝试了以下代码 但是现在无论我输入什么都会给出错误 现在我更改了代码 现在它仅在用户输入数字时发出消息。我该如何解决 问题答案: 使用一个,这是我制作的一个示例,它将仅接受字母字符和空格:

  • 问题内容: 我已经在netbeans注册中完成了一个示例项目。在jtextfield1中是用户ID,在Jtextfiled7中是国家/地区,两者都必须使用非数字字符或不允许的空格和特殊字符。怎么可能? 问题答案: @Vivek, 我对你问的这个问题有答案。请按照以下说明进行操作。 在Netbeans中,右键单击JTextfield,然后选择键入事件>> key >> key,然后在代码之间输入以下

  • 我看遍了整个网络,所有我尝试过的东西都没用。。。。 我发现我可以使用一些JTextFormatterField,但它不起作用。 然后我发现我可以将DocumentFilter与正则表达式一起使用,我所做的是: 但它不起作用。。。它只接受数字。我希望它也能接受点。我还需要它不要以点开头,也不要以点结尾。 我做错了什么?

  • 我需要在Android上实现一个,它只接受特定范围的字符,即:“S、A、Q、W、R、B、C、D、E、U”。