`
rcyl2003
  • 浏览: 231789 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用纯java自定义自己的树形菜单

阅读更多

用纯java自定义自己的树形菜单

转自

small_ding的专栏

<o:p></o:p>

<o:p> </o:p>

1.定义每个树节点信息的类<o:p></o:p>

package BSC.tree;

import java.io.*;

import java.util.*;

/**

 * <p>一个树节点对像 </p>

 * <p>构造一个树节点对像 </p>

 * <p>Copyright: Copyright (c) 2003</p>

 * <p>上海佳杏 </p>

 * @author 丁小龙

 * @version 1.0

 */

<o:p> </o:p>

public class clsTreeNode implements Serializable {

    /**<o:p></o:p>

     * 根据指定参数构造一个新的 clsTreeNode 节点<o:p></o:p>

     *<o:p></o:p>

     * @param name 节点内在名字 (在整个棵树中必须是唯一的)<o:p></o:p>

     * @param icon 节点可见时相对于图像目录的完整图橡文件的路径名<o:p></o:p>

     * @param label 节点可见时的标签内容<o:p></o:p>

     * @param action 当前所选择节点的对应的超级链接,若为空没有超级链接<o:p></o:p>

     * @param target 超级链接所对应的窗口对象,若为空为当前窗口<o:p></o:p>

     * @param expanded 节点是否展开?

     */

    public clsTreeNode(String name,

                           String icon, String label,

                           String action, String target,

                           boolean expanded, String domain) {

<o:p> </o:p>

        super();

        this.name = name;

        this.icon = icon;

        this.label = label;

        this.action = action;

        this.target = target;

        this.expanded = expanded;

        this.domain = domain;

<o:p> </o:p>

    }

    protected String labelcolor="#0000FF";

    public String getLabelColor()

    {

      return this.labelcolor;

    }

    public void setLabelColor(String color)

    {

      if(color!=null)

        this.labelcolor=color;

    }<o:p></o:p>

<o:p> </o:p>

    // ----------------------------------------------------- 实体变量<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

    /**<o:p></o:p>

     * 当前节点的子节点集,他们按一定的顺序显示, in the<o:p></o:p>

     */

    protected Vector children = new Vector();

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

    /**<o:p></o:p>

     * 假如节点被选择将直接被超级链接所控制<o:p></o:p>

     */

    protected String action = null;

<o:p> </o:p>

    public String getAction() {

        return (this.action);

    }

<o:p> </o:p>

    /**

     * 节点的域.

     */

    protected String domain = null;

<o:p> </o:p>

    public String getDomain() {

        return (this.domain);

    }

<o:p> </o:p>

    /**

     * 节点当前是否被展开?

     */

    protected boolean expanded = false;

<o:p> </o:p>

    public boolean isExpanded() {

        return (this.expanded);

    }

<o:p> </o:p>

    public void setExpanded(boolean expanded) {

        this.expanded = expanded;

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     *节点可见时相对于图像目录的完整图橡文件的路径名

     */

    protected String icon = null;

<o:p> </o:p>

    public String getIcon() {

        return (this.icon);

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     *节点可见时的标签内容.

     */

    protected String label = null;

<o:p> </o:p>

    public String getLabel() {

        return (this.label);

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 是否当前父节点的子节点集中的最后一个节点

     */

    protected boolean last = false;

<o:p> </o:p>

    public boolean isLast() {

        return (this.last);

    }

<o:p> </o:p>

    void setLast(boolean last) {

        this.last = last;

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 是否为叶节点 ?

     */

    public boolean isLeaf() {

        synchronized (children) {

            return (children.size() < 1);

        }

    }

<o:p> </o:p>

    public int getChildCount()

    {

      return children.size() ;

    }

    /**

     *节点内在名字 (在整个棵树中必须是唯一的)

     */

    protected String name = null;

<o:p> </o:p>

    public String getName() {

        return (this.name);

    }<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

    /**<o:p></o:p>

     * 当前节点的父节点,若为空为则为根节点.<o:p></o:p>

     */

    protected clsTreeNode parent = null;

<o:p> </o:p>

    public clsTreeNode getParent() {

        return (this.parent);

    }

<o:p> </o:p>

    void setParent(clsTreeNode parent) {

        this.parent = parent;

        if (parent == null)

            width = 1;

        else

            width = parent.getWidth() + 1;

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 节点当前是否被选择

     */

    protected boolean selected = false;

<o:p> </o:p>

    public boolean isSelected() {

        return (this.selected);

    }

<o:p> </o:p>

    public void setSelected(boolean selected) {

        this.selected = selected;

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 超级链接所对应的窗口对象,若为空为当前窗口

     */

    protected String target = null;

<o:p> </o:p>

    public String getTarget() {

        return (this.target);<o:p></o:p>

    }<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

    /**<o:p></o:p>

     * 节点的可显示宽度(如果节点为可见的).<o:p></o:p>

     * 如果节点不可见,则计算出的宽度为最直接的父节点<o:p></o:p>

     */

    protected int width = 0;

<o:p> </o:p>

    public int getWidth() {

        return (this.width);

    }

<o:p> </o:p>

<o:p> </o:p>

    // --------------------------------------------------------- Public Methods

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 添加一个新的子结点的<o:p></o:p>

     *<o:p></o:p>

     * @param child 新子节点

     *

     * @如果这个新子结点的名字不是唯一的则抛出 IllegalArgumentException 异常

     */

    public void addChild(clsTreeNode child)

        throws IllegalArgumentException {

<o:p> </o:p>

        tree.addNode(child);

        child.setParent(this);

        synchronized (children) {

            int n = children.size();

            if (n > 0) {

                clsTreeNode node = (clsTreeNode) children.get(n - 1);

                node.setLast(false);

            }

            child.setLast(true);

            children.add(child);

        }

<o:p> </o:p>

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 通过指定位置加入一个子节点

     *

     * @param offset 相对0的位移

     * @param child 欲加入的子节点

     *

     * @如果这个新子结点的名字不是唯一的则抛出 IllegalArgumentException 异常

     */

    public void addChild(int offset, clsTreeNode child)

        throws IllegalArgumentException {

<o:p> </o:p>

        tree.addNode(child);

        child.setParent(this);

        synchronized (children) {

            children.add(offset, child);

        }

<o:p> </o:p>

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 返回子节点集

     */

    public clsTreeNode[] findChildren() {

<o:p> </o:p>

        synchronized (children) {

            clsTreeNode results[] = new clsTreeNode[children.size()];

            return ((clsTreeNode[]) children.toArray(results));

        }

<o:p> </o:p>

    }

    /**

    * 整棵树的描述对像

     */

    protected clsTreeControl tree = null;

<o:p> </o:p>

     public clsTreeControl getTree() {

         return (this.tree);

     }

<o:p> </o:p>

    public void setTree(clsTreeControl tree) {

         this.tree = tree;

    }

<o:p> </o:p>

    public void setLabel(String label) {

        this.label = label;

    }

<o:p> </o:p>

    /**

     *从树中移出自己

     */

    public void remove() {

<o:p> </o:p>

        if (tree != null) {

            tree.removeNode(this);

        }

<o:p> </o:p>

    }

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 从指定位置中删除一个子节点

     * @param offset 基于0 存在位置

     */

    public void removeChild(int offset) {

<o:p> </o:p>

        synchronized (children) {

            clsTreeNode child =

                (clsTreeNode) children.get(offset);

            tree.removeNode(child);

            child.setParent(null);

            children.remove(offset);

        }

<o:p> </o:p>

    }

<o:p> </o:p>

<o:p> </o:p>

    // -------------------------------------------------------- Package Methods

<o:p> </o:p>

<o:p> </o:p>

    /**

     *删除指定子节点,但必须是存在的<o:p></o:p>

     *

     * @param child 要被删除的节点

     */

    void removeChild(clsTreeNode child) {

<o:p> </o:p>

        if (child == null) {

            return;

        }

        synchronized (children) {

            int n = children.size();

            for (int i = 0; i < n; i++) {

                if (child == (clsTreeNode) children.get(i)) {

                    children.remove(i);

                    return;

                }

            }

        }

<o:p> </o:p>

    }

<o:p> </o:p>

<o:p> </o:p>

}

2.定义控制树节点信息的类

ackage BSC.tree;

import java.io.Serializable;

import java.util.HashMap;

/**

 * <p>一棵树的完整数据结构描述,它能通过clsDrawTree类来绘制</p>

 * <p> 树的每个结点通过TreeControlNode类实例来描述</P>

 * <p>Copyright: Copyright (c) 2003</p>

 * <p>上海佳杏 </p>

 * @author 丁小龙

 * @version 1.0

 */

<o:p> </o:p>

public class clsTreeControl implements Serializable {

<o:p> </o:p>

<o:p> </o:p>

    // ----------------------------------------------------------- 构造方法<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

    /**<o:p></o:p>

     * 在没有预先确定的根节点构造一个新实体<o:p></o:p>

     */

    public clsTreeControl() {

<o:p> </o:p>

        super();

        setRoot(null);

<o:p> </o:p>

    }<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

    /**<o:p></o:p>

     * 通过指定的根节点构造一个新实体<o:p></o:p>

     *

     * @param root 根节点

     */

    public clsTreeControl(clsTreeNode root) {

<o:p> </o:p>

        super();

        setRoot(root);

<o:p> </o:p>

    }

<o:p> </o:p>

<o:p> </o:p>

    // ----------------------------------------------------- 实体变量

<o:p> </o:p>

<o:p> </o:p>

    /**

     *按键入的名字来描述这棵树的节点集合

     */

    protected HashMap registry = new HashMap();

<o:p> </o:p>

<o:p> </o:p>

    /**

     * 最近被选择的节点

     */

    protected clsTreeNode selected = null;

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    Hibernate+Struts 无限级树形菜单(MSSQL).rar

    3、页面的树形菜单的节点用 JavaScript进行控制 4、数据库中的商品类别表productCategory包含一个引用自身主键的外键,从而形成自身一对多关系 5、自定义标签实现类Recursion中主要用了递归实现节点的展开

    JSP Struts Hibernate JS无限级树形菜单.rar

     Eclipse3.2.1 MyEclipse5.1 Tomcat5.5 Microsoft SQL Server 2000,页面的树形菜单的节点用 JavaScript进行控制  数据库中的商品类别表productCategory包含一个引用自身主键的外键,从而形成自身一对多关系,...

    java树形结构

    /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 ...

    Struts+Hibernate+Javascript 实现人无限级分类树形菜单

    Struts+Hibernate+Javascript 实现人无限级分类树...主要是用到了Struts+Hibernate+JSTL1.1和自定义标签,树形菜单节点用 JavaScript控制显示,菜单结构由数据库中的字段区分,测试数据是通过TestMain.java插入数据库的

    java源码包---java 源码 大量 实例

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目源代码

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    java源码包4

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    Java开发技术大全(500个源代码).

    demoEnhanceThread.java 使用自己定义的线程类示例 producer_consumer.java 演示生产者-消费者线程 consumer.java 消费者线程 producer.java 生产者线程 common.java 公有类 第9章 示例描述:本章学习运行时...

    java源码包2

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    java源码包3

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA高并发高性能高可用高扩展架构视频教程

    WEB高级前后台分离思维-懒加载无限级树形菜单 动态页面的静态化处理 大并发展示优化,动态页面的静态化 深入理解JDK动态代理本质 企业级高并发缓存解决方案 性能优化之Oracle语句优化雾区 前后台数据验证架构源码级...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

    java 文本阅读器

    5、书库功能(树形结构) 6、菜单(快捷键功能) 时间原因没有去实现的功能(也没多大必要):新建文档 (时间原因,代码没有加注示) 有意和我交流的请加我QQ:643752665 很希望和大家交流,也期待大家给我指出...

    Android学习笔记含JNI、USB和ftdi通信方式详解

    项目五 Android自定义树形菜单 26 项目六 高仿微信聊天 26 项目七 Android串口通信 26 1. Java层 26 2.JNI层 26 3.PC模拟MCU层 26 4.问题 26 1. arm串口通信问题 26 2. linux串口通信中设置软件控制输入流的开始和...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

    java自学之道

    5.11 树形关系网 5.12 开发自己的文本编辑器 5.13 开发自己的剪切板 5.14 文本拖动效果演示 5.15 怎样拖动图片 5.16 开发自己的数字时钟 5.17 数字动画 5.18 滑杆调试器 5.19 启动程序开发 5.20 开发自己的调色板 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

     本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发...

Global site tag (gtag.js) - Google Analytics