JTable с фильтром строк и пользовательским средством визуализации неправильно отображает значки объектов.

У меня есть JTable с пользовательским средством визуализации, которое устанавливает значок в ячейке.

myTable.setDefaultRenderer(MyClass.class, new DefaultTableCellRenderer() {
   public Component getTableCellRendererComponent(...) {

         JLabel label = table.getTableCellRendererComponent(...);
         label.setIcon(iconMap.get( object_type );

         return label;
   }
});

Где iconMap содержит ссылки на разные значки, а object_type — это тип, на основе которого я хочу, чтобы значок отображался рядом с меткой. В результате в таблице отображаются ячейки в одном из столбцов со значками, различающимися по типу. Это ожидаемое поведение.

Далее я хотел бы отфильтровать строки по типу, я использую

TableRowSorter<> sorter = new TableRowSorter(myModel);
RowFilter<> filter = new RowFilter<>() {
    public boolean include(...) {
         if ( expected_type ) 
                return true;

          return false;
    }

}
sorter.setRowFilter(filter);
myTable.setRowSorter(sorter);

Так что в основном это делается «по правилам», ничего захватывающего дух.

Проблема в том, что значки ячеек отображаются, так как фильтр не установлен.

Запуск приложения без фильтрации отобразит два столбца с правильным соответствием пары тип значка ‹-> тип объекта.

| A-type-icon | A-type-object |
| B-type-icon | B-type-object |
| B-type-icon | B-type-object |
| B-type-icon | B-type-object |

Выполнение того же с фильтром, который фильтрует объекты типа A, будет

| A-type-icon | B-type-object |
| B-type-icon | B-type-object |
| B-type-icon | B-type-object |

Похоже, объекты сначала визуализируются, а затем фильтруются. Что я могу сделать (или что я делаю неправильно), чтобы иконки отображались правильно.


person David Warsow    schedule 14.03.2012    source источник
comment
Вам не хватает return в классе рендерера. Может быть, только здесь.   -  person Jakub Zaverka    schedule 15.03.2012
comment
Это всего лишь краткий код, и оператор возврата присутствует. Без него иконки вообще не отображались бы.   -  person David Warsow    schedule 15.03.2012
comment
В ПОРЯДКЕ. То, что вы описываете, МОЖЕТ быть несоответствием между индексами модели и индексами представления. Если вы сортируете/фильтруете данные, индексы в таблице больше не соответствуют индексам в модели. Вы выбираете объект где-то по его положению в таблице?   -  person Jakub Zaverka    schedule 15.03.2012
comment
Точно, теперь я знаю, для чего нужны методы table.convertRowIndexToView(row) :) Отлично, приятель.   -  person David Warsow    schedule 15.03.2012
comment
@David Warsow, пожалуйста, смотрите мой ответ здесь   -  person mKorbel    schedule 15.03.2012
comment
Поскольку кто-то ясно понял проблему здесь, может ли кто-нибудь опубликовать ответ? Я подозревал, что это как-то связано с буквальным индексом строки по сравнению с отображаемым индексом строки, но это мне не помогает, потому что я не знаю, как это контролировать. Все, что у меня есть, это визуализатор, который дает мне индекс, и редактор, который дает мне индекс. Оба правильны, это просто рисование в неправильном ряду. Где я должен преобразовать строку?   -  person searchengine27    schedule 15.12.2015
comment
В конце концов я понял это. У меня был рендерер, который определял, как его рисовать, основываясь на номере строки, поступающей в рендерер, которая была строкой представления. Поэтому я попросил таблицу дать мне строку из модели на основе строки представления, и это решило проблему.   -  person searchengine27    schedule 15.12.2015