Java 当我只想让JTable给特定的单元格着色时,它会给每个单元格着色 私有类ColorRenderer扩展了DefaultTableCellRenderer { 字符串[][]数据; 公共颜色渲染器(字符串[][]数据) { this.data=新字符串[data.length][data[0].length]; 对于(int i=0;i

Java 当我只想让JTable给特定的单元格着色时,它会给每个单元格着色 私有类ColorRenderer扩展了DefaultTableCellRenderer { 字符串[][]数据; 公共颜色渲染器(字符串[][]数据) { this.data=新字符串[data.length][data[0].length]; 对于(int i=0;i,java,swing,jtable,Java,Swing,Jtable,data是填充JTable的数据数组。表中大部分都是字符串,但有一些空字符串。我想在只有空字符串的单元格中着色,但不在最后三行中着色 但出于某种原因,它目前在我的整个表中不分青红皂白地着色,为什么?在您对DefaultTableCellRenderer.GetTableCellRenderComponent的覆盖中,在if语句后添加一个else部分: private class ColorRenderer extends DefaultTableCellRenderer {

data
是填充JTable的数据数组。表中大部分都是字符串,但有一些空字符串。我想在只有空字符串的单元格中着色,但不在最后三行中着色


但出于某种原因,它目前在我的整个表中不分青红皂白地着色,为什么?

在您对
DefaultTableCellRenderer.GetTableCellRenderComponent的覆盖中,在if语句后添加一个else部分:

private class ColorRenderer extends DefaultTableCellRenderer
{           
    String[][] data;    

    public ColorRenderer(String[][] data)
    {
        this.data = new String[data.length][data[0].length];

        for(int i = 0; i < data.length; i++)
        {
            for(int g = 0; g < data[0].length; g++)
            {
                this.data[i][g] = data[i][g];       
            }
        }

    }       

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);            

        if(row < data.length - 3 && data[row][col].equals(""))
        {               
            c.setBackground(Color.LIGHT_GRAY);
        }

        return c;
    }       
}   
if(行

默认的表格单元格渲染器使用一个组件,用于渲染每个单元格的内容。一旦你改变了它的颜色,它将保持该颜色,直到该颜色被明确改变。

这个答案是不符合逻辑的,不应该是正确的reason@hunter哦:)这是非常符合逻辑的答案,提问者很快就会发现。@hunter阅读了文档中的
实施说明
,hunter看着源代码,我看到了
setForeground
setBackground
方法set
unselectedForeground
unselectedBackground
成员,它们用于初始化GetTableCellRenderComponent中JLabel的颜色(如果选择为false,则为false)谢谢你,我很感激你的回答,希望能对OP有所帮助,这是这个社区的最终目标。至少OP会深入挖掘java源代码。
if(row < data.length - 3 && data[row][col].equals(""))
    c.setBackground(Color.LIGHT_GRAY);
else 
    c.setBackground(table.getBackground());