代码之家  ›  专栏  ›  技术社区  ›  Dzeri96

仅为JavaFXTreetableView中的一级节点设置样式类

  •  1
  • Dzeri96  · 技术社区  · 6 年前

    我有一个餐厅菜单,菜单上的菜和类别在JavaFX中实现为树视图。

    我想用CSS使类别行看起来不同,但我只是找不到过滤它们并应用类的方法。将图像向左移动一点也不错。我也没有机会使用赛艇厂。我见过 这个答案 但是我不理解。

    我就是这样填桌子的。我遗漏了专栏和细胞工厂。

    private void filshdishes(list<dish>dishes){
    root.getchildren().clear();
    map<string,treeitem<dish>>categorymap=new hashmap<>();
    
    适用于(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);
    }
    用于(D盘:盘){
    categoryMap.get(d.getCategory()).getChildren().add(new treeitem<>(d));
    }
    }
    

    我想用CSS使类别行看起来不同,但我只是找不到过滤它们并应用类的方法。将图像向左移动一点也不错。我也没有机会使用赛艇厂。我看到了this answer但我不明白。

    我就是这样填桌子的。我把柱子和细胞工厂都漏掉了。

    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));
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   fabian    6 年前

    TreeTableView 使用 rowFactory 创建 TreeTableRow 在以后的某个时候,它会分配一个 TreeItem 树表行 .这种情况可能会再次发生 Treeitem公司 S代表同一行。因此,您需要处理那些可以通过添加 ChangeHandler TreeTableRow.treeItem 属性。如果是新的 Treeitem公司 分配给行后,可以通过检查行项(不可见)根项的子项来检查顶级节点。

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

    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();
    }
    

    样式表

    .tree-table-row-cell:top-node {
        -fx-background: orange;
    }
    

    将图像向左移动一点也不错。

    通常你是从一个习惯 TreeTableCell 由A返回 TreeTableColumn.cellFactory .取决于要实现设置的行为 fitWidth / fitHeight 可能足够,但在其他情况下,可能需要根据单元大小动态修改这些值。