如何将单元格渲染器和表格模型应用于同一JTable
?问题是,如果我应用单元格渲染器,则JTable
不会显示Boolean
类型字段的复选框。但是,如果我不应用单元格渲染器,则时间字段(JodaTime
)格式不正确。
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);
}
答案 0 :(得分:5)
您无需创建全新的DefaultTableModel。您需要覆盖的唯一方法是getColumnClass()
方法,以返回为给定列存储的数据类。
实际上我不知道你的模型是如何工作的。 DefaultTableModel使用Vector of Vectors来存储数据,你不应该试图引用一个名为“data”的外部2D数组。
接下来的问题是为什么要尝试将自定义渲染器分配给所有列?如果要将渲染器用于日期对象,则应执行以下操作:
table.setDefaultRenderer(Date.class, cellRenderer);
然后日期将使用该渲染器,所有其他列将使用提供的渲染器。
答案 1 :(得分:0)
您的代码中可能存在排版错误?
DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer()
{
public Component getTableCellRendererComponent( JTable table, Object value, boolean
isSelected, boolean hasFocus, int row, int column)
{
Component toReturn= 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);
toReturn= this;
}
else if( value instanceof Boolean ) {
JCheckbox checkbox= new JCheckbox();
checkbox.setSelected((Boolean)value));
toReturn= checkbox;
}
return toReturn;
}
};