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

У меня есть сортируемый 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;
    }
};

person Panky    schedule 25.04.2012    source источник
comment
Мне также может понадобиться убедиться, что форматирование на основе содержимого применяется к строкам после обновления содержимого, но я еще не занимался этим. Я уже перезаписываю custTableModel.setValueAt(Object, int, int), поэтому подумал, что у меня есть много вариантов, но подумал, что должен упомянуть и об этом.   -  person Panky    schedule 25.04.2012
comment
ваш prepareRenderer ничего не делает и комплитирует с CustTableModel thisModel = (CustTableModel) getModel();, удалите это, Renderer предназначен только для форматирования , изменить цвет и т. д., не для создания JComponent, не делайте этого   -  person mKorbel    schedule 25.04.2012
comment
@kKorbel Я не уверен, что следую твоему комментарию. getRowForeColor и getRowBackgroundColor добавляют условную окраску для строки на основе содержимого строки (следовательно, передают rowIdx). Я использую метод super для создания компонента, а затем просто устанавливаю правильный цвет фона и переднего плана для этого компонента. Мне нужно получить TableModel и привести ее к CustTableModel, потому что getRow[Fore|Background]Color не является определенным методом для других моделей таблиц.   -  person Panky    schedule 25.04.2012
comment
мне любопытны детали getRowBackgroundColor()); код внутри? @Пэнки   -  person gumuruh    schedule 28.08.2017


Ответы (2)


вам нужно преобразовать индекс строки из представления в модель

int modelRow = convertRowIndexToModel(row);
person mKorbel    schedule 25.04.2012
comment
блин, ты меня опередил (до сих пор воюю с моей новой клавиатурой :-) +1, конечно - person kleopatra; 25.04.2012
comment
Потрясающий! Спасибо за совет, я некоторое время просматривал Javadoc для JTable, но как-то не наткнулся на это. - person Panky; 25.04.2012
comment
@Panky: при использовании сортировщика всегда не забывайте переводить координаты ячеек. ">Сортировка и фильтрация; к сожалению, мне приходилось искать его не раз. :-) - person trashgod; 26.04.2012

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

для получения дополнительной информации посетите этот сайт http://www.codejava.net/java-se/swing/6-techniques-for-sorting-jtable-you-should-know

person Filip Kováč    schedule 01.05.2016
comment
Я не могу поверить, что этот ответ не является принятым ответом. Так элегантно и просто. Спасибо - person Mijo; 09.07.2021