3 回答
TA贡献1802条经验 获得超6个赞
基本问题是,没有任何可编辑(也不是像 CheckBoxXX 这样的伪可编辑)树/表单元格尊重它们所在行的可编辑性。我认为这是一个错误。
要克服这一问题,您必须扩展(伪)可编辑单元格并使它们尊重行的可编辑性。伪编辑单元格和真实编辑单元格的确切实现是不同的。以下是内嵌示例,对于频繁使用,您可以将它们设为顶级并重复使用。
CheckBoxTreeTableCell:子类化并覆盖 updateItem 以重新绑定其禁用的属性,例如
colSelected.setCellFactory(c -> {
TreeTableCell cell = new CheckBoxTreeTableCell() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (getGraphic() != null) {
getGraphic().disableProperty().bind(Bindings
.not(
getTreeTableView().editableProperty()
.and(getTableColumn().editableProperty())
.and(editableProperty())
.and(getTreeTableRow().editableProperty())
));
}
}
};
return cell;
});
对于真正的编辑单元格,fi TextFieldTreeTableCell: 覆盖 startEdit 并返回,如果该行不可编辑,则不调用 super
colName.setCellFactory(c -> {
TreeTableCell cell = new TextFieldTreeTableCell() {
@Override
public void startEdit() {
if (getTreeTableRow() != null && !getTreeTableRow().isEditable()) return;
super.startEdit();
}
};
return cell;
});
现在你可以像你一样切换行的可编辑性,稍微改变逻辑以保证在所有情况下完全清理:
ttv.setRowFactory(table-> {
return new TreeTableRow<Person>(){
@Override
public void updateItem(Person pers, boolean empty) {
super.updateItem(pers, empty);
// tbd: check for nulls!
boolean isTopLevel = table.getRoot().getChildren().contains(treeItemProperty().get());
if (!isEmpty() && isTopLevel) {
// if(isTopLevel){
setStyle("-fx-background-color:lightgrey;");
setEditable(false);
}else{
setEditable(true);
setStyle("-fx-background-color:white;");
}
}
};
});
TA贡献2039条经验 获得超7个赞
如果您想禁用特定的 Cell,则在 CellFactory 而不是 RowFactory 中处理禁用逻辑。TreeTableColumn(..)的静态方法是一种方便快速使用的方法。但这不是唯一的方法。您仍然可以为 CheckBoxTreeTableCell 创建自己的工厂。
所以代替
colSelected.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(colSelected));
设置 cellfactory 如下,这应该适合你。
colSelected.setCellFactory(new Callback<TreeTableColumn<Person, Boolean>, TreeTableCell<Person, Boolean>>() {
@Override
public TreeTableCell<Person, Boolean> call(TreeTableColumn<Person, Boolean> column) {
return new CheckBoxTreeTableCell<Person, Boolean>() {
@Override
public void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
boolean isTopLevel = column.getTreeTableView().getRoot().getChildren().contains(getTreeTableRow().getTreeItem());
setEditable(!isTopLevel);
}
};
}
});
添加回答
举报