LoginSignup
0
0

More than 3 years have passed since last update.

JFreeChart-ガントチャート-TaskSeriesCollection

Posted at

目次 ⇒ JFreeChartサンプル

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0