2016-12-16 216 views
0

我有一个数据库(代码,composant,父)的表,其中每个节点都有一个父(父也是一个组件代码),我需要从选择动态填充一个treeView从数据库动态填充javaFX treeView

编译没事的时候
@FXML 
private TreeView tree;//declaration of the treeView 
HashMap<Integer, composant> node = new HashMap<>(); //for child nodes 
HashMap<Integer, composant> pere = new HashMap<>(); //for parent nodes 
composant c; //object from component class 

private void fillTree(String idSys) { 
    String query = "SELECT * FROM composant WHERE id=?"; 
    try { 
     ps = cnx.prepareStatement(query); 
     ps.setString(1, idSys); 
     rs = ps.executeQuery(); 

     while (rs.next()) { 
      int code = rs.getInt("code"); 
      String composant = rs.getString("composant"); 
      int parent = rs.getInt("parent"); 
      String niveau = rs.getString("niveau"); 
      int id = rs.getInt("id"); 

      c = new composant(code, composant, niveau, parent, id); 
      node.put(code, c); 
      pere.put(parent, c); 
     } 
     ps.close(); 
     rs.close(); 
    } catch (Exception e) { 
     System.err.println("Error" + e); 
    } 

    TreeItem<String> system = new TreeItem<>(sys); 
    //brows and fill parents node 
    for (Integer k : pere.keySet()) { 
     composant p = pere.get(k); 
     TreeItem<String> parent = new TreeItem<>(); 
     parent.setValue(p.getComposant()); 

     //brows and fill child hashmap 
     for (Integer i : node.keySet()) { 
      composant c = node.get(i); 
      TreeItem<String> noeud = new TreeItem<>(); 
      noeud.setValue(c.getComposant()); 

      if (c.getParent() == k) { 
       //if the parent = 1 it must attach to the root node 
       if (k == 1) { 
        system.getChildren().add(noeud); 
       } else { 
        parent.getChildren().add(noeud); 
       } 
      } 
     } 
    } 
    tree.setRoot(system); 
} 

出现在窗口 上这是我有 enter image description here

+0

我不确定构建树结构的算法是否正确,但如果在GUI中出现* nothing *,则表明您没有发布任何错误。 (至少你应该看到你的根节点。)我建议你尝试创建一个[MCVE];代替访问数据库,硬编码一些'composant'实例并将它们放入地图中。你应该可以在很少的代码行中做到这一点。如果这不起作用,那么你可以在你的问题中发布完整的例子;如果确实如此,您将能够缩小问题所在。 –

回答

1

我几乎可以肯定创建树结构的逻辑是错误的。

如果您只是简单地创建TreeItem,并通过代码将其存储在地图中,那么最好。然后遍历地图并将其添加到它的父代:

Map<Integer, TreeItem<String>> itemById = new HashMap<>(); 
Map<Integer, Integer> parents = new HashMap<>(); 

while (rs.next()) { 
    int code = rs.getInt("code"); 
    String composant = rs.getString("composant"); 
    int parent = rs.getInt("parent"); 
    String niveau = rs.getString("niveau"); 
    int id = rs.getInt("id"); 

    itemById.put(code, new TreeItem<>(composant)); 
    parents.put(code, parent); 
} 
ps.close(); 
rs.close(); 

TreeItem<String> root = null; 
for (Map.Entry<Integer, TreeItem<String>> entry : itemById.entrySet()) { 
    Integer key = entry.getKey(); 
    Integer parent = parents.get(key); 
    if (parent.equals(key)) { 
     // in case the root item points to itself, this is it 
     root = entry.getValue(); 
    } else { 
     TreeItem<String> parentItem = itemById.get(parent); 
     if (parentItem == null) { 
      // in case the root item has no parent in the resultset, this is it 
      root = entry.getValue(); 
     } else { 
      // add to parent treeitem 
      parentItem.getChildren().add(entry.getValue()); 
     } 
    } 
} 
tree.setRoot(root); 

请注意,上面的代码假定存在唯一的根存储在表中。如果该查询返回一个森林里每一根应该被添加到TreeView的根项目,只需用替代项目

TreeItem<String> root = new TreeItem<>(); 

初始化root并添加项目root,而不是设置根

// root = entry.getValue(); 
root.getChildren().add(entry.getValue()); 
+0

非常感谢@fabian, – devhicham