オープンソースコラム


JFreeChart入門 - JFreeChartでガントチャートの作成

2008/03/10 22:42Update
TAGS: JFreeChart | ガントチャート | IntervalCategoryDataset

Syboos.jp編集長

JFreeChartでガントチャートの作成について解説します。

はじめに


JFreeChartとは:JFreeChart - Javaで書かれたフリーで使える高機能なチャート作成ライブラリ

JFreeChart入門 - JFreeChartのインストール及びJFreeChartデモの実行

今回はJFreeChartを使ってガントチャートを作成してみます。

今回のテスト環境
OS :WindowsXP
Java:jdk1.5.0_06
JFreeChart:1.0.9(2008年3月 最新版)
※JFreeChartはJavaで書かれたライブラリなので、Windows以外のOSでも正常に動きます。


JFreeChartでガントチャート(Gantt Chart)の作成


JFreeChartでガントチャートを作成するには、次のようなステップに従えば、非常に簡単に行えます。
ステップ1:IntervalCategoryDataset(TaskSeries)オブジェクトの作成
ステップ2:DatasetからJFreeChartオブジェクトを作成、設定
ステップ3:ファイルやサーブレットに出力

Javaソース:
CreateJFreeChartGantt.java
package com.syboos.demo.jfreechart;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.data.category.IntervalCategoryDataset;
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でガントチャートを作成 サンプル
public class CreateJFreeChartGantt {

    /**
     * JFreeChartでガントチャートを作成
     */
    public static void main(String[] args) {
        //ステップ1:Datasetオブジェクトの作成
        IntervalCategoryDataset dataset = createDataset();
        //ステップ2:DatasetからJFreeChartオブジェクトを作成、及び設定
        JFreeChart freeChart = createChart(dataset);
        //ファイルや、Servletに出力
        saveAsFile(freeChart, "c:\\jfreechart\\gantt.png", 500, 400);
    }
    
    //ファイルに保存する
    public static void saveAsFile(JFreeChart chart, String outputPath, int weight, int height) {
        FileOutputStream out = null;
        try {
            File outFile = new File(outputPath);
            if (!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }
            out = new FileOutputStream(outputPath);
            //PNGイメージファイルに保存する
            ChartUtilities.writeChartAsPNG(out, chart, 300, 200);
            //JPEGイメージファイルに保存する
            //ChartUtilities.writeChartAsJPEG(out, chart, 500, 400);
            out.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    //do nothing
                }
            }
        }
    }

    //IntervalCategoryDatasetからJFreeChartを作成
    public static JFreeChart createChart(IntervalCategoryDataset dataset) {
        //ガントチャートを作成するためのJFreeChartオブジェクトの生成:ChartFactory.createGanttChart
        JFreeChart jfreechart = ChartFactory.createGanttChart("Gantt Chart Demo",    //タイトル
                "タスク",    //categoryAxisLabel (縦軸、Y軸のラベル)
                "日付",    //valueAxisLabel(横軸、X軸のラベル)
                dataset, // dataset
                true, // legend
                false,    //Tooltips
                false //URLs
                );
        
        //以下の設定は省略しても構いません。
        //出力される円グラフの透明度、境界線の色/有無などの設定を行う:クラスPlot(ガントチャートはCategoryPlot)
        CategoryPlot  plot = (CategoryPlot) jfreechart.getPlot();
        //背景色 透明度
        plot.setBackgroundAlpha(0.5f);
        //前景色 透明度
        plot.setForegroundAlpha(0.5f);
        //その他設定は XYPlotを参照
        
        return jfreechart;
    }

    /**
     * IntervalCategoryDatasetオブジェクトの作成。
     * 
     * ガントチャートを作成するために、IntervalCategoryDatasetを用意します。
     * IntervalCategoryDataset: OpenHighLowClose
     */
    public static IntervalCategoryDataset createDataset() {
        
        //日付
        TaskSeries preTaskSeries = new TaskSeries("予定");
        TaskSeries realTaskSeries = new TaskSeries("実績");
        
        //予定タスク
        Task preTask1 = new Task("設計", 
                new SimpleTimePeriod(getDate(2008, 1, 1), getDate(2008, 2, 1)));
        preTaskSeries.add(preTask1);
        Task preTask2 = new Task("開発", 
                new SimpleTimePeriod(getDate(2008, 2, 2), getDate(2008, 4, 1)));
        preTaskSeries.add(preTask2);
        
        //実績
        Task realTask1 = new Task("設計", 
                new SimpleTimePeriod(getDate(2008, 1, 1), getDate(2008, 1, 25)));
        realTaskSeries.add(realTask1);
        Task realTask2 = new Task("開発", 
                new SimpleTimePeriod(getDate(2008, 1, 26), getDate(2008, 4, 15)));
        realTaskSeries.add(realTask2);
        
        
        
        TaskSeriesCollection taskSeriesCollec = new TaskSeriesCollection();
        taskSeriesCollec.add(preTaskSeries);
        taskSeriesCollec.add(realTaskSeries);
        
        return taskSeriesCollec;
    }
    
    //日付取得用
    private static Date getDate(int year, int month, int day) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, day);
        
        return cal.getTime();
    }

}


コンパイル及び実行
次のようなコマンドでコンパイル及び実行を行います。
C:\Work\Download\JFreeChart\demos>javac -classpath .;jcommon-1.0.12.jar;jfreechart-1.0.9.jar com/syboos/demo/jfreechart/CreateJFreeChartGantt.java

C:\Work\Download\JFreeChart\demos>java -classpath .;jcommon-1.0.12.jar;jfreechart-1.0.9.jar  com.syboos.demo.jfreechart.CreateJFreeChartGantt

C:\Work\Download\JFreeChart\demos>

※C:\Work\Download\JFreeChart\demosの構成は次のようになります:
jcommon-1.0.12.jar
jfreechart-1.0.9.jar
com\
   syboos\
         demo\
             jfreechart\
                       CreateJFreeChartGantt.java


ファイルC:\jfreechart\gantt.pngが作成されます。

≪図1≫

Sponsored Link