首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTable TableCellRenderer不正确着色

JTable TableCellRenderer不正确着色
EN

Stack Overflow用户
提问于 2018-06-08 08:31:55
回答 1查看 148关注 0票数 1

我用我的自定义JTable创建了一个简单的DefaultTableCellRenderer。它本身工作正常(最后一栏着色)。但是,一旦我选择了行或筛选器/取消筛选,行就会被着色,即使它根本不应该被着色。

我的渲染者:

代码语言:javascript
复制
public class StatusCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int col) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                table.convertRowIndexToModel(row), col);
        DataTableModel model = (DataTableModel) table.getModel();
        String data = model.getValueAt(table.convertRowIndexToModel(row), col).toString();
        if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(Color.GREEN);
        }
        if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(new Color(255, 51, 51));
        }
        return c;
    }
}

它最初的样子(以及它应该是什么样子):

并在选择2行(顶部和底部)之后:

正如你所看到的,有几行绿色,根本不应该被着色。更令人不安的是,我只选择了绿色块的上一行和下一行,这意味着它也会自动为中间的行着色。

如何停止这种行为,并且只对第一张图片中所示的行着色?

被接受的答案帮助我克服了这些问题,这是最后的代码:

代码语言:javascript
复制
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int col) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
            table.convertRowIndexToModel(row), table.convertColumnIndexToModel(col));
    DataTableModel model = (DataTableModel) table.getModel();
    String data = model.getValueAt(table.convertRowIndexToModel(row), table.convertColumnIndexToModel(col))
            .toString();
    if (!isSelected) {
        if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(Color.GREEN);
        } else if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(new Color(255, 51, 51));
        } else {
            c.setBackground(Color.WHITE);
        }
    } else {
        c.setBackground(c.getBackground());
    }
    return c;
}

如果选择了单元格,则颜色为蓝色,如果没有,则根据值将白色、绿色或红色着色。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 08:55:51

由于渲染器组件将被重复使用,因此当条件不匹配时,请考虑设置默认颜色:

代码语言:javascript
复制
    if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
        c.setBackground(Color.GREEN);
    }
    else if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
        c.setBackground(new Color(255, 51, 51));
    }
    else {
        c.setBackground(Color.GRAY.brighter());
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50756543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档