【问题标题】:How to generate tree view dynamically from a collection of values in JavaFX如何从 JavaFX 中的值集合动态生成树视图
【发布时间】:2018-01-26 08:33:31
【问题描述】:

出于学习目的,我想从 Enum 动态构建一个树视图,我在其中定义了树项及其关系。

MenuContext 枚举

public enum MenuContext {
 APP, // Tree menu of application
 DIALOG; // Tree menu on dialog
}

TreeItems 枚举

public enum TreeItems {
 AM_ROOT(MenuContext.APP, null, ""),
 NODE_1(MenuContext.APP, AM_ROOT, "Menu node 1"),
 NODE_2(MenuContext.APP, AM_ROOT, "Menu node 2"),
 NODE_2_1(MenuContext.APP, NODE_2, "Menu node 2.1"),
 NODE_2_2(MenuContext.APP, NODE_2, "Menu node 2.2"),
 NODE_2_3(MenuContext.APP, NODE_2, "Menu node 2.3"),
 NODE_2_4(MenuContext.APP, NODE_2, "Menu node 2.4"),
 NODE_3(MenuContext.APP, AM_ROOT, "Menu node 3"),
 NODE_4(MenuContext.APP, AM_ROOT, "Menu node 4"),
 DM_ROOT(MenuContext.DIALOG, null, ""),
 DM_NODE_1(MenuContext.DIALOG, DM_ROOT, "Dialog menu node 1"),
 DM_NODE_2(MenuContext.DIALOG, DM_ROOT, "Dialog menu node 2"),
 DM_NODE_2_1(MenuContext.DIALOG, DM_NODE_2, "Dialog menu node 2.1"),
 DM_NODE_2_2(MenuContext.DIALOG, DM_NODE_2, "Dialog menu node 2.2"),
 DM_NODE_2_3(MenuContext.DIALOG, DM_NODE_2, "Dialog menu node 2.3"),
 DM_NODE_2_4(MenuContext.DIALOG, DM_NODE_2, "Dialog menu node 2.4"),
 DM_NODE_3(MenuContext.DIALOG, DM_ROOT, "Dialog menu node 3");

 // Necessary code to get values of single enum item
}

使用这种结构,我尝试根据Answer - fill javaFX treeView dynamically 上的答案动态创建树,我已经看到问题和答案被引用到数据库以存储树信息。

所以我的问题是我如何将构建算法调整为 Enum 数据源,因为当我尝试使用建议的代码动态构建树并且该答案时,我可以获得一个接一个的树项目列表,而不是按父项分组.

【问题讨论】:

    标签: java javafx treeview


    【解决方案1】:

    经过多次尝试和失败,我找到了一种方法,可以使用此方法从一组对象(按其父对象分组)动态构建树视图。

    private TreeView<String> buildTree(MenuContext mC) {
     List<TreeItems> roots = buildParents(mC);
     EnumMap<TreeItems, TreeItem<String>> values = buildTreeValues(mC);
     TreeView<String> tree = new TreeView<>();
     TreeItem<String> root = null;
     int rootsSize = roots.size();
     // Build node w or w/o children in reverse order
     for (int i = rootsSize - 1; i > 0; --i) {
      EnumMap<TreeItems, TreeItem<String>> nodeChildren = getNodeChildren(roots.get(i),values);
      for (Entry<TreeItems, TreeItem<String>> entry : nodeChildren.entrySet()) {
       values.get(roots.get(i)).getChildren().add(entry.getValue());
       values.remove(entry.getKey());
      }
     }
     // Populate tree model
     for (Entry<TreeItems, TreeItem<String>> entry : values.entrySet()) {
      if (entry.getKey().getParent() == null) {
       root = entry.getValue();
      } else {
       if (root == null) {
        root = entry.getValue();
       } else {
        root.getChildren().add(entry.getValue());
       }
      }
     }
     tree.setRoot(root);
     tree.setShowRoot(false);
     return tree;
    }
    
    private EnumMap<TreeItems, TreeItem<String>> buildTreeValues(MenuContext mC) {
     EnumMap<TreeItems, TreeItem<String>> treeValues = new EnumMap<>(TreeItems.class);
     for (TreeItems tI : TreeItems.values()) {
      if (tI.getMenuContext().equals(mC)) {
       treeValues.put(tI, new TreeItem<>(tI.getLabel()));
      }
     }
     return treeValues;
    }
    
    private List<TreeItems> buildParents(MenuContext mC) {
     List<TreeItems> parents = new ArrayList<>();
     for (TreeItems tI : TreeItems.values()) {
      if (tI.getMenuContext().equals(mC) && !parents.contains(tI.getParent())) {
       parents.add(tI.getParent());
      }
     }
     return parents;
    }
    
    private EnumMap<TreeItems, TreeItem<String>> getNodeChildren(TreeItems root,
     EnumMap<TreeItems, TreeItem<String>> values) {
     EnumMap<TreeItems, TreeItem<String>> cNodes = new EnumMap<>(TreeItems.class);
     for (Entry<TreeItems, TreeItem<String>> entry : values.entrySet()) {
      TreeItems parentKey = entry.getKey().getParent();
      if (parentKey != null && root.equals(parentKey)) {
       cNodes.put(entry.getKey(), entry.getValue());
      }
     }
     return cNodes;
    }
    

    我已经使用具有三层嵌套的枚举手动测试了实现,并且生成的树显示了按父级正确分组的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多