我有一个带有自定义单元格渲染器的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;
}
答案 0 :(得分:1)
如果您没有更改数据,您可以预先确定每个ID的颜色,并在每次设置背景之前查找它们。
答案 1 :(得分:1)
当一行中的字段与上一行中的字段不同时,我试图获取行的背景颜色
如果您尝试根据连续数据进行背景渲染,那么我会使用Table Row Rendering方法。