我有一个摆动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 ) );
谢谢大家的帮助!
答案 0 :(得分:2)
您还需要使渲染器不透明:
if (c instanceof JComponent)
((JComponent)c).setOpaque(true);
答案 1 :(得分:2)
int lastRow=Math.max(0, row-1);
不是保存最后一行索引,而是使用实际的row
值并减去1。