JTable TableCellRenderer не красится правильно - PullRequest
0 голосов
/ 08 июня 2018

Я создал простой JTable с моим пользовательским DefaultTableCellRenderer.Сам по себе он работает нормально (окраска последней колонки).Но как только я выберу строку ИЛИ отфильтрую / отфильтрую ее, строка будет окрашена, даже если она вообще не должна быть цветной.

Мой рендер:

public class StatusCellRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int col) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                table.convertRowIndexToModel(row), col);
        DataTableModel model = (DataTableModel) table.getModel();
        String data = model.getValueAt(table.convertRowIndexToModel(row), col).toString();
        if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(Color.GREEN);
        }
        if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(new Color(255, 51, 51));
        }
        return c;
    }
}

Как этоИзначально выглядит (и как это всегда должно выглядеть):

enter image description here

И после выбора 2 строк (верхней и нижней):

enter image description here

Как видите, есть несколько рядов ЗЕЛЕНЫХ, которые вообще не должны быть окрашены.Еще более тревожным является тот факт, что я выбрал только верхний и нижний ряд зеленого блока, что означает, что он автоматически также окрашивает строки между ними.

Как я могу остановить это поведение и толькоцвет строк, как показано на первом рисунке?


Принятый ответ очень помог мне преодолеть проблемы, и вот окончательный код:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int col) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
            table.convertRowIndexToModel(row), table.convertColumnIndexToModel(col));
    DataTableModel model = (DataTableModel) table.getModel();
    String data = model.getValueAt(table.convertRowIndexToModel(row), table.convertColumnIndexToModel(col))
            .toString();
    if (!isSelected) {
        if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(Color.GREEN);
        } else if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
            c.setBackground(new Color(255, 51, 51));
        } else {
            c.setBackground(Color.WHITE);
        }
    } else {
        c.setBackground(c.getBackground());
    }
    return c;
}

Этосиний цвет, если ячейка выбрана, а если нет, то цвет БЕЛЫЙ, ЗЕЛЕНЫЙ или КРАСНЫЙ в зависимости от значения

1 Ответ

0 голосов
/ 08 июня 2018

Поскольку компонент рендерера будет использоваться повторно, рассмотрите возможность установки цвета по умолчанию, если не найдено ни одного условия:

    if (col == 3 && data.equalsIgnoreCase("successful") && !data.isEmpty()) {
        c.setBackground(Color.GREEN);
    }
    else if (col == 3 && !data.equalsIgnoreCase("successful") && !data.isEmpty()) {
        c.setBackground(new Color(255, 51, 51));
    }
    else {
        c.setBackground(Color.GRAY.brighter());
    }
...