How to Change the icon of a selected Tree Node
Hi java gurus,
i am working on Jtree application, and i am adding image icons to the Nodes.
my dought is when i select a node, i want to display that selected node as opened and all other icons should remain closed.
Example:
--root
|
-child
-child1
-child2
|
-SubChild
-SubChild1
-subchild2
Here if i am selecting Child2 means, only the image icon of that child2 should open the nodes and display the icon , all other icons from root to subchild should remain same as closed.
please some one suggest how i can do it,
Thanks in advance,
Cheers,
Murali
Use a custom renderer. http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html#display
refer this link http://forum.java.sun.com/thread.jspa?threadID=755439&messageID=4316522
> Use a custom renderer.
> http://java.sun.com/docs/books/tutorial/uiswing/compon
> ents/tree.html#display
hi PhHein ,
Thanks for your reply,
i went through this link, and i used that example but i am not able to get it.
i want to display the nodes ,as that is displayed in windows explorer.
when i selected a node , the image should display , and when i selected another node, this current node should display the image ,and the previous node should close.
please suggest some other example.
Thanks in advance,
Cheers,
Murali
Hi Murali,
did you actually check the sel flag? [snip]
if(sel){
setIcon(iconSelected);
}else{
setIcon(iconNotSelected);
}
[snip]
hi PhHein ,
Thank u for your reply,
i have tried on this and i have looked in to so many examples, using
setIcon(iconSelected);
but it is not working,
i will try on this again and see,
please can you suggest some other exaples.
Thank u,
Cheers,
Murali
Here are many tree examples: http://javaalmanac.com/egs/javax.swing.tree/pkg.html
hi PhHein ,
Thank you for your reply,
http://groups.google.com/group/comp.lang.java.gui/browse_thread/thread/7680a7746ab59fbd/f0b56a3bd6ef85d7?lnk=st&q=void+seticon(icon+icon)+example+for+jtree&rnum=6&hl=en#f0b56a3bd6ef85d7
http://www.javalobby.org/forums/thread.jspa?threadID=16326&tstart=15
http://www.codase.com/search/display?file=L2dlbnRvbzIvdmFyL3RtcC9yZXBvcy9zb3VyY2Vmb3JnZS9tamJ3b3JsZC9tamJXb3JsZF9qb2dsX3NvdXJjZV82MDBfemlwL21qYndvcmxkL3NvdXJjZS9tamJXb3JsZC9tdHJlZUNlbGxSZW5kZXJlci5qYXZh&lang=java&off=975+993+
http://groups.google.com/group/comp.lang.java.gui/browse_thread/thread/f491cfe06c151b9e/10bcb6dbd697ce74%2310bcb6dbd697ce74
http://java.sun.com/docs/books/tutorial/uiswing/components/icon.html
http://java.sun.com/docs/books/tutorial/uiswing/components/label.html
http://www.java2s.com/Code/Java/Swing-Components/IconNodeTreeExample.htm
http://www.javareference.com/jrexamples/viewexample.jsp?id=46
http://doc.trolltech.com/4.2/widgets-icons.html
i have searched and went through this examples, some were very useful
I will look in to that site,
Thank u onceagain
Thanks,
Cheers,
Murali
You should consider posting your renderer code here, I think that might help finding problems.
Hi Philip,
Thank you very much for your reply,
i am posting my file, i am not able to find the mistakes, i think the error is in "if statement".
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.JPopupMenu;
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 javax.swing.tree.TreePath;
import java.net.URL;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.event.*;
public class TreeEx1
{
JFrame frame;
JTree mytree;
JScrollPane scrollpane;
public TreeEx1()
{
//Creating Frame
frame=new JFrame("Tree & ComboBox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
//Creating Tree Nodes
DefaultMutableTreeNode rootnode=new DefaultMutableTreeNode("Root Node");
DefaultMutableTreeNode childnode=new DefaultMutableTreeNode("Child Node");
DefaultMutableTreeNode childonenode=new DefaultMutableTreeNode("ChildOne Node");
DefaultMutableTreeNode adapter1=new DefaultMutableTreeNode("Adapter 1");
DefaultMutableTreeNode adapter2=new DefaultMutableTreeNode("Adapter 2");
DefaultMutableTreeNode childtwonode=new DefaultMutableTreeNode("ChildTwo Node");
DefaultMutableTreeNode adapter3=new DefaultMutableTreeNode("Adapter 1");
DefaultMutableTreeNode adapter4=new DefaultMutableTreeNode("Adapter 2");
mytree = new JTree(rootnode);
scrollpane = new JScrollPane(mytree);
scrollpane.setBounds(new Rectangle(20,20,200,500));
/*// Creatin Image Icons to Nodes
Icon main=new ImageIcon("images/Main.jpg");
Icon main_sub = new ImageIcon("images/Main_Sub.jpg");
Icon main_child= new ImageIcon("images/Main_Child.jpg");
*/
/*Icon main=new ImageIcon("Main.jpg");
Icon main_sub = new ImageIcon("Main_Sub.jpg");
Icon main_child= new ImageIcon("Main_Child.jpg");
Icon main_open=new ImageIcon("folderOpen.gif");
Icon main_close = new ImageIcon("folder.gif");
Icon main_leaf= new ImageIcon("folder.gif");
*/
ImageIcon main_open= createImageIcon("left.gif");
ImageIcon main_close =createImageIcon("folder.gif");
ImageIcon main_leaf= createImageIcon("right.gif");
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)mytree.getCellRenderer();
renderer.setLeafIcon(main_leaf);
renderer.setClosedIcon(main_close);
renderer.setOpenIcon(main_open);
mytree.setCellRenderer(renderer);
rootnode.add(childnode);
childnode.add(childonenode);
childnode.add(childtwonode);
childonenode.add(adapter1);
childonenode.add(adapter2);
childtwonode.add(adapter3);
childtwonode.add(adapter4);
frame.getContentPane().add(scrollpane,BorderLayout.CENTER);
frame.setSize(1025,750);
frame.setVisible(true);
ImageIcon leafIcon = createImageIcon("right.gif");
ImageIcon leafOpen = createImageIcon("left.gif");
ImageIcon leafClosed = createImageIcon("folder.gif");
if (leafIcon != null)
{
//DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setLeafIcon(leafClosed);
mytree.setCellRenderer(renderer);
if(leafIcon == null)
{
renderer.setLeafIcon(leafOpen);
mytree.setCellRenderer(renderer);
}
else
{
renderer.setLeafIcon(leafClosed);
mytree.setCellRenderer(renderer);
}
}
else if(leafIcon == null)
{
renderer.setOpenIcon(leafOpen);
mytree.setCellRenderer(renderer);
System.err.println("Leaf icon missing; using default.");
}
else
{
renderer.setClosedIcon(leafClosed);
mytree.setCellRenderer(renderer);
}
} // End of Constructor TreeEx()
public static ImageIcon createImageIcon(String path)
{
URL imgURL = TreeEx1.class.getResource(path);
URL imgURL1 = TreeEx1.class.getResource(path);
if((imgURL != null))
{
return new ImageIcon(imgURL);
}
else if((imgURL == null))
{
return new ImageIcon(imgURL1);
}
else
{
System.out.println("Hello ");
System.err.println("Couldn't find file: " + path);
return null;
}
}
//Main()
public static void main(String[] args)
{
TreeEx1 treeex1=new TreeEx1();
System.out.println("Tree Combo Example");
}// End of main()
}// End of Class
Thanks,
Cheers,
Murali.
Oh dear, that could have been a lot easier. You didn't implement a renderer. Reread the Tree tutorial. I've done a simple one:
// class TreeEx1
public class TreeEx1 {
JFrame frame;
JTree mytree;
JScrollPane scrollpane;
public TreeEx1() {
// Creating Frame
frame = new JFrame("Tree & ComboBox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
// Creating Tree Nodes
DefaultMutableTreeNode rootnode = new DefaultMutableTreeNode(
"Root Node");
DefaultMutableTreeNode childnode = new DefaultMutableTreeNode(
"Child Node");
DefaultMutableTreeNode childonenode = new DefaultMutableTreeNode(
"ChildOne Node");
DefaultMutableTreeNode adapter1 = new DefaultMutableTreeNode(
"Adapter 1");
DefaultMutableTreeNode adapter2 = new DefaultMutableTreeNode(
"Adapter 2");
DefaultMutableTreeNode childtwonode = new DefaultMutableTreeNode(
"ChildTwo Node");
DefaultMutableTreeNode adapter3 = new DefaultMutableTreeNode(
"Adapter 1");
DefaultMutableTreeNode adapter4 = new DefaultMutableTreeNode(
"Adapter 2");
mytree = new JTree(rootnode);
mytree.setCellRenderer(new TreeExRenderer()); // <-setRenderer
scrollpane = new JScrollPane(mytree);
scrollpane.setBounds(new Rectangle(20, 20, 200, 500));
rootnode.add(childnode);
childnode.add(childonenode);
childnode.add(childtwonode);
childonenode.add(adapter1);
childonenode.add(adapter2);
childtwonode.add(adapter3);
childtwonode.add(adapter4);
frame.getContentPane().add(scrollpane, BorderLayout.CENTER);
frame.setSize(1025, 750);
frame.setVisible(true);
} // End of Constructor TreeEx()
// Main()
public static void main(String[] args) {
TreeEx1 treeex1 = new TreeEx1();
System.out.println("Tree Combo Example");
}// End of main()
}// End of Class
And this would be a simple Renderer:
public class TreeExRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
row, hasFocus);
ImageIcon leafIcon = createImageIcon("right.gif");
ImageIcon leafOpen = createImageIcon("left.gif");
ImageIcon leafClosed = createImageIcon("folder.gif");
ImageIcon main_open = createImageIcon("left.gif");
ImageIcon main_close = createImageIcon("folder.gif");
ImageIcon main_leaf = createImageIcon("right.gif");
if (!expanded) {
setIcon(leafClosed);
}else{
setIcon(leafOpen);
}
if(sel){
setIcon(leafIcon);
}
return this;
}
public static ImageIcon createImageIcon(String path) {
URL imgURL = TreeEx1.class.getResource(path);
URL imgURL1 = TreeEx1.class.getResource(path);
if ((imgURL != null)) {
return new ImageIcon(imgURL);
} else if ((imgURL == null)) {
return new ImageIcon(imgURL1);
} else {
System.out.println("Hello ");
System.err.println("Couldn't find file: " + path);
return null;
}
}
}
Hi Philip,Thank u very much, its working , The problem is solved .As u suggested i wll look into Jtree document,Thank u,Cheers,Murali.
You're welcome. I'm glad it's working now.
Hi Philip,Thank u very much,Thanks,Cheers, Murali.
Hi philip,Please, In future , If i have any doubts, how can i contact you in this forum.ie: How can i send you an question etc in this forum.Personally.Thank you & Cheers,Murali
You can't and you shouldn't. Just post your questions here and I or any other member will try to answer them.