Swing JTable - Unable to repaint and change background of cells -


hy everyone,

i'm trying calculations in jtable after iteration , mark different background cells need.

however, have 2 problems @ moment:
1) cells not painted immediately, after whole iteration cycle
2) areas not painted - if need paint table[3, 4] , table[6, 5] draws rectangular [3,4] [6, 5] instead of drawing singular cells only.

about problem 1: call repaint() priority without need finish , jvm decide whenever paint? try firetablecellupdated() , firetabledatachanged() don't updated.

here there custom cell renderer method changes bgcolor:

public component gettablecellrenderercomponent(jtable table, object value,     boolean isselected, boolean hasfocus, int row,int column) {     component renderer = super.gettablecellrenderercomponent(         table, value, isselected, hasfocus, row, column);      if(value instanceof color) {         color c = (color) value;         renderer.setbackground(c);         system.out.println("bg change [" + row + ":" + column + "]");     }      return renderer; } 

here there loop paint cells on button click:

for(int paintj = startindex; paintj < endindex; paintj++) {      crosscellrenderer rend =  (crosscellrenderer) jtable1.getcellrenderer(i,  paintj)            .gettablecellrenderercomponent(jtable1, color.blue, true, true, i, paintj);      crosstablemodel.firetablecellupdated(i, paintj);      jtable1.revalidate();      jtable1.repaint();      try {           thread.sleep(1000);      }   catch(interruptedexception ie) {            system.err.println("exception sleeping thread.");      }  } 

any tips on that?

hate say: (whatever want reach) wrong ;-)

  • never-ever direct manipulation/paint on renderer, instead change model data , rest happen automatically.
  • never-ever call of firexx methods on model outside model, it's exclusive responsibility of model notify listeners on change
  • never-ever (or very rarely, not here ;-) there's need call revalidate and/or repaint dircectly, happen automatically if model well-behaved
  • ....

best read snoracle's tutorial on howto-use tables understand rendering mechanism

http://download.oracle.com/javase/tutorial/uiswing/components/table.html

roughly:

   // change model, notify listeners    model.setvalueat(....)     // in custom renderer, check value , decorate appropriate    public component gettablecellrenderercomponent(....) {         // ... normal config, f.i. done in super         component comp = super.get...         if (myconditionforspecialcolor(table, value, ...) {             comp.setbackground(mycolor);         } else {             comp.setbackground(normalcolor);         }    }     // register custom renderer     // per class    table.setdefaultrenderer(object.class, myrenderer)    // or per column    table.getcolumnmodel().getcolumn(mycolumn).setcellrenderer(myrenderer)  

Comments