Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.gui > #2868 > unrolled thread

Struggling with Swingx Tr

Started by"Rogan Dawes" <rogan.dawes@THRWHITE.remove-dii-this>
First post2011-04-27 15:41 +0000
Last post2011-04-27 15:41 +0000
Articles 2 — 1 participant

Back to article view | Back to comp.lang.java.gui


Contents

  Struggling with Swingx Tr "Rogan Dawes" <rogan.dawes@THRWHITE.remove-dii-this> - 2011-04-27 15:41 +0000
    Re: Struggling with Swing "Rogan Dawes" <rogan.dawes@THRWHITE.remove-dii-this> - 2011-04-27 15:41 +0000

#2868 — Struggling with Swingx Tr

From"Rogan Dawes" <rogan.dawes@THRWHITE.remove-dii-this>
Date2011-04-27 15:41 +0000
SubjectStruggling with Swingx Tr
Message-ID<iLadnTTQkKBeKsPanZ2dnUVZ8qKvnZ2d@saix.net>
  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

[toc] | [next] | [standalone]


#2869 — Re: Struggling with Swing

From"Rogan Dawes" <rogan.dawes@THRWHITE.remove-dii-this>
Date2011-04-27 15:41 +0000
SubjectRe: Struggling with Swing
Message-ID<q7SdnbiYCbvZdcPaRVnyiwA@saix.net>
In reply to#2868
  To: comp.lang.java.gui
Rogan Dawes wrote:
> 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
> 

Gah!

Replying to myself! :-(

So, it turns out that the problem is in the TreePath code, since it 
doesn't use == for equality checks, but rather .equals().

Since the empty maps are equivalent, the TreePaths constructed are 
equals(). Which means that the JTree gets confused :-(

See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4257782

So much for that!

Rogan

---
 * 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

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.java.gui


csiph-web