9 Replies - 29776 Views - Last Post: 04 February 2007 - 08:45 PM Rate Topic: -----

#1 Liontrue1   User is offline

  • D.I.C Addict
  • member icon

Reputation: 48
  • View blog
  • Posts: 811
  • Joined: 20-May 06

setting the icon of a JTree node

Posted 28 January 2007 - 05:33 PM

Hi all! I learned some of the basics of the JTree component in the swing package, but I ran into a problem: how can I set the icon displayed beside the node?

Some tutorials use the DefaultMutableTreeNode component as a tree node, but it only takes a string as a parameter for the constructor (the text of the node). I found no constructor using an icon as a parameter.

I looked at the methods, and I did not find a setIcon, setImage, or any method that could look like this. How can I set the icon? No need to publish my code, just a line of code could be sufficient. Thanks in advance!

Is This A Good Question/Topic? 0
  • +

Replies To: setting the icon of a JTree node

#2 Abbygail   User is offline

  • D.I.C Head

Reputation: 0
  • View blog
  • Posts: 65
  • Joined: 13-July 06

Re: setting the icon of a JTree node

Posted 29 January 2007 - 05:11 AM

Not sure if this will help. Found it on the sun web site.

/**
 * A 1.4 application that requires the following additional files:
 *   TreeDemoHelp.html
 *	arnold.html
 *	bloch.html
 *	chan.html
 *	jls.html
 *	swingtutorial.html
 *	tutorial.html
 *	tutorialcont.html
 *	vm.html
 */

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;

import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.ImageIcon;

import java.net.URL;
import java.io.IOException;
import java.awt.Dimension;
import java.awt.GridLayout;

