[jdom-interest] Building a JTree out of a Dom Document.

Matthew MacKenzie matt at xmlglobal.com
Tue Sep 18 08:23:13 PDT 2001


If you check out jdom-contrib, it's even easier than that.  The code
required to output an XML document to a tree node is one line long.  I
strongly encourage you to check it out.

Cheers,

Matthew MacKenzie
XML Global Technologies, Inc.


-----Original Message-----
From: jdom-interest-admin at jdom.org [mailto:jdom-interest-admin at jdom.org]
On Behalf Of Mark Ayad
Sent: September 18, 2001 8:01 AM
To: jdom-interest at jdom.org
Subject: FW: [jdom-interest] Building a JTree out of a Dom Document.



-----Original Message-----
From: Mark Ayad [mailto:mayad at ogilvy.net]
Sent: Monday, September 03, 2001 4:27 PM
To: Tasso Angelidis
Subject: RE: [jdom-interest] Building a JTree out of a Dom Document.


I have an answer your in luck..

// java classes
import java.util.List;
import java.util.Iterator;
import java.io.*;

// swing classes
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

// awt classes
import java.awt.*;
import java.awt.event.*;

// xml classes
import org.jdom.*;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class BigTree
{
	/**************************************
 	/*
 	/* Declerations
 	/*
 	/**************************************/

	/** */
	private JFrame mainFrame = null;

	/** */
	private JScrollPane treeScroll = null;

	/** */
	private DefaultMutableTreeNode rootNode;

	/** */
	private DefaultTreeModel treeModel;

	/** */
	private JTree tree;

	/** jdom sax driver */
	private static String saxDriverClass = null;

	/** jdom root elemnt  */
	private Element rootElement = null;

	/**************************************
 	/*
 	/* Constructor
 	/*
 	/**************************************/

	/** default constructor */
	public BigTree()
	{
		// a simple tree test
		// buildSimpleTree();

		// build an xml tree
		buildXmlTree();

		getMainFrame();
	}

	/**************************************
 	/*
 	/* Helper Methods
 	/*
 	/**************************************/

	/**
	 * build a simple jtree
	 */
	private void buildSimpleTree()
	{
		String p1Name = new String("Parent 1");
		String p2Name = new String("Parent 2");
		String c1Name = new String("Child 1");
		String c2Name = new String("Child 2");

		DefaultMutableTreeNode p1, p2;

		// create the trees root node
		rootNode = new DefaultMutableTreeNode("The Root Node");

		// construct a tree model
		treeModel = new DefaultTreeModel(rootNode);

		// construct a tree based on a tree model
		tree = new JTree(treeModel);

		// allow the tree to be editable
		tree.setEditable(true);

		// show the root handles on the tree
		tree.setShowsRootHandles(true);

		// apply a look and feel to the tree
		tree.putClientProperty("JTree.lineStyle", "Angled");

		// create a tree node
		p1 = addObject(null, p1Name);

		// create a tree node
		p2 = addObject(null, p2Name);

		// add a child node to the p1 node
		addObject(p1, c1Name);
	}

	/**
	 * build a jtree based on an xml document
	 */
	private void buildXmlTree()
	{
		initXml();

		// create the trees root node
		rootNode = new DefaultMutableTreeNode("document");

		// construct a tree model
		treeModel = new DefaultTreeModel(rootNode);

		// construct a tree based on a tree model
		tree = new JTree(treeModel);

		// allow the tree to be editable
		tree.setEditable(false);

		// show the root handles on the tree
		tree.setShowsRootHandles(true);

		// apply a look and feel to the tree
		tree.putClientProperty("JTree.lineStyle", "Angled");


		// if a Jdom root element exists proceed
		if ( rootElement != null)
		{
			recurseXml(rootElement,rootNode);
		}
	}

	/**
	 * recurse an xml tree from a given jdom element
	 */
	private void recurseXml(Element element, DefaultMutableTreeNode
parentNode)
	{
		if(element.hasChildren())
		{
			List elementList = element.getChildren();

			Iterator listIterator = elementList.iterator();

			while (listIterator.hasNext())
			{
				Element currentElement = (Element)
listIterator.next();

				DefaultMutableTreeNode newNode = new
DefaultMutableTreeNode(currentElement.getName());

				treeModel.insertNodeInto(newNode
,parentNode,parentNode.getChildCount());

				// recurse make the parent node the new
node
				recurseXml(currentElement,newNode);
			}
		}
	}

	/**
	 * build an xml document read for parsing
	 */
	private void initXml()
	{
		try
		{
			SAXBuilder builder = null;

			if (saxDriverClass == null) builder = new
SAXBuilder();

			else builder = new SAXBuilder("");

			Document doc = builder.build("dtdxml.xml");

			rootElement = doc.getRootElement();
		}
		catch(Exception e)
		{
			System.out.println("initXml Exception: " + e);
		}
	}

	/** add child to the currently selected node. */
	public DefaultMutableTreeNode addObject(Object child)
	{
		DefaultMutableTreeNode parentNode = null;

		TreePath parentPath = tree.getSelectionPath();

		// if the parent is null then by default the parent is
the root node
		if (parentPath == null) parentNode = rootNode;

		else
		{
			parentNode = (DefaultMutableTreeNode)
(parentPath.getLastPathComponent());
		}

		return addObject(parentNode, child, true);
	}

	/** */
	public DefaultMutableTreeNode addObject(DefaultMutableTreeNode
parent,Object child)
	{
		return addObject(parent, child, false);
	}

	/** */
	public DefaultMutableTreeNode addObject(DefaultMutableTreeNode
parent,Object child,boolean shouldBeVisible)
	{
		// create a new child node
		DefaultMutableTreeNode childNode = new
DefaultMutableTreeNode(child);

		// if the parent is null then by default the parent is
the root node
		if (parent == null) parent = rootNode;

		// add the child to the tree model
		treeModel.insertNodeInto(childNode, parent,
parent.getChildCount());

		// make sure that the added node is visible
		if (shouldBeVisible) tree.scrollPathToVisible(new
TreePath(childNode.getPath()));

		// return the child node
		return childNode;
	}

	/*##########################################################
 	/*
 	/* Component Constructors
 	/*
 	/*##########################################################

	/**************************************
 	/*
 	/* Component Getters
 	/*
 	/**************************************/

	/** create or return the my tree frame instance */
	private JFrame getMainFrame()
	{
		if (mainFrame == null)
		{
			mainFrame = new JFrame("Big Tree");

			mainFrame.setSize(400, 300);

			mainFrame.getContentPane().add(getTreeScroll());

			mainFrame.addWindowListener(new
MyWindowListener());

			mainFrame.show();
		}
		return mainFrame;
	}

	/** create or return the my tree scroll instance */
	private JScrollPane getTreeScroll()
	{
		if (treeScroll == null)
		{
			treeScroll = new JScrollPane();

			treeScroll.getViewport().add(tree);
		}
		return treeScroll;
	}

	/*##########################################################
 	/*
 	/* Event Handling
 	/*
 	/*##########################################################

	/** */
	public class MyWindowListener implements WindowListener,
ActionListener
	{
		/**************************************
 		/*
 		/* Inner Class
 		/* Implement the WindowListener interface
 		/*
 		/**************************************/

		/**
		Invoked when a window is activated.
		@param e the received event
		*/
		public void windowActivated(WindowEvent e)
		{
			//System.out.println("debug window got focus");
		}

		/**
		Invoked when a window has been closed.
		@param e the received event
		*/
		public void windowClosed(WindowEvent e)
		{
			// Do nothing.
			// This method is required to comply with the
WindowListener interface.
		}

		/**
		Invoked when a window is in the process of being closed.
		The close operation can be overridden at this point.
		@param e the received event
		*/
		public void windowClosing(WindowEvent e)
		{
			// The window is being closed.  Shut down the
system.

			System.exit(0);
		}

		/**
		Invoked when a window is deactivated.
		@param e the received event
		*/
		public void windowDeactivated(WindowEvent e)
		{
			//System.out.println("debug window lost focus");
		}

		/**
		Invoked when a window is de-iconified.
		@param e the received event
		*/
		public void windowDeiconified(WindowEvent e)
		{
			//System.out.println("debug de-iconified the
window");
		}

		/**
		Invoked when a window is iconified.
		@param e the received event
		*/
		public void windowIconified(WindowEvent e)
		{
			//System.out.println("debug iconified the
window");
		}

		/**
		Invoked when a window has been opened.
		@param e the received event
		*/
		public void windowOpened(WindowEvent e)
		{
			// Do nothing.
			// This method is required to comply with the
WindowListener interface.
		}

		/**************************************
 		/*
 		/* Implement the ActionListener interface
 		/*
 		/**************************************/

		public void actionPerformed(java.awt.event.ActionEvent
e)
		{
			System.out.println("window action event");
		}
	}

	/*##########################################################
 	/*
 	/* Testing
 	/*
 	/*##########################################################

	/**************************************
 	/*
 	/* Main
 	/*
 	/**************************************/

	/** program entry point */
	public static void main(java.lang.String[] args)
	{
		BigTree objBigTree = new BigTree();
	}
}

