0

私はスイング JXTable を持っており、フィールドが前の行と異なる場合は背景色を変更する必要があります。

例を次に示します。

  • 行 0 : var = 1 -> 背景ブルー

  • 行 1 : var = 1 -> 背景ブルー

  • 行 2 : var = 2 -> 背景赤

  • 行 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 を定義することも考えましたが、決定的ではありませんでした。

だからどうしたらいいのかわからず困っています。何か提案はありますか ?

編集

JXTableを使用しているので、HighlightPredicateを試しました

        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 -> 背景赤

  • 行 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 ) );

助けてくれてありがとう!

4

2 に答える 2

2

You also need to make the renderer opaque:

if (c instanceof JComponent)
    ((JComponent)c).setOpaque(true);
于 2013-01-07T15:10:58.060 に答える
2
int lastRow=Math.max(0, row-1);

最後の行のインデックスを保存する代わりに、実際のrow値を使用して 1 を減算します。

于 2013-01-07T15:12:28.207 に答える