Struggling with Swingx Tr
 
  To: comp.lang.java.gui
Hi folks,
I am struggling to figure out what I am doing wrong in this TreeModel 
implementation. It seems like certain nodes are not being rendered, even 
though I can see that the (custom) renderer *is* actually being called 
for all the rows. Which is just weird!
I am trying to show a JSON Object hierarchy in a JTree (actually a 
SwingX JXTreeTable, which is where this first manifested).
The example shows a broken example, and a working example (if you 
uncomment the code in main() at the bottom). As can be seen from the 
println statements in the TreeCellRenderer, it *is* being called for 
each row, but the row is not actually being rendered at all.
The obvious difference between the two examples is that the non-rendered 
nodes now have a child, but I'd hope that that shouldn't make any real 
difference!
Any ideas?
Rogan
===== Snip TreeTableDemo.java =====
package jtreetable;
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
public class TreeTableDemo extends JFrame {
     public TreeTableDemo(String title, Object data) {
         super("TreeTableDemo - " + title);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         JsonTreeModel model = new JsonTreeModel(data);
         JTree tree = new JTree(model);
         tree.setRootVisible(true);
         tree.setCellRenderer(new JsonTreeTableCellRenderer());
         getRootPane().setLayout(new BorderLayout());
         getRootPane().add(new JScrollPane(tree), BorderLayout.CENTER);
         setSize(300, 200);
     }
     private class JsonTreeModel implements TreeModel {
         private Object json;
         public JsonTreeModel(Object json) {
             this.json = json;
         }
         // Empty, since the tree is static in this example
         public void addTreeModelListener(TreeModelListener l) {}
         public boolean isLeaf(Object node) {
             return false;
         }
         // Empty, since the tree is static in this example
         public void removeTreeModelListener(TreeModelListener l) {}
         // Empty, since the tree is static in this example
         public void valueForPathChanged(TreePath path, Object newValue) {}
         public Object getRoot() {
             return json;
         }
         public Object getChild(Object parent, int index) {
             if (parent instanceof Map) {
                 Map map = (Map) parent;
                 Iterator it = map.keySet().iterator();
                 for (int i=0; i<index; i++) it.next();
                 return map.get(it.next());
             } else if (parent instanceof Collection) {
                 Iterator it = ((Collection) parent).iterator();
                 for (int i=0; i<index; i++) it.next();
                 return it.next();
             }
             throw new IndexOutOfBoundsException("'" + parent + "' 
cannot have children!");
         }
         public int getChildCount(Object parent) {
             int count = 0;
             if (parent instanceof Map) {
                 count = ((Map) parent).size();
             } else if (parent instanceof Collection) {
                 count = ((Collection) parent).size();
             }
             return count;
         }
         public int getIndexOfChild(Object parent, Object child) {
             if (parent instanceof Map) {
                 Iterator it = ((Map) parent).entrySet().iterator();
                 for (int i=0; it.hasNext(); i++)
                     if (it.next() == child)
                         return i;
             } else if (parent instanceof Collection) {
                 Iterator it = ((Collection) parent).iterator();
                 for (int i=0; it.hasNext(); i++)
                     if (it.next() == child)
                         return i;
             }
             throw new IndexOutOfBoundsException("'" + parent + "' 
cannot have children!");
         }
     }
     public class JsonTreeTableCellRenderer extends 
DefaultTreeCellRenderer {
         public JsonTreeTableCellRenderer() {
         }
         public Component getTreeCellRendererComponent(JTree tree, 
Object node,
                 boolean sel, boolean expanded, boolean leaf, int row,
                 boolean hasFocus) {
             node = row + ": '" + node.toString() + "'";
             System.out.println(node);
             super.getTreeCellRendererComponent(tree, node, sel, expanded,
                     leaf, row, hasFocus);
             return this;
         }
     }
     public static void main(String[] args) {
         ArrayList data = new ArrayList();
         for (int i=0; i< 3; i++) {
             data.add(new HashMap());
         }
         final TreeTableDemo broken = new TreeTableDemo("broken", data);
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                 broken.setVisible(true);
             }
         });
         data = new ArrayList();
         for (int i=0; i< 3 ; i++) {
             HashMap map = new HashMap();
             map.put("" + i, "Value " + i);
             data.add(map);
         }
//        final TreeTableDemo works = new TreeTableDemo("works", data);
//        SwingUtilities.invokeLater(new Runnable() {
//            public void run() {
//                works.setVisible(true);
//            }
//        });
     }
}
---
 * Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24