我有一个3级的TreeTableIView。我想仅在叶子上显示复选框,而所有其他单元格保持为空。到目前为止,我创建了两列:
第一列包含层次结构:
TreeTableColumn<AttributeRow, String> attributeColumn = new TreeTableColumn<>("Attributes");
attributeColumn.setPrefWidth(200);
attributeColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures<AttributeRow, String> param) ->
new ReadOnlyStringWrapper(param.getValue().getValue().getAttributeName())
);
第二列仅包含叶子上的CheckBoxes:
TreeTableColumn<AttributeRow, Boolean> companyColumn = new TreeTableColumn<>(companyGroup);
companyColumn.setPrefWidth(200);
companyColumn.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(companyColumn));
companyColumn.setCellValueFactory(param -> {
if (param.getValue().getValue().getCompanyGroups() == null) {
return new SimpleBooleanProperty(true);
} else {
return new SimpleBooleanProperty(false);
}
});
这就是我想要实现的目标:
有没有办法只在叶子上显示CheckBoxes,而其他单元格是空的?谢谢!
答案 0 :(得分:4)
您可以使用自定义rowFactory
检查,如果它包含的项目是否为叶子,则添加或删除leaf
伪类:
private static final PseudoClass LEAF = PseudoClass.getPseudoClass("leaf");
...
treeTableView.setRowFactory(view -> new TreeTableRow<BoolItem>() {
{
ChangeListener<Boolean> listener = (observable, oldValue, newValue) -> {
pseudoClassStateChanged(LEAF, newValue);
};
treeItemProperty().addListener((observable, oldItem, newItem) -> {
if (oldItem != null) {
oldItem.leafProperty().removeListener(listener);
}
if (newItem != null) {
newItem.leafProperty().addListener(listener);
listener.changed(null, null, newItem.isLeaf());
} else {
listener.changed(null, null, Boolean.FALSE);
}
});
}
});
另外使用自定义cellFactory
除了创建单元格之外还为其分配样式类,允许您将其标识为应隐藏的单元格(如果它不是叶子):
companyColumn.setCellFactory((TreeTableColumn<AttributeRow, Boolean> param) -> {
CheckBoxTreeTableCell<AttributeRow, Boolean> cell = new CheckBoxTreeTableCell<>();
cell.getStyleClass().add("hide-non-leaf");
return cell;
});
这允许您隐藏CSS样式表中的相应单元格:
.tree-table-row-cell .hide-non-leaf * {
/* invisible by default */
visibility: hidden;
}
.tree-table-row-cell:leaf .hide-non-leaf * {
/* make visible, if leaf */
visibility: visible;
}
编辑:由于某些原因,javafx似乎设置了内联单元格的可见性,这会覆盖CSS样式。因此,细胞的孩子变得不可见,而不是细胞本身。