Выделите текст в средстве просмотра отчетов Jasper

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

Но JRViewer, который я использую, на самом деле не имеет большого количества API.
И манипулирование объектом JasperPrint с помощью setForecolor/setBackcolor перед его отображением, похоже, не изменило вывод.

Есть идеи? Или я должен перегрузить / переопределить зрителя? Не будет большой проблемой, так как это открытый код, но я бы хотел не изобретать велосипед заново.

1 ответ

Похоже, я должен ответить на мои вопросы сам... снова.

Я перегружал класс JRViewer (фактически скопировал код JRViewer, потому что ни одна из интересных панелей не была доступна) и добавил несколько методов подсветки, чтобы сделать следующее:

Данные на основе шаблонов JasperPrint используют - как следует из названия - шаблоны. Это означает, что у текстовых объектов нет собственного стиля, они используют стиль своего шаблона.
Вот почему setForecolor ничего не делал - реализация JRTemplatePrintElement просто пуста.

Но если бы я установил подсветку в текстовом шаблоне, я бы закончил полным столбцом выделенных текстов, так как они разделяют экземпляр шаблона.
Вместо этого я создаю новый шаблон как копию оригинала с подсветкой и использую его в выделенных элементах печати. Кстати, эти элементы яшмы действительно могут использовать метод clone().
Похоже на хак, но я не вижу лучшего способа.

ОБНОВИТЬ:
Однако это имеет неприятный побочный эффект для файловых (виртуализированных) отчетов. Они, очевидно, сохраняют все изменения, которые вы вносите в элементы во время просмотра страниц. Однако, если в то же время программа просмотра заставляет виртуализатор отбрасывать элементы, на которые вы ссылаетесь (например, перелистывая страницы), ваши дальнейшие изменения не будут сохранены...

Так что это заставило меня пересмотреть свое мнение, и теперь я просто рисую свое выделение поверх объекта Graphics, нарисованного PageRenderer Джаспера.
Намного проще и чище. Только выделение фона не будет работать таким образом.

Другие вопросы по тегам