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
Post a Comment