2012-04-25 1 views
13

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

Я также, возможно, потребуется убедитесь, что контент-ориентированная формация применяется к строкам после обновления содержимого, но я еще не решил, что , Я уже перезаписываю custTableModel.setValueAt (Object, int, int), поэтому я думал, что у меня там много вариантов, но подумал, что я должен это упомянуть. – Panky

+1

ваш prepareRenderer ничего не делает и усложняет CustTableModel thisModel = (CustTableModel) getModel() ;, удалить, [Renderer только о создании, изменении цвета и т. Д.] (Http://stackoverflow.com/search?q=user%3A714968 + prepareRenderer), а не для создания JComponent, don9t do – mKorbel

+0

@kKorbel Я не уверен, если я последую вашему комментарию. getRowForeColor и getRowBackgroundColor добавляют условную раскраску для строки, основываясь на содержимом строки (следовательно, передавая rowIdx). Я использую метод super для создания компонента, а затем просто устанавливаю правильный цвет фона и переднего плана для этого компонента. Мне нужно получить TableModel и применить его к моей CustTableModel, потому что getRow [Fore | Background] Цвет не является определенным методом для других моделей таблиц. – Panky

ответ

13

вы должны convert row index from View to the Model

int modelRow = convertRowIndexToModel(row); 
+2

черт, вы избили меня (по-прежнему борется с моей новой клавиатурой :-) +1, конечно – kleopatra

+0

Удивительный! Спасибо за подсказку, я некоторое время смотрел на Javadoc для JTable, но так и не наткнулся на это. – Panky

+2

@Panky: «При использовании сортировщика всегда помните о переводе координат ячейки». [Сортировка и фильтрация] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting); к сожалению, мне приходилось искать его не один раз. :-) – trashgod

Смежные вопросы