【发布时间】:2013-01-11 22:34:17
【问题描述】:
我已经阅读并实现了这个Changing JTable cell color
我想知道的是如何实际使用此代码?我只想在单击时更改表格单元格的颜色。
【问题讨论】:
我已经阅读并实现了这个Changing JTable cell color
我想知道的是如何实际使用此代码?我只想在单击时更改表格单元格的颜色。
【问题讨论】:
在您引用的代码中,您有一个自定义 CellRenderer。
将其添加到表格后,您只需在适当的位置进行格式化:
class CustomRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
// Formatting here
return c;
}
}
DefaultTableCellRenderer 只不过是在 JTable 中用于绘制单元格的组件。更准确地说,在这种情况下,组件是一个 JLabel(您可以通过检查 DefaultTableCellRenderer 的源来查看这一点)。
所以你应该做的所有格式化都在“c”对象上(或在“this”上,因为该方法实际上每次都返回相同的组件:它自己)。例如,c.setBackground() 将允许您设置背景颜色。
将为 JTable 的每个单元格调用被覆盖的 getTableCellRendererComponent() 方法,并使用参数告诉您上下文。您知道表格、行、列、应该显示的值,并且您还知道是否选择了单元格,这可以帮助您解决问题:
if (selected)
c.setBackground(Color.YELLOW);
更进一步,请注意,因为您覆盖 DefaultTableCellRenderer 类,并使用它自己的方法,所以您已经完成了一些格式化,例如背景颜色,它来自表格。因此,您只需要在需要时定义自己的颜色。如果不是,您将必须注意所有情况,因为由于使用了相同的组件,您将以颜色集结束一次,然后将其应用于所有连续的单元格,因为不会做任何更改来更改它。
如果您想了解有关它的完成和使用方式的更多信息,我建议您阅读 DefaultTableCellRenderer(及其在 JTable 中的用途)的源代码。
【讨论】:
这是否意味着单元格颜色会永远改变,或者一旦您单击另一个单元格就会重置。
如果您只想暂时改变颜色,那么最简单的方法是使用Table Row Rendering 中提出的概念,这样您就不必为每种类型的数据创建多个渲染器。
如果您希望单元格颜色是永久的,那么它会涉及更多,因为现在您实际上需要为每个应该以不同颜色着色的单元格保存数据。同样,最简单的方法是使用上面的方法,然后可能保留一组所有彩色单元格。
【讨论】:
当我想为 JTable 中的特定单元格着色时,我也很挣扎。 您可以创建自定义表格单元格渲染并将行/列作为参数发送:
class CustomRenderer extends DefaultTableCellRenderer {
int col;
int row;
public CustomRenderer (int col, int row)
{
this.col = col;
this.row = row;
}
public Component getTableCellRendererComponent
(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent
(table, value, isSelected, hasFocus, row, column);
setForeground( (column == this.col && row == this.row)
? Color.red : Color.black );
return c;
}
}
table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer(0, 1);
table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer(1, 3);
【讨论】: