JTable故障改变第一列的颜色

时间:2011-08-23 08:23:56

标签: java swing jtable tablecellrenderer

我尝试根据它们的值更改JTable中的字段颜色。我不想改变第一列的任何颜色,但无论如何都会以错误的方式改变(某些文件没有像大学和Possible_Reviewer那样正确归档):x is the first column

我的代码如下:

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”时,它会将第二列变为白色但第一列仍然是奇怪的颜色。

有人有想法吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

编辑:

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

setCellRenderer(int row, int col, TableCellRenderer render) 

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

答案 1 :(得分:3)

How to Use Tables: Using Custom Renderers提到了这种替代方法:“要指定特定列中的单元格应使用渲染器,请使用TableColumn方法setCellRenderer()。”

附录:此方法的一个好处是,如果用户将其拖动到其他位置,则渲染器会“粘贴”到该列。在此example中,将setDefaultRenderer()替换为setCellRenderer()

table.getColumnModel().getColumn(DATE_COL).setCellRenderer(new DateRenderer());