-----Original Message-----
From: jdom-interest-admin at jdom.org
[mailto:jdom-interest-admin at jdom.org]On Behalf Of Tasso Angelidis
Sent: Tuesday, September 18, 2001 3:17 PM
To: 'Matthew MacKenzie'; philip.nelson at omniresources.com; Tasso
Angelidis; jdom-interest at jdom.org
Subject: RE: [jdom-interest] Building a JTree out of a Dom Document.


Call me ignorant, where are the contribs or the files for the
outputter...

Thanks.

-----Original Message-----
From: Matthew MacKenzie [mailto:matt at xmlglobal.com]
Sent: Monday, September 17, 2001 8:32 PM
To: philip.nelson at omniresources.com; TassoA at trustmarque.ca;
jdom-interest at jdom.org
Subject: Re: [jdom-interest] Building a JTree out of a Dom Document.


On Monday 17 September 2001 16:51, philip.nelson at omniresources.com
wrote:
> There is a JTree outputter in the jdom-contrib area though I don't
know if
> it's up to date.

It should still work.  Also, if one were to search the list archives
they
might find an announcement that someone wrote a TreeModel for JDOM.
Last I
checked, jdom-contrib still just output to a tree node, following the
Outputter model.


>
> Brett's second edition of "Java and XML" has an example in the
Advanced
> JDOM chapter (and the sax chapter if I remember right)
> _______________________________________________
> To control your jdom-interest membership:
>
http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@you
rho
>st.com

--
Matthew MacKenzie
XML Global

<quote>
If at first you don't succeed, redefine success.
</quote>
_______________________________________________
To control your jdom-interest membership:
http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@you
rhos
t.com

_______________________________________________
To control your jdom-interest membership:
http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@you
rhost.com




More information about the jdom-interest mailing list