【问题标题】:creating nested TreeItem in javafx在 javafx 中创建嵌套的 TreeItem
【发布时间】:2015-03-02 23:21:15
【问题描述】:

当时我在 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&lt;String,ArrayList&lt;String&gt;&gt;的结果:

{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

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

【问题讨论】:

    标签: javafx parent-child treetableview


    【解决方案1】:

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

    该解决方案通过递归遍历数据结构来确定要在树层次结构的每个级别记录的 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);
        }
    }
    

    【讨论】:

    • 真的很棒。虽然我以前不知道 rooKeys。我试着想办法找到它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多