【问题标题】:Common function to make JavaFX TextField accepts only numeric input使 JavaFX TextField 只接受数字输入的常用函数
【发布时间】:2017-05-13 09:22:48
【问题描述】:

我发现这个 link 有助于使JavaFX TextField 只接受数值。但是我想简化解决方案,以便它可以在多个 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

有什么推荐吗?

【问题讨论】:

    标签: lambda javafx-8 textfield numeric


    【解决方案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));
    

    方法二

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多