用纯java自定义自己的树形菜单
转自
<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>
分享到:
相关推荐
3、页面的树形菜单的节点用 JavaScript进行控制 4、数据库中的商品类别表productCategory包含一个引用自身主键的外键,从而形成自身一对多关系 5、自定义标签实现类Recursion中主要用了递归实现节点的展开
Eclipse3.2.1 MyEclipse5.1 Tomcat5.5 Microsoft SQL Server 2000,页面的树形菜单的节点用 JavaScript进行控制 数据库中的商品类别表productCategory包含一个引用自身主键的外键,从而形成自身一对多关系,...
/* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 ...
Struts+Hibernate+Javascript 实现人无限级分类树...主要是用到了Struts+Hibernate+JSTL1.1和自定义标签,树形菜单节点用 JavaScript控制显示,菜单结构由数据库中的字段区分,测试数据是通过TestMain.java插入数据库的
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
demoEnhanceThread.java 使用自己定义的线程类示例 producer_consumer.java 演示生产者-消费者线程 consumer.java 消费者线程 producer.java 生产者线程 common.java 公有类 第9章 示例描述:本章学习运行时...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
WEB高级前后台分离思维-懒加载无限级树形菜单 动态页面的静态化处理 大并发展示优化,动态页面的静态化 深入理解JDK动态代理本质 企业级高并发缓存解决方案 性能优化之Oracle语句优化雾区 前后台数据验证架构源码级...
将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...
5、书库功能(树形结构) 6、菜单(快捷键功能) 时间原因没有去实现的功能(也没多大必要):新建文档 (时间原因,代码没有加注示) 有意和我交流的请加我QQ:643752665 很希望和大家交流,也期待大家给我指出...
项目五 Android自定义树形菜单 26 项目六 高仿微信聊天 26 项目七 Android串口通信 26 1. Java层 26 2.JNI层 26 3.PC模拟MCU层 26 4.问题 26 1. arm串口通信问题 26 2. linux串口通信中设置软件控制输入流的开始和...
将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...
5.11 树形关系网 5.12 开发自己的文本编辑器 5.13 开发自己的剪切板 5.14 文本拖动效果演示 5.15 怎样拖动图片 5.16 开发自己的数字时钟 5.17 数字动画 5.18 滑杆调试器 5.19 启动程序开发 5.20 开发自己的调色板 ...
本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发...