JTextField只接受数字和一个点

时间:2017-04-18 13:07:43

标签: java swing jtextfield

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

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

有人可以帮我解决吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

Swing拥有更新更好的API。

最简单的方法是使用JFormattedTextField。阅读How to Use Formatted Text Fields上Swing教程中的部分,了解更多信息和工作示例。

另一种选择是使用DocumentFilter。阅读Implementing a DocumentFilter上的Swing教程中的部分。

答案 2 :(得分:0)

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

获取keyTyped并将其传递给validate方法。

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

Char或keytyped不是有效的输入,因此请使用它。

            evt.consume();
        }

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

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

获取在textField中输入的整个字符串;

            String field = textField.getText();

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

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


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

每次按键都会调用此方法。

private boolean validate(char ch){

确定字符是否具有与Integer,小数点,退格键或Delete匹配的值。如果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  
            }