Выделите текст в средстве просмотра отчетов Jasper
Я хочу выделить некоторые части отчетов, которые я создаю для отображения.
Я не хочу менять определение отчета. Я хочу выделить вывод во время выполнения.
Но JRViewer, который я использую, на самом деле не имеет большого количества API.
И манипулирование объектом JasperPrint с помощью setForecolor/setBackcolor перед его отображением, похоже, не изменило вывод.
Есть идеи? Или я должен перегрузить / переопределить зрителя? Не будет большой проблемой, так как это открытый код, но я бы хотел не изобретать велосипед заново.
1 ответ
Похоже, я должен ответить на мои вопросы сам... снова.
Я перегружал класс JRViewer (фактически скопировал код JRViewer, потому что ни одна из интересных панелей не была доступна) и добавил несколько методов подсветки, чтобы сделать следующее:
Данные на основе шаблонов JasperPrint используют - как следует из названия - шаблоны. Это означает, что у текстовых объектов нет собственного стиля, они используют стиль своего шаблона.
Вот почему setForecolor ничего не делал - реализация JRTemplatePrintElement просто пуста.
Но если бы я установил подсветку в текстовом шаблоне, я бы закончил полным столбцом выделенных текстов, так как они разделяют экземпляр шаблона.
Вместо этого я создаю новый шаблон как копию оригинала с подсветкой и использую его в выделенных элементах печати. Кстати, эти элементы яшмы действительно могут использовать метод clone().
Похоже на хак, но я не вижу лучшего способа.
ОБНОВИТЬ:
Однако это имеет неприятный побочный эффект для файловых (виртуализированных) отчетов. Они, очевидно, сохраняют все изменения, которые вы вносите в элементы во время просмотра страниц. Однако, если в то же время программа просмотра заставляет виртуализатор отбрасывать элементы, на которые вы ссылаетесь (например, перелистывая страницы), ваши дальнейшие изменения не будут сохранены...
Так что это заставило меня пересмотреть свое мнение, и теперь я просто рисую свое выделение поверх объекта Graphics, нарисованного PageRenderer Джаспера.
Намного проще и чище. Только выделение фона не будет работать таким образом.