目次 ⇒ 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;
}
}