Java 尝试使用自定义渲染器为JTable的特定行着色,而不是所有我的行都着色

Java 尝试使用自定义渲染器为JTable的特定行着色,而不是所有我的行都着色,java,swing,jtable,background-color,tablecellrenderer,Java,Swing,Jtable,Background Color,Tablecellrenderer,对于我的Java程序,基本上当JTable的第4列中的值大于第3列时,我希望这些特定的行被涂成红色,而不是其他行 我已经实现了以下代码,但由于某种原因,我的所有行都被涂成红色,而不仅仅是那些符合条件的行 table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){ @Override public Component getTableCellRendererComponent(JTable table

对于我的Java程序,基本上当JTable的第4列中的值大于第3列时,我希望这些特定的行被涂成红色,而不是其他行

我已经实现了以下代码,但由于某种原因,我的所有行都被涂成红色,而不仅仅是那些符合条件的行

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
    @Override
    public Component getTableCellRendererComponent(JTable table, 
                   Object value, boolean isSelected, boolean hasFocus, int row, int col) {

        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);

        int Value1= Integer.parseInt(table.getModel().getValueAt(row, 3).toString());
        int Value2= Integer.parseInt(table.getModel().getValueAt(row, 4).toString());
        if (Value2>=Value1) {                        
            setBackground(Color.red);
        } 
        return this;
    }   
});
关于如何解决这个问题有什么建议/提示吗

实例使用模板组件呈现所有单元格(即其本身,请参见文档)。设置其颜色后,模板将具有该颜色,并将应用于所有后续单元格

您需要做的是在您的逻辑中,在需要的情况下将颜色设置为红色,在所有其他情况下将其设置为默认背景色

if(!isSelected) {
    if (Value2>=Value1) {                        
        setBackground(Color.red);
    } else {
        setBackground(table.getBackground()); // or use another color for another background
    }
}

再次查看您的代码,我注意到您在模型索引和视图索引方面犯了一个错误。使用视图索引调用
gettableCellRenderComponent
方法,但您正在使用这些索引对模型进行索引(例如在
table.getModel().getValueAt(第3行)
)。对表进行排序时,结果将不正确,因为模型索引和视图索引将不同

如果需要从模型中获取值,首先需要将视图索引转换为模型索引。使用和来做这件事。例如:

int modelRowId = table.convertRowIndexToModel(row);
int Value1= Integer.parseInt(table.getModel().getValueAt(modelRowId, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(modelRowId, 4).toString());
实例使用模板组件呈现所有单元格(即其本身,请参见文档)。设置其颜色后,模板将具有该颜色,并将应用于所有后续单元格

您需要做的是在您的逻辑中,在需要的情况下将颜色设置为红色,在所有其他情况下将其设置为默认背景色

if(!isSelected) {
    if (Value2>=Value1) {                        
        setBackground(Color.red);
    } else {
        setBackground(table.getBackground()); // or use another color for another background
    }
}

再次查看您的代码,我注意到您在模型索引和视图索引方面犯了一个错误。使用视图索引调用
gettableCellRenderComponent
方法,但您正在使用这些索引对模型进行索引(例如在
table.getModel().getValueAt(第3行)
)。对表进行排序时,结果将不正确,因为模型索引和视图索引将不同

如果需要从模型中获取值,首先需要将视图索引转换为模型索引。使用和来做这件事。例如:

int modelRowId = table.convertRowIndexToModel(row);
int Value1= Integer.parseInt(table.getModel().getValueAt(modelRowId, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(modelRowId, 4).toString());
看一看,其中显示了如何通过重写JTable的
prepareRenderer(…)
方法来实现这一点

使用这种方法,您不需要为表中的每种数据类型使用自定义呈现程序。

请查看通过覆盖JTable的
prepareRenderer(…)
方法来实现此目的的示例


使用这种方法,表中的每种数据类型都不需要自定义渲染器。

看看这个-看看这个-非常感谢您,特别是模型与视图索引。我甚至不知道这是一件事(我是java新手)。另一个问题,现在唯一改变的是当我选择这个jTable上的行时,它们不再以默认的蓝色突出显示,而是以白色突出显示。我是否可以修复此问题,使选定的行具有正常的蓝色背景?@user5798517我已更新了答案。如果
isSelected
为true,则无需设置背景色。通过调用
super.gettablcellrendercomponent
非常感谢您,特别是模型与视图索引,组件将为所选行准备合适的背景颜色。我甚至不知道这是一件事(我是java新手)。另一个问题,现在唯一改变的是当我选择这个jTable上的行时,它们不再以默认的蓝色突出显示,而是以白色突出显示。我是否可以修复此问题,使选定的行具有正常的蓝色背景?@user5798517我已更新了答案。如果
isSelected
为true,则无需设置背景色。通过调用
super.gettablcellrendercomponent