Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextField只接受数字和一个点_Java_Swing_Jtextfield - Fatal编程技术网

Java JTextField只接受数字和一个点

Java JTextField只接受数字和一个点,java,swing,jtextfield,Java,Swing,Jtextfield,我希望我的文本字段只接受数字(数字)和一个点,因为它是一个用户可以在其中写入产品价格的字段。我有这个代码,但它不能很好地工作,它只接受数字和删除 char c=evt.getKeyChar(); if(!(Character.isDigit(c))||(c==KeyEvent.VK_BACK_SPACE)||(c==KeyEvent.VK_DELETE)){ getToolkit().beep(); evt.consume(); } 有人能帮我修一下吗?不要用键盘监听器。这是使

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

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

有人能帮我修一下吗?

不要用键盘监听器。这是使用AWT时的旧代码

Swing有更新更好的API

最简单的方法是使用
JFormattedTextField
。有关更多信息和工作示例,请阅读上Swing教程的部分


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

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

Swing有更新更好的API

最简单的方法是使用
JFormattedTextField
。有关更多信息和工作示例,请阅读上Swing教程的部分


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

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

char c=evt.getKeyChar();
if((Character.isDigit(c))| |(c==KeyEvent.VK_PERIOD)| |(c==KeyEvent.VK_BACK_SPACE)){
int punto=0;
如果(c==KeyEvent.VK_PERIOD){
字符串s=pricefield.getText();
int dot=s.indexOf('.');
punto=点;
如果(点!=-1){
getToolkit().beep();
evt.consume();
}
}
}
否则{
getToolkit().beep();
evt.consume();

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

char c=evt.getKeyChar();
if((Character.isDigit(c))| |(c==KeyEvent.VK_PERIOD)| |(c==KeyEvent.VK_BACK_SPACE)){
int punto=0;
如果(c==KeyEvent.VK_PERIOD){
字符串s=pricefield.getText();
int dot=s.indexOf('.');
punto=点;
如果(点!=-1){
getToolkit().beep();
evt.consume();
}
}
}
否则{
getToolkit().beep();
evt.consume();

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

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

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

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

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

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

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

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

这里是整个代码,我已经提供了一些评论,希望这些会有所帮助


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

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

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

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

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

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

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

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

这里是整个代码,我已经提供了一些评论,希望这些会有所帮助


看到这一点,它可能会帮助“一个用户在其中写产品价格的文件。”
new JSpinner(新SpinnerNumberModel(0.0,0.0,999.99.01));
看到这一点,它可能会帮助“一个用户在其中写产品价格的文件。”
new JSpinner(新SpinnerNumberModel(0.0,0.0,999.99.01))
谢谢,非常有帮助。但是现在我不得不使用jtextfield,因为我已经创建了一个小程序,在其中添加了很多内容jtextfield@Dani,1)JFormattedTextField是JTextField。2)可以在JTextField上使用DocumentFilter。3)您当前的设计与此无关。它不起作用,因此您仍然需要进行更改。请妥善处理不要走捷径。正如你所看到的,当你用错误的方式做事时,你会遇到问题。谢谢,非常有帮助。但是现在我必须使用jtextfield,因为我已经创建了一个小程序,在其中添加了很多jtextfield@Dani,1)JFormattedTextField是JTextField。2)可以在JTextField上使用DocumentFilter。3)您当前的设计与此无关。它不起作用,因此您无论如何都需要进行更改。正确地做事,不要走捷径。因为您可以看到,当您以错误的方式做事时,您会遇到问题。您是否可以为此代码添加一些解释?仅答案;进入关于改进答案的详细信息。您是否可以为此代码添加一些解释?仅答案;进入详细信息关于改进答案。
        if(!validate(evt.getKeyChar())){
            evt.consume();
        }
        if(evt.getKeyChar()==KeyEvent.VK_DECIMAL || evt.getKeyChar()==KeyEvent.VK_PERIOD){
            
            String field = textField.getText();
            int index = field.indexOf(".");


            if(!(index==-1)){ //index is not equal to -1
                evt.consume(); //consume
            }
          
        }
    }  
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 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  
            }