请教用java展现树状结构图问题!!!

lsh902 2010-01-27 10:58:31
麻烦大家给写一个树状结构的展现,能够打印出结构关系就可以了,下面是表的结构,大体上就是这种结构但是分的层次比较多,有一段VB写的代码,我简单写了一下注释,基本能看明白逻辑,请大家帮忙用java给写一个性能更好的树状结构的展现。




orgcode(部门编号),orgname(部门名称),porgcode(上级部门编号),orderid(某级别层的序号),[level](部门级别)
1000 总公司 Null 1 0
M1010 分公司A 1000 1 1
M1040 分公司B 1000 2 1
1010 董事会 1000 3 1
1140 总经办 1000 4 1
1160 A业务部 M1010 1 2
1050 A人力部 M1010 2 2
1170 B业务部 M1040 1 2
1130 B人力部 M1040 2 2
..... ........ ...... ... ...


'建立数据连接池
Dim dbconn As dbaccess = New dbaccess("uid=****;pwd=*****;database=*****;server=***.***.***.***;")
'建立容器
Public orglist As List(Of org) = Nothing

'声明类,放置查询结果集
Public Sub initdata()
Dim sql As String = ""
Dim dbreader As SqlClient.SqlDataReader = Nothing
Dim orgobj As org = Nothing
Try
'执行SQL
sql = "select orgcode,orgname,porgcode,orderid,[level] from ORG order by [level],orderid "

dbreader = dbconn.ExecuteReader(sql)

If dbreader IsNot Nothing Then
orglist = New List(Of org)
Do While dbreader.Read
orgobj = New org
With orgobj
.orgcode = dbreader.GetString(0)
.orgname = dbreader.GetString(1)
If dbreader.IsDBNull(2) Then
.porgcode = ""
Else
.porgcode = dbreader.GetString(2)
End If

.orderid = dbreader.GetValue(3)
.level = dbreader.GetValue(4)

End With
'将表中的信息放置容器中
orglist.Add(orgobj)


Loop
If orglist IsNot Nothing Then
If orglist.Count > 0 Then
createorgtree(orglist)
End If
End If
Else
MessageBox.Show("无记录")
End If

Catch ex As Exception
MessageBox.Show(ex.ToString)

End Try

End Sub
'一个类,5个属性
Class org

Public orgcode As String '部门编号
Public orgname As String '部门名称
Public porgcode As String '上级部门名称
Public level As Integer '部门级别编号,分为0,1,2,3,4五个级别
Public orderid As Integer '在某个部门下的序号,好像没什么用。


End Class

'有参方法
Private Function createorgtree(ByVal orglist As List(Of org)) As Boolean
Dim flag As Boolean = False
TV_ORG.Nodes.Clear()

Try
For i As Integer = 0 To orglist.Count - 1
Dim tnode As New TreeNode
Select Case orglist(i).level
Case 0
tnode.Name = orglist(i).orgcode
tnode.Text = orglist(i).orgname
tnode.Tag = orglist(i)
'获得部门名称和编号
TV_ORG.Nodes.Add(tnode)
addnode(tnode, orglist)
flag = True
End Select
Next
Catch ex As Exception
MessageBox.Show("错误:" & ex.ToString)
flag = False
End Try
Return flag
End Function
'有参方法
Public Sub addnode(ByVal node1 As TreeNode, ByVal orglist As List(Of org))
Dim tnode As TreeNode = Nothing
Try
For i As Integer = 0 To orglist.Count - 1
If orglist(i).porgcode = node1.Name Then
'找到上级部门
tnode = New TreeNode
tnode.Name = orglist(i).orgcode
tnode.Text = orglist(i).orgname & "(" & orglist(i).orgcode & ")"
tnode.Tag = orglist(i)
'递归调用自身
node1.Nodes.Add(tnode)
addnode(tnode, orglist)

End If
Next
Catch ex As Exception
MessageBox.Show("错误:" & ex.ToString)

End Try

End Sub
...全文
1138 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen889000 2011-01-17
  • 打赏
  • 举报
回复
什么玩意!看不懂!fuck
ldy_216 2010-04-06
  • 打赏
  • 举报
回复
自己建立一个树形结构体,想怎么打印便怎么打印
我是写围棋的
QQ:184324486
xyq593 2010-01-28
  • 打赏
  • 举报
