【发布时间】:2014-04-24 08:37:52
【问题描述】:
如何将单元格渲染器和表格模型应用于同一个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);
}
【问题讨论】:
-
您无需创建一个全新的 DefaultTableModel。您需要覆盖的唯一方法是
getColumnClass()方法,用于返回为给定列存储的数据类。事实上,我不知道你的模型是如何工作的。 DefaultTableModel 使用 Vector 的 Vector 来存储数据,您不应尝试引用名为 data 的外部 2D 数组。 -
@camickr:你能举个例子吗?
-
could you give an example?- 删除除 getColumnClass() 和 isCellEditable() 方法之外的所有代码。请参阅我的答案以了解更多详细信息。
标签: java swing jtable tablecellrenderer tablemodel