使用jdom操作xml数据,生成含Jtree的applet

关键词:xml,jdom,applet,jtree


在我们工作中,常常会碰到树形组件的生成问题,如果你在开发web application,纯粹使用
javascript来生成树形组件是非常繁琐的,而且交互性也不不太好。所以许多产品使applet来实现树形组件的功能。比如说,weblogic,jboss等产品的console.所以,把树形数据组织成xml文件,用jdom剖析它,最后生成applet就非常有通用的意义。下面,我就给出一个例子,抛砖引玉。

1.准备一个存有属性数据的xml文件,把它放在classpath中,我这里是org.xml。

[pre]<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSPY v5 rel. 3 U (http://www.xmlspy.com)-->;
<node xmlns="http://www.javabox.com/schemas/org" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://www.javabox.com/schemas/org
E:/myDemo/org.xsd" name="组织机构" id="-1" desc="" link="#">
    <node name="总经理" id="1" desc="" link="#">
        <node name="管理副总经理" id="2" desc="" link="#"/>
        <node name="生产副总经理" id="3" desc="" link="#">
            <node name="项目部" id="7" desc="" link="#"/>
            <node name="机械公司" id="8" desc="" link="#"/>
            <node name="贝盟公司" id="9" desc="" link="#"/>
            <node name="洛斯韦公司" id="9" desc="" link="#"/>
        </node>
        <node name="总工程师" id="4" desc="" link="#"/>
        <node name="总会计师" id="5" desc="" link="#"/>
        <node name="总经济师" id="6" desc="" link="#"/>
    </node>
</node>[/pre]

2.确保你可以使用jdom解析器,你如果没有可以去这里下载。

3.用于代表树结点节点的javabean,TreeNode.java

  1. package com.javabox.jtree;
  2. public class TreeNode{
  3.   private String id;
  4.   private String name;
  5.   private String link;
  6.   public TreeNode(String id,String name,String link){
  7.     this.id=id;
  8.     this.name=name;
  9.     this.link=link;
  10.   }
  11.   public String getId(){
  12.     return id;
  13.   }
  14.   public void setId(String Id){
  15.     this.id=Id;
  16.   }
  17.   public void  setName(String Name){
  18.     this.name=Name;
  19.   }
  20.   public String getName(){
  21.     return name;
  22.   }
  23.   public String toString(){
  24.     return  name;
  25.   }
  26.   public String getLink(){
  27.     return link;
  28.   }
  29.   public void setLink(String link){
  30.     this.link=link;
  31.   }
  32. }


4.自己写的TreeCellRenderer,IconRender.java

  1. package com.javabox.jtree;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import javax.swing.tree.*;
  5. import javax.swing.tree.DefaultTreeCellRenderer;
  6. class IconRender
  7.     extends DefaultTreeCellRenderer {
  8.   
  9. //你需要替换成你的icon
  10.   public static final Icon leafSelectedIcon = new ImageIcon("greeball.JPG");
  11.   public static final Icon leafUnSelectedIcon = new ImageIcon("greyball.JPG");
  12.   public static final Icon folderOpen = new ImageIcon("folderopen.JPG");
  13.   public static final Icon folderClose = new ImageIcon("folderclose.JPG");
  14.   public Component getTreeCellRendererComponent(JTree tree,
  15.                                                 Object value,
  16.                                                 boolean selected,
  17.                                                 boolean expanded,
  18.                                                 boolean leaf,
  19.                                                 int row,
  20.                                                 boolean hasFocus) {
  21.     super.getTreeCellRendererComponent(tree, value, selected, expanded,
  22.                                        leaf, row, hasFocus);
  23.     if (leaf && selected) {
  24.       setIcon(IconRender.leafSelectedIcon);
  25.     }
  26.     else if (leaf) {
  27.       setIcon(IconRender.leafUnSelectedIcon);
  28.     }
  29.     return this;
  30.   }
  31.   public IconRender() {
  32.     super();
  33.     this.setLeafIcon(leafUnSelectedIcon);
  34.     this.setOpenIcon(folderOpen);
  35.     this.setClosedIcon(folderClose);
  36.   }
  37. }


5.AppletTree.java,该文件解析xml文件,生成含Jtree的applet,你可以把它嵌入到jsp,html文件中使用,也可以直接运行该文件。

  1. package com.javabox.jtree;
  2. import javax.swing.event.*;
  3. import java.awt.*;
  4. import java.applet.*;
  5. import javax.swing.*;
  6. import javax.swing.tree.*;
  7. import java.awt.event.*;
  8. import org.jdom.*;
  9. import org.jdom.input.*;
  10. import java.io.*;
  11. import java.util.*;
  12. import java.awt.*;
  13. import javax.swing.*;
  14. import javax.swing.border.*;
  15. import javax.swing.plaf.*;
  16. import javax.swing.plaf.basic.*;
  17. import javax.swing.plaf.metal.*;
  18. import java.io.*;
  19. import netscape.javascript.*;
  20. public class AppletTree extends Applet implements TreeSelectionListener
  21. {
  22.   private JTree tree;
  23.   private TreePath path;
  24.   private Panel topPanel;
  25.   private DefaultMutableTreeNode top;
  26.   private DefaultMutableTreeNode clicknode;
  27.   private String link;
  28.   public AppletTree(){
  29.   }
  30.   public void init(){
  31.     try{
  32.     super.init();
  33.     this.setLayout(new GridLayout(1,1));
  34.     tree=createTree(new FileInputStream("org.xml"));
  35.     tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
  36.     tree.putClientProperty("JTree.lineStyle","Angled");
  37.     tree.setShowsRootHandles(true);
  38.     tree.setEditable(false);
  39.     tree.addTreeSelectionListener( this );
  40.     IconRender render=new IconRender();
  41.     tree.setCellRenderer(render);
  42.     topPanel=new Panel(new BorderLayout());
  43.     topPanel.add(tree);
  44.     this.add(topPanel);
  45.     }catch(Exception e){
  46.       e.printStackTrace();
  47.     }
  48.   }
  49.   public JTree createTree(InputStream is){
  50.     SAXBuilder builder = new SAXBuilder();
  51.     try {
  52.       Document doc = builder.build(is);
  53.       Element root=doc.getRootElement();
  54.       TreeNode rootNode=new 
  55. TreeNode(root.getAttributeValue("id"),root.getAttributeValue("name"),root.getAttributeValue("link"));
  56.       top=new DefaultMutableTreeNode(rootNode);
  57.       addNode(root,top);
  58.     }  catch (Exception ex) {
  59.       ex.printStackTrace();
  60.     }
  61.     //你可以在这里改变jtree中连线的颜色,我请教国外的高手才找到的,很酷的哦:)
  62.     UIManager.put( "Tree.hash"new ColorUIResource(Color.red) );
  63.     return new JTree(top);
  64.   }
  65.   /**
  66.    *
  67.    * @param e 待加入树种的jdom元素
  68.    * @param rootNode 树根节点
  69.    */
  70.   private void addNode(Element e,DefaultMutableTreeNode rootNode){
  71.     String id=e.getAttributeValue("id");
  72.     String name=e.getAttributeValue("name");
  73.     String link=e.getAttributeValue("link");
  74.     TreeNode node=new TreeNode(id,name,link);
  75.     //如有父节点
  76.     Element father=e.getParent();
  77.     if(father!=null){
  78.       String fid=father.getAttributeValue("id");
  79.       DefaultMutableTreeNode fatherNode=getTreeNode(fid,rootNode);
  80.       if(fatherNode!=null){
  81.         fatherNode.add(new DefaultMutableTreeNode(node));
  82.       }
  83.     }
  84.     //如有子节点
  85.     Iterator it=e.getChildren().iterator();
  86.     while(it.hasNext()){
  87.       Element child=(Element)it.next();
  88.       addNode(child,rootNode);
  89.     }
  90.   }
  91.   /**
  92.    * 根据id,查找树节点,//广度优先
  93.    * @param id 节点id
  94.    * @param rootNode 树根节点
  95.    * @return DefaultMutableTreeNode
  96.    */
  97.   private DefaultMutableTreeNode getTreeNode(String id,DefaultMutableTreeNode rootNode){
  98.     DefaultMutableTreeNode returnNode=null;
  99.     if(rootNode!=null){
  100.       Enumeration enum=rootNode.breadthFirstEnumeration();
  101.       while(enum.hasMoreElements()){
  102.         DefaultMutableTreeNode temp=(DefaultMutableTreeNode)enum.nextElement();
  103.         TreeNode node=(TreeNode)temp.getUserObject();
  104.         if(node.getId().equals(id)){
  105.           returnNode=temp;
  106.           break;
  107.         }
  108.       }
  109.     }
  110.     return returnNode;
  111.   }
  112.   public void valueChanged( TreeSelectionEvent event ){
  113.     if( event.getSource() == tree ){
  114.       path = event.getPath();
  115.       clicknode=(DefaultMutableTreeNode)path.getLastPathComponent();
  116.       Object uo=clicknode.getUserObject();
  117.       if(uo instanceof TreeNode){
  118.         TreeNode nd=(TreeNode)clicknode.getUserObject();
  119.         link=nd.getLink();
  120.       }
  121.       //调用一个javascript函数; 
  122. //      JSObject.getWindow (this).eval ("javascript:window.open('"+link+"')") ;
  123.     }
  124.   }
  125.   public static  void main(String[] args ){
  126.     JFrame frame=new JFrame("test");
  127.     AppletTree tree=new AppletTree();
  128.     tree.init();
  129.     frame.getContentPane().add(tree);
  130.     frame.setSize(600,600);
  131.     frame.show();
  132.   }
  133. }


6.运行一个这个类,是不是很cool哦,你还可以把它嵌在网页中,调用javasript函数,达到刷新页面的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值