【问题标题】:Trying to color specific cell in JTable... getTableCellRendererComponent Overide尝试为 JTable 中的特定单元格着色... getTableCellRendererComponent Override
【发布时间】:2017-04-07 17:02:08
【问题描述】:

所以我知道这可能是一个重复的问题,但是我已经浏览了许多已经在这里的问题,但似乎没有一个对我有用,所以我想我会发布自己的问题,并希望其他一些遇到问题的人也会发现这很有帮助。

这是我的代码

    table.getColumn("Name").setCellRenderer(
                new DefaultTableCellRenderer() {
                    @Override
                    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                        setText(value.toString());

                        if (row==3) 
                        {
                            setForeground(Color.RED);
                        }
                        return this;
                    }
                }
            );

这是 JFrame 中显示的内容。如您所见,我试图只为“名称”列第三行中的文本着色,但它为整行着色。

有什么建议吗? 谢谢! 迦南

【问题讨论】:

    标签: java swing jtable cell cellrenderer


    【解决方案1】:

    “名称”列的渲染是唯一的。当第 3 行时,您将红色设置为前景色,但您不会为其他行重置它,所以当调用画家时,它总是涂成红色。 当第 3 行时你必须设置红色,但在其他情况下你也必须重置原始颜色。

    已编辑:执行版本。现在备份了原来的前景色,用super渲染其他列。

               table.getColumn("Name").setCellRenderer(
                new DefaultTableCellRenderer() {
    
            Color originalColor = null;
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (originalColor == null) {
                    originalColor = getForeground();
                }
                if (value == null) {
                    renderer.setText("");
                } else {
                    renderer.setText(value.toString());
                }
    
                if (row == 3) {
                    renderer.setForeground(Color.RED);
                } else {
                    renderer.setForeground(originalColor); // Retore original color
                }
                return renderer;
            }
        });
    

    【讨论】:

    • 谢谢!工作得很好!
    • 还有一个问题,有没有setForeground(null)?我想将 row == 3 设置为红色,但不在 else{ 括号中做任何事情。我只是希望它基本上什么都不做,但前景黑色加粗,谢谢!基本上 Color.BLACK 不是原来的颜色
    • 1.永远不要在 XxxRenderer 内设置值,顺便说一句,JTable 在单元格或 XxxTableModel 2 中没有任何 null 问题。 renderer.setForeground(originalColor);而不是 originalColor 应该是 myTable.getForeground() 3. @Canaan Linder 请问你说的不是真的好的渲染器每周在这个论坛上发布超过两/三次
    猜你喜欢
    • 2023-04-04
    • 2013-03-14
    • 2013-07-31
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2013-04-09
    • 2011-12-23
    相关资源
    最近更新 更多