2016-12-16 6 views
0

Ich habe eine Tabelle auf der Datenbank (Code, Compostant, Eltern), wo jeder Knoten ein Elternteil hat (ein Elternteil ist auch ein Komponentencode), muss ich einen TreeView dynamisch von einem Selectfülle javaFX treeView von der Datenbank dynamisch

füllen
@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); 
} 

wenn nichts erscheint auf dem Fenster Kompilierung das ist, was ich enter image description here

+0

Ich bin nicht sicher, ob der Algorithmus zum Erstellen der Baumstruktur korrekt ist, aber wenn * nichts * in der GUI angezeigt wird, ist etwas falsch, dass Sie nicht gebucht haben. (Zumindest sollten Sie Ihren Wurzelknoten sehen.) Ich empfehle Ihnen, ein [MCVE] zu erstellen; Anstatt auf eine Datenbank zuzugreifen, codieren Sie ein paar "Composant" -Instanzen und fügen Sie sie in die Karten ein. Sie sollten das in einer ziemlich kleinen Anzahl von Codezeilen tun können. Wenn das nicht funktioniert, können Sie das vollständige Beispiel in Ihrer Frage veröffentlichen; Wenn dies der Fall ist, können Sie eingrenzen, wo das Problem liegt. –

Antwort

1

ich bin die Logik fast sicher Struktur der Erstellung der Baum haben falsch ist.

Am besten erstellen Sie einfach die TreeItem s und speichern sie nach Code in einer Karte. Dann iterieren über die Karte und jedes Kind hinzufügen, um es Eltern:

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); 

Beachten Sie, dass der obige Code angenommen, dass es eine eindeutige Wurzel in der Tabelle gespeichert ist. falls die Abfrage einen Wald zurück, wo jede Wurzel zum Stammelement der TreeView hinzugefügt werden soll, initialisiert einfach root mit einem Punkt statt

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

und die Elemente in dem root statt die Wurzel der Einstellung

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

vielen dank @fabian, – devhicham

Verwandte Themen