Dou*_*ker 2 java listview javafx
我有一个带有一些值(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!");
});
}
}
Run Code Online (Sandbox Code Playgroud)
这将ListItem正确显示,使用其value每个项目中的属性ListView.然而,它打破了选择和System.out.println(...)不执行(该项目也并没有在GUI中突显).我发现删除list.setCellFactory(...)声明是罪魁祸首,但让我陷入困境.
如果list.setCellFactory(...)存在,则项目使用正确的文本,但无法选择.如果list.setCellFactory(...)不存在,则该项目使用错误的文本,但可以选择.为了正确显示文本并选择项目,我还需要做一些其他的特殊工作吗?
我已经完成了先决条件谷歌搜索,但我找不到其他任何有这个特殊问题的人.任何帮助是极大的赞赏.
你需要添加
super.updateItem(item, empty);
Run Code Online (Sandbox Code Playgroud)
作为第一行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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
969 次 |
| 最近记录: |