根据前一行JXTreeTable中的值绘制单元格某些颜色

时间:2011-03-01 12:42:24

标签: java swing jtable swingx tablecellrenderer

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

当一行中的字段与上一行中的字段不同时,我试图获取行的背景颜色

如果您尝试根据连续数据进行背景渲染,那么我会使用Table Row Rendering方法。