我尝试更改每个第二行的背景颜色。问题是只有第一个COLUMN受到影响。为什么呢?
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
return c;
}
});
答案 0 :(得分:5)
使用渲染器方法,您需要为表中的每种数据类型编写自定义渲染器。因此,如果您有String,Data,Integer,Boolean,则需要编写4个自定义渲染器。
有关允许您编写代码的方法,请参阅Table Row Rendering,无论表中包含多种数据类型。这种方法会覆盖JTable的preparerrenderer(...)
方法。
答案 1 :(得分:2)
如Concepts: Editors and Renderers教程的How to Use Tables部分所述,如果您没有为特定列指定渲染器,那么该表会调用表模型的getColumnClass
方法来获取默认渲染器列类型。
如果您覆盖了getColumnClass
方法,那么您的方法可能无法按预期工作。例如:
DefaultTableModel model = new DefaultTableModel(new Object[]{"Column # 1", "Column # 2"}, 0) {
@Override
public Class<?> getColumnClass(int columnIndex) {
Class columnClass = Object.class;
switch(columnIndex) {
case 0: columnClass = String.class; break;
case 1: columnClass = Boolean.class; break;
}
return columnClass;
}
};
然后这样做:
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {// your code here});
不适用于第二列,因为getColumnClass
方法将返回Boolean.class
并且该类的默认单元格渲染器(JCheckBox
)。
在您的情况下,我建议您覆盖JTable.prepareRenderer()方法,而不是独立于渲染器类型(JLabel
,JCheckBox
甚至自定义渲染器设置行背景颜色):
JTable table = new JTable(model) {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
return c;
}
};
答案 2 :(得分:1)
好的,废弃我刚写的所有内容。
尝试#2:
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
return this;
}
});
您需要返回当前对象,而不是super()调用的引用。