Swing机构树拼接

发布于 2018-07-13  413 次阅读


    上次使用的方式,思路没有问题,但是中间限制条件较多,后面再准备正式拼接机构树的时候,突然想到了递归调用,这样处理起来会方便一些。

图片.png

                                                                                效果图

思路:
    1、传入当前节点,第一次调用传入root节点当做当前节点
    2、将节点挂接在当前节点下,挂接后,判断当前节点是否有子节点,没有直接结束,
    有节点,将新节点设置为当前节点
    3、递归调用节点操作,传入list,当前节点
    
注:当前节点会有一种情况,当某分支机构树遍历结束后,当前节点会变成最后一个节点,所以机构会挂接
在最后的节点上,针对这种情况,引入了两个新的方法,节点比较,比较nowNode是否是需要挂接的节点的
父级节点,而想要通过字符串和机构树节点对比的话,只能遍历机构树,同时获得节点的UserObject属性
值(节点名称),如果是,则返回节点,不是则继续遍历直至找到父级节点,如遍历结束后仍未找到,则挂
接在root节点下
/**
     * 节点操作
     * @param list  数据列表
     * @param rootId    上级节点ID
     * @param nowNode    当前节点
     */
    public static void nodeOperating(List<Map<String, Object>> list,
            String rootId, DefaultMutableTreeNode nowNode) {
        // 遍历机构,将机构挂接在相应机构树上
        for (Map<String, Object> map : list) {
            // 挂接节点
            String unit_name = map.get("unit_name").toString();
            System.out.println("当前机构:" + unit_name);
            
            // 根据当前节点名称确定上级节点
            nowNode = nodeEquals(nowNode,map);
            
            System.out.println("当前节点:" + nowNode.getUserObject().toString());
            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
                    unit_name);
            nowNode.add(newNode);
            String parent_id = map.get("id").toString();
            // 判断当前节点下是否有子节点
            list = JDBC.query(JDBC.conn(),
                    SQL.selByCondition("unit", "parent_id", parent_id));
            if (list.size() > 0) {
                nowNode = newNode;
                nodeOperating(list, parent_id, nowNode);
            } else {
                System.out.println("末级节点");
            }
        }
        System.out.println("机构树挂接");
    }
/**
     * 节点比较
     * @param nowNode    当前节点
     * @param map        当前需要挂接的节点信息
     * @return
     */
    public static DefaultMutableTreeNode nodeEquals(DefaultMutableTreeNode nowNode,Map<String, Object> map){
        DefaultMutableTreeNode node = nowNode;
        // 根据当前节点名称确定上级节点,上级节点为空则挂接在根节点中
        List<Map<String, Object>> list = JDBC.query(JDBC.conn(),SQL.selPraent("unit_name", map.get("parent_id").toString()));
        if(list.size()>0){
            String parment_name = list.get(0).get("unit_name").toString();
            if (!nowNode.getUserObject().equals(parment_name)) {
                System.out.println("nowNode节点与上级节点不相同");
                //获取上级节点 DefaultMutableTreeNode对象
                node = nodeTraversing(root, parment_name);
                }
        }else{
            node = root;
        }
        return node;
    }
/**
     * 遍历节点
     * @param root    根节点
     * @param nodeName    节点名称
     * @return
     */
    public static DefaultMutableTreeNode nodeTraversing(DefaultMutableTreeNode root,String nodeName){
        DefaultMutableTreeNode nowNode = null;
        Enumeration enumeration = root.preorderEnumeration();
         while(enumeration.hasMoreElements()){ //遍历枚举对象.
             //先定义一个节点变量.
             DefaultMutableTreeNode node;
             node=(DefaultMutableTreeNode) enumeration.nextElement();//将节点名称给node.
             //根据级别输出占位符.
             for(int l=0;l<node.getLevel();l++){
             System.out.print("---");
             }
             System.out.println(node.getUserObject());//输入节点标签.
             if(node.getUserObject().equals(nodeName)){
                 nowNode = node;
                return nowNode;
             }
             }
         return root;
    }


个人博客,用于记录工作日常的问题。