【问题标题】:JTextField accept only numbers and one dotJTextField 只接受数字和一个点
【发布时间】:2017-09-14 08:21:09
【问题描述】:

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

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

有人可以帮我解决吗?

【问题讨论】:

  • 看这个,可能对enter link description here有帮助
  • “用户在其中写入产品价格的文件。” new JSpinner(new SpinnerNumberModel(0.0, 0.0, 999.99, .01));

标签: java swing jtextfield


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    Swing 有更新更好的 API。

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

    另一个选项是使用DocumentFilter。阅读 Implementing a DocumentFilter 上的 Swing 教程部分。

    【讨论】:

    • 谢谢,非常有帮助。但是现在我必须使用 jtextfield,因为我已经创建了一个小程序,我在其中添加了很多 jtextfield
    • @Dani,1) JFormatedTextField 是 JTextField。 2) DocumentFilter 可用于 JTextField。 3)您当前的设计无关紧要。它不起作用,因此您无论如何都需要进行更改。把事情做好,不要走捷径。如您所见,当您以错误的方式做事时会遇到问题。
    【解决方案3】:

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

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

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

    Char 或 keytyped 不是有效的输入,所以让它消费吧。

                evt.consume();
            }
    

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

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

    获取文本字段中输入的整个字符串;

                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){
    

    这确定字符是否具有与整数、小数点、退格或删除匹配的值。如果 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;
                }     
    

    这里是完整的代码,我提供了一些cmets,希望对你有帮助。

    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  
                }  
    

    【讨论】:

    • 你能在这个代码中添加一些解释吗? How to answer 详细介绍了改进答案。
    【解决方案4】:

    下面是我的示例代码,我已经测试过并且可以按预期工作。 当用户输入或按错键时,我还添加了哔声。

    private void textFieldScoreKeyTyped(java.awt.event.KeyEvent evt) {                                        
           char c =  evt.getKeyChar();
           if(c == KeyEvent.VK_BACK_SPACE){
                evt.consume(); 
           }else if(Character.isLetter(c) || String.valueOf(c).trim().isEmpty()){
               getToolkit().beep();
               evt.consume(); 
           }else{
               try{
                   Double.parseDouble(textFieldScore.getText()+c);
               }catch(NumberFormatException e){
                   getToolkit().beep();
                   evt.consume();
               }
           }
        }
    

    祝大家好运!!

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2013-08-07
      相关资源
      最近更新 更多