2017-05-13 147 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");