Создание темы для диаграмм в JasperReports

В JasperReports можно создавать свои темы для диаграмм. Темы дают полный контроль над созданием объектов JFreeChart. Их можно использовать вместо customizer классов.

Для начала необходимо создать класс темы, реализующий интерфейс net.sf.jasperreports.charts.ChartTheme. У этого интерфейса есть всего один метод:

Этот метод должен возвращать созданный элемент JFreeChart. Создание темы с нуля довольно большая задача. Лучше сделать свой класс наследником от класса net.sf.jasperreports.engine.fill.DefaultChartTheme. В качестве примера сделаем тему, которая будет добавлять надписи значений в диаграммах вида StackedAreaChart:

Тема готова. Чтобы её подключить нужно создать в проекте ещё несколько классов.

Класс MyChartThemeBundle, реализующий интерфейс net.sf.jasperreports.charts.ChartThemeBundle. У него есть два метода. Метод getChartTheme возвращает тему по названию. Метод getChartThemeNames возвращает массив со списком наших тем.

Класс, реализующий интерфейс net.sf.jasperreports.extensions.ExtensionsRegistryFactory должен возвращать наш класс MyChartThemeBundle  в своём интерфейсе.

Обратите внимание, что класс сравнивает аргумент extensionType с ChartThemeBundle.class и возвращает наш MyChartThemeBundle только тогда, когда ожидаются темы диаграмм.

Нужно зарегистрировать наш класс MyExtensionRegistryFactory. Для этого нужно поместить файл jasperreports_extension.properties в src/main/resources нашего Maven проекта. В этом файле должна быть строчка вида:

То есть net.sf.jasperreports.extension.registry.factory.<любое окончание>=<класс ExtensionRegistryFactory>

Всё. Тема готова и доступна для использования. На этом этапе тема уже должна быть видна в форме редактирования отчётов в списке тем для диаграмм. Если она не видна, то, возможно, нужно закрыть IDE и открыть снова, чтобы JasperStudio её увидел. Создадим отчёт с диаграммой, использующей нашу тему (theme=»myTheme»), чтобы проверить её:

Java код генерации отчёта по этому шаблону:

Java класс, генерирующий отчёт, и шаблон отчёта должны быть в одном пакете, в одной папке.

В идеале всё уже должно работать. Но нет. Если мы запустим отчёт на исполнение сейчас, то увидим, что наш код темы выполняется, но надписи не появялются. Это баг. Он связан с использованием старой версии JFreeChart в JasperReports.  В версии 6.0.3 используется JFreeChart версии 1.0.12. Я выявил этот баг создав диаграмму StackedAreaChart в чистом JFreeChart, без JasperReports, и надписей не было. Уберём в pom.xml зависимость от старого JFreeChart  и добавим зависимость от последнего JFreeChart. Вот так будет выглядеть конечный pom.xml:

Теперь всё должно работать. Собираем проект и запускаем. Результат:

2015-06-30 15-28-55 Скриншот экрана

Ссылки:

https://github.com/urvanov-ru/java-examples/tree/master/jasper-reports-chart-theme — Проект на github. Поставьте звезду, пожалуйста.

jasper-reports-chart-theme — ZIP архив Maven проекта.

https://github.com/urvanov-ru/java-examples/tree/master/jfreechart-stackedarealabels — Пример, показывающей, что в JFreeChart версии 1.0.12 надписи не показываются, хотя настройки setBaseItemLabelsVisible и прочие выставлены. Поставьте звезду, пожалуйста.

http://jasperreports.sourceforge.net/sample.reference/chartthemes/index.html — пример создания тем для диаграмм в JasperReports.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *