Reputation: 33
in my custom JTable I have multiple columns. One column is of type java.sql.Timestamp. I want to change the backgroundcolor of all cells and I want to change the format of only the Timestamp cells. I made the following customcellrenderer which I call by:
for(int i = 0; i < tableTask.getColumnCount(); i++)
{
Class columnClass = myTaskTM.getColumnClass(i);
TableCellRenderer defaultRenderer = tableTask.getDefaultRenderer(columnClass);
tableTask.getColumnModel().getColumn(i).setCellRenderer(new CustomRenderer(defaultRenderer));
}
customrenderer:
public class CustomRenderer extends DefaultTableCellRenderer
{
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
TableCellRenderer delegate;
public CustomRenderer(TableCellRenderer defaultRenderer)
{
super();
delegate = defaultRenderer;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Color foreground, background;
if(!isSelected)
{
...
}
else
{
background = javax.swing.UIManager.getDefaults().getColor("Table.selectionBackground");
//foreground = javax.swing.UIManager.getDefaults().getColor("Table.selectionForeground");
foreground = Color.BLACK;
}
c.setForeground(foreground);
c.setBackground(background);
setValue(value);
return c;
}
@Override
public void setValue(Object value) {
if (formatter == null) {
formatter = DateFormat.getDateInstance();
}
if(value != null)
{
if(value.getClass().toString().equals("class java.sql.Timestamp"))
{
((JLabel)delegate).setText((value == null) ? "" : formatter.format(value));
}
else
{
((JLabel)delegate).setText(value.toString());
}
}
}
}
The setValue only works if getTableCellRendererComponent is commented out.
How can I get both to work?
Upvotes: 1
Views: 281
Reputation: 57401
The setValue()
should call delegate.setText()
because the delegate's component is actually used. Also I don't even see where the setValue()
is called in the renderer.
Call it in your renderer passing the Object value
.
Upvotes: 1