public class TreeIconDemo extends JPanel 
						  implements TreeSelectionListener {
	private JEditorPane htmlPane;
	private JTree tree;
	private URL helpURL;
	private static boolean DEBUG = false;

	public TreeIconDemo() {
		super(new GridLayout(1,0));

		//Create the nodes.
		DefaultMutableTreeNode top =
			new DefaultMutableTreeNode("The Java Series");
		createNodes(top);

		//Create a tree that allows one selection at a time.
		tree = new JTree(top);
		tree.getSelectionModel().setSelectionMode
				(TreeSelectionModel.SINGLE_TREE_SELECTION);

		//Set the icon for leaf nodes.
		ImageIcon leafIcon = createImageIcon("images/middle.gif");
		if (leafIcon != null) {
			DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
			renderer.setLeafIcon(leafIcon);
			tree.setCellRenderer(renderer);
		} else {
			System.err.println("Leaf icon missing; using default.");
		}

		//Listen for when the selection changes.
		tree.addTreeSelectionListener(this);

		//Create the scroll pane and add the tree to it. 
		JScrollPane treeView = new JScrollPane(tree);

		//Create the HTML viewing pane.
		htmlPane = new JEditorPane();
		htmlPane.setEditable(false);
		initHelp();
		JScrollPane htmlView = new JScrollPane(htmlPane);

		//Add the scroll panes to a split pane.
		JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
		splitPane.setTopComponent(treeView);
		splitPane.setBottomComponent(htmlView);

		Dimension minimumSize = new Dimension(100, 50);
		htmlView.setMinimumSize(minimumSize);
		treeView.setMinimumSize(minimumSize);
		splitPane.setDividerLocation(100); //XXX: ignored in some releases
										   //of Swing. bug 4101306
		//workaround for bug 4101306:
		//treeView.setPreferredSize(new Dimension(100, 100)); 

		splitPane.setPreferredSize(new Dimension(500, 300));

		//Add the split pane to this panel.
		add(splitPane);
	}

	/** Required by TreeSelectionListener interface. */
	public void valueChanged(TreeSelectionEvent e) {
		DefaultMutableTreeNode node = (DefaultMutableTreeNode)
						   tree.getLastSelectedPathComponent();

		if (node == null) return;

		Object nodeInfo = node.getUserObject();
		if (node.isLeaf()) {
			BookInfo book = (BookInfo)nodeInfo;
			displayURL(book.bookURL);
			if (DEBUG) {
				System.out.print(book.bookURL + ":  \n	");
			}
		} else {
			displayURL(helpURL); 
		}
		if (DEBUG) {
			System.out.println(nodeInfo.toString());
		}
	}

	private class BookInfo {
		public String bookName;
		public URL bookURL;

		public BookInfo(String book, String filename) {
			bookName = book;
			bookURL = TreeIconDemo.class.getResource(filename);
			if (bookURL == null) {
				System.err.println("Couldn't find file: "
								   + filename);
			}
		}

		public String toString() {
			return bookName;
		}
	}

	private void initHelp() {
		String s = "TreeDemoHelp.html";
		helpURL = TreeIconDemo.class.getResource(s);
		if (helpURL == null) {
			System.err.println("Couldn't open help file: " + s);
		} else if (DEBUG) {
			System.out.println("Help URL is " + helpURL);
		}

		displayURL(helpURL);
	}

	private void displayURL(URL url) {
		try {
			if (url != null) {
				htmlPane.setPage(url);
			} else { //null url
		htmlPane.setText("File Not Found");
				if (DEBUG) {
					System.out.println("Attempted to display a null URL.");
				}
			}
		} catch (IOException e) {
			System.err.println("Attempted to read a bad URL: " + url);
		}
	}

	private void createNodes(DefaultMutableTreeNode top) {
		DefaultMutableTreeNode category = null;
		DefaultMutableTreeNode book = null;

		category = new DefaultMutableTreeNode("Books for Java Programmers");
		top.add(category);

		//original Tutorial
		book = new DefaultMutableTreeNode(new BookInfo
			("The Java Tutorial: A Short Course on the Basics",
			"tutorial.html"));
		category.add(book);

		//Tutorial Continued
		book = new DefaultMutableTreeNode(new BookInfo
			("The Java Tutorial Continued: The Rest of the JDK",
			"tutorialcont.html"));
		category.add(book);

		//JFC Swing Tutorial
		book = new DefaultMutableTreeNode(new BookInfo
			("The JFC Swing Tutorial: A Guide to Constructing GUIs",
			"swingtutorial.html"));
		category.add(book);

		//Bloch
		book = new DefaultMutableTreeNode(new BookInfo
			("Effective Java Programming Language Guide",
		 "bloch.html"));
		category.add(book);

		//Arnold/Gosling
		book = new DefaultMutableTreeNode(new BookInfo
			("The Java Programming Language", "arnold.html"));
		category.add(book);

		//Chan
		book = new DefaultMutableTreeNode(new BookInfo
			("The Java Developers Almanac",
			 "chan.html"));
		category.add(book);

		category = new DefaultMutableTreeNode("Books for Java Implementers");
		top.add(category);

		//VM
		book = new DefaultMutableTreeNode(new BookInfo
			("The Java Virtual Machine Specification",
			 "vm.html"));
		category.add(book);

		//Language Spec
		book = new DefaultMutableTreeNode(new BookInfo
			("The Java Language Specification",
			 "jls.html"));
		category.add(book);
	}

	/** Returns an ImageIcon, or null if the path was invalid. */
	protected static ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = TreeIconDemo.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}

	/**
	 * Create the GUI and show it.  For thread safety,
	 * this method should be invoked from the
	 * event-dispatching thread.
	 */
	private static void createAndShowGUI() {
		//Create and set up the window.
		JFrame frame = new JFrame("TreeIconDemo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		//Create and set up the content pane.
		TreeIconDemo newContentPane = new TreeIconDemo();
		newContentPane.setOpaque(true); //content panes must be opaque
		frame.setContentPane(newContentPane);

		//Display the window.
		frame.pack();
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		//Schedule a job for the event-dispatching thread:
		//creating and showing this application's GUI.
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				createAndShowGUI();
			}
		});
	}
}


Was This Post Helpful? 0
  • +
  • -

#3 Liontrue1   User is offline

  • D.I.C Addict
  • member icon

Reputation: 48
  • View blog
  • Posts: 811
  • Joined: 20-May 06

Re: setting the icon of a JTree node

Posted 29 January 2007 - 01:58 PM

Thanks it helps, but I want a script (or line) to set all icons individually, like:

Node my_mode = new Node("Some text");
my_node.setIconImage(somepath);

Well, these two lines are just examples, the Node object does not exist... but it shows what I am looking for. Thanks in advance.
Was This Post Helpful? 0
  • +
  • -

#4 Programmist   User is offline

  • Refactorer in Chief
  • member icon

Reputation: 256
  • View blog
  • Posts: 1,843
  • Joined: 02-January 06

Re: setting the icon of a JTree node

Posted 30 January 2007 - 03:17 PM

View Postalpha02, on 29 Jan, 2007 - 02:58 PM, said:

Thanks it helps, but I want a script (or line) to set all icons individually, like:

