2016-12-16 5 views
0

各ノードに親(親もコンポーネントコード)があるデータベース(コード、コンポネント、親)上にテーブルがあり、selectから動的に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

ツリー構造を構築するアルゴリズムが正しいかどうかはわかりませんが、* nothing *がGUIに表示されている場合は、投稿していないものが間違っています。 (少なくとも、ルートノードが表示されるはずです。)[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 = entry.getValue(); 
root.getChildren().add(entry.getValue()); 
の設定 rootに項目を追加する代わりに
+0

ありがとう@fabian、 – devhicham

関連する問題