swing - JTree Custom TreeCellRenderer / Selected node-specific color -


i trying set different background color different nodes of jtree . user can right click on node, push button , choose color jcolorchooser . made custom treecellrenderer(chromatizer()) , overriden method .gettreecellrenderercomponent() in order set backgroundnonselectioncolor chosen color. happens though happens beggining current selection , expands if selections changes . there way change color of selected node?

      public class treeexample extends jframe     {         private jtree tree;         private jbutton btn;           public treeexample()         { btn = new jbutton ("choose color");         chromatizer chroma = new chromatizer();  defaultmutabletreenode root = new defaultmutabletreenode("letters");          defaultmutabletreenode parent1 = new defaultmutabletreenode("uppercase");          defaultmutabletreenode parent2 = new defaultmutabletreenode("lowercase");          defaultmutabletreenode child1 = new defaultmutabletreenode("a");          defaultmutabletreenode child2 = new defaultmutabletreenode("b");          defaultmutabletreenode child3 = new defaultmutabletreenode("c");          defaultmutabletreenode child4 = new defaultmutabletreenode("a");          defaultmutabletreenode child5 = new defaultmutabletreenode("b");          defaultmutabletreenode child6 = new defaultmutabletreenode("c");           root.add(parent1);          root.add(parent2);           parent1.add(child1);          parent1.add(child2);          parent1.add(child3);           parent2.add(child4);          parent2.add(child5);          parent2.add(child6);           tree = new jtree(root);           imageicon imageicon = new imageicon(treeexample.class.getresource("./leaf.jpg"));         chroma.setleaficon(imageicon);           tree.setcellrenderer(chroma);   tree.setshowsroothandles(true);         tree.setrootvisible(false);           add(new jscrollpane(tree)          );          /*          start of btn          */                  btn.addactionlistener(         new actionlistener(){             private defaultmutabletreenode dmt;                @override             public void actionperformed(actionevent event){                       dmt = (defaultmutabletreenode)tree.getlastselectedpathcomponent();                         color clr = null;                    clr =jcolorchooser.showdialog(null, "Επιλογή χρώματος", clr);                       chroma.gettreecellrenderercomponent(tree, dmt, rootpanecheckingenabled, rootpanecheckingenabled, rootpanecheckingenabled, error, rootpanecheckingenabled, clr);    (             (defaulttreemodel) tree.getmodel()).nodechanged(dmt);                               }        );           /*end of btn */           /*right mouse click menu*/         tree.addmouselistener(new mouseadapter ()     {         public void mousepressed(mouseevent e)         {             if ( swingutilities.isrightmousebutton ( e ) )             {                 int row = tree.getclosestrowforlocation(e.getx(), e.gety());                 tree.setselectionrow(row);                 treepath path = tree.getpathforlocation ( e.getx (), e.gety () );                 rectangle pathbounds = tree.getui ().getpathbounds ( tree, path );                 if ( pathbounds != null && pathbounds.contains ( e.getx (), e.gety () ) )                 {                     jpopupmenu menu = new jpopupmenu ();                     menu.add (btn) ;                     menu.show ( tree, pathbounds.x, pathbounds.y + pathbounds.height );                  }              }           }      }  );          /*end of menu*/          this.setdefaultcloseoperation(jframe.exit_on_close);         this.settitle("jtree example");                 this.setsize(200, 200);         this.setvisible(true);       }         public static void main(string[] args)     {           swingutilities.invokelater(new runnable() {                 public void run() {                 new treeexample();               }         });     }       } 

and custom renderer

public class  chromatizer extends defaulttreecellrenderer {  public component gettreecellrenderercomponent(                     jtree tree,                     object value,                     boolean sel,                     boolean expanded,                     boolean leaf,                     int row,                     boolean hasfocus,                     color color)  {       super.gettreecellrenderercomponent(                     tree, value, sel,                     expanded, leaf, row,                     hasfocus);        defaultmutabletreenode node = (defaultmutabletreenode) value;        if(node.getparent() != null){               super.setbackgroundnonselectioncolor(color);              super.setbackgroundselectioncolor(color);        }       return this;       }    }; 

images(couldn't upload due being new member ! : )

first screen[1]  http://i.stack.imgur.com/lnrka.jpg after right-clicking , pushing button "choose color"[2] http://i.stack.imgur.com/xicrp.jpg result after clicking ok[3]  http://i.stack.imgur.com/l48ft.jpg if left-click there(arrow) tree nodes filled color[4]  http://i.stack.imgur.com/1ceks.jpg 

maybe can use this

defaulttreecellrenderer defaultrenderer = new defaulttreecellrenderer(); //do 1 of parameter //tree, value, selected, expanded, leaf, row, hasfocus   component returnvalue = defaultrenderer.gettreecellrenderercomponent(tree, value, selected, expanded, leaf, row, hasfocus); return returnvalue; 

Comments