如何构造这棵树呢

didoleo 2005-03-28 10:53:14
表结构:
表名: Menu

MenuID MenuDescr
---------- ------------------------
01 系统管理
0101 权限管理
010101 用户组管理
010102 用户代码管理
010103 用户组、地点、功能关系设置
010104 菜单、功能对应设置
010105 密码修改
0102 系统基本数据维护
010201 综合类型维护
0103 电子文档维护
010301 电子文档发布
02 存货管理
0201 商品档案管理
020101 商品类型维护
020102 商品性质维护
020103 附加商品信息类型维护
.................................

如何根据表里的内容生成一个JTree呢?
...全文
160 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_have_a_Dream 2005-03-30
  • 打赏
  • 举报
回复
Hashtable ht = new Hashtable();
//ht可以构建成这种方式:(01,[0101,0102,0103...])
(0101,[010101,010102,010103....])
(010101,[01010101,.....])
说白了就是,元素1是父节点的id,元素2是其包含的所有子节点id(可以用一个vector保存)

DefaultMutableTreeNode top = new DefaultMutableTreeNode("根节点");
递归(“根节点”,top);
treeModel.setRoot(top);

递归(String str,DefaultMutableTreeNode pnode)
{
Vector v = (Vector)ht.get(str);
if(v ==null)return;
for (int i = 0; i < v.size(); i++)
{
DefaultMutableTreeNode node = new DefaultMutableTreeNode(v.get(i).toString());
pnode.add(node);
dg(v.get(i).toString(),node);
}
}
I_have_a_Dream 2005-03-30
  • 打赏
  • 举报
回复
我这几天也遇到类似的问题
楼主兄弟,你试试我的这个递归程序:
递归(String str,DefaultMutableTreeNode pnode)
{
Vector v = (Vector)ht.get(str);
if(v ==null)return;
for (int i = 0; i < v.size(); i++)
{
DefaultMutableTreeNode node
= new DefaultMutableTreeNode(v.get(i).toString());
pnode.add(node);
递归(v.get(i).toString(),node);
}
}
结合我上一个帖子,准好用

didoleo 2005-03-30
  • 打赏
  • 举报
回复
--我自己是这样写的,可就是不对,出来结果会变成这样
public DefaultTreeModel createModel(DefaultTreeModel model,
DefaultMutableTreeNode p,
DefaultMutableTreeNode c,
ResultSet rs)
{
try{

while(rs.next())
{
c=new DefaultMutableTreeNode(rs.getString(1));
if(c.toString().startsWith(p.toString(),0) && c.toString().length()==(p.toString().length()+2))
{
model.insertNodeInto(c,p,Integer.parseInt(c.toString().substring(p.toString().length(),c.toString().length()-1)));
}else if
else
{
createModel(model,p,c,rs);
}

p=c;
}

}catch(SQLException sqle)
{

}

return model;
}


--出来的结果是这样
01
|
--0101
|
--010101
下面的就没了,是我的递归没学好,哪位帮帮我.
yinwaner 2005-03-29
  • 打赏
  • 举报
回复
其实还有一个办法,就是在点击一个目录的时候,触发事件重新检索数据库将子节点取出来,长到树上,这样可以实现无限层次,但是不好的地方,就是速度问题,每次都要检索数据库,这样比较麻烦!
zhaohao19853 2005-03-29
  • 打赏
  • 举报
回复
这个我想要在ID上面坐文章
要判断下,感觉这方发有点苯,但是也不为一个实用的方法
didoleo 2005-03-28
  • 打赏
  • 举报
