Афоризм
Хороших мужиков разбирают еще щенками.
Лариса Гузеева
Последние статьи

 • Домашние финансы
Приложение учета домашних финансов
 • Сохранение значений
Сохранение и восстановление значений компонентов
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • Android и OSGi
Старт OSGi-фреймворка Felix в android устройстве
 • Загрузка драйвера
Динамическая загрузка JDBC-драйвера
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
 • уроки JaBricks
Учебные примеры изучения платформы Jabricks
 • бандл 'О программе'
Модуль представления инфо о программе
 • бандл form-currencies
Модуль управления справочником валют
 • бандлы JaBricks
Бандлы приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  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
CategoryDataItem Набор записей CategoryDataItem используется для формирования CategoryDataset при построении столбчатой диаграммы (гистограммы).
PieDataItem Набор записей PieDataItem используется для формирования PieDataset при построении круговой диаграммы.
Классы описания диаграмм
ChartDesc Базовый класс описания диаграммы
ChartDescBar Класс описания столбчатой диаграммы
ChartDescPie Класс описания линейной диаграммы
ChartDescTime Класс описания временно́й диаграммы
ChartDescXY Класс описания кусочно-линейной диаграммы
Классы взаимодействия с библиотекой jfreechart
JFreeChartActivator Активатор класса
IJFreeChart Интерфейс описания методов взаимодействия с библиотекой org.jfree.jfreechart
JFreeChartImpl Класс взаимодействия с библиотекой org.jfree.jfreechart

Типы записей для создания 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 необходимо :

  • разместить модуль в поддиректории «configuration/bundles/»
  • внести в файл инициализации бандлов «configuration/bundles.ini» запись : util-jfreechart-1.0.0.jar

GAV параметры модуля util-jfreechart имеют следующие значения :

• groupId : org.jabricks.jfreechart
• artifactId : util-jfreechart
• version : 1.0.0

Подробнее о включении модуля в приложение JaBricks представлено здесь.

Скачать util-jfreechart

Рассмотренный на странице модуль подготовки набора данных и создания диаграмм util-jfreechart упакован в архивный файл util-jfreechart-1.0.0.zip (17.4 Кб).

  Рейтинг@Mail.ru