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

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -