JFreeChart-ガントチャート-TaskSeriesCollection


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.util.Calendar;
import java.util.Date;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.GanttRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;
import org.jfree.data.time.SimpleTimePeriod;

/**
■ JFreeChart-ガントチャート-TaskSeriesCollection


・しかし、我々がよく認識しているガントチャートとは少し違う.
・もともと生産管理者のガントが考えたガントチャートは、縦軸に作業者が並び、横に作業内容が並ぶもので、作業者に対する作業指示に使用するもの.
・我々ソフトウェア開発者が認識しているガントチャートは、縦軸に機能のカテゴリが並び、横に作業項目が並んでいるもの.

・JFreeChartで言うガントチャートとは、ご覧のように作業項目が縦に並んでいるだけで、横に詳細を表示するものではない.

・クレームはともかく、どのようにチャートを作成するのか見てみる.

・(1)PlotはCategoryPlotを使用する.

・(2)レンダラはGanttRendererというものがある.

・(3)X軸(Orientationを変えているので、実際は縦軸)はCategoryAxisを使用する.

・(4)Y軸Orientationを変えているので、実際は横軸)は、日程なのでDataAxisを使用する.

・(5)DatasetはAPI上はCategoryDatasetを要求しているが、ここではTaskSeriesCollectionを使用している.
  ・TaskSeriesCollectionに予定と実績のTaskSeriesを入れている.

 */
public class Chart17_00 {

  public static void main(String[] args) {
    // 予定データ
    TaskSeries sched = new TaskSeries("予定");
    sched.add(new Task("要件定義",new SimpleTimePeriod(date(2020,2,1),date(2020,4,30))));
    sched.add(new Task("概要設計",new SimpleTimePeriod(date(2020,5,1),date(2020,7,10))));
    sched.add(new Task("詳細設計",new SimpleTimePeriod(date(2020,7,11),date(2020,10,31))));
    sched.add(new Task("プログラミング",new SimpleTimePeriod(date(2020,11,1),date(2021,3,31))));
    sched.add(new Task("単体テスト",new SimpleTimePeriod(date(2021,4,1),date(2021,6,30))));
    sched.add(new Task("結合テスト",new SimpleTimePeriod(date(2021,7,1),date(2021,10,31))));
    sched.add(new Task("統合テスト",new SimpleTimePeriod(date(2021,11,1),date(2022,1,31))));
    sched.add(new Task("システムテスト",new SimpleTimePeriod(date(2022,2,1),date(2022,3,31))));
    // 実績データ
    TaskSeries real = new TaskSeries("実績");
    real.add(new Task("要件定義",new SimpleTimePeriod(date(2020,2,1),date(2020,5,10))));
    real.add(new Task("概要設計",new SimpleTimePeriod(date(2020,5,11),date(2020,7,15))));
    real.add(new Task("詳細設計",new SimpleTimePeriod(date(2020,7,16),date(2020,11,15))));
    real.add(new Task("プログラミング",new SimpleTimePeriod(date(2020,11,16),date(2021,3,31))));
    real.add(new Task("単体テスト",new SimpleTimePeriod(date(2021,4,1),date(2021,6,30))));
    real.add(new Task("結合テスト",new SimpleTimePeriod(date(2021,7,1),date(2021,10,15))));
    real.add(new Task("統合テスト",new SimpleTimePeriod(date(2021,10,16),date(2022,2,28))));
    real.add(new Task("システムテスト",new SimpleTimePeriod(date(2022,3,1),date(2022,5,31))));
    //
    TaskSeriesCollection seriesCollection = new TaskSeriesCollection(); //(5)
    seriesCollection.add(sched);
    seriesCollection.add(real);
    ValueAxis yAxis = new DateAxis(); // (4)
    CategoryAxis xAxis = new CategoryAxis("作業工程"); // (3)
    CategoryItemRenderer renderer = new GanttRenderer(); // (2)
    CategoryPlot plot = new CategoryPlot((CategoryDataset)seriesCollection,xAxis,yAxis,renderer); // (1)
    plot.setOrientation(PlotOrientation.HORIZONTAL);
    JFreeChart jfreeChart = new JFreeChart("ガントチャート",(Plot)plot);
    ChartFrame cFrame = new ChartFrame("ガントチャート",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
  private static Date date(int year,int month,int date) {
    Calendar localCalendar = Calendar.getInstance();
    localCalendar.set(year, month, date);
    Date localDate = localCalendar.getTime();
    return localDate;
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/f8932e7b-184a-517d-d904-96182d2c82c7.png)