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