回复
取表里的内容没问题
while(rs.next()) {
menuid=rs.getString(1);
menudescr=rs.getString(2);
......
......
{

当中该怎么写呢
didoleo 2005-03-28
  • 打赏
  • 举报
回复
自己顶一下.

谁帮我看一吧,谢谢了!!
yinwaner 2005-03-28
  • 打赏
  • 举报
回复
实现无限层的JTREE 树图我也没有想到一个很好的方法我实现了有限层的实现方法,你可以参考一下,我们共同学习一下。

private JTree CreateTree() {
JTree tree = null;
try {
/**将数据库中的结果按照 NAME_ID 的形式获取出来*/
ArrayList list = LDA.getLeleDictList(StaticVariable.System_Stock);
String f_dict = list.get(0).toString();
int pot1 = f_dict.lastIndexOf("_");

DefaultMutableTreeNode root = new DefaultMutableTreeNode(f_dict.substring(
0, pot1));
DefaultMutableTreeNode node1 = null;
DefaultMutableTreeNode node2 = null;
DefaultMutableTreeNode node3 = null;

for (int i = 1; i < list.size(); i++) {
String StrDict = list.get(i).toString();
int pot = StrDict.lastIndexOf("_");
String dict_name = StrDict.substring(0, pot);
String dict_id = StrDict.substring(pot + 1, StrDict.length());
int DictIdSize = dict_id.length() / 2;
switch (DictIdSize) {
case 2:
node1 = new DefaultMutableTreeNode(dict_name);
root.add(node1);
break;
case 3:
if (node1 != null) {
node1.add(node2 = new DefaultMutableTreeNode(dict_name));
}
break;
case 4:
if (node2 != null) {
node2.add(node3 = new DefaultMutableTreeNode(dict_name));
}
break;
default:
break;
}
}
tree = new JTree(root);
tree.putClientProperty("JTree.lineStyle", "None");
tree.setFont(myUtil.getFont());
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.
SINGLE_TREE_SELECTION);
}
catch (Exception e) {
System.out.println("调用LeleDictDAO 方法错误:" + e.getMessage());
}
return tree;
}
anson2003 2005-03-28
  • 打赏
  • 举报
回复
实现写一个BaseNode实现TreeNode,然后逐步继承各个节点
然后根据TreeNode也就是BaseNode来创建树
didoleo 2005-03-28
  • 打赏
  • 举报
回复
谢谢fiele(半导体) :
可是我是做GUI,不是JSP,而且表的结构就是这样的,单凭直觉可以看出这是一棵树,但是怎么样在JTree上表现出来呢?

也就是想用 DefaultMutableTreeNode来构造DefaultTreeModel,再用DefaultTreeModel来构造JTree

其中是不是要用到递归啊,我就是写不清楚.
fiele 2005-03-28
  • 打赏
  • 举报
回复
看来你的权是分三级,
建表的时候要写明他的等级,
fiele 2005-03-28
  • 打赏
  • 举报
回复
<%@ page contentType="text/html;charset=gb2312" %>
<%@ include file="../../inc/import.jsp"%>
<%@ include file="../../inc/public.jsp"%>
<%
int count=0,row=0;
Vector rsVector;
CommonModel CM;
SystemFunc CSysfunc = new SystemFunc();
String nodeno;
String nodename;
String nodestep;
String nodefather;
String sonflag;
String lastflag;
String rootname="",rootcode="",rootfather="",rootstep="";
String user_name="",rootnode="";
String strSqlnode="";
Vector rsVectornode;
int rownode=0;
String strSqlnode2="";
Vector rsVectornode2;
int rownode2=0;
String strSqlnode3="";
Vector rsVectornode3;
int rownode3=0;
String depname = "", depart = "", sqldepname = ""; //测试
user_name=(String)userInfo.get("user_name");
depart = (String)userInfo.get("depart_no");
sqldepname = "select depname from t_dep where depcode=dbo.uf_get_aspcode('"+depart+"')";
%>
<% //------------------------取根节点------------------------
Vector rsVector1 = CCommonDAO.select(sqldepname,"ESYSDATACON");
if(rsVector1!=null&&!rsVector1.isEmpty()){
CommonModel CM1=(CommonModel)rsVector1.firstElement();
depname=CM1.getAttrValue("depname");
}

String strSql1="exec usp_get_itemtyperoot ";
rsVector1 = CCommonDAO.select(strSql1,"ESYSDATACON");
if(rsVector1!=null&&!rsVector1.isEmpty()){
CommonModel CM1=(CommonModel)rsVector1.firstElement();
rootname=CM1.getAttrValue("node_name");
rootcode=CM1.getAttrValue("node_no");
rootfather=CM1.getAttrValue("father_no");
rootstep=CM1.getAttrValue("menustep");
rootnode="a"+rootcode;
}else{
rootname="货物分类";
rootcode="000000";
rootnode="a000000";
}
%>
<% //------------------------取下级------------------------
String strSql="exec usp_get_nextitemtype '"+user_name+"','"+rootcode+"'";
rsVector = CCommonDAO.getSetVector(strSql,"ESYSDATACON");
%>

<HTML>
<HEAD>
<TITLE>货物分类</TITLE>
<SCRIPT language="JScript.Encode" src="js/tree_func.js"></SCRIPT>
<SCRIPT src="js/itemtype_list.js"></SCRIPT>
<SCRIPT src="../../js/rightclick.js"></SCRIPT>
<LINK href="js/tree.css" type="text/css" rel="stylesheet">
<style type="text/css">
<!--
body {
background-color: #149AC7;
}
-->
</style>

</head>
<body bgcolor="#E6E6E6" >
<FONT size="2">
<!--tree开始部分---->
<strong><font color="#FFFFFF">
<%
out.print(CSysfunc.getTreeBegin("【"+depname+"】"));
%>
</font></strong>
<!--tree的根节点开始部分---->

<%
out.print(CSysfunc.getTreeRootNode(rootname,rootcode,rootfather,rootstep));
%>
<!--tree的一级节点开始部分---->
<%
if(rsVector!=null&&!rsVector.isEmpty()){
row=rsVector.size();
for(int j=0;j<row;j++){
CM = (CommonModel)rsVector.get(j);
nodename=CM.getAttrValue("node_name");
nodeno=CM.getAttrValue("node_no");
nodefather=CM.getAttrValue("father_no");
nodestep=CM.getAttrValue("menustep");
sonflag=CM.getAttrValue("son_flag");
if (j==row-1)
lastflag="1";
else
lastflag="0";

if(sonflag.equals("1")){
out.print(CSysfunc.getTreemidNode(nodename,nodeno,nodefather,nodestep,rootstep,lastflag));
strSqlnode="exec usp_get_nextitemtype '"+user_name+"','"+nodeno+"'";
rsVectornode = CCommonDAO.getSetVector(strSqlnode,"ESYSDATACON");
//----------tree的二级节点开始部分----
if(rsVectornode!=null&&!rsVectornode.isEmpty()){
rownode=rsVectornode.size();
for(int i=0;i<rownode;i++){
CM = (CommonModel)rsVectornode.get(i);
nodename=CM.getAttrValue("node_name");
nodeno=CM.getAttrValue("node_no");
nodefather=CM.getAttrValue("father_no");
nodestep=CM.getAttrValue("menustep");
sonflag=CM.getAttrValue("son_flag");
if (i==rownode-1)
lastflag="1";
else
lastflag="0";
if(sonflag.equals("1")){
out.print(CSysfunc.getTreemidNode(nodename,nodeno,nodefather,nodestep,rootstep,lastflag));
strSqlnode2="exec usp_get_nextitemtype '"+user_name+"','"+nodeno+"'";
rsVectornode2 = CCommonDAO.getSetVector(strSqlnode2,"ESYSDATACON");
out.print(" </DIV>");
}else{
out.print(CSysfunc.getTreeleafNode(nodename,nodeno,nodefather,nodestep,rootstep,lastflag));
}
}
}
//---------tree的二级节点结束---
out.print(" </DIV>");
}else{
out.print(CSysfunc.getTreeleafNode(nodename,nodeno,nodefather,nodestep,rootstep,lastflag));
}
}
}
//--------tree的一级节点结束---
%>
<!--tree的根节点结束---->
</DIV>
<!--tree结束---->
</DIV>

</FONT>
</BODY>
</HTML>

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