java - Colored Table Cells -
i want color table cells according value in column 1, if values isn´t equal value in column 1 color should cyan, code doesnt work:
table = new jtable(){ public tablecellrenderer getcellrenderer(int row, int column) { tablecellrenderer tcr=null; color c; if(column>=1&&getvalueat(row, column)!=null &&getvalueat(row, 1)!=null &&!getvalueat(row, column).equals(getvalueat(row, 1))) c=color.cyan; else c=color.white; if(getvalueat(row, column) instanceof boolean) { tcr= super.getdefaultrenderer(boolean.class); } else { tcr= super.getcellrenderer(row, column); } tcr.gettablecellrenderercomponent(this, getvalueat(row, column), iscellselected(row, column) , hasfocus(), row, column).setbackground(c); return tcr; } public tablecelleditor getcelleditor(int row, int column) { if(getvalueat(row, column) instanceof boolean) { return super.getdefaulteditor(boolean.class); } else { return super.getcelleditor(row, column); } } }; table.setmodel(new defaulttablemodel( new object[][] { {"row1", "1","2","3"}, {"row2", "2","2","3"}, {"row3", "2","2","2"}, {"row3", "2","1","2"} }, new string[] {"header1", "header2","header3","header4"} ));
the decision of whether cell must highlighted must made in tablecellrenderer. can not made in jtable. there (probably) no reason override methods in jtable. instead, can set cellrenderer columns own implmenentation of tablecellrenderer.
in example, columns 2 , 3 receive "coloringcellrenderer". coloringcellrenderer highlight cell if value in cell not null , same value in column 1.
import java.awt.color; import java.awt.component; import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.swingutilities; import javax.swing.table.defaulttablecellrenderer; import javax.swing.table.defaulttablemodel; import javax.swing.table.tablecolumn; public class coloredtablecells { public static void main(string[] args) { swingutilities.invokelater(new runnable() { @override public void run() { createandshowgui(); } }); } private static void createandshowgui() { jframe f = new jframe(); f.getcontentpane().add(new jscrollpane(createtable())); f.pack(); f.setlocationrelativeto(null); f.setvisible(true); } static jtable createtable() { class coloringtablecellrenderer extends defaulttablecellrenderer { coloringtablecellrenderer() { setopaque(true); } @override public component gettablecellrenderercomponent(jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { super.gettablecellrenderercomponent( table, value, isselected, hasfocus, row, column); if (highlightcell(table, row, column)) { setbackground(color.cyan); } else { setbackground(color.white); } return this; } private boolean highlightcell(jtable table, int row, int column) { object thisvalue = table.getvalueat(row, column); object referencevalue = table.getvalueat(row, 1); if (thisvalue != null && referencevalue != null) { return thisvalue.equals(referencevalue); } return false; } } jtable table = new jtable(); table.setmodel(new defaulttablemodel(new object[][] { { "row1", "1", "2", "3" }, { "row2", "2", "2", "3" }, { "row3", "2", "2", "2" }, { "row3", "2", "1", "2" } }, new string[] { "header1", "header2", "header3", "header4" })); (int i=2; i<table.getcolumncount(); i++) { tablecolumn column = table.getcolumnmodel().getcolumn(i); column.setcellrenderer(new coloringtablecellrenderer()); } return table; } }
edit: answer accepted already, in response comments, different version:
this 1 uses 2 classes, "delegatingtablecellrenderer" , "delegatingtablecelleditor". these classes each receive respective delegate, , set background color of cell component delivered delegate.
this way, functionality of coloring table cells (for renderers or editors) decoupled actual renderer. thus, possible color, example, background of default cellrenderer boolean
values (which shows jcheckbox).
import java.awt.color; import java.awt.component; import java.util.eventobject; import javax.swing.jcomponent; import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.swingutilities; import javax.swing.event.celleditorlistener; import javax.swing.table.defaulttablecellrenderer; import javax.swing.table.defaulttablemodel; import javax.swing.table.tablecelleditor; import javax.swing.table.tablecellrenderer; public class coloredtablecells2 { public static void main(string[] args) { swingutilities.invokelater(new runnable() { @override public void run() { createandshowgui(); } }); } private static void createandshowgui() { jframe f = new jframe(); f.getcontentpane().add(new jscrollpane(createtable())); f.pack(); f.setlocationrelativeto(null); f.setvisible(true); } static jtable createtable() { jtable table = new jtable() { @override public class<?> getcolumnclass(int column) { if (column == 0) { return object.class; } return boolean.class; } }; table.setdefaulteditor(boolean.class, new delegatingtablecelleditor(table.getdefaulteditor(boolean.class))); table.setdefaultrenderer(boolean.class, new delegatingtablecellrenderer(table.getdefaultrenderer(boolean.class))); table.setmodel(new defaulttablemodel(new object[][] { { "row1", true, false, true }, { "row2", true, true, false }, { "row3", false, false, true }, { "row3", false, true, false } }, new string[] { "header1", "header2", "header3", "header4" })); return table; } static class delegatingtablecelleditor implements tablecelleditor { private final tablecelleditor delegate; delegatingtablecelleditor(tablecelleditor delegate) { this.delegate = delegate; } @override public object getcelleditorvalue() { return delegate.getcelleditorvalue(); } @override public boolean iscelleditable(eventobject anevent) { return delegate.iscelleditable(anevent); } @override public boolean shouldselectcell(eventobject anevent) { return delegate.shouldselectcell(anevent); } @override public boolean stopcellediting() { return delegate.stopcellediting(); } @override public void cancelcellediting() { delegate.cancelcellediting(); } @override public void addcelleditorlistener(celleditorlistener l) { delegate.addcelleditorlistener(l); } @override public void removecelleditorlistener(celleditorlistener l) { delegate.removecelleditorlistener(l); } @override public component gettablecelleditorcomponent(jtable table, object value, boolean isselected, int row, int column) { component component = delegate.gettablecelleditorcomponent( table, value, isselected, row, column); if (component instanceof jcomponent) { jcomponent c = (jcomponent)component; c.setopaque(true); } if (highlightcell(table, row, column)) { component.setbackground(color.cyan); } else { component.setbackground(color.white); } return component; } } static class delegatingtablecellrenderer extends defaulttablecellrenderer { private final tablecellrenderer delegate; delegatingtablecellrenderer(tablecellrenderer delegate) { this.delegate = delegate; } @override public component gettablecellrenderercomponent( jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { component component = delegate.gettablecellrenderercomponent( table, value, isselected, hasfocus, row, column); if (component instanceof jcomponent) { jcomponent c = (jcomponent)component; c.setopaque(true); } if (highlightcell(table, row, column)) { component.setbackground(color.cyan); } else { component.setbackground(color.white); } return component; } } private static boolean highlightcell(jtable table, int row, int column) { if (column == 1) { return false; } object thisvalue = table.getmodel().getvalueat(row, column); object referencevalue = table.getmodel().getvalueat(row, 1); if (thisvalue != null && referencevalue != null) { return thisvalue.equals(referencevalue); } return false; } }
Comments
Post a Comment