Окрашивание ячеек определенными цветами в зависимости от значения в предыдущей строке JXTreeTable - PullRequest
2 голосов
/ 01 марта 2011

У меня есть JXTreeTable с пользовательским средством визуализации ячеек. Я пытаюсь изменить цвет фона строки, если поле в строке отличается от поля в предыдущей строке. Скажем, например, что строка содержит «1» в качестве идентификатора. Если предыдущая строка также содержала «1», я хочу, чтобы эта строка была окрашена в тот же цвет. Если предыдущий был "2", я хочу, чтобы этот ряд был окрашен в альтернативный цвет. Цель состоит в том, чтобы сгруппировать строки с одинаковым идентификатором.

Первоначально я сохранял ранее окрашенный цвет и использовал его (вместе со значением), чтобы определить, какой цвет рисовать в текущей строке. Однако это работало только при полной покраске стола сверху вниз. В настоящее время я выбираю фоновый цвет предыдущих строк и использую его для определения, но если строка выбрана или иным образом отличается, это портит цвета. Есть ли лучший способ сделать это?

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 ]

1 голос
/ 01 марта 2011

Я пытаюсь изменить цвет фона строки, если поле в строке отличается от поля в предыдущей строке

Если вы пытаетесь выполнить фоновый рендеринг на основе данных в строке, тогда я бы использовал Рендеринг строк таблицы .

1 голос
/ 01 марта 2011

Если вы не сильно меняете свои данные, вы можете просто предварительно определить цвета для каждого идентификатора и просмотреть их, прежде чем устанавливать фон каждый раз.

...