作者:夕阳隐日 | 来源:互联网 | 2023-09-24 18:02
怎样构造一个JTree,根据数据库的内容构造.
比如根据学校的班级结构
怎样通过一个函数构造,应该传什么样的参数更方便
6 个解决方案
http://www.goldenclasp.com:8080
要建立树型结构,需要数据库提供的节点信息主要有节点号,节点在用户界面上显示的内容,以及每个节点的父节点号。本例中使用SQL Server 2000数据库,首先建立一个名为tbTree的表用以存储树节点信息,与建树相关的字段设计如下表:
字段名 数据类型 长度 描述 说明
ID Int 4 节点序号 关键字,非空
Node Char 30 界面上显示的节点内容 非空
ParentsID Int 4 父节点序号 非空
在java中,为TreeView控件添加节点的方法是:TreeNode.add(TreeNode node),其中,调用add()方法的是父节点,子节点作参数。
考虑到在实际应用中,经过数次修改之后,ID字段的值可能会不连续,导致tbTree表的记录总数不等于ID字段的最大值的现象。这个时候,从数据库中取出的数据必须先经过一定的处理,而不能直接使用treeNode[parentID[i]].add(treeNode[id[i]])的方式来填充TreeView控件。
因为我对数据库不熟悉,所以只能在程序中作映射,请高手们不要见笑。下面说说我的处理方法:在程序中先将以上字段的记录读到数组中,用一个二维数组map[max_ID][2]通过一层循环,进行子节点编号与其父节点编号的映射,map[i][0]存储编号为i的子节点在数组中的索引号,而map[i][1]中则保存对应编号i节点的父节点的编号,其中map[0][]中保存树的根节点的信息。这样,编号为map[i][0]的节点对应的父节点编号就是map[map[i][1]]。因此,填充TreeView控件时,只需treeNode[map[map[i][1]][0]].add(treeNode[map[i][0]])即可。
实现
以下给出实现用数据库表构造树型结构方法的关键部分的代码。其中该程序名为TbTree.java,下面的TbTree()是构造方法;createTree()是利用数据库中的节点信息创建树的方法;count指tbTree表的记录总数,全局变量;max指tbTree表的ID字段的最大值,全局变量;id数组保存tbTree表ID字段的值,全局变量;node数组保存tbTree表Node字段的值,全局变量;parentId数组保存tbTree表ParentID字段的值,全局变量;newTree是JTree,全局变量:
//TbTree的构造方法
public TbTree(){
//连接数据库
connectDB();
//从数据库中读取节点信息,将值赋给相应的变量
inquireTB();
//调用createTree()方法创建一棵名为“高校”的树
newTree = createTree("高校");
//构造frame
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try{
//调用constructFrame()方法,构造用户界面
constructFrame();
}
catch(Exception e){
e.printStackTrace();
}
}
/**
* 用数据库表中的节点信息构造树型结构视图。该程序的关键部分。
* @param root 所构造的树型结构的根节点。
* @return 已创建的树。
*/
JTree createTree(String root){
/**
* 当前节点号。
*/
int currentId;
/**
* 树的节点,
* 其内容来自数组node,
* 因为根节点不在其中,所以比node多分配一个空间。
*/
DefaultMutableTreeNode[] treeNodes = new DefaultMutableTreeNode[count+1];
/**
* 当前节点及其父节点的一个映射关系表。
* map[][0] 保存子节点在数组id中的索引号,如map[i][0]表示节点i在数组id中索引号;
* map[][1] 保存对应子节点的父节点号,map[i][1]表示节点i的父节点号;
* 其中map[0][]保存根节点信息。
*/
int[][] map = new int[max][2];
//初始化映射表
for (int i=1; i map[i][0] = -1;
map[i][1] = -1;
}
map[0][0] = 0;
map[0][1] = 0;
//根节点
treeNodes[0] = new DefaultMutableTreeNode(root);
JTree nTree = new JTree(treeNodes[0]);
//做父与子的映射
for (int i=1; i currentId = id[i-1];
treeNodes[i] = new DefaultMutableTreeNode(node[i-1]); //创建树的节点
map[currentId][0] = i-1;
map[currentId][1] = parentsId[i-1];
}
//为父节点添加其相应的子节点。
//parentNode.add(childNode);
for (int i=1; i if (map[i][0] > -1){
//父节点是根节点时
if (map[i][1] == 0){
treeNodes[map[map[i][1]][0]].add(treeNodes[map[i][0]+1]);
}
//父节点非根节点时
else{
treeNodes[map[map[i][1]][0]+1].add(treeNodes[map[i][0]+1]);
}
}
}
return nTree;
}//end createTree
//--------------------------------------
以上均摘自我的一篇练习论文
//--------------------------------------
俺用递归的哦。。。。就是数据结构里面那种,先序、中序、后序遍历树的同时,就把
tree生成了。。