カスタムセルレンダラーを備えたJXTreeTableがあります。行のフィールドが前の行のフィールドと異なる場合に、行の背景色を変更しようとしています。たとえば、行にIDとして「1」が含まれているとします。前の行にも「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;
}