У меня есть свинг 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, но это не совпало.
Так что я застрял, я не знаю, как это сделать. У Вас есть какие-то предложения ?
ИЗМЕНИТЬ
Я пробовал с 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 -> Фон КРАСНЫЙ
Ряд 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 ) );
Спасибо за вашу помощь !