1

当时我在 TreeTableView 中的 TreeItem 看起来很平坦,像这样:

    //////////////////row//////////////////////////////
    for (Entry<String, String> entryRow : dc.getSortedfuncAll().entrySet()) {
        root.getChildren().add(new TreeItem<String>(entryRow.getValue()));

    }
    // ////////////////treetable////////////////////////////
    final TreeTableView<String> treeTableView = new TreeTableView<>(root);
  • AUF_1086686287581_9999
  • AUF_1086686329972_10049
  • AUF_1079023138936_6682
  • AUF_1087981634453_7022
  • AUF_1060589919844_59496
  • AUF_1421268568003_1743
  • AUF_1422451819445_14260
  • AUF_1421268533080_1741
  • AUF_1421268719761_1776
  • AUF_1421272434570_1781
  • AUF_1421268568003_1743

考虑它们之间的以下关系:它是结果TreeMap<String,ArrayList<String>>

{AUF_1060589919844_59496=[AUF_1086686287581_9999,AUF_1086686329972_10049,AUF_1079023138936_6682],
AUF_1087981634453_7022=[AUF_1421268533080_1741, AUF_1421268568003_1743],
AUF_1421268533080_1741=[AUF_1421268719761_1776], 
AUF_1421272434570_1781=[AUF_1087981634453_7022], 
AUF_1422451819445_14260=[AUF_1421268568003_1743]}

我想让它们像这样分层:

  • AUF_1060589919844_59496
    • AUF_1079023138936_6682
    • AUF_1086686287581_9999
    • AUF_1086686329972_10049
  • AUF_1421272434570_1781
    • AUF_1087981634453_7022
      • AUF_1421268568003_1743
      • AUF_1421268533080_1741
        • AUF_1421268719761_1776
  • AUF_1422451819445_14260
    • AUF_1421268568003_1743

我应该在哪里尝试应用它?(细胞工厂?)你能想出一种方法来建立嵌套关系吗?

4

1 回答 1

2

这是一个解决方案,它假设您事先知道并提供初始树根作为输入。

该解决方案通过递归遍历数据结构来确定要在树层次结构的每个级别记录的 TreeItems。该解决方案假设输入图数据结构中的节点不是循环的。如果输入数据中有循环,则解决方案将永远循环。

此解决方案在显示树之前预先创建所有树项值,而不是在用户单击以展开该级别时确定给定级别的树项值。

等级制度

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.stage.Stage;

import java.util.Arrays;
import java.util.List;
import java.util.TreeMap;
import java.util.stream.Collectors;

public class NestedTree extends Application {
    @Override
    public void start(Stage stage) {
        // create some sample data.
        TreeMap<String, List<String>> data = new TreeMap<>();

        data.put("AUF_1060589919844_59496", Arrays.asList("AUF_1086686287581_9999", "AUF_1086686329972_10049", "AUF_1079023138936_6682"));
        data.put("AUF_1087981634453_7022", Arrays.asList("AUF_1421268533080_1741", "AUF_1421268568003_1743"));
        data.put("AUF_1421268533080_1741", Arrays.asList("AUF_1421268719761_1776"));
        data.put("AUF_1421272434570_1781", Arrays.asList("AUF_1087981634453_7022"));
        data.put("AUF_1422451819445_14260", Arrays.asList("AUF_1421268568003_1743"));

        String[] rootKeys = {
                "AUF_1060589919844_59496",
                "AUF_1421272434570_1781",
                "AUF_1422451819445_14260"
        };

        // create the tree from the data.
        TreeView<String> tree = createTreeView(
                data,
                rootKeys
        );

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

    /**
     * Create a TreeView of a set of data
     * given the data and identified roots within the data.
     */
    private TreeView<String> createTreeView(
            TreeMap<String, List<String>> data,
            String[] rootKeys
    ) {
        TreeItem<String> root = new TreeItem<>();
        Arrays.stream(rootKeys).sorted().forEach(
                rootKey ->
                        root.getChildren().add(
                                createTreeItem(data, rootKey)
                        )
        );

        TreeView<String> tree = new TreeView<>();
        tree.setRoot(root);
        tree.setShowRoot(false);

        return tree;
    }

    /**
     * Create a TreeItem for a TreeView from a set of data
     * given the data and an identified root within the data.
     */
    private TreeItem<String> createTreeItem(
            TreeMap<String, List<String>> data,
            String rootKey
    ) {
        TreeItem<String> item = new TreeItem<>();
        item.setValue(rootKey);
        item.setExpanded(true);

        List<String> childData = data.get(rootKey);
        if (childData != null) {
            childData.stream()
                .sorted()
                .map(
                        child -> createTreeItem(data, child)
                )
                .collect(
                        Collectors.toCollection(item::getChildren)
                );
        }

        return item;
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}
于 2015-03-03T00:38:13.157 回答