Java Forum / GUI / July 2005
Setting TreeCellRenderer disables TreeSelectionListener?
brightoceanlight@hotmail.com - 13 Jul 2005 09:29 GMT added a custom renderer to JTree
then added a TreeSelectionListener to JTree
but TreeSelectionListener does not respond when custom renderer assigned to JTree. TreeSelectionListener does respond when custom renderer not assigned.
JTree tree2; tree2 = new JTree(top); tree2.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); MyDefaultTreeCellRenderer renderer = new MyDefaultTreeCellRenderer();
// custom renderer tree2.setCellRenderer(renderer);
// Listen for when the selection changes. tree2.addTreeSelectionListener(this);
Christian Kaufhold - 13 Jul 2005 09:38 GMT > added a custom renderer to JTree > [quoted text clipped - 3 lines] > custom renderer assigned to JTree. TreeSelectionListener > does respond when custom renderer not assigned. Please post a complete compilable example that showls that behaviour.
Christian
brightoceanlight@hotmail.com - 13 Jul 2005 09:50 GMT Complete code :
// ScrollTreeTest.java import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ItemListener; import java.awt.event.ItemEvent; import javax.swing.event.TreeSelectionListener;
import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeSelectionModel; import javax.swing.event.TreeSelectionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.ImageIcon; import javax.swing.event.TreeSelectionEvent;
public class ScrollTreeTest extends JFrame implements ItemListener, TreeSelectionListener {
JTree tree2; MyTreeNode testnode;
public void ScrollTreeTest() { this.setLayout(null);
}
void createScrollTree() { System.out.println("in createScrollTree"); //String[] strs = {"node1", "node2", "node3", "node4", "node5"}; String nodestr = "node"; MyTreeNode top = new MyTreeNode("top"); for (int i=0; i < 100; i++) { nodestr+=i; if (nodestr.equals("node012")) { testnode = new MyTreeNode(nodestr); top.add(testnode); } else { MyTreeNode next = new MyTreeNode(nodestr); top.add(next); } }
tree2 = new JTree(top); //ImageIcon iconarr[] = new ImageIcon[2]; //iconarr[0] = new ImageIcon("c:/java/eclipse/workspace/Collection2/FileIconRed.gif"); //iconarr[1] = new ImageIcon("c:/java/eclipse/workspace/Collection2/FileIcon.gif");
tree2.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); //MyDefaultTreeCellRenderer renderer = new MyDefaultTreeCellRenderer(iconarr); MyDefaultTreeCellRenderer renderer = new MyDefaultTreeCellRenderer(); tree2.setCellRenderer(renderer);
// Listen for when the selection changes. tree2.addTreeSelectionListener(this);
//gc.local_jtree.add((MyTreeNode)top); int row = 0; while (row < tree2.getRowCount()) { //gc.local_jtree.expandRow(row); tree2.expandRow(row); row++; }
JScrollPane scrollpane_ind = new JScrollPane(tree2); // Make the scrollbars always appear
scrollpane_ind.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// Make the scrollbars never appear
scrollpane_ind.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
int treewidth = 240; int treeheight = 700; JPanel contentPane = (JPanel)this.getContentPane(); contentPane.setLayout(null); addComponent(contentPane, scrollpane_ind, 5,20, treewidth,treeheight);
}
public void valueChanged(TreeSelectionEvent e) { System.out.println("in valueChanged"); MyTreeNode node = (MyTreeNode)tree2.getLastSelectedPathComponent(); System.out.println("after get Last SelectionPathComponent"); if (node == null) return; System.out.println("after node is null checked"); Object nodeInfo = node.getUserObject(); String nname = node.getName(); System.out.println("Node name : "+nname);
if (node.isLeaf()) { System.out.println("node isLeaf"); //BookInfo book = (BookInfo)nodeInfo; //displayURL(book.bookURL); } else { System.out.println("else node isnot Leaf"); //displayURL(helpURL); } }
void createCheckBox() { JCheckBox mapCheckBox = new JCheckBox("map_cb"); mapCheckBox.addItemListener(this);
JPanel contentPane = (JPanel)this.getContentPane(); contentPane.setLayout(null); addComponent(contentPane, mapCheckBox, 340, 0, 20, 20); //620 with single pane
}
void addComponent(Container container, Component c, int x, int y, int width, int height) { c.setBounds(x,y, width, height); container.add(c); }
public void itemStateChanged(ItemEvent ie) { JCheckBox cb = (JCheckBox)ie.getItem(); String jcb_str = cb.getText(); System.out.println("checkbox state changed"); System.out.println(jcb_str);
if (jcb_str.equals("map_cb")) { int itemstate = ie.getStateChange(); System.out.println("map_cb checkbox state changed"); if (itemstate == ItemEvent.SELECTED) { testnode.changeIconColor("red"); tree2.updateUI(); } else { testnode.changeIconColor("normal"); tree2.updateUI(); } } }
public static void main(String[] args) { try { System.out.println("ScrollTreeTest");
//JFrame.setDefaultLookAndFeelDecorated(true); ScrollTreeTest f = new ScrollTreeTest();
//f.setBackground(Color.RED); f.setSize(new Dimension(675,740)); // 425, 740 f.setLocation(270,0); f.setTitle("ScrollTreeTest");
f.createScrollTree(); f.createCheckBox(); f.setVisible(true); } catch (Exception ex) {
}
} }
// MyTreeNode.java import javax.swing.ImageIcon; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer;
public class MyTreeNode extends DefaultMutableTreeNode{
String local_name = ""; String local_color = "normal";
public MyTreeNode(String name) { super(name); local_name = name; }
public String getName() { return local_name; }
public void changeIconColor(String color) {
local_color = color; if (color.equals("yellow")) {
} }
public String getNodeColor() { return local_color; }
public void iconLocation() { /* ImageIcon OpenIcon = new ImageIcon("c:/java/eclipse/workspace/Collection2/FolderIconRed.gif");
//JTree tree2 = new JTree(top); DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); //renderer.setBorderSelectionColor(Color.red); renderer.setLeafIcon(leafIcon); renderer.setOpenIcon(OpenIcon); */ }
}
// MyDefaultTreeCellRenderer.java import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.JTree; import java.awt.Component; import javax.swing.Icon;
public class MyDefaultTreeCellRenderer extends DefaultTreeCellRenderer { Icon redIcon; Icon normalIcon;
public MyDefaultTreeCellRenderer() { super(); }
public MyDefaultTreeCellRenderer(Icon icon[]) { super(); redIcon = icon[0]; normalIcon = icon[1]; }
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);
String className = value.getClass().getName(); System.out.println("Name of value in getTreeCellRendererComponent : "+ className);
MyTreeNode mtn = (MyTreeNode)value;
String nodename = mtn.getName(); System.out.println("Name of node : "+ nodename); if (nodename.equals("node012")) { System.out.println("node name : " +nodename); String nodecolor = mtn.getNodeColor(); System.out.println("node color is : " +nodecolor); if (nodecolor.equals("red")) { System.out.println("node color is red "); setIcon(redIcon); } else { } } return this; }
}
brightoceanlight@hotmail.com - 13 Jul 2005 11:29 GMT In this example, if I comment out the line where the renderer is set, then the TreeSelectionListener works,
A complete compilable example :
// ScrollTreeTest.java import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ItemListener; import java.awt.event.ItemEvent; import javax.swing.event.TreeSelectionListener;
import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeSelectionModel; import javax.swing.event.TreeSelectionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.ImageIcon; import javax.swing.event.TreeSelectionEvent;
public class ScrollTreeTest extends JFrame implements ItemListener, TreeSelectionListener {
JTree tree2; MyTreeNode testnode;
public void ScrollTreeTest() { this.setLayout(null);
}
void createScrollTree() { System.out.println("in createScrollTree"); //String[] strs = {"node1", "node2", "node3", "node4", "node5"}; String nodestr = "node"; MyTreeNode top = new MyTreeNode("top"); for (int i=0; i < 100; i++) { nodestr+=i; if (nodestr.equals("node012")) { testnode = new MyTreeNode(nodestr); top.add(testnode); } else { MyTreeNode next = new MyTreeNode(nodestr); top.add(next); } }
tree2 = new JTree(top); // ImageIcon iconarr[] = new ImageIcon[2]; // iconarr[0] = new ImageIcon("c:/java/eclipse/workspace/Collection2/FileIconRed.gif"); // iconarr[1] = new ImageIcon("c:/java/eclipse/workspace/Collection2/FileIcon.gif");
tree2.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); // MyDefaultTreeCellRenderer renderer = new MyDefaultTreeCellRenderer(iconarr); MyDefaultTreeCellRenderer renderer = new MyDefaultTreeCellRenderer();
// If I comment out line below then listener works *************** tree2.setCellRenderer(renderer);
// Listen for when the selection changes. tree2.addTreeSelectionListener(this);
//gc.local_jtree.add((MyTreeNode)top); int row = 0; while (row < tree2.getRowCount()) { //gc.local_jtree.expandRow(row); tree2.expandRow(row); row++; }
JScrollPane scrollpane_ind = new JScrollPane(tree2); // Make the scrollbars always appear
scrollpane_ind.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// Make the scrollbars never appear
scrollpane_ind.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
int treewidth = 240; int treeheight = 700; JPanel contentPane = (JPanel)this.getContentPane(); contentPane.setLayout(null); addComponent(contentPane, scrollpane_ind, 5,20, treewidth,treeheight);
}
public void valueChanged(TreeSelectionEvent e) { System.out.println("in valueChanged"); MyTreeNode node = (MyTreeNode)tree2.getLastSelectedPathComponent(); System.out.println("after get Last SelectionPathComponent"); if (node == null) return; System.out.println("after node is null checked"); Object nodeInfo = node.getUserObject(); String nname = node.getName(); System.out.println("Node name : "+nname);
if (node.isLeaf()) { System.out.println("node isLeaf"); //BookInfo book = (BookInfo)nodeInfo; //displayURL(book.bookURL); } else { System.out.println("else node isnot Leaf"); //displayURL(helpURL); } }
void createCheckBox() { JCheckBox mapCheckBox = new JCheckBox("map_cb"); mapCheckBox.addItemListener(this);
JPanel contentPane = (JPanel)this.getContentPane(); contentPane.setLayout(null); addComponent(contentPane, mapCheckBox, 340, 0, 20, 20); //620 with single pane
}
void addComponent(Container container, Component c, int x, int y, int width, int height) { c.setBounds(x,y, width, height); container.add(c); }
public void itemStateChanged(ItemEvent ie) { JCheckBox cb = (JCheckBox)ie.getItem(); String jcb_str = cb.getText(); System.out.println("checkbox state changed"); System.out.println(jcb_str);
if (jcb_str.equals("map_cb")) { int itemstate = ie.getStateChange(); System.out.println("map_cb checkbox state changed"); if (itemstate == ItemEvent.SELECTED) { testnode.changeIconColor("red"); tree2.updateUI(); } else { testnode.changeIconColor("normal"); tree2.updateUI(); } } }
public static void main(String[] args) { try { System.out.println("ScrollTreeTest");
//JFrame.setDefaultLookAndFeelDecorated(true); ScrollTreeTest f = new ScrollTreeTest();
//f.setBackground(Color.RED); f.setSize(new Dimension(675,740)); // 425, 740 f.setLocation(270,0); f.setTitle("ScrollTreeTest");
f.createScrollTree(); f.createCheckBox(); f.setVisible(true); } catch (Exception ex) {
}
} }
// MyTreeNode.java import javax.swing.ImageIcon; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer;
public class MyTreeNode extends DefaultMutableTreeNode{
String local_name = ""; String local_color = "normal";
public MyTreeNode(String name) { super(name); local_name = name; }
public String getName() { return local_name; }
public void changeIconColor(String color) {
local_color = color; if (color.equals("yellow")) {
} }
public String getNodeColor() { return local_color; }
public void iconLocation() { /* ImageIcon OpenIcon = new ImageIcon("c:/java/eclipse/workspace/Collection2/FolderIconRed.gif");
//JTree tree2 = new JTree(top); DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); //renderer.setBorderSelectionColor(Color.red); renderer.setLeafIcon(leafIcon); renderer.setOpenIcon(OpenIcon); */ }
}
// MyDefaultTreeCellRenderer.java import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.JTree; import java.awt.Component; import javax.swing.Icon;
public class MyDefaultTreeCellRenderer extends DefaultTreeCellRenderer { Icon redIcon; Icon normalIcon;
public MyDefaultTreeCellRenderer() { super(); }
public MyDefaultTreeCellRenderer(Icon icon[]) { super(); redIcon = icon[0]; normalIcon = icon[1]; }
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);
String className = value.getClass().getName(); System.out.println("Name of value in getTreeCellRendererComponent : "+ className);
MyTreeNode mtn = (MyTreeNode)value;
String nodename = mtn.getName(); System.out.println("Name of node : "+ nodename); if (nodename.equals("node012")) { System.out.println("node name : " +nodename); String nodecolor = mtn.getNodeColor(); System.out.println("node color is : " +nodecolor); if (nodecolor.equals("red")) { System.out.println("node color is red "); setIcon(redIcon); } else { } } return this; }
}
Roland - 13 Jul 2005 12:33 GMT > In this example, if I comment out the line where the renderer is set, > then the TreeSelectionListener works, > > A complete compilable example : [snip]
Your example works for me, both with and without your custom tree cell renderer. Every tree node I selected caused the valueChanged method to be called. Tried it with 1.4.2-b28 and 1.5.0_04-b05 on Win2000.
 Signature Regards,
Roland de Ruiter ` ___ ___ `/__/ w_/ /__/ / \ /_/ / \
brightoceanlight@hotmail.com - 14 Jul 2005 13:31 GMT Hi Roland,
> Your example works for me, both with and without your custom tree cell > renderer. Every tree node I selected caused the valueChanged method to [quoted text clipped - 7 lines] > `/__/ w_/ /__/ > / \ /_/ / \ Thanks very much for running the code! I don't know why it didn't work for me. I may have had too many programs running. I restarted my computer and reran the program and it also works.
Thanks very much for the help!
Gil
Andrew Thompson - 14 Jul 2005 15:08 GMT > I restarted my > computer and reran the program and it also works. 'If in doubt - restart'.
I have found that clears so very many 'odd' errors with browsers, IDE's, systems.. try any and all applicable.
 Signature Andrew Thompson physci.org 1point1c.org javasaver.com lensescapes.com athompson.info It's Like "Hee Haw" With Lasers
Free MagazinesGet these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...
|
|
|