Окраска ячеек определенными цветами в зависимости от значения в предыдущей строке JXTreeTable

У меня есть 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;
}

person Bonnotbh    schedule 01.03.2011    source источник


Ответы (2)


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

person jzd    schedule 01.03.2011
comment
Я думал об этом, но идентификаторы могут быть от 1 до 30 000 и не обязательно последовательные, например. может быть 1,2,3 или 2,4,6 или 9,18,27 и т. д. - person Bonnotbh; 01.03.2011
comment
@Bonnotbh упорядочивает их в любом порядке, в котором они расположены в дереве. Поместите любой другой идентификатор в HashSet. При выборе цвета, если идентификатор существует в наборе, используйте цвет1, иначе — цвет2. - person jzd; 01.03.2011
comment
Хорошо также, когда таблица отсортирована, идентификаторы могут быть в любом положении, и может быть от 1 до 15 строк с одним и тем же идентификатором, поэтому у вас может быть 1, 2, 16, 1, 52, 2, 2 или любая комбинация В самом деле. Цель состоит в том, чтобы иметь 2 цвета и чередовать их всякий раз, когда строка имеет другой идентификационный номер по сравнению с предыдущей строкой. Также в таблицу будет постоянно добавляться больше строк. - person Bonnotbh; 01.03.2011
comment
В этом случае вам нужно будет построить набор строк, которым нужен один цвет всякий раз, когда таблица пересматривается или добавляются новые данные. - person jzd; 01.03.2011

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

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

person camickr    schedule 01.03.2011