2017-05-13 152 views
0

我发现这个 link有用于使JavaFX TextField只接受数字值。不过,我想简化解决方案,以便它可以在多个TextFields上实现。使JavaFX TextField只接受数字输入的常见功能

寻找类似:

ChangeListener<String> numericTextFieldListener = (observable, oldValue, newValue) -> { 
    if(!newValue.matches("\\d*")) { 
     //textField.setText(newValue.replaceAll("[^\\d]", "")); //how to set this new value to parent text field? 
    } 
}; 

textField1.textProperty().addListener(numericTextFieldListener); 
textField2.textProperty().addListener(numericTextFieldListener); 
textField3.textProperty().addListener(numericTextFieldListener); 
textField4.textProperty().addListener(numericTextFieldListener); 
// ... and so on 

任何建议?

回答

0

方法1

您可以简单地实现的ChangeListener新的类,并通过文本字段作为构造函数的参数。

class MyChangeListener implements ChangeListener<String> { 

    TextField txt; 

    public MyChangeListener(TextField txt) { 
     this.txt = txt; 
    } 

    @Override 
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
     if (!newValue.matches("\\d*")) { 
      txt.setText(newValue.replaceAll("[^\\d]", "")); 
     } 
    } 
} 

现在你可以实例MyChangeListener和应用自定义ChangeListener添加到您的文本框的这个样子。

textField1.textProperty().addListener(new MyChangeListener(textField1)); 
textField2.textProperty().addListener(new MyChangeListener(textField2)); 
textField3.textProperty().addListener(new MyChangeListener(textField3)); 

方法2

您可以自定义的文本字段这样。

class NumericalTextField extends TextField { 

    public NumericalTextField() { 
     super(); 
     addListener(); 
    } 

    public NumericalTextField(String txt) { 
     super(txt); 
     addListener(); 
    } 

    private void addListener() { 
     this.textProperty().addListener((observable, oldValue, newValue) -> { 
      if (!newValue.matches("\\d*")) { 
       this.setText(newValue.replaceAll("[^\\d]", "")); 
      } 
     }); 
    } 
} 

并实例化。

TextField txt1 = new NumericalTextField(); 
TextField txt2 = new NumericalTextField("Text");