【发布时间】:2018-03-12 10:30:33
【问题描述】:
我有一个奇怪的错误,我找不到合适的解决方案。 我想在我的应用程序中添加一个显示任务分类的 TreeTableView。 由于用户可以自己添加任务,但这些任务必须与已经存在的任务区分开来,我希望它们在我的 TreeView 中是黄色的。因此我添加了一个自定义 CellFactory:
public class TaskLibrary extends AnchorPane {
@FXML
private TreeTableColumn<Task,String> mainColumn;
@FXML
private TreeTableView<Task> taskTreeTableView;
public TaskLibrary(){
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("../layout/TaskLibrary.fxml"));
loader.setRoot(this);
loader.setController(this);
loader.load();
mainColumn.setCellValueFactory(param -> param.getValue().getValue().taskNameProperty());
mainColumn.setCellFactory(param -> new TreeTableCell<Task,String>(){
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
Task listObject = this.getTreeTableRow().getItem();
if (listObject != null) {
if (item == null || empty) {
setText("");
setStyle("");
} else {
if (listObject.getIsDummy()) {
setStyle("-fx-background-color: yellow");
}
setText(listObject.getTaskName());
}
}
}
});
}
catch (IOException e){
throw new RuntimeException(e);
}
}
@FXML
public void addNewTask(){
}
public void setColumnText(String text){
mainColumn.setText(text);
}
public void enableDragAndDrop(){
TaskTreeRowFactory fac = new TaskTreeRowFactory();
taskTreeTableView.setRowFactory(fac::internalMoveFactory);
}
public TreeTableColumn<Task, String> getMainColumn() {
return mainColumn;
}
public void setMainColumn(TreeTableColumn<Task, String> mainColumn) {
this.mainColumn = mainColumn;
}
public TreeTableView<Task> getTaskTreeTableView() {
return taskTreeTableView;
}
public void setTaskTreeTableView(TreeTableView<Task> taskTreeTableView) {
this.taskTreeTableView = taskTreeTableView;
}
}
现在有一个奇怪的错误,在我的树视图中展开最后一个节点会导致一个新节点:
有什么我错过的吗?
【问题讨论】:
-
如果单元格为空,
listObject将为空,您的updateItem方法不会执行任何操作。因此,如果一个单元格从非空变为空(例如,当用户折叠树中的一个节点时),您不会删除现有文本。每当单元格为空时,您都需要删除文本(并清除样式)。 -
不错!那是为我做的。不是很直观,但我想更多的是我对 JavaFX 缺乏了解!
-
如果它有助于您的直觉:您的单元格有三种可能的感兴趣状态:空、显示虚拟项目、显示非虚拟项目。您的
updateItem()方法需要处理从任何一种状态到任何其他状态的转换,以及简单地更改为处于相同状态的不同项目。