java - Change background color of one cell in JTable -
possible duplicate:
changing swing jtable cell colors
i have developed swing application shows jtable. want when user modify cell value, cell modified change color.
this code run when user modify cell:
this.mytable.getcolumnmodel().getcolumn(column).setcellrenderer(new statuscolumncellrenderer()); and code of cell render class:
public class statuscolumncellrenderer extends defaulttablecellrenderer { @override public component gettablecellrenderercomponent(jtable table, object value, boolean isselected, boolean hasfocus, int row, int col) { //cells default rendered jlabel. jlabel l = (jlabel) super.gettablecellrenderercomponent(table, value, isselected, hasfocus, row, col); //get status current row. tablemodellotti tablemodel = (tablemodellotti) table.getmodel(); if(isselected) l.setbackground(color.green); //return jlabel renders cell. return l; } }
you'll need custom renderer display green color when cell marked modified in model.
you'll need custom editor set model's modified state in implementation of stopcellediting(), mentioned here.
a related example of custom renderer , editor shown here.
addendum: here's example of approach described.

import java.awt.color; import java.awt.component; import java.awt.eventqueue; import java.util.arraylist; import java.util.list; import javax.swing.defaultcelleditor; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.jtable; import javax.swing.jtextfield; import javax.swing.table.abstracttablemodel; import javax.swing.table.defaulttablecellrenderer; /** * @see https://stackoverflow.com/a/12352838/230513 */ public class modifiedcells extends jpanel { public modifiedcells() { final mymodel model = new mymodel(); jtable table = new jtable(model); table.setdefaultrenderer(string.class, new myrenderer()); table.setdefaulteditor(string.class, new myeditor(table)); this.add(table); } private static class myrenderer extends defaulttablecellrenderer { color backgroundcolor = getbackground(); @override public component gettablecellrenderercomponent( jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { component c = super.gettablecellrenderercomponent( table, value, isselected, hasfocus, row, column); mymodel model = (mymodel) table.getmodel(); if (model.getstate(row)) { c.setbackground(color.green.darker()); } else if (!isselected) { c.setbackground(backgroundcolor); } return c; } } private static class myeditor extends defaultcelleditor { private jtable table; private mymodel model; public myeditor(jtable table) { super(new jtextfield()); this.table = table; this.model = (mymodel) table.getmodel(); } @override public boolean stopcellediting() { model.setstate(table.geteditingrow(), true); return super.stopcellediting(); } } private static class mymodel extends abstracttablemodel { private final list<row> list = new arraylist<row>(); public mymodel() { list.add(new row("one", true)); list.add(new row("two", false)); list.add(new row("three", false)); } public boolean getstate(int row) { return list.get(row).state.booleanvalue(); } public void setstate(int row, boolean state) { list.get(row).state = state; } @override public int getrowcount() { return list.size(); } @override public int getcolumncount() { return 1; } @override public object getvalueat(int row, int col) { return list.get(row).name; } @override public void setvalueat(object avalue, int row, int col) { list.get(row).name = (string) avalue; firetablecellupdated(row, col); } @override public boolean iscelleditable(int rowindex, int columnindex) { return true; } @override public class<?> getcolumnclass(int columnindex) { return string.class; } private static class row { private string name; private boolean state; public row(string name, boolean state) { this.name = name; this.state = state; } } } private void display() { jframe f = new jframe("modifiedcells"); f.setdefaultcloseoperation(jframe.exit_on_close); f.add(this); f.pack(); f.setlocationrelativeto(null); f.setvisible(true); } public static void main(string[] args) { eventqueue.invokelater(new runnable() { @override public void run() { new modifiedcells().display(); } }); } }