JTable с фильтром строк и пользовательским средством визуализации не отображает значки объектов должным образом - PullRequest
2 голосов
/ 15 марта 2012

У меня есть 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);

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

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

При запуске приложения без фильтрации будут отображаться два столбца с правильным соответствием пары icon-type <-> object-type

| 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 |

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

...