如何设置单元格';Javafx中TreeView中的缩进

如何设置单元格';Javafx中TreeView中的缩进,java,javafx,fxml,Java,Javafx,Fxml,我正在开发一个TreeView,它代表一个机器人控制程序,每个TreeCell代表一个语句,一个TreeCell可以嵌套在另一个语句中。与编程一样,语句可以嵌套在if或for语句中 在这里,我创建了一个简单的演示,其中填充了一些随机块 为了自定义TreeCell的呈现,我创建了一个扩展TreeCell的类: public class TreeDataCell extends TreeCell<TreeData> { public void updateItem(TreeD

我正在开发一个
TreeView
,它代表一个机器人控制程序,每个
TreeCell
代表一个语句,一个
TreeCell
可以嵌套在另一个语句中。与编程一样,语句可以嵌套在
if
for
语句中

在这里,我创建了一个简单的演示,其中填充了一些随机块

为了自定义
TreeCell
的呈现,我创建了一个扩展
TreeCell
的类:

public class TreeDataCell extends TreeCell<TreeData> {

    public void updateItem(TreeData item, boolean empty) {
        super.updateItem(item, empty);

        setText(null);
        if (item == null || empty) {
            setGraphic(null);
        } else {
            setGraphic(getCellGraphic(item));
        }
    }

    private Group getCellGraphic(TreeData data) {

        Group grp = new Group();

        VBox vbox = new VBox();
        vbox.setMinWidth(100);
        vbox.setMaxWidth(200);
        vbox.setBorder(new Border(new BorderStroke(
                Color.LIGHTGRAY.darker(), 
                BorderStrokeStyle.SOLID, 
                new CornerRadii(10.0), 
                new BorderWidths(2.0))));
        vbox.setBackground(new Background(new BackgroundFill(Color.LIGHTGRAY, new CornerRadii(10.0), null)));
        vbox.setEffect(new DropShadow(2.0, 3.0, 3.0, Color.DIMGRAY));

        Region header = new Region();
        header.setPrefHeight(5.0);

        Region footer = new Region();
        footer.setPrefHeight(5.0);

        Label labTitle = new Label();
        labTitle.setFont(new Font("San Serif", 20));
        labTitle.setText(data.getTitle());

        Label labDesc = null;
        if (data.getDescription() != null) {
            labDesc = new Label();
            labDesc.setWrapText(true);
            labDesc.setText(data.getDescription());
        }

        vbox.getChildren().addAll(header, labTitle);
        if (labDesc != null) {
            vbox.getChildren().add(labDesc);
        }
        vbox.getChildren().add(footer);
        grp.getChildren().add(vbox);

        return grp;
    }
}
正如您所看到的,两个级别之间的缩进太小,我们几乎看不到语句嵌套

我正在用Java硬编码所有样式,因为我还没有学会FXML+CSS

我想知道是否可以用Java设置缩进的大小?我找不到任何用于此目的的API。此外,是否可以在父节点与其子节点之间绘制线,如
Swing
中的
JTree


谢谢。

关于像
JTree
这样的行,在JavaFX11中没有内置的方法。有一个功能请求(),但似乎没有任何实现它的计划。你也许可以自己实现它,但我不知道如何实现

至于修改
TreeCell
s的缩进,最简单的方法是使用CSS

如中所述,
TreeCell
有一个名为
-fx indent
的CSS属性,其值为。您可以通过使用样式表或通过内联设置此属性。使用内联样式的示例:

public class TreeDataCell extends TreeCell<TreeData> {

    public TreeDataCell() {
        setStyle("-fx-indent: <size>;");
    }

}

您还可以扩展
TreeCellSkin
并对其进行自定义。只需记住重写
createDefaultSkin()
并返回自定义皮肤实现。

谢谢Slaw,这两种解决方案都非常有效。很明显,CSS方法更有效、更简单,我想我会努力学习它。周末好。
public class TreeDataCell extends TreeCell<TreeData> {

    public TreeDataCell() {
        setStyle("-fx-indent: <size>;");
    }

}
public class TreeDataCell extends TreeCell<TreeData> {

    @Override
    protected Skin<?> createDefaultSkin() {
        TreeCellSkin<?> skin = (TreeCellSkin<?>) super.createDefaultSkin();
        skin.setIndent(/* your value */);
        return skin;
    }

}