SwingX JXTable: используйте ColorHighlighter для окрашивания строк на основе объекта строки

Я использую JXTable и знаю, как это сделать на основе DefaultRenderers для JTable, но я хочу знать, как это сделать так, чтобы это было удобно для JXTable, на основе HighlighterPipeline.

У меня есть список объектов, отображаемых в таблице, и каждая строка представляет один объект. Я хотел бы покрасить строки, отображающие объекты определенного типа, в другой цвет.

Похоже, мне следует использовать ColorHighlighter. Но я не могу найти примеров для этого, кроме простых маркеров, таких как «раскрашивать каждую вторую строку» или что-то в этом роде.

Мне нужен номер строки, так как в парадигме JTable/TableModel нет такого понятия, как «объект строки», но если я могу это сделать, я могу легко протестировать предикат и вернуть true/false, чтобы указать подсветчику включаться или нет. .

Может ли кто-нибудь помочь мне понять правильное направление, чтобы заставить это работать?


person Jason S    schedule 20.03.2012    source источник


Ответы (1)


неважно, я разобрался. Было просто сложно понять, как правильно использовать ComponentAdapter.

JXTable table = ...
final List<Item> itemList = ...

final HighlightPredicate myPredicate = new HighlightPredicate() {
      @Override 
      public boolean isHighlighted(
            Component renderer, 
            ComponentAdapter adapter) {

            Item item = itemList.get(adapter.row);
            return testItem(item);
      }

      public boolean testItem(Item item) { ... }
}

ColorHighlighter highlighter = new ColorHighlighter(
      myPredicate,
      Color.RED,   // background color
      null);       // no change in foreground color

table.addHighlighter(highlighter);
person Jason S    schedule 20.03.2012
comment
рад, что вы нашли решение - просто будьте осторожны: adapter.row находится в координатах представления, а ваш itemList (скорее всего?) - в координатах модели, поэтому тест вернет неверные результаты, если таблица отсортирована/отфильтрована. Чтобы исправить это, вызовите adapter.convertRowIndexToModel. - person kleopatra; 21.03.2012
comment
хорошо, спасибо - я специально отключаю сортировку JXTable, чтобы использовать средства сортировки GlazedLists, поэтому мои индексы согласуются с окончательными отображаемыми строками. Спасибо хоть! - person Jason S; 21.03.2012
comment
p.s. что случилось с пайплайнами Highlighter? они ушли? Я пытаюсь найти общую информацию о маркерах JXTable, и это случайный набор устаревших материалов. - person Jason S; 21.03.2012
comment
да, конвейеры исчезли (не нужно их оставлять после нацеливания на jdk6). Документация в руинах, извините за это - единственный способ учиться - это на примере: демонстрации, код в тестовых пакетах, некоторые разделы в инкубаторе и, возможно, заметки о дизайне рендеринга вики (много неработающих ссылок из-за переноса проекта ... ааааа) Приглашаем спросить, если у вас возникнут проблемы :-) - person kleopatra; 21.03.2012
comment
@JasonS У меня аналогичное требование. Но я новичок в SwingX, и я попытался скопировать и вставить ваш код, но Item, adapter.row и т. д., похоже, не разрешаются. У вас есть полный рабочий пример? - person coding_idiot; 16.03.2013
comment
@kleopatra мой jxtreetable отсортирован, и я вижу, что это создаст проблему. Но я не могу понять, как это решить, потому что указанного вами метода тоже не существует. У вас есть полный рабочий пример? - person coding_idiot; 16.03.2013
comment
@XCoder не знает, что вы подразумеваете под отсортировано (сортировка/фильтрация не поддерживается таблицей дерева). В любом случае, ничего нового в моем последнем комментарии, в котором перечислены некоторые ресурсы, содержащие полноценные примеры. И, пожалуйста, задайте свой вопрос, желательно с SSCCE :-) - person kleopatra; 16.03.2013