Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable更改第一列颜色时出现问题_Java_Swing_Jtable_Tablecellrenderer - Fatal编程技术网

Java JTable更改第一列颜色时出现问题

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

我尝试根据字段的值更改JTable中字段的颜色。我不想更改第一列的任何颜色,但它会以错误的方式更改(有些文件没有正确归档,如大学和可能的\u审阅者):

我的代码如下:

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的性能不好),并根据需要在那里进行所有配置