You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于数据库记录创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:11:02