2017-05-13 3 views
0

私はこれを見つけました。 linkは、JavaFX TextFieldが数値だけを受け入れるのに便利です。しかし、複数のTextFieldに実装できるように、このソリューションを簡素化したいと思います。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を実装する新しいクラスを作成し、コンストラクタで引数としてTextFieldを渡すことができます。

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をtextFieldにこのように適用できます。

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

方法2

あなたは、このようなカスタムTextFieldを行うことができます。

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"); 
関連する問題