复选框仅在JavaFX中的TreeTableView的Leafs上

时间:2016-05-10 10:49:05

标签: checkbox javafx

我有一个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); 
               }
           });

这就是我想要实现的目标:

enter image description here

有没有办法只在叶子上显示CheckBoxes,而其他单元格是空的?谢谢!

1 个答案:

答案 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样式。因此,细胞的孩子变得不可见,而不是细胞本身。