Java JTable更改第一列颜色时出现问题
我尝试根据字段的值更改JTable中字段的颜色。我不想更改第一列的任何颜色,但它会以错误的方式更改(有些文件没有正确归档,如大学和可能的\u审阅者): 我的代码如下:Java JTable更改第一列颜色时出现问题,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我尝试根据字段的值更改JTable中字段的颜色。我不想更改第一列的任何颜色,但它会以错误的方式更改(有些文件没有正确归档,如大学和可能的\u审阅者): 我的代码如下: table.setDefaultRenderer(Object.class, new CustomRenderer()); private class CustomRenderer extends DefaultTableCellRenderer { public Component getTableCellRender
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
}
}
setCellRenderer(int row, int col, TableCellRenderer render)
奇怪的是,当我使用“col==2”时,它会将第二列变成白色,但第一列仍然保持奇怪的颜色
有人有想法吗?您应该扩展JTable类并重写此方法:
public TableCellRenderer getCellRenderer(int row, int column){}
否则,JTable将对同一列中的每个单元格使用相同的渲染器
编辑:
正如@Mark Bramnik指出的,最好不要为每个getCellRenderer调用实例化一个新的TableCellRenderer对象。您可以实现如下方法:
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
}
}
setCellRenderer(int row, int col, TableCellRenderer render)
并将渲染器存储在扩展JTable中。提到了这种替代方法:“要指定特定列中的单元格应使用渲染器,请使用该方法。”
附录:这种方法的一个好处是,如果用户将列拖动到不同的位置,渲染器会“粘住”列。在这种情况下,将setDefaultRenderer()
替换为setCellRenderer()
setCellRenderer不是对同一列中的每个单元格使用相同的渲染器吗?是的,但您可以根据值来调整外观,如图所示。您好,请注意,您不应该每次都从getCellRenderer返回渲染器的新对象,否则在大表中,它将是太多徒劳的对象,您可能会遇到与性能相关的问题。尽量减少不同渲染器对象的数量。@Mark Bramnik:是的,我知道。我通常实现一个setCellRenderer(int行、int列、TableCellRenderer render)并将渲染器存储在扩展表中。我将编辑我的答案,谢谢。+1这种方法的一个限制是它会影响视图列。@trashgood:你能再解释一下这个限制吗?我不确定是否理解。-1表示过于复杂;-)很少有任何理由使用每单元渲染器,每列足够细粒度。此外,渲染器本身设计用于处理单元的配置,只需使用性能良好的实现(请注意,DefaultTableCellRenderer的性能不好),并根据需要在那里进行所有配置