为什么我不能从事件侦听器调用方法但可以在 class 的其他地方调用?

Why can't I call method from event listener but can elsewhere in class?

我在控制器 class 中有以下代码用于为组合框提供事件侦听器的 JavaFX GUI:

courseComboBox.getSelectionModel().selectedItemProperty()
                .addListener(new ChangeListener<String>() {
                    @Override
                    public void changed(
                            ObservableValue<? extends String> selected,
                            String oldValue, String newValue) {

                           // Do stuff

    }
});

但是,当我尝试从其中调用另一个方法时,我无法:

courseComboBox.getSelectionModel().selectedItemProperty()
                    .addListener(new ChangeListener<String>() {
                        @Override
                        public void changed(
                                ObservableValue<? extends String> selected,
                                String oldValue, String newValue) {

                                this.setClassList(courseProcessed);

                               // Do Stuff

   }
});

不过,我可以在 class 的其他地方调用该方法。更具体地说,我可以在我的控制器中的 initialize() 函数中调用它,该侦听器也位于该函数中。为什么我会遇到这个问题?

因为this里面的listener指的是listener当前实例,而不是controller实例。要引用容器实例,请使用语法 ControllerClassName.this

这里的问题是:

new ChangeListener<String>() {
   @Override
   public void changed(ObservableValue<? extends String> selected, String oldValue, String newValue) {
       this.setClassList(courseProcessed);// `this` refers to the current instance of the anonymous class `ChangeListener`
   }
}

在这个匿名的 class ChangeListener 中没有名为 setClassList() 的方法,所以编译器会抱怨它。您可以尝试简单地避免使用 this 关键字:

setClassList(courseProcessed);

你也可以试试这个:

YourClass.this.setClassList(courseProcessed);