How to apply cell renderer and table model to the same JTable
? The problem is that if I apply cell renderer, then JTable
does not display checkboxes for Boolean
type fields. However, if I do not apply cell renderer, then time fields (JodaTime
) are not formatted properly.
model = new DefaultTableModel(data, columnNames)
{
private static final long serialVersionUID = 1L;
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public String getColumnName(int col) {
return (String) columnNames[col];
}
@Override
public Object getValueAt(int row, int column) {
return data[row][column];
}
@Override
public Class getColumnClass(int column) {
return (getValueAt(0, column).getClass());
}
@Override
public void setValueAt(Object value, int row, int column) {
data[row][column] = value;
}
@Override
public boolean isCellEditable(int row, int column) {
return (column != 0);
}
};
DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer()
{
public Component getTableCellRendererComponent( JTable table, Object value, boolean
isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
if ( value instanceof LocalTime )
{
DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm");
String strTime = formatter.print((LocalTime)value);
this.setText(strTime);
}
return this;
}
};
table = new JTable(model);
for (int i = 0; i < table.getColumnCount(); ++i)
{
table.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
}
There is no need for you do create a completely new DefaultTableModel. The only method you need to override is the getColumnClass()
method to return the class of data that is stored for the given column.
In fact I don't know how your model works. The DefaultTableModel uses a Vector of Vectors to store the data, you should not be attempting to reference an external 2D array called "data".
The next question is why are you attempting to assign you custom renderer to all columns? If you want to use your renderer for Date Objects then you should do something like:
table.setDefaultRenderer(Date.class, cellRenderer);
Then Dates will use that renderer and all other columns will use the provided renderers.