Общая функция для того, чтобы JavaFX TextField принимала только числовой ввод

Я нашел эту ссылку полезно, чтобы текстовое поле JavaFX принимало только числовые значения. Однако я хотел бы упростить решение, чтобы его можно было реализовать на нескольких текстовых полях.

Ищете что-то вроде:

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

Любая рекомендация?


person pjRamores    schedule 13.05.2017    source источник


Ответы (1)


Способ 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 к своим текстовым полям, как показано ниже.

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");
person Ashish    schedule 13.05.2017