我尝试根据它们的值更改JTable中的字段颜色。我不想改变第一列的任何颜色,但无论如何都会以错误的方式改变(某些文件没有像大学和Possible_Reviewer那样正确归档):
我的代码如下:
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”时,它会将第二列变为白色但第一列仍然是奇怪的颜色。
有人有想法吗?
答案 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());