![](/img/trans.png)
[英]JavaFX - ListView<? extends V> - Generics - CellFactory
[英]JavaFX ListView CellFactory Disables Item Selection
我有一个具有一些值的类( ListItem
),我想显示这些项的列表( ListView<ListItem>
)。 ListItem
有一个value
属性,我希望ListView<ListItem>
显示为其文本,但是否则列表应该看起来和功能正常,特别是关于项目选择。 我有以下代码来完成此任务。 懒惰中省略了FXML,它只是一个<ListView />
。
// Controller for FXML
public class MainController {
// Wrapper class containing several values
private class ListItem {
private String value;
public ListItem(String value) {
this.value = value;
}
public String getValue() {
return value;
}
... // Other useful stuff
}
@FXML private ListView<ListItem> list;
@FXML
public void initialize() {
// Set list to display using the given CellFactory
list.setCellFactory((list) -> {
return new ListCell<ListItem>() {
@Override
protected void updateItem(ListItem item, boolean empty) {
if (empty) return;
// Display item's value property
setText(item.getValue());
}
};
});
// Add test data
list.getItems().add(new ListItem("test"));
list.getItems().add(new ListItem("test2"));
// Print when selection changes
list.getSelectionModel().selectedItemProperty().addListener((evt) -> {
System.out.println("Selection changed!");
});
}
}
这会在ListView
每个项目中使用其value
属性正确显示ListItem
。 然而,它打破了选择,和System.out.println(...)
不执行(该项目也没有在GUI中突显)。 我发现删除list.setCellFactory(...)
语句是罪魁祸首,但让我陷入了困境。
当存在list.setCellFactory(...)
,该项使用正确的文本,但无法选择。 当list.setCellFactory(...)
不存在时,该项目使用错误的文本,但可以选择。 为了正确显示文本并选择项目,我还需要做一些其他的特殊工作吗?
我已经完成了先决条件谷歌搜索,但我找不到其他任何有这个特殊问题的人。 任何帮助是极大的赞赏。
你需要添加
super.updateItem(item, empty);
作为updateItem(...)
的第一行。 这个呼叫必须始终存在于一个重写Cell.updateItem(...)
方法(同样为其他真updateXXX
方法,如updateIndex(...)
此外,还应确保updateItem(...)
方法正确处理所有情况,包括单元格为空的情况:
protected void updateItem(ListItem item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
// Display item's value property
setText(item.getValue());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.