我没写过树型结构但你可以用jdom来分析xml文件,为没一个分支,在你这应该是
<parent4>
    <display-name>parent4</display-name>
    <onClickEvent>Event4</onClickEvent>
<child7>
  <display-name>child7</display-name>
  <onClickEvent>child7-Event</onClickEvent>
</child7>
<child8>
  <display-name>child8</display-name>
  <onClickEvent>child8-Event</onClickEvent>
</child8>
  </parent4>设计一个类,等分析完整个xml文件后返回一个数组就可以了,然后根据数组的内容来写树型结构。
下面是我写的一段代码片断
// -----------------------------------------------------------------------------
// JaxpXmlDomExample.java
// -----------------------------------------------------------------------------// Core Java APIs
package com.hhb.mobile.util;import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;// JAXP
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;// DOM
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.NamedNodeMap;/**
 * -----------------------------------------------------------------------------
 * Used to provide an example of how to build a DOM Tree from an example XML
 * file provided on the command line. This example uses Sun Microsystem's JAXP
 * API's.
 *
 * COMPILE:
 * --------------------------
 * javac JaxpXmlDomExample.java
 *
 * 
 * RUN PROGRAM:
 * --------------------------
 * java JaxpXmlDomExample DatabaseInventory.xml
 *
 * -----------------------------------------------------------------------------
 */
 
public class JaxpXmlDomExample {    private static void printNode(Node node, String indent)  {        switch (node.getNodeType()) {            case Node.DOCUMENT_NODE:
                System.out.println("<xml version=\"1.0\">\n");
                // recurse on each child
                NodeList nodes = node.getChildNodes();
                if (nodes != null) {
                    for (int i=0; i<nodes.getLength(); i++) {
                        printNode(nodes.item(i), "");
                    }
                }
                break;
                
            case Node.ELEMENT_NODE:
                String name = node.getNodeName();
                System.out.print(indent + "<" + name);
                NamedNodeMap attributes = node.getAttributes();
                for (int i=0; i<attributes.getLength(); i++) {
                    Node current = attributes.item(i);
                    System.out.print(
                        " " + current.getNodeName() +
                        "=\"" + current.getNodeValue() +
                        "\"");
                }
                System.out.print(">");
                
                // recurse on each child
                NodeList children = node.getChildNodes();
                if (children != null) {
                    for (int i=0; i<children.getLength(); i++) {
                        printNode(children.item(i), indent + "  ");
                    }
                }
                
                System.out.print("</" + name + ">");
                break;            case Node.TEXT_NODE:
                System.out.print(node.getNodeValue());
                break;
        }    }    public static void main(String[] args) {        if (args.length != 0) {
            System.err.println ("\nUsage: java JaxpXmlDomExample filename\n");
            System.exit (1);
        }        // Create File object from incoming file
        File xmlFile = new File("configure.xml");
 
        try {
        
            // Get Document Builder Factory
            DocumentBuilderFactory factory = 
                    DocumentBuilderFactory.newInstance();            // Turn on validation, and turn off namespaces
            factory.setValidating(true);
            factory.setNamespaceAware(false);            // Obtain a document builder object
            DocumentBuilder builder = factory.newDocumentBuilder();            System.out.println();
//            System.out.println("Passed in File         : " + args[0]);
            System.out.println("Object to Parse (File) : " + xmlFile);
            System.out.println("Parser Implementation  : " + builder.getClass());
            System.out.println();            // Parse the document
            Document doc = builder.parse(xmlFile);            // Print the document from the DOM tree and feed it an initial 
            // indentation of nothing
            printNode(doc, "");
            
            System.out.println("\n");        } catch (ParserConfigurationException e) {
            System.out.println("The underlying parser does not support " +
                               "the requested features.");
            e.printStackTrace();
        } catch (FactoryConfigurationError e) {
            System.out.println("Error occurred obtaining Document Builder " +
                               "Factory.");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }}

解决方案 »

