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 ownerfocuslostin focus in windowfocusquite asyncronous,jtextcomponentcan delayed events firing addedlisteners/inputmask/formatter, can solved delaying ininvokelater, forgot that, not issue(i'm ...) remove
treeselectionlistenerjtextfield, move (logical)jtree,add
system.out.println(gettext());, 1st code linepublic void valuechanged(treeselectionevent e) {, see whats happend :-), there place store (userunnable#thread,swingworkerredirect whateverworkers 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
Post a Comment