JTable Clickable Column Sorting :Сортировка сортирует содержимое ячеек, но не обновляет форматирование ячеек? #39;

У меня есть сортируемый JTable, настроенный на использование пользовательского расширения AbstractTableModel. Тем не менее, некоторое поведение этой таблицы - это то, что я ожидал, и мне бы хотелось получить совет о том, как это понять.

Я настроил JTable для сортировки с помощью:

thisJTable.setAutoCreateRowSorter(true);

Это позволяет мне сортировать таблицу, щелкая заголовки столбцов, как и ожидалось.

Однако я обнаружил, что когда я сортирую таблицу, щелкая заголовки столбцов, форматирование (фона и цвета переднего плана )моих строк также не сортируются.

Я установил для этих строк цветовую -кодировку на основе содержащихся в них значений. Когда я сортирую по заголовку столбца, форматирование данной строки NUMBER остается прежним (, хотя содержимое, которое ранее было в этой строке, перемещается ).

Цвет строки задается путем переопределения вызова по умолчанию prepareRendererдля JTable:

thisTable = new JTable(thisModel){

    //Set up custom rendering - Sets background color of row to correct value
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        CustTableModel thisModel = (CustTableModel) getModel();
        c.setBackground(thisModel.getRowBackgroundColor(row));
        c.setForeground(thisModel.getRowForeColor(row));
        return c;
    }
};

Есть ли лучший/другой способ приблизиться к этому?

Должен ли я использовать другой метод для рендеринга, метод, который будет обновлять рендеринг JTable при сортировке?

Или я хочу написать свой собственный метод сортировки?

Решение (Спасибо, mKorbel!)

Я решил опубликовать свое решение, так как мне пришлось немного поиграть с этим, так как я не был уверен, будет ли новый индекс также передан в prepareRenderer.

 thisTable = new JTable(thisModel){

    //Set up custom rendering - Sets background color of row to correct value
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {

        int viewIdx = row;
        int modelIdx = convertRowIndexToModel(viewIdx);
        Component c = super.prepareRenderer(renderer, row, column);
        CustTableModel thisModel = (CustTableModel) getModel();
        c.setBackground(thisModel.getRowBackgroundColor(modelIdx));
        c.setForeground(thisModel.getRowForeColor(modelIdx));
        return c;
    }
};
19
задан Michael 11 September 2017 в 16:52
поделиться