  1.   


    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.TreeNode;
    import javax.swing.plaf.metal.MetalTheme;
    import javax.swing.plaf.metal.MetalLookAndFeel;
    import javax.swing.plaf.metal.*;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class Frame1 extends JFrame {
      JPanel contentPane;
      BorderLayout borderLayout1 = new BorderLayout();  //Construct the frame
      public Frame1() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }  //Component initialization
      private void jbInit() throws Exception  {
        contentPane = (JPanel) this.getContentPane();
        contentPane.setLayout(borderLayout1);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            final int inset = 50;
            setBounds ( inset, inset, screenSize.width - inset*2, screenSize.height - inset*2 );
        this.setTitle("Frame Title");
        first f = new first();
        JTree tree = new JTree(f.ReadXml());
        JTree tree1 = new JTree(f.ReadXml());
        TreeClick tclick = new TreeClick(tree,tree1);
        JScrollPane spanel = new JScrollPane(tree);
        contentPane.add(new JScrollPane(tree1),BorderLayout.NORTH);
        contentPane.add(spanel,BorderLayout.CENTER);
        MetalTheme[] themes = { new DefaultMetalTheme(),
                                    new AquaMetalTheme()};    MetalTheme selectedTheme = themes[ new Integer(0).intValue() ];
        MetalLookAndFeel.setCurrentTheme(selectedTheme);
        JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout ( new FlowLayout(FlowLayout.RIGHT) );
            JButton cancel = new JButton("Cancel");
            cancel.addActionListener(new ActionListener() {
                                   public void actionPerformed(ActionEvent e) {
                                       System.out.println("cancel");
                                   }});
            buttonPanel.add( cancel );
            JButton ok = new JButton("OK");
            ok.addActionListener(new ActionListener() {
                                   public void actionPerformed(ActionEvent e) {
                                       System.out.println("OK");
                                   }});
            buttonPanel.add( ok );
            JButton shuan = new JButton("Bye");
            shuan.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent e){
                System.out.println("very good");
                System.exit(0);
              }
            });
            buttonPanel.add(shuan);
            contentPane.add(buttonPanel,BorderLayout.SOUTH);    try {
          UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (Exception ex) {
          System.out.println("Failed loading Metal");
          System.out.println(ex);
        }  }  //Overridden so we can exit when window is closed
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
    }
      

  2.   

    import java.awt.*;
    import javax.swing.*;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class Application1 {
      boolean packFrame = false;  //Construct the application
      public Application1() {
        Frame1 frame = new Frame1();
        //Validate frames that have preset sizes
        //Pack frames that have useful preferred size info, e.g. from their layout
        if (packFrame) {
          frame.pack();
        }
        else {
          frame.validate();
        }
        //Center the window
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        if (frameSize.height > screenSize.height) {
          frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
          frameSize.width = screenSize.width;
        }
        frame.setSize(frameSize);
    //    frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
        frame.setVisible(true);
      }  //Main method
      public static void main(String[] args) {
        JDialog.setDefaultLookAndFeelDecorated(true);
        JFrame.setDefaultLookAndFeelDecorated(true);
        Toolkit.getDefaultToolkit().setDynamicLayout(true);
        System.setProperty("sun.awt.noerasebackground","true");    new Application1();
      }
    }
    这只是显示的
      

  3.   

    to AllError(错误大全)下面两句代码中的类是什么?
       //TreeClick tclick = new TreeClick(tree,tree1);
    // MetalTheme[] themes = { new DefaultMetalTheme(),new AquaMetalTheme()};是自己定义的还是jdk的类库?
    谢谢!
      

  4.   

    可以考虑使用JAXB,使用XML SCHEMA直接进行XML与JAVA数据对象直接的映射,并对对象直接操作。具体操作可以搜索 java 数据绑定,里面有教程
      

  5.   

    谢谢楼上的各位..谁有完整的示例代码,请发到我信箱里面,好吗?[email protected]到时候另外给分!
      

  6.   

    自己做了一些.实现了文件遍历产生对应的目录树。
    求教:如何在jtree上点击时候出现右键菜单?如何将结果保存到xml文件里面?谢谢!
    以下是我的代码:
    //AppletTreeimport 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.jdom.input.* ;
    import java.io.* ;
    import java.util.* ;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.* ;public class AppletTree
        extends Applet
        implements TreeSelectionListener
    {
      private JTree tree ;  private TreePath path ;
      private Panel topPanel ;
      private DefaultMutableTreeNode top ;  private DefaultMutableTreeNode clicknode ;  private String link ;
      public AppletTree()
      {
      }  public void init()
      {
        try
        {
          super.init() ;
          this.setLayout(new GridLayout(1, 1)) ;
          tree = createTree(new FileInputStream("source/config.xml")) ;
          tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION) ;
          tree.putClientProperty("JTree.lineStyle", "Angled") ;      tree.setShowsRootHandles(true) ;
          tree.setEditable(false) ;
          tree.addTreeSelectionListener(this) ;
          IconRender render = new IconRender() ;
          tree.setCellRenderer(render) ;      topPanel = new Panel(new BorderLayout()) ;
          topPanel.add(tree) ;
          this.add(topPanel) ;
        }
        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("link")) ;
          top = new DefaultMutableTreeNode(rootNode) ;
          addNode(root, top) ;
        }
        catch (Exception ex)
        {
          ex.printStackTrace() ;
        }
        UIManager.put("Tree.hash", new ColorUIResource(Color.red)) ;
        return new JTree(top) ;  }  /**
       *
       * @param e 待加入树种的jdom元素
       * @param rootNode 树根节点
       */  private void addNode(Element e, DefaultMutableTreeNode rootNode)
      {
        String id = e.getAttributeValue("id") ;
        String name = e.getAttributeValue("name") ;
        String link = e.getAttributeValue("link") ;
       // 取回属性值
       //String val = element.getAttributeValue("value");
       //重新设置值
       //element.setAttribute("value", val+" haha ");
       //删除属性
       //element.removeAttribute("value");    TreeNode node = new TreeNode(id, name, link) ;
        //如有父节点
        Element father = e.getParent() ;
        if (father != null)
        {
          String fid = father.getAttributeValue("id") ;
          DefaultMutableTreeNode fatherNode = getTreeNode(fid, rootNode) ;
          if (fatherNode != null)
          {
            fatherNode.add(new DefaultMutableTreeNode(node)) ;
          }
        }
        //如有子节点
        Iterator it = e.getChildren().iterator() ;
        while (it.hasNext())
        {
          Element child = (Element) it.next() ;
          addNode(child, rootNode) ;
        }  }  /**
       * 根据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() ;
          }
          //调用一个javascript函数; 
    //      JSObject.getWindow (this).eval ("javascript:window.open('"+link+"')") ;    }
      }  public static void main(String[] args)
      {
        JFrame frame = new JFrame("test") ;
        AppletTree tree = new AppletTree() ;
        tree.init() ;
        frame.getContentPane().add(tree) ;
        frame.setSize(600, 600) ;    frame.show() ;
      }}//IconRender
    import javax.swing.* ;
    import java.awt.* ;
    import javax.swing.tree.* ;import javax.swing.tree.DefaultTreeCellRenderer ;class IconRender
        extends DefaultTreeCellRenderer
    {//你需要替换成你的icon  public static final Icon leafSelectedIcon = new ImageIcon("source/1.gif") ;
      public static final Icon leafUnSelectedIcon = new ImageIcon("source/2.gif") ;
      public static final Icon folderOpen = new ImageIcon("source/3.gif") ;
      public static final Icon folderClose = new ImageIcon("source/4.gif") ;
      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() ;
        this.setLeafIcon(leafUnSelectedIcon) ;
        this.setOpenIcon(folderOpen) ;
        this.setClosedIcon(folderClose) ;  }}//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 ;
      }}//config.xml
    <?xml version="1.0" encoding="UTF-8"?>
     <node name="aaa" id="1" desc="" link="#">
            <node name="bbb" id="2" desc="" link="#"/>
            <node name="ccc" id="3" desc="" link="#">
                <node name="ddd" id="4" desc="" link="#"/>
                <node name="eee" id="5" desc="" link="#"/>
                <node name="fff" id="6" desc="" link="#"/>
                <node name="hhh" id="7" desc="" link="#"/>
            </node>
            <node name="jjj" id="8" desc="" link="#"/>
            <node name="kkk" id="9" desc="" link="#"/>
            <node name="lll" id="10" desc="" link="#"/>
    </node>
      

  7.   

    ^_^..着急啊..java板块的人气的确有些不够。谁能帮我一下吗?谢谢