Node my_mode = new Node("Some text");
my_node.setIconImage(somepath);

Well, these two lines are just examples, the Node object does not exist... but it shows what I am looking for. Thanks in advance.

You may have to extend DefaultTreeCellRenderer.
Was This Post Helpful? 0
  • +
  • -

#5 Liontrue1   User is offline

  • D.I.C Addict
  • member icon

Reputation: 48
  • View blog
  • Posts: 811
  • Joined: 20-May 06

Re: setting the icon of a JTree node

Posted 30 January 2007 - 03:36 PM

I am beginning to understand... do you have any example?
Was This Post Helpful? 0
  • +
  • -

#6 Programmist   User is offline

  • Refactorer in Chief
  • member icon

Reputation: 256
  • View blog
  • Posts: 1,843
  • Joined: 02-January 06

Re: setting the icon of a JTree node

Posted 31 January 2007 - 03:15 PM

I'm afriad I don't. Sorry. I just have experience extending renderers in other Swing components. Have a look at the API and the java source code.
Was This Post Helpful? 0
  • +
  • -

#7 Liontrue1   User is offline

  • D.I.C Addict
  • member icon

Reputation: 48
  • View blog
  • Posts: 811
  • Joined: 20-May 06

Re: setting the icon of a JTree node

Posted 02 February 2007 - 10:17 AM

View Postalcdotcom, on 31 Jan, 2007 - 05:15 PM, said:

I'm afriad I don't. Sorry. I just have experience extending renderers in other Swing components. Have a look at the API and the java source code.


If you mean something like:

class my_renderer extends DefaultTreeCellRenderer{
   //put code here...
}


A single example would suffice. Have you got one? Thanks.
Was This Post Helpful? 0
  • +
  • -

#8 Programmist   User is offline

  • Refactorer in Chief
  • member icon

Reputation: 256
  • View blog
  • Posts: 1,843
  • Joined: 02-January 06

Re: setting the icon of a JTree node

Posted 03 February 2007 - 10:33 PM

View Postalpha02, on 2 Feb, 2007 - 11:17 AM, said:

View Postalcdotcom, on 31 Jan, 2007 - 05:15 PM, said:

I'm afriad I don't. Sorry. I just have experience extending renderers in other Swing components. Have a look at the API and the java source code.


If you mean something like:

class my_renderer extends DefaultTreeCellRenderer{
   //put code here...
}


A single example would suffice. Have you got one? Thanks.

I took a quick peek at the API and it looks like you're going to have to settle for setting the icons by node type (leaf or otherwise). If you want more info on JTrees, look at the Sun tutorial. I haven't got a ready-made example and frankly, I don't have time to come up with one. Maybe someone else here can help you if you can't figure it out from the sun tutorials or the API. But that should really suffice.
Was This Post Helpful? 0
  • +
  • -

#9 Liontrue1   User is offline

  • D.I.C Addict
  • member icon

Reputation: 48
  • View blog
  • Posts: 811
  • Joined: 20-May 06

Re: setting the icon of a JTree node

Posted 04 February 2007 - 05:01 PM

View Postalcdotcom, on 4 Feb, 2007 - 12:33 AM, said:

View Postalpha02, on 2 Feb, 2007 - 11:17 AM, said:

View Postalcdotcom, on 31 Jan, 2007 - 05:15 PM, said:

I'm afriad I don't. Sorry. I just have experience extending renderers in other Swing components. Have a look at the API and the java source code.


If you mean something like:

class my_renderer extends DefaultTreeCellRenderer{
   //put code here...
}


A single example would suffice. Have you got one? Thanks.

I took a quick peek at the API and it looks like you're going to have to settle for setting the icons by node type (leaf or otherwise). If you want more info on JTrees, look at the Sun tutorial. I haven't got a ready-made example and frankly, I don't have time to come up with one. Maybe someone else here can help you if you can't figure it out from the sun tutorials or the API. But that should really suffice.


I found a perfect example of an IconNode object with the SetIcon method. It is a class that extends DefaultMutableTreeNode. The link is:
http://www.java2s.co...TreeExample.htm
Was This Post Helpful? 1

#10 Programmist   User is offline

  • Refactorer in Chief
  • member icon

Reputation: 256
  • View blog
  • Posts: 1,843
  • Joined: 02-January 06

Re: setting the icon of a JTree node

Posted 04 February 2007 - 08:45 PM

Great! See - perseverance pays off. :)
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1