我需要在更改文本时对多个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); }
但是,在执行验证时,无法知道哪个TextField触发了更改.我如何获得这些信息?
解决方法
有两种方法:
假设您只使用TextField的text属性注册此侦听器,则传递给changed(…)方法的ObservableValue是对该textProperty的引用.它有一个getBean()方法,它将返回TextField.所以你可以做到
StringProperty textProperty = (StringProperty) observable ; TextField textField = (TextField) textProperty.getBean();
如果您使用TextField的textProperty之外的其他内容注册侦听器,这显然会中断(使用ClassCastException),但它允许您重用相同的侦听器实例.
更健壮的方法可能是将侦听器类创建为内部类而不是匿名类,并保留对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 newValue) { // do validation on textField } }
然后
this.firstTextField.textProperty().addListener(new TextFieldListener(this.firstTextField));
等等