回复
高手如云啊,学习了~
zl3450341 2010-01-28
  • 打赏
  • 举报
回复
去下个dtree
看看他的api
tuerqizhou 2010-01-28
  • 打赏
  • 举报
回复
呵呵~~
我是来学习的
不是来求分的
上面的兄弟写的貌似不错~~~
学习了~~
不过我认为~如果放在数据库里面的话,可能更简单一点,
在设计数据库的时候可以给定一个大类和一个小类
然后查询的时候线按照大类排序,之后按照小类排序,之后存入集合
最后迭代出来,
这样之后,无论怎么操作都比较容易了~~
lsh902 2010-01-28
  • 打赏
  • 举报
回复
感谢大家的帮助,我会尽快测试出结果,结贴给分!
冰思雨 2010-01-28
  • 打赏
  • 举报
回复
下面是数据的获得。我采用的是读取文件的方式,当然,为省事文件和类都放一起了。
package houlei.java.swing.treeView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
* 通过读取ORG_Data_File.txt文件内容的方式来获得一个含有ORG对象的列表。
* @author HouLei
*/
public class FileORGFactory implements ORGFactory {

public static final String FileName = "houlei/java/swing/treeView/ORG_Data_File.txt";
public static final boolean HasHeader = true;//文件是否有一个头行,头行的内容相当于注释,不做处理。
public static final int Sections = 5;//每一行有5个部分组成。
public static final String NoPorgCode = "NULL";//当记录没有上级部门编号时,用NULL来表示。

public List<ORG> getORGList() {
List<ORG> result = new ArrayList<ORG>();

InputStream in = ClassLoader.getSystemResourceAsStream(FileName);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
try {
if(HasHeader) br.readLine();
while((line = br.readLine())!=null){
String sub[] = line.split("\\s+");
if(sub.length<Sections)continue;
String porgCode = sub[2].equals(NoPorgCode)?null:sub[2];
result.add(new ORG(Integer.valueOf(sub[4]),Integer.valueOf(sub[3]),sub[0],sub[1],porgCode));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}

}

楼主要想实现从数据库中获取数据,可以仿照上述的实现类,编写一个实现类就行了。

然后是那个ORG_Data_File.txt文件的内容。
orgcode(部门编号),orgname(部门名称),porgcode(上级部门编号),orderid(某级别层的序号),[level](部门级别) 
1000 总公司 Null 1 0
M1010 分公司A 1000 1 1
M1040 分公司B 1000 2 1
1010 董事会 1000 3 1
1140 总经办 1000 4 1
1160 A业务部 M1010 1 2
1050 A人力部 M1010 2 2
1170 B业务部 M1040 1 2
1130 B人力部 M1040 2 2

冰思雨 2010-01-28
  • 打赏
  • 举报
回复
大致看了一下楼主的VB代码。貌似是个GUI方面的程序。
楼上几位兄弟的程序,我也没怎么看,有冲突的地方,请海涵。
我写了几个类。当然,很多地方都简写了(比如,没有从数据库中读取数据)
希望能对楼主有所帮助。最近经常上不了网了。
package houlei.java.swing.treeView;

/**
* 这是楼主VB当中的一个类,用于存放每条记录的信息。
* @author HouLei
*/
public class ORG {
private String orgCode; //部门编号
private String orgName; //部门名称
private String porgCode; //上级部门名称
private int level; //部门级别编号,分为0,1,2,3,4五个级别
private int orderId; //在某个部门下的序号,好像没什么用。

public ORG() {
}

public ORG(int level, int orderid, String orgcode, String orgname,
String porgcode) {
super();
this.level = level;
this.orderId = orderid;
this.orgCode = orgcode;
this.orgName = orgname;
this.porgCode = porgcode;
}

/* 重写该方法,用于返回GUI中Tree显示的名称。
*/
@Override
public String toString() {
return orgName;
}

/* Setters and Getters */

public String getOrgCode() {
return orgCode;
}

public void setOrgCode(String orgCode) {
this.orgCode = orgCode;
}

public String getOrgName() {
return orgName;
}

public void setOrgName(String orgName) {
this.orgName = orgName;
}

public String getPorgCode() {
return porgCode;
}

public void setPorgCode(String porgCode) {
this.porgCode = porgCode;
}

public int getLevel() {
return level;
}

public void setLevel(int level) {
this.level = level;
}

public int getOrderId() {
return orderId;
}

public void setOrderId(int orderId) {
this.orderId = orderId;
}

}

package houlei.java.swing.treeView;

import java.util.List;

/**
* 为了方便测试编码,我编写了这个接口,使程序可以采用不同的方式来获得数据。<br/>
* 楼主的VB代码是从数据库中获得的数据,我这里为简便,采用的是读取文件的方式。<br/>
* 楼主若采用我的代码思路,只要写一个本接口的实现类并更改入口方法的一行代码即可。
* @author HouLei
*/
public interface ORGFactory {
/**
* 获得ORG对象的一个列表。
* @return 返回含有ORG对象的一个列表。
*/
public abstract List<ORG> getORGList();
}

package houlei.java.swing.treeView;

import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

/**
* 该类是显示树状结果的一个Frame类,通过使用JTree、TreeModel、TreeNode等类,实现了树数据的显示。<br/>
* 为快速编程,以下代码,有一部分是通过Eclipse自动生成的。
* @author houlei
*/
public class View extends javax.swing.JFrame {

private TreeNode tree;
private Controller ctlr;//本程序如果不做功能扩充,可以去掉该变量。因为目前没有任何作用。
private DefaultTreeModel model;

/** Creates new form View */
public View(TreeNode root, Controller ctlr) {
this.tree = root;
this.ctlr = ctlr;
initComponents();
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();
model = new DefaultTreeModel(tree);//添加一个TreeModel对象
jTree1 = new javax.swing.JTree(model);//使用自己的数据模型作为树的显示内容。

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jScrollPane1.setViewportView(jTree1);

org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING).add(jScrollPane1,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 400,
Short.MAX_VALUE));
layout.setVerticalGroup(layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING).add(jScrollPane1,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 300,
Short.MAX_VALUE));

pack();
}// </editor-fold>
//GEN-END:initComponents

