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>
,其中T
是 Warning
或者它的某个超类。
所以你需要
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
,并让你访问它的方法等
这是关于实现一个 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>
,其中T
是 Warning
或者它的某个超类。
所以你需要
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
,并让你访问它的方法等