Изменить цвет строки в Swing JTable после сортировки строк - PullRequest
1 голос
/ 16 октября 2011

Мы используем JTable, который отображает данные вместе со статусом (Новый, Обработан, Закрыт).Каждая строка состояния имеет свой цвет, который достигается перегрузкой prepareRenderer () JTable.

Теперь нам нужно отсортировать эту таблицу, и мы используем table.setAutoCreateRowSorter (true);чтобы достичь этого.Строки сортируются правильно, но цвет строк остается прежним.После этой операции нам нужно повторно применить цвет ко всем строкам на основе столбца состояния.

Мне было интересно, что может быть лучшим способом для достижения этой цели.Есть несколько способов, о которых я могу подумать:

  1. Перекрасить / заново проверить таблицу.Но, думаю, простое выполнение этого не сработает.
  2. Захватите событие mouseClicked и определите, был ли нажат заголовок столбца, затем вызовите prepareRenderer () вручную, а затем вызовите repaint / revalidate
  3. Затем я прочитал один извопросы здесь, где в одном из ответов было упомянуто не вызывать repaint / revalidate напрямую, а изменить базовую модель данных, и она автоматически вызовет вышеуказанные методы.

Я не знаю, как поступитьоб этом.Может ли кто-нибудь дать представление о том, как правильно этого добиться?

1 Ответ

8 голосов
/ 05 апреля 2012

Для изменения цвета ячейки в JTable с помощью setAutoCreateRowSorter (true) я использовал метод table.getRowSorter (). ConvertRowIndexToModel (row) в моем TableCellRenderer

import javax.swing.*;

import javax.swing.table.DefaultTableCellRenderer;

import javax.swing.table.TableModel;

import java.awt.*;

public class OwnTableCellRenderer extends DefaultTableCellRenderer {

    public OwnTableCellRenderer() {
        super();
        setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, 
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, 
                                                   int row, 
                                                   int column) {

        setBackground(Color.white);
        setForeground(Color.black);

        TableModel model = table.getModel();
        int modelRow = table.getRowSorter().convertRowIndexToModel(row);
        int columnStatusPosition = 5;
        String statusColumnValue = (String) model.getValueAt(modelRow, columnStatusPosition);

        if (statusColumnValue.equals("ACTIVE")) {
            if (isSelected) {
                setBackground(Color.green);
            } else {
                setBackground(Color.yellow);
            }
        }

        setText(value != null ? value.toString() : "");
        return this;
    }
}

И затем

table.setDefaultRenderer(Object.class, new OwnTableCellRenderer());
...