JR 精品文章 - 使用jdom操作xml数据,生成含Jtree的applet
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » Java GUI 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
使用jdom操作xml数据,生成含Jtree的applet
Jagie 原创   更新:2003-11-05 16:22:51  版本: 1.0   

关键词:xml,jdom,applet,jtree


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

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

<?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>


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函数,达到刷新页面的目的。


希望该文章能对你有所启发,祝你成功!



版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     19       2
作者其它文章: 作者全部文章
游客: jdao 发表时间: Wed Nov 05 16:26:43 CST 2003
您好,感谢您的文章!

请教一个问题,您文章中有“netscape.javascript.*”,并用到了JSObject,请问netscape这个包是不是浏览器中内置的?还是需要另外下载?谢谢!
评论人:Jagie 发表时间: Wed Nov 05 17:10:40 CST 2003
我的位于
D:\j2sdk1.4.2_02\jre\lib\plugin.jar,
也就是说在你的jdk/jre/lib目录中。

我也是用google找到的。:)
评论人:scarus 发表时间: Thu Nov 06 14:15:53 CST 2003
写的好啊,比较牛
评论人:turing600 发表时间: Fri Nov 21 15:27:03 CST 2003
飞哥,多年不见,java用的这么牛啊?嘿嘿,以后多多指教了
评论人:boona 发表时间: Sun Dec 14 12:55:35 CST 2003
我运行上面的代码,提示出错,如下:
  1. org.jdom.input.JDOMParseException: Error on line 1: 字符转换错误:“Malformed UTF-8 char -- is an XML encoding declaration missing?”(行号可能太小)。
  2.     at org.jdom.input.SAXBuilder.build(SAXBuilder.java:381)
  3.     at org.jdom.input.SAXBuilder.build(SAXBuilder.java:684)
  4.     at mytest.jdom.jtree.AppletTree.createTree(AppletTree.java:52)
  5.     at mytest.jdom.jtree.AppletTree.init(AppletTree.java:35)
  6.     at mytest.jdom.jtree.AppletTree.main(AppletTree.java:126)
评论人:Jagie 发表时间: Thu Dec 18 12:05:59 CST 2003
可能是你在页面copy xml文件的时候,没有copy好,导致不是一个well-formated的xml文件,最好是把copy下来的xml文件用一些xml文件编辑器校验一下,例如xmlspy,看看这个xml是否完整!
游客: violet 发表时间: Tue Feb 17 14:38:36 CST 2004
俺虽然不懂,也来捧下场先:)
评论人:vampire_315 发表时间: Sun Dec 17 11:48:51 CST 2006
好啊

这个文章共有 8 条评论
主题: 认识class Class及其应用 上一篇文章
返回文章列表 返回〔Java GUI〕
下一篇文章 主题: 对Swing线程的再思索 (上)


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号