使 JavaFX TextField 只接受数字输入的常用函数

Common function to make JavaFX TextField accepts only numeric input

我发现这个 link 对于使 JavaFX TextField 只接受数值很有用。但是我想简化解决方案,以便它可以在多个 TextFields 上实现。

寻找类似的东西:

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

有什么推荐吗?

方法一

您可以简单地创建实现 ChangeListener 的新 class 并将 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));

方法二

您可以像这样自定义 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");