从数据库动态填充JavaFXTreeView

从数据库动态填充JavaFXTreeView,javafx,treeview,Javafx,Treeview,我在数据库(代码、组件、父节点)上有一个表,其中每个节点都有一个父节点(父节点也是一个组件代码),我需要从select动态填充树视图 @FXML private TreeView tree;//declaration of the treeView HashMap<Integer, composant> node = new HashMap<>(); //for child nodes HashMap<Integer, composant> pere = ne

我在数据库(代码、组件、父节点)上有一个表,其中每个节点都有一个父节点(父节点也是一个组件代码),我需要从select动态填充树视图

@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);
}
@FXML
私家树//树景宣言
HashMap节点=新建HashMap()//对于子节点
HashMap pere=新的HashMap()//对于父节点
成分c//来自组件类的对象
私有空心填充树(字符串idSys){
String query=“从组件中选择*,其中id=?”;
试一试{
ps=cnx.prepareStatement(查询);
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”);
字符串niveau=rs.getString(“niveau”);
int id=rs.getInt(“id”);
c=新组件(代码、组件、niveau、家长、id);
节点put(代码c);
pere.put(母公司,c);
}
ps.close();
rs.close();
}捕获(例外e){
系统错误println(“错误”+e);
}
TreeItem系统=新的TreeItem(系统);
//浏览和填充父节点
for(整数k:pere.keySet()){
复合物p=pere.get(k);
TreeItem parent=新的TreeItem();
setValue(p.getComposant());
//浏览并填充子hashmap
对于(整数i:node.keySet()){
composantc=node.get(i);
TreeItem noeud=新TreeItem();
noeud.setValue(c.getComposant());
如果(c.getParent()==k){
//如果父节点=1,则必须附加到根节点
如果(k==1){
system.getChildren().add(noeud);
}否则{
parent.getChildren().add(noeud);
}
}
}
}
树根(系统);
}
编译时,窗口上不会显示任何内容 这就是我得到的
我几乎可以肯定创建树结构的逻辑是错误的

最好是简单地创建
TreeItem
s并将它们按代码存储在地图中。然后迭代映射并将每个子对象添加到其父对象:

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);
并将项目添加到
根目录
,而不是设置根目录

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

我不确定构建树结构的算法是否正确,但如果GUI中没有显示任何内容,则说明您没有发布错误信息。(至少你应该看到你的根节点);与其访问数据库,不如硬编码一些
composant
实例,并将它们放入地图中。您应该能够在相当少的代码行中实现这一点。如果这不起作用,那么你可以在你的问题中发布完整的例子;如果确实如此,您将能够缩小问题的范围。
// root = entry.getValue();
root.getChildren().add(entry.getValue());