Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / GUI / July 2005

Tip: Looking for answers? Try searching our database.

Setting TreeCellRenderer disables TreeSelectionListener?

Thread view: 
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 Magazines

Get 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 ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.