如何限制文本字段仅输入数字和十进制?

时间:2019-07-31 09:26:11

标签: java

我想控制jtextfield上的用户输入文本。似乎在netbean 8中找不到任何好的方法。在C#中使用keypress event,但是在java中,我是新手。

我选择了key type事件

我只想输入小数点后2位的数字

10.00
1224547885544.12
545545464646464646465466.10

不是

12121212.654654654654

我尝试过

                 // not a good idea

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

    //second try

   char enter = evt.getKeyChar();
if(!(Character.isDigit(enter))){
    evt.consume();
}

我认为这不是一个好主意。

尝试许多其他方式。

请帮助我。

2 个答案:

答案 0 :(得分:0)

假设您所指的是JavaFX TextField

您可以通过调用textProperty获得文本字段的textField.textProperty()。由于这是一个属性,因此您可以在其上附加一个侦听器,以侦听字段中文本的更改:

textField.textProperty().addListener((observable, oldValue, newValue) -> {
    // this code is called whenever the text in the field changes
    // oldValue is the text contained before the event was triggered
    // newValue is the text that the field is about to be set to

    if (oldValue.contains("[a-zA-Z]")) {  // any predicate you want/need
        textField.setText(oldValue);  // revert the text of the field back to its old value
    }
});

答案 1 :(得分:0)

对于Swing TextField,这应该可以帮助您:

 JFormattedTextField textField = new JFormattedTextField();
        textField.setFormatterFactory(new AbstractFormatterFactory() {
            @Override
            public AbstractFormatter getFormatter(JFormattedTextField tf) {
                NumberFormat format = DecimalFormat.getInstance();
                //or two, if you want to force something like 10.00
                format.setMinimumFractionDigits(0); 
                format.setMaximumFractionDigits(2);
                format.setRoundingMode(RoundingMode.HALF_UP);
                InternationalFormatter formatter = new InternationalFormatter(format);
                formatter.setAllowsInvalid(false); //important!
                return formatter;
            }
        });