ListView选择侦听器:错误没有为addListener找到合适的方法(<anonymous changelistener <string =“”>&gt;)

时间:2016-11-16 13:15:30

标签: listview javafx selection changelistener

这是关于实现ListView的选择侦听器。

listView.setItems(FXCollections.observableList(content.getListContent()));
listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
         @Override
        public void changed(ObservableValue<? extends String> observableValue, String s, String s2) {
                  System.out.println("Selected item: " + s2);
        }
    });

我收到此错误消息:

error: no suitable method found for addListener(<anonymous ChangeListener<String>>)
    listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
method Observable.addListener(InvalidationListener) is not applicable
  (argument mismatch; <anonymous ChangeListener<String>> cannot be converted to InvalidationListener)
method ObservableValue.addListener(ChangeListener<? super Warning>) is not applicable
  (argument mismatch; <anonymous ChangeListener<String>> cannot be converted to ChangeListener<? super Warning>)

我不知道如何解决这个问题。有人可以帮忙吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我从错误消息中猜到你将列表视图声明为

private ListView<Warning> listView ;

并且content.getContentList()的返回类型是List<Warning>(或者是子接口或其实现的东西)。

ListView<T>.getSelectionModel()会返回MultipleSelectionModel<T>(请参阅docs),因此listView.getSelectionModel()正在为您提供MultipleSelectionModel<Warning>

MultipleSelectionModel<T>.selectedItemProperty()返回ReadOnlyObjectProperty<T>(请参阅docs),因此listView.getSelectionModel().selectedItemProperty()评估为ReadOnlyObjectProperty<Warning>

最后,ReadOnlyObjectProperty<T>继承了addListener(ChangeListener<? super T>)docs)的ObservableValue<T>方法,因此您需要传入ChangeListener<T> TWarning或它的一些超类。

所以你需要

listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Warning>() {
    @Override
    public void changed(ObservableValue<? extends Warning> observableValue, Warning s, Warning s2) {
        System.out.println("Selected item: " + s2);
    }
});

请注意,使用Java8 lambdas和类型推断将允许您回避整个问题:

listView.getSelectionModel().addListener((obs, oldValue, newValue) -> {
    System.out.println("Selected item: "+newValue);
});

如果你使用它,一个不错的IDE也可以在这里推断出newValueWarning,并允许你访问它的方法等。