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