JTable CustomRenderer问题

时间:2012-11-29 17:40:23

标签: java swing jtable tablecellrenderer

我创建了一个Jtable。这个表由两列name和timestamp组成。如果名字是“jane”,我想做行黄色。以下是代码: -

    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);
        String name = table.getModel().getValueAt(row, 0).toString();

        if (name.trim().equals("jane")) {
            c.setBackground(Color.YELLOW);
        }
        return c;
    }
}

然而,不是将特定名称的行颜色改为黄色,而是改变每一行的颜色。我正在设置表的数据如下

tableModelName = (DefaultTableModel)jTableName.getModel();

jTableName.setDefaultRenderer(Object.class,new CustomRenderer());

for(int i=0; i<records.size(); i++)
         {
            tableModelName.addRow(records.get(i));          

         }

我做错了什么?

1 个答案:

答案 0 :(得分:4)

如果名称不是“jane”,则需要else子句将背景颜色设置为黄色以外的颜色。单个渲染器实例用于所有渲染,因此一旦在该实例上将颜色设置为黄色,它就会保持黄色。

查看JTable源代码,了解内置渲染器的工作原理:

    if (isSelected) {
        setForeground(table.getSelectionForeground());
        super.setBackground(table.getSelectionBackground());
    }
    else {
        setForeground(table.getForeground());
        setBackground(table.getBackground());
    }

为了更简单地执行此操作,您可以尝试子类化JTable并覆盖prepareRenderer。这对于影响整个行的更改非常方便,因此您可以为单个单元格使用自定义渲染器,并在prepareRenderer方法中调整行的所有渲染器。