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

Nik*_*dun 8 java javafx-2

我需要在更改文本时对多个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)

等等