//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTree jTree1;
// End of variables declaration//GEN-END:variables

}

package houlei.java.swing.treeView;

import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;

/**
* 这个类是本程序的入口类。因为Main方法在这里。<p>
* 编写这个类的主要目的,是想协调“显示”与“数据”之间的关系。<br/>
* 由于程序本身功能简单,所以这个类,也是可以省略的。<br/>
* @author HouLei
*/
public class Controller {

private TreeNode root;
private View v ;

public Controller(ORGFactory fac){
root = convert(fac.getORGList());
v = new View(root,this);
v.setVisible(true);
}

/**
* 这个方法就是将列表(List)结构的数据 转换成 树形(Tree)结构的数据。<br/>
* 楼主求一个高效的转换算法,估计是要这段代码,而不是其他的代码。
* @param list
* @return
*/
@SuppressWarnings("unchecked")
private TreeNode convert(List<ORG> list) {
//将列表的数据用部门编号(orgCode)来索引,分别由TreeNode对象来进行封装,并存入到LinkedHashMap里面。
Map<String,DefaultMutableTreeNode> cache = new LinkedHashMap<String,DefaultMutableTreeNode>();
for(ORG org : list){
cache.put(org.getOrgCode(), new DefaultMutableTreeNode(org));
}
//以下代码,用来将上述形成的个节点,拼接成一个树。
DefaultMutableTreeNode root = null;
for(Map.Entry<String, DefaultMutableTreeNode> e : cache.entrySet()){//遍历所有数据。只遍历一边。
ORG org = (ORG)e.getValue().getUserObject();
if(org.getLevel()<=0){//如果是跟节点的情况。
root = e.getValue();
continue;
}
DefaultMutableTreeNode parent = cache.get(org.getPorgCode());//获得当前节点的父节点。
if(parent==null)throw new NoSuchElementException("不存在 "+org.getPorgCode()+" 所表示的父节点,本节点为:"+org.getOrgCode());
boolean notInsert = true;
if(parent.getChildCount()>0){//如果其父节点已经有子节点了,那么要按次序插入当前节点。
for(Enumeration<DefaultMutableTreeNode> eChi = parent.children();eChi.hasMoreElements();){
DefaultMutableTreeNode brother = eChi.nextElement();
if(((ORG)brother.getUserObject()).getOrderId()>org.getOrderId()){
parent.insert(e.getValue(), parent.getIndex(brother));
notInsert = false;
break;
}
}
}
//剩余的情况有两种,就是其父节点是叶子节点;和 当前节点是相对最大的那个节点 。
if(notInsert)parent.add(e.getValue());
}
return root;
}

/**
* 入口方法,没啥好说的。
* @param args the command line arguments
*/
public static void main(String args[]) {
//如果想该用数据库方式获得数据,需要编写一个实现类,并更改下行代码即可。
ORGFactory fac = new FileORGFactory();
new Controller(fac);
}
}
crazylaa 2010-01-28
  • 打赏
  • 举报
