我有一个带有自定义单元格渲染器的 JXTreeTable。当一行中的字段与前一行中的字段不同时,我试图让行的背景颜色发生变化。例如,该行包含“1”作为 ID。如果前一行也包含“1”,我希望这一行被涂成相同的颜色。如果前一个是“2”,我希望这一行被涂上另一种颜色。目的是对具有相同 ID 的行进行分组。
我最初是存储先前绘制的颜色并使用它(连同值)来确定要绘制当前行的颜色。然而,这只在从上到下完全绘制表格时才有效。我目前正在获取前几行的背景颜色并使用它来确定,但是如果选择了该行或以其他方式不同,这会弄乱颜色。有一个更好的方法吗?
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;
}