`
clarancepeng
  • 浏览: 191747 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用dhtmlxtree的checkbox tree做权限菜单时碰到的一个问题

阅读更多
我对每个系统都分配了一个唯一的系统号,每个系统的下的菜单和它的子菜单的命名也按一定的规律
如果系统分配了3位数, 如100, 101
它的菜单对应于: 100系统的菜单10001, 10002, 10003, 1000101, 100010102....

使用dhtmlxtree它的实节点很容易获取到,但是它的虚节点获取时有点问题(采用某种方式时)
因此通过它的实节点获取到它对应的虚节点
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.clarancepeng;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
*
* @author pqs
*/
public class TyMenu {
   
    private Collection<QxVo> getMenuList() {
        //String ids_ =  "1060204,106020401,10602040101,1060205,106020501,10602050101,106020502,10602050201,1060206,106020601,10602060101,10602060102,10602060103,10602060104,1060207"; //"10602,1060201,106020101,10602010101,106020102,10602010201,10602010202,10602010203,10602010204,106020103,10602010301,106020104,10602010401,1060202,106020201,10602020101,10602020102,10602020103,10602020104,1060203,106020301,10602030101,10602030102,10602030103,10602030104,1060204,106020401,10602040101,1060205,106020501,10602050101,106020502,10602050201,1060206,106020601,10602060101,10602060102,10602060103,10602060104,1060207";
        String ids_ = "100010203,100010204,1000102,1000204,1000205,1000203,10301,103,10302,103020103,1030101,1030102,1000402,10705040605,1001028,10402020507";
        String[] str = ids_.split(",");
        String[] str2 = getOhterMenu(str);
       
        System.out.println("-----------------------------------------------------------");
        Arrays.sort(str2);
        for(String s : str2) {
            System.out.println(" " + s);
        }
        List<QxVo> list = new ArrayList<QxVo>();
        if(str != null)
        {
            for(String s : str){
                    if(!"".equals(s) && s!=null)
                    {
                            QxVo vo = new QxVo();
                            vo.setRlid("abc");
                            vo.setPrvid(s);
                            vo.setLbl("0");
                            list.add(vo);
                    }

            }
        }
       
        return list;
   }
  
   /**
    * 首先对获取的节点进行排序
    * 1. 如果他们的祖先已经被选择了,则他们的儿子及孙子等都不用再做判断了(只判断为3位数的顶级节点)
    * 2. 如果他们的父亲已经被选择了,则此节点不用再做判断了
    * 3. 如果相邻的两个节点有共同的父亲,后面的一个节点就不用判断了
    * @param strArr
    * @return
    */
   private String[] getOhterMenu(String[] strArr) {
       if(strArr == null || strArr.length == 0) return strArr;
       List<String> menuList =  Arrays.asList(strArr);    
       Collections.sort(menuList);
      
       //祖先节点  
       String ancestorNode = null;
       Set<String> otherMenu = new HashSet<String>();
       String parent = null;
       //上级菜单
       String upperMenu = "";
       String befores = "";
      
       for(String s : menuList) {
           System.out.println(" " + s);
           if(s != null && !"".equals(s)) {
               if(s.length() == 3) {
                   ancestorNode = s;
               }
               else if(s.length() > 3) {
                   if(ancestorNode != null
                           && s.startsWith(ancestorNode)) {
                       //祖先已经被选节点
                       continue;
                   }
                   else {
                       ancestorNode = null;
                       if(s.substring(0, s.length() -2).equals(parent)) {
                        //同父节点
                        continue;  
                       }
                       else {
                           if(befores.length() < s.length()) {
                            upperMenu = befores;
                           }
                           else if(befores.length() > s.length()) {
                               upperMenu = s;
                           }
                          
                           parent = s.substring(0, s.length() -2);
                           //System.out.println("parent= " + parent );
                           //父节点已经被选择,不必在做添加
                           if(parent.equals(upperMenu)) {
                               continue;
                           }
                           if(!menuList.contains(parent)) {
                               otherMenu.add(parent);
                           }
                           String temp = parent;
                          
                           while(temp.length() > 3) {
                               temp = temp.substring(0, temp.length()-2);
                               if(!menuList.contains(temp)) {
                                   otherMenu.add(temp);
                               }
                           }
                       }
                   }
                  
               }
           }
            befores = s;
       }
       return otherMenu.toArray(new String[0]);
   }
  
   public static void main(String[] args) {
       TyMenu tyMenu = new TyMenu();
       tyMenu.getMenuList();
   }
   
}

class QxVo implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -4622465980226296915L;
private String rlid;
private String prvid;
private String lbl;
public String getPrvid()
{
return prvid;
}
public void setPrvid(String prvid)
{
this.prvid = prvid;
}
public String getRlid()
{
return rlid;
}
public void setRlid(String rlid)
{
this.rlid = rlid;
}
/**
* @return Returns the lbl.
*/
public String getLbl()
{
return lbl;
}
/**
* @param lbl The lbl to set.
*/
public void setLbl(String lbl)
{
this.lbl = lbl;
}

}

分享到:
评论

相关推荐

    dhtmlXtree树 右dhtmlXtree键菜单

    一般来说,你会在`onRightClick`事件处理函数中创建一个新的菜单实例,然后将定义好的菜单项添加进去。 4. **显示菜单**:菜单创建后,需要将其定位到用户点击的位置。这通常涉及到计算鼠标点击的坐标,并设置菜单...

    dhtmlxtree的一个实用demo

    【标题】"dhtmlxtree的一个实用demo"指的是一个基于dhtmlxtree的示例应用,这个示例可能展示了如何在网页中实现交互式的树形数据结构,用于展示层次化的信息,比如目录结构、组织架构或者权限管理等。dhtmlxtree是一...

    JS 带右键菜单的目录树 dhtmlxtree+proto.menu 分权限

    JS 带右键菜单的目录树 dhtmlxtree+proto.menu 分权限 JS 带右键菜单的目录树 dhtmlxtree+proto.menu 分权限 图片预览 ...

    dhtmlxtree

    综上所述,dhtmlxtree是一个专注于创建权限树和交互式菜单的JavaScript库,它提供了一套完整的解决方案,包括前端展示、后端交互以及丰富的示例和文档,适用于需要进行权限管理的Web应用程序开发。开发者可以通过...

    dhtmlxtree 的右键菜单

    dhtmlxtree 是一个流行的JavaScript库,用于创建交互式的树形数据结构,广泛应用于网站和Web应用程序中,用于展示层次化的信息。其强大的功能之一是支持右键菜单,这使得用户可以通过鼠标右键点击节点来执行各种操作...

    dhtmlxTree 树菜单.docx

    dhtmlxTree 是一个功能强大的 JavaScript 库,用于创建基于 Ajax 的树形菜单。它支持多种特性,如在线编辑、拖拽操作、复选框模式(包括全选、不选和半选状态)等,并且在处理大量数据时仍能保持高效的性能。...

    dhtmlxTree目录树增加右键菜单及拖拽排序+源码示例

    artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口,非常出色。但在项目开发中,一些细节方面、框架调用、模块集成以及与IE6的兼容问题等都有一些地方需要注意和完善。该实例中集成的...

    dhtmlxtree 右键菜单的增加,删除,修改

    1. **添加右键菜单**:首先,你需要创建一个包含菜单项的JSON对象,每个菜单项包含ID、文本、图标等属性。然后,通过调用dhtmlxtree的`attachEvent`方法,监听树节点的`onContext`事件,这会在用户右击节点时触发。...

    dhtmlxtree实例

    例如,在一个项目管理应用中,可以使用dhtmlxtree展示任务的层级关系,通过拖放调整任务顺序,通过复选框选择多个任务,通过右键菜单进行任务的增删改操作。 **六、API与配置选项** dhtmlxtree提供了丰富的API接口...

    dhtmlxTree

    XML文件通常包含一系列`&lt;tree&gt;`或`&lt;item&gt;`标签,每个标签代表一个树节点,包含ID、文本、图标以及子节点等信息。例如: ```xml &lt;tree&gt; 父节点1"&gt; 子节点1.1"/&gt; 子节点1.2"/&gt; 父节点2"/&gt; &lt;/tree&gt; ``` **二、...

    DhtmlxTree-dhtmlxmenu实现在节点上右键弹出菜单

    对dhtmlXTree进行一个小的扩展 需求1: 动态生成树形菜单,每个节点都有各自的URL地址,单击不同的节点框架页的右侧跳转到该节点所对应的URL。(框架页说明:左边是树形菜单;右边是显示页面相应信息的页面) 分析...

    drag-drop-folder-tree.zip_ajax_dhtmlxtree dr_drop_tree_tree ja

    在这个特定的例子"drag-drop-folder-tree.zip_ajax_dhtmlxtree_dr_drop_tree_tree_ja"中,开发者利用JavaScript的特性实现了一个拖放功能,这在AJAX(Asynchronous JavaScript and XML)开发中非常常见。AJAX允许...

    Dhtmlxtree的例子

    总的来说,Dhtmlxtree是一个强大且灵活的JavaScript树形控件,通过XML数据的加载,可以方便地构建出具有多层次结构的界面元素,适用于各种类型的Web应用。这个例子展示了其基础用法,但Dhtmlxtree的强大之处远不止于...

    dhtmlxTree 2.1

    通过监听这些事件,可以实现节点操作的回调函数,例如,当用户点击一个节点时执行特定的操作,或者在节点展开时加载其子节点的数据。 **5. 扩展功能** dhtmlxTree 2.1可能包含了对Ajax支持的改进,允许更流畅的数据...

    专业版dhtmlxtree下载

    dhtmlxtree是一款基于JavaScript的开源树形菜单控件,专为Web开发人员设计,用于在网页中构建交互式、可扩展的树状结构。它提供了丰富的功能和自定义选项,使得用户界面更加直观和易于操作。这款专业版dhtmlxtree在...

    dhtmlXTree1.6

    **dhtmlXTree1.6** 是一个基于JavaScript的组件,用于在Web应用程序中创建交互式的树状结构。这个组件允许开发者以动态和灵活的方式展示层次化的数据,常见于网站的导航菜单、文件系统或者组织架构等场景。...

Global site tag (gtag.js) - Google Analytics