回复
web 用dtree,swing之类用Jtree。
只要1分,楼主good luck
tg008007x3 2010-01-27
  • 打赏
  • 举报
回复
高手好多啊
phyerbarte 2010-01-27
  • 打赏
  • 举报
回复
如果sql的结果已经能够产生如LZ的打印结果一样的顺序,那么,这个程序的核心问题在于怎么连ACCESS而不是怎么打印了,一个for循环就能打印出所有的结果。
ouyangyh 2010-01-27
  • 打赏
  • 举报
回复
树形,在设计数据库的时候,最好建一个LongNumber字段,它为上级对象的LongNumber+分隔符+自己的number
这样查询的时候,直接按longNumber排序,就可以了
Inhibitory 2010-01-27
  • 打赏
  • 举报
回复
汗, csdn对Safari的支持太错了, 竟然在Safari中不能插入代码.

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/*
1000 总公司 Null 1 0
M1010 分公司A 1000 1 1
M1040 分公司B 1000 2 1
1010 董事会 1000 3 1
1140 总经办 1000 4 1
1160 A业务部 M1010 1 2
1050 A人力部 M1010 2 2
1170 B业务部 M1040 1 2
1130 B人力部 M1040 2 2
*/
/*
输出结果如下:
总公司
|-----分公司A
| |-----A业务部
| |-----A人力部
|-----分公司B
| |-----B业务部
| |-----B人力部
|-----董事会
|-----总经办
*/

