410013796724260
• Webmoney
R335386147728
Z369087728698
Модуль создания диаграммУтилита util-jfreechart, выполненная по технологии OSGi, позволяет ускорить процесс подготовки набора данных и создания диаграмм для их представления в приложениях на платформе JaBricks. Графическая библиотекаДля создания диаграмм util-jfreechart использует свободно распространяемую графическую библиотеку
org.jfree.jfreechart-1.0.19.jar с исходными кодами, которую можно скачать из репозитория
https://mvnrepository.com/artifact/org.jfree/jfreechart/1.0.19, <!-- зависимость в pom --> <dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.19</version> </dependency> либо с оффициального сайта http://www.jfree.org/jfreechart. В готовом виде библиотека org.jfree.jfreechart не может быть использована в OSGi-приложении, поскольку не является бандлом. Наличие исходных кодов библиотеки позволило создать из неё OSGi-бандл (osgi-jfreechart-1.0.19.jar), который доступен как для приложений на платформе JaBricks, так и других OSGi-приложений, использующих Swing. Преимущества использования util-jfreechartМодуль util-jfreechart позволяет существенно ускорить процесс подготовки наборов данных, создания и настройки разничных типов диаграмм для их представления в OSGi-приложениях. Структура util-jfreechartНа скриншоте представлена структура проекта util-jfreechart в IDE Eclipse. Внутри проекта в поддиректории repo создан репозиторий для графической библиотеки osgi-jfreechart, наличие которой в проекте необходимо для определения соответствующих зависимостей в pom.xml. В таблице представлен список и краткое описание используемых в модуле классов.
Типы записей для создания DatasetОдна из задач при построении диаграмм связана с подготовкой соответствующих наборов записей. Диаграммы различного типа требуют разные наборы данных. Библиотека org.jfree.jfreechart включает классы TimeSeriesDataItem и XYDataItem, используемые при создании соответственно наборов TimeSeries и XYSeries для временны́х и кусочно-линейных диаграмм. Поскольку подобных классов для создания наборов столбчатых и круговых диаграмм библиотека org.jfree.jfreechart не имеет, то в утилиту base-jfreechart включены два класса, имеющих подобные наименования : CategoryDataItem, PieDataItem. CategoryDataItem, запись для столбчатой диаграммыКласс CategoryDataItem следует использовать для формирования наборов данных при построении столбчатых диаграмм (гистограмм). Ниже представлен листинг класса без отображения методов get/set. Тип двух полей класса rowKey и columnKey определен как интерфейс Comparable<?>, используемый графической библиотекой org.jfree.jfreechart для сортировки данных.
public class CategoryDataItem { private Comparable<?> rowKey ; private Comparable<?> columnKey; private Double value ; public CategoryDataItem() {} public CategoryDataItem(Double value, Comparable<?> rowKey, Comparable<?> columnKey) { this.value = value ; this.rowKey = rowKey ; this.columnKey = columnKey; } // Методы get/set . . . } Пример создания коллекции CategoryDataItemВ следующем примере создается коллекция записей List<CategoryDataItem> :
String[][] INCOME = {{"52733", "Янв", "Доходы 2018"}, {"51345", "Фев", "Доходы 2018"}, {"52600", "Мар", "Доходы 2018"}, {"53300", "Апр", "Доходы 2018"}, {"53245", "Май", "Доходы 2018"}, {"53000", "Июн", "Доходы 2018"}}; List<CategoryDataItem> data_category; data_category = new ArrayList<CategoryDataItem>(); for (int i = 0; i < INCOME.length; i++) { CategoryDataItem cdi = new CategoryDataItem(); cdi.setValue (Double.valueOf(INCOME[i][0])); cdi.setColumnKey(INCOME[i][1]); cdi.setRowKey (INCOME[i][2]); data_category.add(cdi); } PieDataItem, запись для круговой диаграммыКласс PieDataItem следует использовать для формирования наборов данных при построении круговых диаграмм. Ниже представлен листинг класса без представления методов get/set. public class PieDataItem { private String name ; private Double value; public PieDataItem() {} public PieDataItem(String name, Double value) { this.name = name; this.value = value; } } // Методы get/set . . . Пример создания коллекции PieDataItemВ следующем примере создается коллекция записей типа List<PieDataItem> : String[][] SECTIONS = {{ "99535", "Квартира" }, {"520000", "Питание" }, { "48000", "Бассейн, фитнес" }, {"235450", "Развлечения, отпуск"}, { "58600", "Автомобиль" }, { "15000", "Дача" }}; List<PieDataItem> data_pie; data_pie = new ArrayList<PieDataItem>(); for (int i = 0; i < SECTIONS.length; i++) { double value; value = Double.valueOf(SECTIONS[i][0]).doubleValue(); data_pie.add(new PieDataItem(SECTIONS[i][1], value)); } Классы описания диаграммПри построении диаграммы необходимо определить как настройки общих параметров (заголовок и подзаголовок, цвет фона, осевые линии, легенду и всплывающие подсказки), так и настройки диаграммы определенного типа (положение, цвет и толщину линий, фигуры в узловых точках, параметры сетки и т.д.). Конечно же, библиотека org.jfree.jfreechart не ограничивается только данными настройками, и может включать более тонкие настройки, связанные с надписями, маркерами и т.д. Но это, скорее всего, не будет иметь общего характера. Представленные ниже классы позволяют «упаковать» описание диаграммы в определенный объект типа ChartDesc, который в дальнейшем можно использовать для создания диаграммы вызовом соответствующего метода класса JFreeChartImpl. Базовый класс ChartDescКласс ChartDesc включает четыре поля, представленные в листинге. В конструкторе класса устанавливаются флаги представления в диаграмме легенды (legend), всплывающей подсказки (tooltips), а также определяются настройки параметров заголовка (textTitle) и подзаголовка (textSubtitle) диаграммы. Дополнительно класс включает методы определения шрифта, положения, цвета и выравнивания заголовка и подзаголовка.
public class ChartDesc { private boolean legend ; // легенда private boolean tooltips; // подсказка private TextTitle textTitle ; // заголовок private TextTitle textSubtitle; // подзаголовок public ChartDesc() { legend = true; tooltips = true; textTitle = new TextTitle(); Font font = new Font("Arial", Font.BOLD, 26); textTitle.setFont (font); textTitle.setPosition (RectangleEdge.TOP); textTitle.setHorizontalAlignment( HorizontalAlignment.CENTER); textTitle.setPaint(Color.DARK_GRAY); textSubtitle = new TextTitle(); Font font = new Font("Arial", Font.BOLD, 12); textSubtitle.setFont (font); textSubtitle.setPosition (RectangleEdge.TOP); textSubtitle.setHorizontalAlignment( HorizontalAlignment.CENTER); textSubtitle.setPaint(Color.DARK_GRAY); } //----------------------------------------------------- public boolean isLegend() { return legend; } public void setLegend(boolean legend) { this.legend = legend; } public boolean isTooltips() { return tooltips; } public void setTooltips(boolean tooltips) { this.tooltips = tooltips; } //----------------------------------------------------- public String getTitle() { return textTitle.getText(); } public void setTitle(String title) { textTitle.setText(title); } public String getSubtitle() { return textSubtitle.getText(); } public void setSubtitle(String subtitle) { this.textSubtitle.setText(subtitle); } public TextTitle getTextTitle() { return textTitle; } public TextTitle getTextSubtitle() { return textSubtitle; } //----------------------------------------------------- public void setTextTitleFont (final Font font) { textTitle.setFont (font); } public void setTextTitleColor (final Color color) { textTitle.setPaint (color); } public void setTextTitlePosition(RectangleEdge position) { textTitle.setPosition (position); } public void setTextTitleAlignment(HorizontalAlignment alignment) { textTitle.setHorizontalAlignment (alignment); } //----------------------------------------------------- public void setSubtextTitleFont (final Font font) { textSubtitle.setFont (font); } public void setSubtextTitleColor (final Color color) { textSubtitle.setPaint (color); } public void setSubtextTitlePosition(final RectangleEdge position) { textSubtitle.setPosition (position); } public void setSubtextTitleAlignment(HorizontalAlignment alignment) { textSubtitle.setHorizontalAlignment (alignment); } } Описание столбчатой диаграммы, ChartDescBarКласс описания столбчатой диаграммы ChartDescBar (гистограмма) наследует свойства базового класса ChartDesc. Наряду с параметрами базового класса описание диаграммы включает наименование осей абсцисс axis_x, ординат axis_y и набор данных dataset. Методы get/set в листинге класса не представлены.
import org.jfree.data.category.CategoryDataset; public class ChartDescBar extends ChartDesc { private String axis_x ; private String axis_y ; private CategoryDataset dataset ; //----------------------------------------------------- public ChartDescBar() { super(); } //----------------------------------------------------- public ChartDescBar(String title, String axis_x, String axis_y, CategoryDataset dataset) { this(); this.axis_x = axis_x ; this.axis_y = axis_y ; this.dataset = dataset; setTitle(title); } //----------------------------------------------------- // Методы get/set . . . } Описание круговой диаграммы, ChartDescPieКласс описания круговой диаграммы ChartDescPie наследует свойства базового класса ChartDesc. Наряду с параметрами базового класса описание диаграммы включает только набор данных dataset. Методы get/set в листинге класса не представлены. public class ChartDescPie extends ChartDesc { private PieDataset dataset; //----------------------------------------------------- public ChartDescPie() { super(); } //----------------------------------------------------- public ChartDescPie(String title, boolean legend, boolean tooltips, PieDataset dataset) { this(); this.setLegend (legend); this.setTooltips(tooltips); this.dataset = dataset ; setTitle(title); } //----------------------------------------------------- // Методы get/set . . . } Описание временно́й диаграммы, ChartDescTimeКласс описания временно́й диаграммы ChartDescTime наследует свойства базового класса ChartDesc. Наряду с параметрами базового класса описание диаграммы включает набор данных dataset, параметры определения подписей осей, формата меток временно́й шкалы, флаги представления осей, цвет линий сетки, флаг маркировки узловых точек графиков. Методы get/set в листинге класса не представлены. Особый интерес может представлять параметр autoTickUnit. В документации по данному параметру Вы можете найти следующую информацию : Sets a flag indicating whether or not the tick unit is automatically selected from a range of standard tick units. If the flag is changed, registered listeners are notified that the chart has changed. От себя приведу пример, с которым мне пришлось столкнуться, прежде чем понять, как можно использовать данный параметр настройки диаграмм. Представьте себе, что Вы хотите на диаграмме отобразить изменение курса валюты за 2 недели; формат временно́й шкалы абсцисс определим как 'dd.MM'. После представления диаграммы Вы видите, что временна́я шкала, допустим, имеет количество делений, соответствующее количеству дней. То есть, отображение соответствует Вашему пожеланию. Но, как только Вы растянете диаграмму, то заметите, что размер шкал практически не изменился (или изменился незначительно), но появились новые деления, а вмести с ними и надписи, дублирующие предыдущие метки. Чтобы понять, что происходит с диаграммой, измените формат шкалы на 'dd.MM HH', чтобы наряду с днями отображалось и время. И тогда Вы увидете, что дублирование связано только с дополнительными метками шкалы времени : т.е. расстояние между метками делится на несколько частей (2, 3 ...), а в промежуточных точках метка может указывать на 12/8/6/... часов. Чтобы избежать этого, следует параметру autoTickUnit присвоить значение false, как это реализовано в конструкторе по умолчанию.
public class ChartDescTime extends ChartDesc { // Набор данных private XYDataset dataset; // Формат представления меток на временно́й оси private DateFormat axisDateFormat; // Подписи осей private String axisTimeLabel ; // ось абсцисс private String axisValueLabel; // ось ординат // Флаги представления осей private boolean axisValueVisible; // ось ординат private boolean axisDateVisible ; // ось абсцисс // Параметры определения цвета линий сетки графика private Color axisValueColor ; private Color axisDateColor ; // Флаг маркировки узловых точек графиков private boolean seriesShapeVisible; // Флаг автоматической настройки шкалы ... private boolean autoTickUnit; //----------------------------------------------------- public ChartDescTime() { super(); axisDateFormat = new SimpleDateFormat("dd.MM"); seriesShapeVisible = false; axisValueVisible = true; axisDateVisible = true; axisValueColor = Color.lightGray; axisDateColor = Color.lightGray; autoTickUnit = false; } //----------------------------------------------------- public ChartDescTime(String title, boolean legend, boolean tooltips, XYDataset dataset) { this(); this.setLegend (legend); this.setTooltips(tooltips); this.dataset = dataset ; setTitle(title); } //----------------------------------------------------- // Методы get/set . . . } Описание кусочно-линейной диаграммы, ChartDescXYКласс описания кусочно-линейной диаграммы ChartDescXY наследует свойства базового класса ChartDesc. Описание диаграммы наряду с параметрами базового класса включает набор данных dataset, параметры определения подписей осей, флаги представления осей, цвет линий сетки, флаг маркировки узловых точек графиков, параметр ограничения диапазона значений range, формат меток осей, ориентацию графика и флаг автоматической настройки шкалы, о котором было сказано выше. Методы get/set в листинге класса не представлены. В данном описании следует обратить внимание на ограничение диапазона range, формат представления меток осей (xTickUnit, уTickUnit) и маркировку узловых точек seriesShapeVisible. Что касается параметра range, то его использование позволяет представить (растянуть/сжать) график в определеном диапазоне оси ординат (при PlotOrientation.VERTICAL).
public class ChartDescXY extends ChartDesc { // Набор данных private XYDataset dataset ; // Подписи осей private String axisXLabel ; private String axisYLabel ; // Флаг представления осей private boolean axisXVisible; // абсцисс private boolean axisYVisible; // ординат // Цвета линий сетки на диаграмме private Color axisYColor ; private Color axisXColor ; // Флаг представления фигур/маркеров в узловых точках private boolean seriesShapeVisible; // Ограничение диапазона private Range range ; // Формат представления меток осей private TickUnitSource xTickUnit ; private TickUnitSource yTickUnit ; // Ориентация private PlotOrientation plotOrientation; // Флаг автоматической настройки шкалы ... private boolean autoTickUnit; //----------------------------------------------------- public ChartDescXY() { super(); seriesShapeVisible = false; axisXVisible = true; axisYVisible = true; axisYColor = Color.lightGray; axisXColor = Color.lightGray; setPlotOrientation(PlotOrientation.VERTICAL); setAutoTickUnit(false); xTickUnit = NumberAxis.createStandardTickUnits(); yTickUnit = NumberAxis.createStandardTickUnits(); } public ChartDescXY(String title, boolean legend, boolean tooltips, XYDataset dataset) this(); this.setLegend (legend ); this.setTooltips(tooltips); this.dataset = dataset ; setTitle(title); } Примечание : следует обратить внимание на параметр seriesShapeVisible, определяющий представление маркеров/фигур в узловых точках графиков. Данный параметр связан с показом всплывающих подсказок, когда курсор мыши указывает на узловую точку графика. Если Вы установите данный флаг (seriesShapeVisible=true), то отображаемый маркер/фигура закроет узловую точку, и представление всплывающой подсказки будет блокировано. Классы и интерфейсы взаимодействия с графической библиотекой jfreechartАктиватор JFreeChartActivatorАктиватор бандла JFreeChartActivator включает два бандла (start, stop), вызываемые фреймворком при старте и останове бандла. Модуль util-jfreechart не имеет интерфейсной части, а только включает сервисы подготовки исходных данных и формирования диаграмм, описанных в интерфейсе IFreeChart. Интерфейс IFreeChartНиже представлен листинг интерфейса IFreeChart. Модификатор public в описаниях методов не представлен. Описания методов можно разделить на несколько групп Первую группу представляют методы формирования наборов данных. Для создания наборов данных для столбчатой диаграммы (CategoryDataset) и круговой диаграммы (PieDataset) в соответствующие методы необходимо передать коллекции записей List<CategoryDataItem> и List<PieDataItem>. Набор данных для временны́х и кусочно-линейных диаграмм имеют одинаковый тип XYDataset; однако методы формирования наборов createXYDataset имеют различные типы входных массивов, описывающих графики. Так, для подготовки одного временно́го графика необходимо использовать метод createTimeSeries с коллекцией List<TimeSeriesDataItem>. А для подготовки одного кусочно-линейного графика необходимо использовать метод createXYSeries с коллекцией List<XYDataItem>. Первым параметром обоих методов является заголовок (title) графика. Вторая группа включает методы с формированием и настройкой диаграмм и ее составляющих. Столбчатые диаграммы создаются методом createBarChart. Методы hideAxisLineX и hideAxisLineY позволяют скрыть оси абсцисс и ординат. Наибольшую группу составляют методы формирования круговой диаграммы. Данные методы определяют настройки разделительных линий секций диаграммы, выделении одной из секции, меток обозначения секций. Временны́е и кусочно-линейные диаграммы создаются методами createTimeSeriesChart и createLineChart. Последнюю группу составляют методы, связанные с определением фонового цвета диаграммы, фона графической части, цвета и толщины графиков.
public interface IJFreeChart { // public //----- Методы создания наборов данных ----- CategoryDataset createCategoryDataset( List<CategoryDataItem> data); PieDataset createPieDataset ( List<PieDataItem> data); XYDataset createXYDataset( TimeSeries ... series); XYDataset createXYDataset( XYSeries ... series); TimeSeries createTimeSeries ( String title, List<TimeSeriesDataItem> data); XYSeries createXYSeries ( String title, List<XYDataItem> data); //----- Столбчатые диаграммы ----- JFreeChart createBarChart (ChartDescBar cdb ); void hideAxisLineX (CategoryPlot plot); void hideAxisLineY (CategoryPlot plot); //----- Круговые диаграммы ----- JFreeChart createPieChart (ChartDescPie cdp ); void setExplodePercent (JFreeChart chart, Comparable<?> section, float percent); void hideSectionOutlines (JFreeChart chart ); void setBaseSectionOutlinePaint(JFreeChart chart, Color color, float pen_width); void setBaseSectionOutlineStroke(JFreeChart chart, Color color, float pen_width); void setSectionOutlinePaint (JFreeChart chart, Comparable<?> section, Color color, float pen_width); void setSectionOutlineStroke (JFreeChart chart, Comparable<?> section, Color color, float pen_width); void setPiePlotLabels (PiePlot plot, Font font, Color link_color, Color label_color); //----- Временны́е диаграммы ----- JFreeChart createTimeSeriesChart (ChartDescTime cdt); //----- Кусочно-линейные диаграммы ----- JFreeChart createLineChart (ChartDescXY cdxy); //----- Общие методы настройки диаграмм ----- void setBackground (JFreeChart chart, Color color); void setBackground (Plot plot , Color color); void setSeriesPaint (JFreeChart chart, int sid , Color color, float pen_width); } Класс JFreeChartImplКласс JFreeChartImpl, реализующий методы интерфейса IJFreeChart, облегчает процесс подготовки наборов данных и создание диаграмм. Примеры использования данного класса представлены в уроках изучения платформы JaBricks. Примеры создания диаграммБазовый модуль util-jfreechart следует использовать в качестве утилиты для подготовки данных и создания диаграмм в приложении JaBricks. Пример создания и представления столбчатых и круговых диаграмм представлен в 15 уроке. Пример создания временны́х и кусочно-линейных графиков представлен в 16 уроке. ЗависимостиБазовый модуль util-jfreechart функционирует вместе с графической библиотекой osgi-jfreechart. Подключение модуля к приложениюДля подключения модуля util-jfreechart в приложение JaBricks необходимо :
GAV параметры модуля util-jfreechart имеют следующие значения :
Подробнее о включении модуля в приложение JaBricks представлено здесь. Скачать util-jfreechartРассмотренный на странице модуль подготовки набора данных и создания диаграмм util-jfreechart упакован в архивный файл util-jfreechart-1.0.0.zip (17.4 Кб). |