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

Posted

技术标签:

【中文标题】尝试使用自定义渲染器为 JTable 的特定行着色,而不是我的所有行都着色【英文标题】:Trying to color specific rows of JTable using Custom Renderer, instead all my rows are colored 【发布时间】:2016-06-11 16:27:01 【问题描述】:

对于我的 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;
       
);

关于如何解决此问题的任何建议/提示?

【问题讨论】:

看看这个 - ***.com/questions/16882902/… 【参考方案1】:

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

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

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


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

如果您需要从模型中获取值,您首先需要将视图索引转换为模型索引。使用 JTable.convertRowIndexToModelJTable.convertColumnIndexToModel 来做到这一点。例如:

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());

【讨论】:

非常感谢,尤其是模型与视图索引。甚至不知道这是一件事(我是java新手)。现在就像一个魅力。 另一个问题,现在唯一改变的是当我在这个 jTable 上选择行时,它们不再以默认的蓝色突出显示,而是以白色突出显示。无论如何我可以解决这个问题,使选定的行具有正常的蓝色背景? @user5798517 我已经更新了我的答案。如果isSelected 为真,则无需设置背景颜色。通过调用super.getTablCellRendererComponent,组件将为选定的行准备适当的背景颜色【参考方案2】:

看看Table Row Rendering,它展示了如何通过覆盖JTable 的prepareRenderer(...) 方法来做到这一点。

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

【讨论】:

以上是关于尝试使用自定义渲染器为 JTable 的特定行着色,而不是我的所有行都着色的主要内容,如果未能解决你的问题,请参考以下文章

jTable 单元格背景颜色

为 jTable 行着色

如何使用自定义 JTable 单元格编辑器和单元格渲染器

JTable 自定义单元格渲染器焦点问题

Nimbus 和备用行颜色

通过自定义单元格渲染器在Jtable中显示超链接