如何基于数据库记录创建N层级的JTree?
基于数据库parentID构建N层级JTree的解决方案
你的核心问题是没有利用parentID建立节点间的层级关联,当前代码只是把所有后续节点硬挂到第一个节点下,自然只能生成一级子节点。下面是基于parentID构建任意层级JTree的实现方案:
实现思路
- 用**哈希表(Map)**存储所有节点,键为节点ID,值为对应的
DefaultMutableTreeNode,目的是快速查找父节点,避免嵌套遍历的低效操作 - 先遍历所有数据库记录,创建每个节点并存入哈希表
- 再次遍历所有节点,根据
parentID从哈希表中找到父节点,将当前节点挂载到父节点下;如果是根级节点(parentID为null/0等根标识),则直接挂载到JTree的根节点上
修改后的代码示例
假设你的tbl_bom_sandbox实体类包含getId()(获取当前节点ID)、getParentId()(获取父节点ID)、getNodeName()(获取节点显示名称,建议统一字段名,替代原有的RouteName/InFeedItemName)方法:
private DefaultMutableTreeNode setSandboxJTreeModel() { sandboxJTreeRootNode = new DefaultMutableTreeNode(AppConstants.SANDBOX_TREE_NAME); try { ArrayList<tbl_bom_sandbox> sandboxArray = daoSandboxObject.fetchAllSandboxRoutes(); // 用Map存储所有节点,实现父节点快速查找 Map<Long, DefaultMutableTreeNode> nodeMap = new HashMap<>(); // 第一步:批量创建所有节点并存入Map for (tbl_bom_sandbox item : sandboxArray) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(item.getNodeName()); nodeMap.put(item.getId(), node); } // 第二步:根据parentID挂载节点到对应父节点 for (tbl_bom_sandbox item : sandboxArray) { DefaultMutableTreeNode currentNode = nodeMap.get(item.getId()); Long parentId = item.getParentId(); if (parentId == null || parentId == 0) { // 父ID为null或0,判定为根级子节点,挂载到JTree根节点 sandboxJTreeRootNode.add(currentNode); } else { DefaultMutableTreeNode parentNode = nodeMap.get(parentId); if (parentNode != null) { parentNode.add(currentNode); } else { // 处理父节点不存在的异常情况,可根据业务需求调整 System.err.println("找不到ID为" + parentId + "的父节点,跳过节点" + item.getId()); } } } } catch (Exception e) { e.printStackTrace(); } return sandboxJTreeRootNode; }
关键说明
- 如果实体类中节点名称字段不统一,可根据
parentID判断使用getRouteName()还是getInFeedItemName(),但更建议数据库表统一字段定义 - 请根据你数据库中根节点的
parentID标识调整判断逻辑(比如部分系统用-1表示根节点) - 新增的父节点不存在的异常处理,可避免因数据错误导致JTree构建失败
内容的提问来源于stack exchange,提问作者Alpha
相关产品推荐
相关产品推荐

