java - 具有两列的 TreeView JavaFX 8

标签 java javafx treeview javafx-8 treetableview

我需要在 JavaFX 8 中拥有一个可扩展的可嵌套键值列表。这在功能上与 TreeTableView 类似,但它是垂直定向的,而不是水平定向的。换句话说,对于 X-Y 倒轴表,行将是标题而不是列。由于TreeTableView水平的限制,我开始探索TreeView的选项。 TreeView 工作得很好,但只有一列,我需要在每一行中有一个键值对。我真正需要的是如下所示:

example

请注意,foobar 可以是唯一的。

如何向 TreeView 添加第二列?

最佳答案

这是一个基于 TreeView 的自定义单元工厂的想法,用于创建行状单元。创建一个自定义单元格,其中包含网格中的 2 个标签和一些调整大小行为设置。

enter image description here

public class CustomTree extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        TreeView<String[]> tree = new TreeView<>();

        tree.setCellFactory(cell -> new TreeCell<String[]>() {

            private GridPane pane = new GridPane();
            private Label keyLabel = new Label();
            private Label valueLabel = new Label();
            private Border keyBorder = new Border(
                    new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0.5, 0.5, 0.5, 1)));
            private Border valueBorder = new Border(
                    new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0.5, 1, 0.5, 0.5)));

            {
                pane.getChildren().addAll(keyLabel, valueLabel);
                GridPane.setConstraints(keyLabel, 0, 0);
                GridPane.setConstraints(valueLabel, 1, 0);

                ColumnConstraints column1 = new ColumnConstraints();
                column1.setPercentWidth(50);
                ColumnConstraints column2 = new ColumnConstraints();
                column2.setPercentWidth(50);
                pane.getColumnConstraints().addAll(column1, column2);

                keyLabel.setBorder(keyBorder);
                valueLabel.setBorder(valueBorder);
                keyLabel.setMaxWidth(Double.MAX_VALUE);
                valueLabel.setMaxWidth(Double.MAX_VALUE);

                setPadding(Insets.EMPTY);
            }

            @Override
            public void updateItem(String[] name, boolean empty) {
                super.updateItem(name, empty);
                if (empty || name == null) {
                    setText(null);
                    setGraphic(null);
                } else {
                    keyLabel.setText(name[0]);
                    valueLabel.setText(name[1]);
                    setGraphic(pane);
                }
            }
        });

        TreeItem<String[]> root = new TreeItem<>(new String[] { "", "" });
        TreeItem<String[]> sub1 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub2 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub3 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub4 = new TreeItem<>(new String[] { "Foo", "" });
        TreeItem<String[]> sub5 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub41 = new TreeItem<>(new String[] { "Foo", "Bar" });
        TreeItem<String[]> sub42 = new TreeItem<>(new String[] { "Foo", "Bar" });
        root.getChildren().addAll(sub1, sub2, sub3, sub4, sub5);
        sub4.getChildren().addAll(sub41, sub42);

        tree.setRoot(root);

        Scene scene = new Scene(tree);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}

请注意,根也必须使用此单元格类型,尽管可以使用tree.setShowRoot(false);完全隐藏根。这种方法的两个缺点是每个单元格表现为一个单元 - 没有列的概念,并且单元格的值作为数组给出,从而失去类型安全性。您可以自己扩展此示例。

尽管需要做更多的工作,但使用(通用)TableViewTreeTableView 方法是可能的。

关于java - 具有两列的 TreeView JavaFX 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45511808/

相关文章:

java - 为什么我在运行 Jetty 时总是在 LocationAwareLogger 上收到 NoSuchMethodError?

java - Array和ArrayList之间的性能或内存消耗差异

select - 在 JavaFX 中搜索 TableView 列表

CSS 样式在 javafx 中导出的可运行 jar 中不起作用

python-3.x - tkinter TreeView : how to disable widget?

java - 测试提供给 "su"命令的密码是否成功使用 JSch 库

java - 从 TextView 中进行字符串标记

java - Button 类型未定义方法 setOnAction((<no type> e) -> {})

delphi - 如何同步2个TTreeview的滚动?

javascript - KendoUI - 树状 View : How to prevent the item drag n drop from one node to another?