public class Test1 {
public static void main(String[] args) throws Exception {
// 把所有部门都读入链表中, 测试数据如上放在文件level.txt中
List<Department> departments = new ArrayList<Department>();
BufferedReader reader = new BufferedReader(new FileReader("level.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
departments.add(new Department(line));
}

// 构建部门的树形结构
for (int i = 0; i < departments.size() - 1; ++i) {
for (int j = i + 1; j < departments.size(); ++j) {
if (departments.get(j).getParentId().equals(departments.get(i).getId())) {
departments.get(i).addChild(departments.get(j));
}
}
}

// 打印出部门的树形关系结构
Department.showDepartmentStructure(departments.get(0), 0);
}
}

class Department {
private String id;
private String name;
private String parentId;
private int orderId;
private int level;

private List<Department> children;

public Department(String descript) {
build(descript);
children = new ArrayList<Department>();
}

/**
* 递归的打印出部门之间的树形关系结构
*
* @param dpt
* @param tabCount
*/
public static void showDepartmentStructure(Department dpt, int tabCount) {
for (int i = 0; i < tabCount - 1; ++i) {
System.out.print(" | ");
}
if (tabCount > 0)
System.out.print(" |-----");
System.out.println(dpt.getName());

for (int i = 0; i < dpt.children.size(); ++i) {
showDepartmentStructure(dpt.children.get(i), tabCount + 1);
}
}

public void addChild(Department child) {
children.add(child);
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getParentId() {
return parentId;
}

public void setParentId(String parentId) {
this.parentId = parentId;
}

public int getOrderId() {
return orderId;
}

public void setOrderId(int orderId) {
this.orderId = orderId;
}

public int getLevel() {
return level;
}

public void setLevel(int level) {
this.level = level;
}

private void build(String descript) {
List<String> data = new ArrayList(5);
// 这里定义文件中数据的分隔使用tab, 因为编码的关系, 相应改一下
// 结构: 1000 总公司 Null 1 0
StringTokenizer st = new StringTokenizer(descript, "\t ");
while (st.hasMoreTokens()) {
String str = st.nextToken();
data.add(str);
}

if (data.size() != 5) {
throw new RuntimeException("column data is not 5");
}

id = data.get(0);
name = data.get(1);
parentId = data.get(2);
orderId = Integer.parseInt(data.get(3));
level = Integer.parseInt(data.get(4));
}
}
nihuajie05 2010-01-27
  • 打赏
  • 举报
回复
操蛋的VB
楼主息怒。。。我对你没意见。。我对VB有点偏见。。
我想用双向链接的linkedlist来实现。一个指儿子,一个指兄弟。
最后遍历的时候,要么用栈,要么用递归。遍历一次。每个元素可能需要一个String来放他前面的空格,兄弟相同,儿子多一个。
Inhibitory 2010-01-27
  • 打赏
  • 举报
回复
写了个不怎么样的, 实现了功能, 里面的各种优化自己弄弄吧.

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/*
测试数据
1000 总公司 Null 1 0
M1010 分公司A 1000 1 1
M1040 分公司B 1000 2 1
1010 董事会 1000 3 1
1140 总经办 1000 4 1
1160 A业务部 M1010 1 2
1050 A人力部 M1010 2 2
1170 B业务部 M1040 1 2
1130 B人力部 M1040 2 2
*/
/*
输出结果如下:
总公司
|-----分公司A
| |-----A业务部
| |-----A人力部
|-----分公司B
| |-----B业务部
| |-----B人力部
|-----董事会
|-----总经办
*/

public class Test1 {
public static void main(String[] args) throws Exception {
// 把所有部门都读入链表中, 测试数据如上放在文件level.txt中
List<Department> departments = new ArrayList<Department>();
BufferedReader reader = new BufferedReader(new FileReader("level.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
departments.add(new Department(line));
}

// 构建部门的树形结构
for (int i = 0; i < departments.size() - 1; ++i) {
for (int j = i + 1; j < departments.size(); ++j) {
if (departments.get(j).getParentId().equals(departments.get(i).getId())) {
departments.get(i).addChild(departments.get(j));
}
}
}

// 打印出部门的树形关系结构
Department.showDepartmentStructure(departments.get(0), 0);
}
}

class Department {
private String id;
private String name;
private String parentId;
private int orderId;
private int level;

private List<Department> children;

public Department(String descript) {
build(descript);
children = new ArrayList<Department>();
}

/**
* 递归的打印出部门之间的树形关系结构
*
* @param dpt
* @param tabCount
*/
public static void showDepartmentStructure(Department dpt, int tabCount) {
for (int i = 0; i < tabCount - 1; ++i) {
System.out.print(" | ");
}
if (tabCount > 0)
System.out.print(" |-----");
System.out.println(dpt.getName());

for (int i = 0; i < dpt.children.size(); ++i) {
showDepartmentStructure(dpt.children.get(i), tabCount + 1);
}
}

public void addChild(Department child) {
children.add(child);
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getParentId() {
return parentId;
}

public void setParentId(String parentId) {
this.parentId = parentId;
}

public int getOrderId() {
return orderId;
}

public void setOrderId(int orderId) {
this.orderId = orderId;
}

public int getLevel() {
return level;
}

public void setLevel(int level) {
this.level = level;
}

private void build(String descript) {
List<String> data = new ArrayList(5);
// 这里定义文件中数据的分隔使用tab, 因为编码的关系, 相应改一下
// 结构: 1000 总公司 Null 1 0
StringTokenizer st = new StringTokenizer(descript, "\t ");
while (st.hasMoreTokens()) {
String str = st.nextToken();
data.add(str);
}

if (data.size() != 5) {
throw new RuntimeException("column data is not 5");
}

id = data.get(0);
name = data.get(1);
parentId = data.get(2);
orderId = Integer.parseInt(data.get(3));
level = Integer.parseInt(data.get(4));
}
}
focusforce 2010-01-27
  • 打赏
  • 举报
回复
package org.jdesktop.demo;

import java.awt.BorderLayout;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.treetable.FileNode;
import org.jdesktop.swingx.treetable.FileSystemModel;

public class FileSystemDemo
{

/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
final JPanel panel = new JPanel(new BorderLayout());
JXTreeTable treeTable = new JXTreeTable();
treeTable.setRootVisible(true);
treeTable.setShowsRootHandles(false);

FileSystemModel treeTableModel = new FileSystemModel(new FileNode(new File("e://")));
treeTable.setTreeTableModel(treeTableModel);
treeTable.expandAll();
panel.add(new JScrollPane(treeTable));
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(panel);
frame.setVisible(true);
}
}


/*
* $Id: FileSystemModel.java,v 1.2 2005/10/10 18:01:37 rbair Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

package org.jdesktop.swingx.treetable;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.tree.TreeNode;

/**
* FileSystemModel
*
* @author Ramesh Gupta
*/
public class FileSystemModel extends DefaultTreeTableModel
{
protected boolean asksAllowsChildren;

public FileSystemModel()
{
this(new FileNode(new File(File.separator)));
}

public FileSystemModel(TreeNode root)
{
this(root, false);
}

public FileSystemModel(TreeNode root, boolean asksAllowsChildren)
{
super(root);
this.asksAllowsChildren = asksAllowsChildren;
}

public Object getChild(Object parent, int index)
{
try
{
return ((FileNode) parent).getChildren().get(index);
}
catch (Exception ex)
{
return super.getChild(parent, index);
}
// return getChildren(parent).get(index);
}

public List getChildren(Object parent)
{
return new ArrayList();
}

public int getChildCount(Object parent)
{
try
{
return ((FileNode) parent).getChildren().size();
}
catch (Exception ex)
{
return super.getChildCount(parent);
}
}

public int getColumnCount()
{
/**
* @todo Implement this org.jdesktopx.swing.treetable.TreeTableModel
* abstract method
*/
return 4;
}

public String getColumnName(int column)
{
switch (column)
{
case 0:
return "Name";
case 1:
return "Size";
case 2:
return "Directory";
case 3:
return "Modification Date";
default:
return "Column " + column;
}
}

public Object getValueAt(Object node, int column)
{
final File file = ((FileNode) node).getFile();
try
{
switch (column)
{
case 0:
return file.getName();
case 1:
return file.isFile() ? new Integer((int) file.length()) : ZERO;
case 2:
return new Boolean(!file.isFile());
case 3:
return new java.util.Date(file.lastModified());
}
}
catch (Exception ex)
{
ex.printStackTrace();
}

return null;
}

// The the returned file length for directories.
private static final Integer ZERO = new Integer(0);
}

/*
* $Id: FileNode.java,v 1.3 2005/10/13 09:00:00 kleopatra Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

package org.jdesktop.swingx.treetable;

import java.io.File;
import java.util.List;
import java.util.Vector;

import javax.swing.tree.DefaultMutableTreeNode;

/**
* FileNode
*
* @author Ramesh Gupta
*/
public class FileNode extends DefaultMutableTreeNode {
public FileNode(File file) {
this.file = file;
this.isDir = file.isDirectory();
}


public boolean getAllowsChildren() {
return isDir;
}

protected List getChildren() { // rg:changed return type
if (children == null) {
try {
final String[] files = file.list();
if (files != null) {
// Create an empty list of FileNodes (#elements = files.length)
children = new Vector(files.length);
final String path = file.getPath();
for (int i = 0; i < files.length; i++) {
final File childFile = new File(path, files[i]);
children.add(new FileNode(childFile));
}
}
}
catch (SecurityException se) {
}
}

return children;
}

public File getFile() {
return file;
}

public boolean isLeaf() {
return !isDir;
}

public String toString() {
return file.getName();
}

private final File file;
private final boolean isDir;
}

其他代码,请参考swingx里JXTreetable的实现。
phyerbarte 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lsh902 的回复:]
引用 1 楼 phyerbarte 的回复:
如果sql的结果已经能够产生如LZ的打印结果一样的顺序,那么,这个程序的核心问题在于怎么连ACCESS而不是怎么打印了,一个for循环就能打印出所有的结果。

我是想让表输出成这样的结构:
总公司
    分公司A
      A业务部
        A人力部
    分公司B
      B业务部
        B人力部
    董事会
    总经办
  。。。。。。。



[/Quote]
结果是否已经有这个上下顺序?
lsh902 2010-01-27
  • 打赏
  • 举报
回复
顶起来!
一头头 2010-01-27
  • 打赏
  • 举报
回复
接分,只要4分。Thanks
Sou2012 2010-01-27
  • 打赏
  • 举报
回复
上面不是 delphi 的吗? 呵呵
加载更多回复(2)

62,614

社区成员

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

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