这是关于实现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>)
我不知道如何解决这个问题。有人可以帮忙吗?提前谢谢。
答案 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>
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 lambdas和类型推断将允许您回避整个问题:
listView.getSelectionModel().addListener((obs, oldValue, newValue) -> {
System.out.println("Selected item: "+newValue);
});
如果你使用它,一个不错的IDE也可以在这里推断出newValue
是Warning
,并允许你访问它的方法等。