我需要在更改文本时对多个TextField执行验证.验证完全相同,所以我认为我使用一个程序.我不能使用onInputMethodTextChanged,因为即使控件没有焦点我也需要执行验证.所以我在textProperty中添加了一个ChangeListener.
private TextField firstTextField;
private TextField secondTextField;
private TextField thirdTextField;
protected void initialize() {
ChangeListener<String> textListener = new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable,
String oldValue, String newValue) {
// Do validation
}
};
this.firstTextField.textProperty().addListener(textListener);
this.secondTextField.textProperty().addListener(textListener);
this.thirdTextField.textProperty().addListener(textListener);
}
Run Code Online (Sandbox Code Playgroud)
但是,在执行验证时,无法知道哪个TextField触发了更改.我如何获得这些信息?
Jam*_*s_D 13
有两种方法:
假设您只使用a的text属性注册此侦听器TextField,则ObservableValue传入changed(...)方法的方法是对该方法的引用textProperty.它有一个getBean()方法可以返回TextField.所以你可以做到
StringProperty textProperty = (StringProperty) observable ;
TextField textField = (TextField) textProperty.getBean();
Run Code Online (Sandbox Code Playgroud)
ClassCastException如果您使用除textPropertya 之外的其他内容注册侦听器,这显然会中断(使用a )TextField,但它允许您重用相同的侦听器实例.
一种更健壮的方法可能是将侦听器类创建为内部类而不是匿名类,并保持对以下内容的引用TextField:
private class TextFieldListener implements ChangeListener<String> {
private final TextField textField ;
TextFieldListener(TextField textField) {
this.textField = textField ;
}
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
// do validation on textField
}
}
Run Code Online (Sandbox Code Playgroud)
然后
this.firstTextField.textProperty().addListener(new TextFieldListener(this.firstTextField));
Run Code Online (Sandbox Code Playgroud)
等等