У меня есть сортируемый JTable
, настроенный для использования пользовательского расширения AbstractTableModel
. Тем не менее, какое-то поведение этой таблицы является тем, что я ожидал, и мне хотелось бы получить некоторые советы о том, как это понять.JTable Clickable Column Sorting: Сортировка сортирует содержимое ячеек, но не обновляет форматирование ячейки?
У меня есть 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;
}
};
Я также, возможно, потребуется убедитесь, что контент-ориентированная формация применяется к строкам после обновления содержимого, но я еще не решил, что , Я уже перезаписываю custTableModel.setValueAt (Object, int, int), поэтому я думал, что у меня там много вариантов, но подумал, что я должен это упомянуть. – Panky
ваш prepareRenderer ничего не делает и усложняет CustTableModel thisModel = (CustTableModel) getModel() ;, удалить, [Renderer только о создании, изменении цвета и т. Д.] (Http://stackoverflow.com/search?q=user%3A714968 + prepareRenderer), а не для создания JComponent, don9t do – mKorbel
@kKorbel Я не уверен, если я последую вашему комментарию. getRowForeColor и getRowBackgroundColor добавляют условную раскраску для строки, основываясь на содержимом строки (следовательно, передавая rowIdx). Я использую метод super для создания компонента, а затем просто устанавливаю правильный цвет фона и переднего плана для этого компонента. Мне нужно получить TableModel и применить его к моей CustTableModel, потому что getRow [Fore | Background] Цвет не является определенным методом для других моделей таблиц. – Panky