4

我尝试根据字段的值更改 JTable 中字段的颜色。我不想更改第一列的任何颜色,但无论如何都会以错误的方式更改(某些文件未正确归档,例如 University 和 Possible_Reviewer):x 是第一列

我的代码如下:

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

private class CustomRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int col){
         Component comp = super.getTableCellRendererComponent(table,  value, isSelected, hasFocus, row, col);
         try {
             Double val =  Double.parseDouble(value.toString());

             if(col == 0){
                 comp.setBackground(Color.white);
             } else {
                 comp.setBackground(changeColor(val));
             }
         } catch (NumberFormatException e){}
         return( comp );
    }

    private Color changeColor(Double val) {
        //returns a Color between red and green depending on val
    }
}

奇怪的是,当我使用“col == 2”时,它会将第二列变成白色,但第一列仍然是奇怪的颜色。

任何人的想法?

4

2 回答 2

3

您应该扩展 JTable 类并覆盖此方法:

public TableCellRenderer getCellRenderer(int row, int column){}

否则 JTable 将为同一列中的每个单元格使用相同的渲染器。

编辑:

就像@Mark Bramnik 指出的那样,最好不要为每个 getCellRenderer 调用实例化一个新的 TableCellRenderer 对象。您可以实现如下方法:

setCellRenderer(int row, int col, TableCellRenderer render) 

并将渲染器存储在扩展的 JTable 本身中。

于 2011-08-23T08:30:23.663 回答
3

如何使用表格:使用自定义渲染器提到了这种替代方法:“要指定特定列中的单元格应使用渲染器,请使用TableColumn方法setCellRenderer()。”

附录:这种方法的一个好处是,如果用户将它拖到不同的位置,渲染器会“粘”到列上。在此示例中,替换setDefaultRenderer()setCellRenderer()

table.getColumnModel().getColumn(DATE_COL).setCellRenderer(new DateRenderer());
于 2011-08-23T09:13:16.013 回答