确定JavaFX中的调用节点更改侦听器

前端之家收集整理的这篇文章主要介绍了确定JavaFX中的调用节点更改侦听器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在更改文本时对多个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));

等等

猜你在找的Java相关文章