比较单元格中的2个值并更改JTable中的单元格颜色

时间:2016-03-16 08:14:23

标签: java jtable

所以我想比较来自同一行的2个单元格中的2个值("初始目标"和"结果目标"),如果值不相同单元格"结果目标"列将变为红色 ,但我的代码将所有单元格变为红色,结果如下:

result

这就是我的期望:

Expected

这是我的代码:

tblResult = new JTable(tableModel) {
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
            Component comp = super.prepareRenderer(renderer, row, col);
            Object value1 = getModel().getValueAt(row, 2);
            Object value2 = getModel().getValueAt(row, 1);
            if (value1!=value2) {
                    comp.setBackground(Color.red);
            }
             else {
                comp.setBackground(Color.white);
            }
            return comp;
        }
    };

2 个答案:

答案 0 :(得分:3)

如果您正在执行if (value1 != value2),那么您只是在检查value1value2是否具有相同的引用,而在这里它们不是这样,此比较将始终返回true

您可以做的是将这些对象转换为String或Integer,如下所示:

String value1 = (String) getModel().getValueAt(row, 2);
String value2 = (String) getModel().getValueAt(row, 1);

然后按如下方式进行比较:

if (!value1.equalsIgnoreCase(value2)) {}

答案 1 :(得分:1)

您为每个columnIndex执行逻辑,因此每个渲染组件都会对其颜色进行操作并绘制,例如红色。您应该有类似if(col == 2)的条件,因此只有在为第3列调用方法prepareRenderer()时才执行您的颜色魔法。

原因是已经提到的比较修正if (!value1.equalsIgnoreCase(value2)) {}应该完成。

顺便说一下,您可以使用table.getColumnModel().getColumn(2).setCellRenderer(TableCellRenderer)为此列设置特定的呈现逻辑。