У меня есть JXTreeTable с пользовательским средством визуализации ячеек. Я пытаюсь изменить цвет фона строки, если поле в строке отличается от поля в предыдущей строке. Скажем, например, что строка содержит «1» в качестве идентификатора. Если предыдущая строка также содержала «1», я хочу, чтобы эта строка была окрашена в тот же цвет. Если предыдущий был "2", я хочу, чтобы этот ряд был окрашен в альтернативный цвет. Цель состоит в том, чтобы сгруппировать строки с одинаковым идентификатором.
Первоначально я сохранял ранее окрашенный цвет и использовал его (вместе со значением), чтобы определить, какой цвет рисовать в текущей строке. Однако это работало только при полной покраске стола сверху вниз. В настоящее время я выбираю фоновый цвет предыдущих строк и использую его для определения, но если строка выбрана или иным образом отличается, это портит цвета. Есть ли лучший способ сделать это?
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
Object node = this.getPathForRow(row).getLastPathComponent();
if(node instanceof Record && !isCellSelected(row,column)) {
Object prevNode = null;
Component prevC = null;
if(row > 1) {
prevC = super.prepareRenderer(renderer, row-1, column);
prevNode = this.getPathForRow(row-1).getLastPathComponent();
}
if(row != prevRow) { //paint rows the same colour
if(getTreeTableModel().getValueAt(node,17) != null) {
if (prevNode != null) {
if(getTreeTableModel().getValueAt(prevNode, 17) == getTreeTableModel().getValueAt(node, 17)) {
c.setBackground(prevC.getBackground()); //if ID is same as previous ID, paint same colour
prevColor = prevC.getBackground();
}else if(prevC.getBackground().equals(Color.WHITE)) {;
c.setBackground(new Color(240,255,255)); //if previous row was white, paint blue
prevColor = new Color(240,255,255);
}else if(prevC.getBackground().equals(new Color(240,255,255))) {
c.setBackground(Color.WHITE); //if previous row blue, paint white
prevColor = Color.WHITE;
}
} else {
c.setBackground(Color.WHITE); //previous node is null
prevColor = Color.WHITE;
}
}
} else {
c.setBackground(prevColor);
}
}
prevRow = row;
return c;
}