用java小程序applet实现无限级树结构
 
该程序可以根据从指定的xml文件中读取的有关信息动态的建立一棵树。 

1.该树的特点: 

1)无限级树结构 

理论上树的深度可以无限,树的深度由xml文件所给的信息确定; 

数据加载采用一次加载和动态加载相结合的方法; 

每次打开相关页时重新加载树结构,真正的做到了建立树的动态性。 

2)复用性 

由于这棵树是通过读取xml文件建立的,树的程序代码固定,所以具有很强的复用性。只需要给出xml文件,程序就可以建立对应的树。 

3)与用户的交互 

由于该程序是用java小程序实现的,所以可以利用java语言中监听事件的类,以响应用户操作。与用户具有更好的交互性。 

2.程序结构 

这棵树主要有三个类实现: 

1) 类TreeNode:该类起辅助作用,用来描述树的数据结构,并提供一些setter,getter函数用来设置树结构的属性。 

2) 类IconRender:该类也是一个辅助类,用来设置树节点的图标。并且可以根据树节点的选中状态改变图标。 

3) 类AppletTree:该类是建立这棵树的主要类,它继承自Applet并且实现了TreeSelectionListener接口,以用来监听用户操作。树结构由java类JTree显示,我们只需要合理的设定JTree的属性就可以构造出这棵树。而它的属性是通过jdom中的Element读取xml文件提供的。上面已经提到监听用户操作是通过实现TreeSelectionListener接口完成的,但是只监听不响应毫无用处。怎样才能将监听到的用户操作传给相应的类以响应用户的操作呢?这里用的方法是通过URL将参数传递给jsp文件,再由jsp文件传给相应的操作类实现的。 

这三个类的代码如下: 

1.TreeNode类 

