ListView 选择侦听器:错误找不到适合 addListener(<anonymous ChangeListener<String>>) 的方法

ListView selection listener: error no suitable method found for addListener(<anonymous ChangeListener<String>>)

这是关于实现一个 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>)

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

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

private ListView<Warning> listView ;

并且 content.getContentList() 的 return 类型是 List<Warning>(或者是子接口或子接口的实现)。

ListView<T>.getSelectionModel() return 一个 MultipleSelectionModel<T>(见 docs),所以 listView.getSelectionModel() 给你一个 MultipleSelectionModel<Warning>

MultipleSelectionModel<T>.selectedItemProperty() returns a ReadOnlyObjectProperty<T>(参见 docs),因此 listView.getSelectionModel().selectedItemProperty() 计算为 ReadOnlyObjectProperty<Warning>

最后,ReadOnlyObjectProperty<T>ObservableValue<T>(docs)继承了一个addListener(ChangeListener<? super 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 lambda 和类型推断可以让您回避整个问题:

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

如果你使用这个,一个体面的 IDE 也将能够推断出 newValue 是一个 Warning ,并让你访问它的方法等