Swing JTable - 在前一行的函数中更改行的背景颜色

时间:2013-01-07 15:07:44

标签: java swing swingx jxtable

我有一个摆动JXTable,要求是如果一个字段与前一行不同,背景颜色必须改变。

以下是一个例子:

  • 第0行:var = 1 - >背景蓝色

  • 第1行:var = 1 - >背景蓝色

  • 第2行:var = 2 - >背景RED

  • 第3行:var = 3 - >背景蓝色

我尝试了几种解决方案。

覆盖prepareRenderer,但此解决方案无法正常工作。线条闪烁,颜色随表中可见的第一行的变化而变化。

    @Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
{
    Component c = super.prepareRenderer ( renderer , row , column );
    if(lastRow  != -1)
    {
        Data actualData = ( ( MessagesTableModel ) getModel ( ) ).getData ( row );
        Data previousData = ( ( MessagesTableModel ) getModel ( ) ).getData ( lastRow );
        if ( previousData != null )
        {
            if ( previousData.getNbr ( ) != actualData.getNbr ( ) )
            {
                if(lastColor.equals ( COLOR1 ))
                {
                    System.out.println ("A");
                    lastColor = COLOR2;
                }
                else
                {
                    System.out.println ("b");
                    lastColor = COLOR1;
                }
            }
        }
    }
    lastRow = row;
    c.setBackground ( lastColor );
    return c;
}

我也想过定义一个自定义的TableCellRender,但它并不是那么简单。

所以我被困住了,我不知道该怎么做。 你有什么建议吗?

修改

我尝试使用HighlightPredicate,因为我正在使用JXTable

        HighlightPredicate predicate = new HighlightPredicate ( )
    {
        public boolean isHighlighted(Component renderer, ComponentAdapter adapter)
        {
            Data actualData = ( ( MessagesTableModel ) getModel ( ) ).getData ( adapter.row );
            if ( adapter.row - 1 >= 0 )
            {
                Data previousData = ( ( MessagesTableModel ) getModel ( ) )
                        .getData ( adapter.row - 1 );
                if ( actualData.getNbr ( ) != previousData.getNbr ( ) )
                {   
                    return true;
                }

            }
            return false;
        }
    };

    addHighlighter ( new ColorHighlighter ( predicate , COLOR1 , null ) );

此时,如果值发生变化,颜色会发生变化,但如果后面的行没有变化,则颜色会发生变化。

  • 第0行:var = 1 - >背景蓝色

  • 第1行:var = 1 - >背景蓝色

  • 第2行:var = 2 - >背景RED

  • 第3行:var = 2 - >背景蓝色

这是正常的,因为这是编码:) 但我面临同样的问题,如何知道前一行是否突出显示。

编辑2

我找到了一个解决方案,看起来不是很干净但是很有效。

        HighlightPredicate predicate = new HighlightPredicate ( )
    {
        public boolean isHighlighted(Component renderer, ComponentAdapter adapter)
        {
            Data actualData = ( ( MessagesTableModel ) getModel ( ) ).getData ( adapter.row );
            if ( adapter.row - 1 >= 0 )
            {
                Data previousData = ( ( MessagesTableModel ) getModel ( ) )
                        .getData ( adapter.row - 1 );
                if ( actualData.getMsgNbr ( ) != previousData.getMsgNbr ( ) )
                {   
                    adapter.row--;
                    if(isHighlighted ( renderer , adapter ))
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }                       
                }
                else
                {
                    adapter.row--;
                    if(isHighlighted ( renderer , adapter ))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            return false;
        }
    };

    addHighlighter ( new ColorHighlighter ( predicate , COLOR1 , null ) );

谢谢大家的帮助!

2 个答案:

答案 0 :(得分:2)

您还需要使渲染器不透明:

if (c instanceof JComponent)
    ((JComponent)c).setOpaque(true);

答案 1 :(得分:2)

int lastRow=Math.max(0, row-1);

不是保存最后一行索引,而是使用实际的row值并减去1。

相关问题