首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅为JavaFX treeTableView中的第一级节点设置样式类

仅为JavaFX treeTableView中的第一级节点设置样式类
EN

Stack Overflow用户
提问于 2018-06-12 08:05:15
回答 1查看 632关注 0票数 1

我有一个餐厅菜单,其中包含菜肴和类别,并在javaFX中作为treeTableView实现。

我想用CSS让类别行看起来不一样,但我就是找不到一种方法来过滤它们并应用一个类。将图像向左移动一点也会很好。我使用rowFactory也不走运。我见过this answer,但我不理解它。

这就是我填写表格的方式。我省略了专栏--还有细胞工厂。

代码语言:javascript
复制
private void fillDishes(List<Dish> dishes){
    root.getChildren().clear();
    Map<String,TreeItem<Dish>> categoryMap = new HashMap<>();

    for (Category c: allCats) {
        TreeItem<Dish> newCat = new TreeItem<>(new Dish(c.getName(),null,null,null));
        //newCat.getGraphic().getStyleClass().add("category");
        categoryMap.put(c.getName(),newCat);
        root.getChildren().add(newCat);
    }
    for (Dish d: dishes) {
        categoryMap.get(d.getCategory()).getChildren().add(new TreeItem<>(d));
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-12 09:18:17

TreeTableView使用rowFactory来创建TreeTableRow,稍后它会将TreeItem分配给TreeTableRow。同一行的不同TreeItem可能会再次发生这种情况。由于这个原因,您需要处理更改,这些更改可以通过向TreeTableRow.treeItem属性添加ChangeHandler来完成。如果为行分配了新的TreeItem,则可以通过检查行项目的(不可见)根项目的子项来检查顶级节点。

不过,我更喜欢不需要搜索子列表的方法。可以将项的父项与根项进行比较。

代码语言:javascript
复制
public static class Item {

    private final String value1;
    private final String value2;

    public Item(String value1, String value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    public String getValue1() {
        return value1;
    }

    public String getValue2() {
        return value2;
    }

}

@Override
public void start(Stage primaryStage) {
    final TreeItem<Item> root = new TreeItem<>(null);
    TreeTableView<Item> ttv = new TreeTableView<>(root);
    ttv.setShowRoot(false);

    TreeTableColumn<Item, String> column1 = new TreeTableColumn<>();
    column1.setCellValueFactory(new TreeItemPropertyValueFactory<>("value1"));

    TreeTableColumn<Item, String> column2 = new TreeTableColumn<>();
    column2.setCellValueFactory(new TreeItemPropertyValueFactory<>("value2"));

    ttv.getColumns().addAll(column1, column2);

    final PseudoClass topNode = PseudoClass.getPseudoClass("top-node");
    ttv.setRowFactory(t -> {
        final TreeTableRow<Item> row = new TreeTableRow<>();

        // every time the TreeItem changes, check, if the new item is a
        // child of the root and set the pseudoclass accordingly
        row.treeItemProperty().addListener((o, oldValue, newValue) -> {
            boolean tn = false;
            if (newValue != null) {
                tn = newValue.getParent() == root;
            }
            row.pseudoClassStateChanged(topNode, tn);
        });
        return row;
    });

    // fill tree structure
    TreeItem<Item> c1 = new TreeItem<>(new Item("category 1", null));
    c1.getChildren().addAll(
            new TreeItem<>(new Item("sub1.1", "foo")),
            new TreeItem<>(new Item("sub1.2", "bar")));

    TreeItem<Item> c2 = new TreeItem<>(new Item("category 2", null));
    c2.getChildren().addAll(
            new TreeItem<>(new Item("sub2.1", "answer")),
            new TreeItem<>(new Item("sub2.2", "42")));

    root.getChildren().addAll(c1, c2);

    Scene scene = new Scene(ttv);
    scene.getStylesheets().add("style.css");

    primaryStage.setScene(scene);
    primaryStage.show();
}

style.css

代码语言:javascript
复制
.tree-table-row-cell:top-node {
    -fx-background: orange;
}

将图像向左移动一点也会很好。

通常,您可以从TreeTableColumn.cellFactory返回的自定义TreeTableCell执行此操作。根据您希望实现的行为,设置fitWidth/fitHeight可能就足够了,但在其他情况下,可能需要根据单元格大小动态修改这些值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50807588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档