从数据库动态填充JavaFXTreeView
我在数据库(代码、组件、父节点)上有一个表,其中每个节点都有一个父节点(父节点也是一个组件代码),我需要从select动态填充树视图从数据库动态填充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
@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());