java - JTree valueChanged event gets called before focusLost of another component on clicking a node -


i have jtree each node of tree represents user data. data editable , stored in file/db. there bunch of jtextfield lets edit/update user data node. saving of data event fired when jtextfield loses focus. works fine except when change selection of node in jtree. because valuechanged of jtree event occurs before focuslost of jtextfield.

here sscce: http://pastebin.com/wh1veqdc

public class jtreefocustest extends jframe{         private static final long serialversionuid = 1l;         public jtreefocustest() {                 super("jtree focus test");                 jpanel panel = new jpanel(true);                 panel.setlayout(new boxlayout(panel, boxlayout.y_axis));                 mytree tree = new mytree();                 panel.add(tree);                 panel.add(box.createverticalstrut(20));                 panel.add(new mytextfield(tree));                 panel.add(box.createverticalstrut(20));                 panel.add(new jtextfield(30));                 getcontentpane().add(panel);                 setvisible(true);                 setdefaultcloseoperation(jframe.exit_on_close);                 pack();         }          public static void main(string[] args){                 new jtreefocustest();         } }  class mytree extends jtree{         private static final long serialversionuid = 1l;         public mytree() {                 defaultmutabletreenode root = new defaultmutabletreenode(new mynode("root", "root"));                 defaultmutabletreenode child1 = new defaultmutabletreenode(new mynode("child 1", "doc122122"));                 root.add(child1);                 defaultmutabletreenode child2 = new defaultmutabletreenode(new mynode("child 2", "doc134342"));                 root.add(child2);                 defaulttreemodel model = new defaulttreemodel(root, true);                 setmodel(model);                 getselectionmodel().setselectionmode(treeselectionmodel.single_tree_selection);                 setselectionpath(getpathforrow(0));         } }  class mytextfield extends jtextfield implements focuslistener, treeselectionlistener{         private static final long serialversionuid = 1l;         private mytree tree;         public mytextfield(mytree tree) {                 this.tree = tree;                 settext("some");                 addfocuslistener(this);                 this.tree.addtreeselectionlistener(this);                 dimension dim = new dimension(200, 20);                 setpreferredsize(dim);                 setmaximumsize(dim);                 setminimumsize(dim);         }         @override         public void focusgained(focusevent e) {system.out.println("textfield gained focus");}         @override         public void focuslost(focusevent e) {                 getselectednodeuserobj().setvalue(gettext());         }         @override         public void valuechanged(treeselectionevent e) {                 settext(getselectednodeuserobj().getvalue());         }         private mynode getselectednodeuserobj(){                 return ((mynode)((defaultmutabletreenode)this.tree.getselectionpath().getlastpathcomponent()).getuserobject());         } }  class mynode{         private string label = "";         private string value = "";          public mynode(string label, string value) {                 this.label = label;                 this.value = value;         }         public void setvalue(string value){                 this.value = value;         }         public string getvalue(){                 return value;         }         public string tostring(){                 return label;         }       } 

in example have 1 field in actual application have several fields represents user data. jtextfield example, input field jcombobox or jspinner.

how can save user data? i'd appreciate help/pointer.

thanks!

because valuechanged of jtree event occurs before focuslost of jtextfield.

  • this logical ordering, don't change that, 1 jcomponents focusgained, after focus owner focuslost in focus in window

  • focus quite asyncronous, jtextcomponent can delayed events firing added listeners/inputmask/formatter, can solved delaying in invokelater, forgot that, not issue

  • (i'm ...) remove treeselectionlistener jtextfield, move (logical) jtree,

  • add system.out.println(gettext());, 1st code line public void valuechanged(treeselectionevent e) {, see whats happend :-), there place store (use runnable#thread, swingworker redirect whatever workers thread)

  • then there stays question whats happend if value is/are changed in jtextfield , user click same node, value stays unchanged or jcomponent refreshed original value, bussines logics, not how code, speculation


Comments

Popular posts from this blog

.htaccess - First slash is removed after domain when entering a webpage in the browser -

Automatically create pages in phpfox -

c# - Farseer ContactListener is not working -