java - JTree Not Refreshed When Called on Different Location But On Same Event-Dispatching Thread -


i have been struggling jtree. cannot refresh after add new tree node (defaultmutabletreenode). able refresh when code adds tree node called within gui class, not outside it. here code adds node jtree:

public class treeviewer extends jpanel implements treeselectionlistener {     jtree tree;     defaultmutabletreenode rootnode;     defaulttreemodel treemodel;      public void modifyjtree(string name) {         defaultmutabletreenode childnode = new defaultmutabletreenode(name);         treemodel.insertnodeinto(childnode, rootnode, rootnode.getchildcount());     } } 

when called in main method, gui failed refresh after node added. experimented several ways put on event-dispatching thread, not work. tried on main thread, , failed. code examples provided below:

public static void main(string[] args) throws exception {     final treeviewer viewer = new caseviewer();      // omit code sets gui , displays      // calls modifyjtree on event-dispatching thread     // , not work          javax.swing.swingutilities.invokelater(new runnable() {         public void run() {         viewer.modifyjtree("invokelater");         }     });      // calls modifyjtree on event-dispatching thread     // , still not work            javax.swing.swingutilities.invokelater(new runnable() {         public void run() {         viewer.modifyjtree("invokelater");         }     });      // using swingworker. still no luck.     swingworker<void, void> worker = new swingworker<void, void>() {         @override         protected void doinbackground() throws exception {             thread.sleep(5000);             return null;     }         @override         protected void done() {             viewer.modifyjtree("swingerworker");         }     };      // tried call on main thread, cannot work     viewer.modifyjtree("main thread"); } 

however, if call within class, works. example, in constructor of treeviewer class, shown below:

public treeviewer() {     rootnode = new defaultmutabletreenode("root node");      treemodel = new defaulttreemodel(rootnode);     treemodel.addtreemodellistener(new mytreemodellistener());     tree = new jtree(treemodel);     tree.seteditable(false);     tree.getselectionmodel().setselectionmode(     treeselectionmodel.single_tree_selection);     tree.setshowsroothandles(true);     // listen when selection changes.     tree.addtreeselectionlistener(this);     // omitting other initialization stuff      // using swingworker. same swingworker, 1 works!     swingworker<void, void> worker = new swingworker<void, void>() {         @override         protected void doinbackground() throws exception {             thread.sleep(5000);             return null;         }         @override         protected void done() {             viewer.modifyjtree("insideswingerworker");         }     }; } 

so impression call must coming inside treeviewer class. however, if method cannot called outside class, treeviewer useless. can't suspect bug of jvm. or ignorant of best practices regarding jtrees caused weird error?

update: problem solved. has nothing jtrees. jtree instance modifying not correctly added gui looking at.

settle down. first, if haven't already, read how use trees tutorial. once feel comfortable material, can focus attention on dynamically changing tree partition. therein you'll find sample code make things little bit more clear you.

but remember, you're absolutely right in you're trying do. is, respect swing's single-thread model. using mechanisms, such swingutilities , swingworker modify swing component when in thread absolutely correct, although not seem applicable in case. think you're little misguided, or overwhelmed.


Comments

Popular posts from this blog

linux - Using a Cron Job to check if my mod_wsgi / apache server is running and restart -

actionscript 3 - TweenLite does not work with object -

jQuery Ajax Render Fragments OR Whole Page -