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

时间:2015-02-22 02:50:45

标签: java oop javafx event-listener

我在控制器类中有以下代码,用于为组合框提供事件侦听器的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

   }
});

我可以在课堂的其他地方调用该方法。更具体地说,我可以在我的控制器中的initialize()函数内调用它,这个监听器也驻留在。我为什么会遇到这个问题?

2 个答案:

答案 0 :(得分:3)

因为侦听器中的this引用了侦听器当前实例,而不是控制器实例。要引用容器实例,请使用语法ControllerClassName.this

答案 1 :(得分:1)

问题在于:

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`
   }
}

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

setClassList(courseProcessed);

OR

你也可以试试这个:

YourClass.this.setClassList(courseProcessed);