2

我有一个带有自定义单元格渲染器的 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;
}
4

2 回答 2

1

当一行中的字段与前一行中的字段不同时,我试图让行的背景颜色发生变化

如果您尝试基于一行中的数据进行后台渲染,那么我将使用Table Row Rendering方法。

于 2011-03-01T16:04:32.473 回答
1

如果您没有太多更改数据,您可以预先确定每个 id 的颜色并在每次设置背景之前查找它们。

于 2011-03-01T13:02:49.057 回答