Thanks, rmp and Pat.  Your suggestions are going to be
a great help.

--Erik O.

--- "Prescott, Ralph" <[EMAIL PROTECTED]>
wrote:
> >To improve the user experience, I'd like
> >to immediately load enough data for the
> >user to visually chew on for a while,
> >then lazy load the rest of it (the lion's share).
> 
> >The javadoc for JTree.DynamicUtilTreeNode
> >looks promising, but neither google nor this mail
> >archive show many references to it.
> 
> >Is there a standard way to do this?
> 
> You can use that node class or your own.
> A couple of key points you want to understand are:
> 
> * I'm assuming that you're using DefaultTreeModel
> and DefaultMutableTreeNode
>   for your data -- either directly or via
> subclassing.  
>   If not, you will have to solve similar problems in
> your classes
> 
> * you want to call
> DefaultTreeModel.setAsksAllowsChildren(true)
>   This changes the protocol of isLeaf in the model. 
> This is a 
>   subtle but key aspect of DefaultTreeModel and it's
> interaction with JTree
> 
> * In your node class you have to two things:
> 
>   o lazily defer actual population until
> getChildCount() is called.
>     If you've correctly set askAllowsChildren this
> won't be called until
>     the user actually expands a node.
>         private boolean _loaded = false;
>         public int getChildCount() {
>               if (!_loaded)
>             {
>                 _loaded = true; // have to do this
> FIRST
>                                 // as add() calls
> back into this method
> 
>                 loadData(); // your method to load
> content
>             }
>             return super.getChildCount();
>         }
>     Note: by rights you also need to do the same for
> children() but 
>           it's rarely a problem.
> 
>   o ensure that allowsChildren correctly states if
> you're a leaf or not 
>     BEFORE you have loaded your data.
>     You can do this by setting the property or
> overriding -- whatever works 
>     for you. If you're not sure if its a leaf then
> return true.  If you've 
>     set askAllowsChildren on the model you will now
> get expansion handles 
>     before your data is loaded.
> 
> * If you can bring "chunks" of data down fast enough
> to be interactive then 
>   this scheme works well. If not you have to play
> some games (have the node 
>   say "loading..." until the data is there, etc)
> 
> * Spawning an async worker thread to keep loading
> data works well too.
>  
> * Just be careful about mutating your model outside
> the AWT thread as the 
>   Tree is a model listener.  Gather the data and use
> invokeLater to do the 
>   final mutation.
> 
> HTH
> ~rmp
> 


__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com
_______________________________________________
Advanced-swing mailing list
[EMAIL PROTECTED]
http://eos.dk/mailman/listinfo/advanced-swing

Reply via email to