使 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");
我发现这个 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");