public class TreeNode{ 

private String id; 

private String name; 

private String link; 

public TreeNode(String id,String name,String link){ 

this.id=id; 

this.name=name; 

this.link=link; 



public String getId(){ 

return id; 



public void setId(String Id){ 

this.id=Id; 



public void setName(String Name){ 

this.name=Name; 





public String getName(){ 

return name; 





public String toString(){ 

return name; 



public String getLink(){ 

return link; 



public void setLink(String link){ 

this.link=link; 





2. IconRender类 

import javax.swing.*; 

import java.awt.*; 

import javax.swing.tree.*; 

import javax.swing.tree.DefaultTreeCellRenderer; 

IconRender 

class extends DefaultTreeCellRenderer { 





//创建用于显示的图标 

public static final ImageIcon leafSelectedIcon = new ImageIcon("OpenedFolder.ico"); 

public static final ImageIcon leafUnSelectedIcon = new ImageIcon("closedFolder.ico"); 

public static final ImageIcon folderOpen = new ImageIcon("OpenedFolder.ico"); 

public static final ImageIcon folderClose = new ImageIcon("closedFolder.ico"); 



//设定图标随选中状态的变化 

public Component getTreeCellRendererComponent(JTree 

tree,Object value,boolean selected,boolean expanded, 

boolean leaf, int row,boolean hasFocus) 



super.getTreeCellRendererComponent(tree,value, selected, expanded, leaf, row, hasFocus); 



if (leaf && selected) { 

setIcon(IconRender.leafSelectedIcon); 



else if (leaf) { 

setIcon(IconRender.leafUnSelectedIcon); 





return this; 





public IconRender() { 

super(); 

if((leafSelectedIcon != null)&&(leafUnSelectedIcon != null)) 

System.out.println("IconRender:trace"); 



setLeafIcon(leafUnSelectedIcon); 

setOpenIcon(folderOpen); 

setClosedIcon(folderClose); 









3.AppletTree类 

import javax.swing.event.*; 

import java.awt.*; 

import java.applet.*; 

import javax.swing.*; 

import javax.swing.tree.*; 

import java.awt.event.*; 

import org.jdom.*; 

//import org.w3c.dom.NodeList; 

import org.jdom.input.*; 

import java.io.*; 

import java.util.*; 

import java.net.*; 



import java.awt.*; 

import javax.swing.*; 

import javax.swing.border.*; 

import javax.swing.plaf.*; 

import javax.swing.plaf.basic.*; 

import javax.swing.plaf.metal.*; 







import java.io.*; 

//import netscape.javascript.*; 

class MyWindowListener extends WindowAdapter 



public void windowClosing(WindowEvent e) 



System.exit(1); 







public class AppletTree extends Applet implements TreeSelectionListener 



private JTree tree; 



private TreePath path; 

private JScrollPane treeView; 

private DefaultMutableTreeNode top; 



private DefaultMutableTreeNode clicknode; 







private String link; 



public AppletTree(){ 



MouseListener ml = new MouseAdapter() { 

public void mousePressed(MouseEvent e) { 

int selRow = tree.getRowForLocation(e.getX(), e.getY()); 

TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); 

if(selRow != -1) { 

if(e.getClickCount() == 1) { 

System.out.print("点击一次鼠标"); 



//得到最后一个节点 

DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)selPath.getLastPathComponent(); 

boolean isLeaf = treeNode.isLeaf(); 



TreeNode objTreeNode = (TreeNode)treeNode.getUserObject(); 

System.out.println(isLeaf); 

System.out.println(objTreeNode .getName()) ; 

System.out.println(objTreeNode .getId()) ; 

if(isLeaf) 

{//如果为叶子节点就传出去进行查询操作 

try 



getAppletContext().showDocument(new URL("http://127.0.0.1:8080/tree/showDevice.htm"),"f2" ); 



catch(Exception ex) 



System.out.print(ex); 









else if(e.getClickCount() == 2) { 

System.out.print("点击两次鼠标"); 

//getAppletContext().showDocument(new URL("http://www.csdn.net/")); 

//myDoubleClick(selRow, selPath); 







}; 





public void start() 



super.start(); 





public void init(){ 

try{ 

super.init(); 

this.setLayout(new GridLayout(1,1)); 

tree=createTree(new FileInputStream("e:/example/TreeXML.xml")); 

tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 

tree.putClientProperty("JTree.lineStyle","Angled"); 



tree.setShowsRootHandles(true); 

tree.setEditable(true); 

tree.addTreeSelectionListener( this ); 

IconRender render=new IconRender(); 

tree.setCellRenderer(render); 





treeView = new JScrollPane(tree); 

//topPanel.add(tree); 

this.add(treeView); 



tree.addMouseListener(ml); 



}catch(Exception e){ 

e.printStackTrace(); 







public JTree createTree(InputStream is){ 

SAXBuilder builder = new SAXBuilder(); 

try { 

Document doc = builder.build(is); 

Element root=doc.getRootElement(); 

TreeNode rootNode=new 

TreeNode(root.getAttributeValue("id"),root.getAttributeValue("name"),root.getAttributeValue("HaveChildren")); 

top=new DefaultMutableTreeNode(rootNode); 

addNode(root,top); 

} catch (Exception ex) { 

ex.printStackTrace(); 



//可以在这里改变jtree中连线的颜色 

UIManager.put( "Tree.hash", new ColorUIResource(Color.red) ); 

return new JTree(top); 







/** 



* @param e 待加入树中的jdom元素 

* @param fatherNode 树节点父亲节点 

*/ 



private void addNode(Element e,DefaultMutableTreeNode fatherNode){ 

try{ 

Iterator it=e.getChildren().iterator(); 

if(!it.hasNext()) 

return; 

while(it.hasNext()){ 



Element sub=(Element)it.next(); 



String id=new String(sub.getAttributeValue("id").getBytes(),"GB2312"); 

String name=new String(sub.getAttributeValue("name").getBytes(),"GB2312"); 

String link=new String(sub.getAttributeValue("HaveChildren").getBytes(),"GB2312"); 



System.out.println(id); 

System.out.println(name); 

System.out.println(link); 



TreeNode tempNode=new TreeNode(id,name,link); 



DefaultMutableTreeNode node=new DefaultMutableTreeNode(tempNode); 

fatherNode.add(node); 



if(link.equals("true")){ 

System.out.println("true~! equal test"); 

addNode(sub,node); 







catch(Exception exp) 



System.out.println("encoding fail"); 









/** 

* 根据id,查找树节点,//广度优先 

* @param id 节点id 

* @param rootNode 树根节点 

* @return DefaultMutableTreeNode 

*/ 

private DefaultMutableTreeNode getTreeNode(String id,DefaultMutableTreeNode rootNode){ 

DefaultMutableTreeNode returnNode=null; 

if(rootNode!=null){ 

Enumeration enum=rootNode.breadthFirstEnumeration(); 

while(enum.hasMoreElements()){ 

DefaultMutableTreeNode temp=(DefaultMutableTreeNode)enum.nextElement(); 

TreeNode node=(TreeNode)temp.getUserObject(); 

if(node.getId().equals(id)){ 

returnNode=temp; 

break; 







return returnNode; 









public void valueChanged( TreeSelectionEvent event ){ 

if( event.getSource() == tree ){ 

path = event.getPath(); 

clicknode=(DefaultMutableTreeNode)path.getLastPathComponent(); 

Object uo=clicknode.getUserObject(); 

if(uo instanceof TreeNode){ 

TreeNode nd=(TreeNode)clicknode.getUserObject(); 

link=nd.getLink(); 











public static void main(String[] args ){ 

JFrame frame1=new JFrame("test"); 

AppletTree tree=new AppletTree(); 

tree.init(); 

frame1.getContentPane().add(tree); 

frame1.setSize(600,600); 



frame1.show(); 

frame1.addWindowListener(new MyWindowListener()); 





}
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()