Creating Gantt Chart In Java Using JFreeChart API [Example/Tutorial]

In a row of writing tutorials about creating various charts using JFreeChart, I am writing on how to create Gantt Charts.

About Gantt Charts:

A Gantt chart is a type of bar chart that illustrates a project schedule. Gantt charts illustrate the start and finish dates of the terminal elements and summary elements of a project. Terminal elements and summary elements comprise the work breakdown structure of the project. Some Gantt charts also show the dependency (i.e, precedence network) relationships between activities. Gantt charts can be used to show current schedule status using percent-complete shadings and a vertical “TODAY” line.

Although now regarded as a common charting technique, Gantt charts were considered revolutionary when they were introduced. In recognition of Henry Gantt’s contributions, the Henry Laurence Gantt Medal is awarded for distinguished achievement in management and in community service. This chart is used also in Information Technology to represent data that has been collected.

Gantt charts have become a common technique for representing the phases and activities of a project work breakdown structure (WBS), so they can be understood by a wide audience.

A common error made by those who equate Gantt chart design with project design is that they attempt to define the project work breakdown structure at the same time that they define schedule activities. This practice makes it very difficult to follow the 100% Rule. Instead the WBS should be fully defined to follow the 100% Rule, then the project schedule can be designed.

Although a Gantt chart is useful and valuable for small projects that fit on a single sheet or screen, they can become quite unwieldy for projects with more than about 30 activities. Larger Gantt charts may not be suitable for most computer displays. A related criticism is that Gantt charts communicate relatively little information per unit area of display. That is, projects are often considerably more complex than can be communicated effectively with a Gantt chart.

Gantt charts only represent part of the triple constraints of projects, because they focus primarily on schedule management. Moreover, Gantt charts do not represent the size of a project or the relative size of work elements, therefore the magnitude of a behind-schedule condition is easily miscommunicated. If two projects are the same number of days behind schedule, the larger project has a larger impact on resource utilization, yet the Gantt does not represent this difference.

Although project management software can show schedule dependencies as lines between activities, displaying a large number of dependencies may result in a cluttered or unreadable chart.

Because the horizontal bars of a Gantt chart have a fixed height, they can misrepresent the time-phased workload (resource requirements) of a project. In the example shown in this article, Activities E and G appear to be the same size, but in reality they may be orders of magnitude different. A related criticism is that all activities of a Gantt chart show planned workload as constant. In practice, many activities (especially summary elements) have front-loaded or back-loaded work plans, so a Gantt chart with percent-complete shading may actually miscommunicate the true schedule performance status. [Wikipedia/Creative Commons Attribution-ShareAlike License]

About JFreeChart:
JFreeChart is an open-source framework for the programming language Java, which allows the creation of complex charts in a simple way.

JFreeChart also works with GNU Classpath, a free software implementation of the standard class library for the Java programming language.

Following chart types are supported:

  • * X-Y charts (line, spline and scatter)
  • * Pie charts
  • * Gantt charts
  • * Bar charts (horizontal and vertical, stacked and independent)
  • * Single valued (thermometer, compass, speedometer)

Downloading JFreeChart API:
You can download the JFreeChart API required for this tutorial in their official website www.jfree.org

Working Java Example Code:
I wrote, compiled and tested the following code that generates and saves Gantt Charts using JFreeChart API. The generated sample Gantt Chart is at the end of the code.

package com.kushal.charts;
/**
 * @Author Kushal Paudyal
 * www.sanjaal.com/java
 * Last Modified On: 2009-September 25
 *
 * Demonstrating the use of JFreeChart to create
 * Gantt Chart
 **/

import java.io.File;
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.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;

public class MyGanttChart {

private static final long serialVersionUID = 3488074583840465632L;

public static IntervalCategoryDataset createDataset() {

/**
* Creating a task series
* And adding planned tasks dates on the series.
*/
TaskSeries seriesOne = new TaskSeries("Planned Implementation");

/**Adding data in this series**/
seriesOne.add(new Task("Sanjaal Domain Registration",
new SimpleTimePeriod(makeDate(10, Calendar.JUNE, 2007),
makeDate(15, Calendar.JUNE, 2007))));

seriesOne.add(new Task("Feature Addition - Java Blog",
new SimpleTimePeriod(makeDate(9, Calendar.JULY, 2007),
makeDate(19, Calendar.JULY, 2007))));

seriesOne.add(new Task("Feature Addition - PHPBB Forum",
new SimpleTimePeriod(makeDate(10, Calendar.AUGUST, 2007),
makeDate(15, Calendar.AUGUST, 2007))));

seriesOne.add(new Task("Feature Addition - Tagged Mails",
new SimpleTimePeriod(makeDate(6, Calendar.MAY, 2007), makeDate(
30, Calendar.MAY, 2007))));

seriesOne.add(new Task("Feature Addition - H1B Visa Portal",
new SimpleTimePeriod(makeDate(2, Calendar.JUNE, 2007),
makeDate(2, Calendar.JUNE, 2007))));

seriesOne.add(new Task("Feature Addition - Events Gallery",
new SimpleTimePeriod(makeDate(3, Calendar.JUNE, 2007),
makeDate(31, Calendar.JULY, 2007))));

seriesOne.add(new Task("Google Adsense Integration",
new SimpleTimePeriod(makeDate(1, Calendar.AUGUST, 2007),
makeDate(8, Calendar.AUGUST, 2007))));

seriesOne.add(new Task("Adbrite Advertisement Integration",
new SimpleTimePeriod(makeDate(10, Calendar.AUGUST, 2007),
makeDate(10, Calendar.AUGUST, 2007))));

seriesOne.add(new Task("InfoLink Advertisement Integration",
new SimpleTimePeriod(makeDate(12, Calendar.AUGUST, 2007),
makeDate(12, Calendar.SEPTEMBER, 2007))));

seriesOne.add(new Task("Feature Testing", new SimpleTimePeriod(
makeDate(13, Calendar.SEPTEMBER, 2007), makeDate(31,
Calendar.OCTOBER, 2007))));

seriesOne.add(new Task("Public Release", new SimpleTimePeriod(makeDate(
1, Calendar.NOVEMBER, 2007), makeDate(15, Calendar.NOVEMBER,
2007))));

seriesOne.add(new Task("Post Release Bugs Collection",
new SimpleTimePeriod(makeDate(28, Calendar.NOVEMBER, 2007),
makeDate(30, Calendar.NOVEMBER, 2007))));

/**
* Creating another task series
*/
TaskSeries seriesTwo = new TaskSeries("Actual Implementation");

/**Adding data in this series**/
seriesTwo.add(new Task("Sanjaal Domain Registration",
new SimpleTimePeriod(makeDate(11, Calendar.JUNE, 2007),
makeDate(14, Calendar.JUNE, 2007))));

seriesTwo.add(new Task("Feature Addition - Java Blog",
new SimpleTimePeriod(makeDate(11, Calendar.JULY, 2007),
makeDate(19, Calendar.JULY, 2007))));

seriesTwo.add(new Task("Feature Addition - PHPBB Forum",
new SimpleTimePeriod(makeDate(10, Calendar.AUGUST, 2007),
makeDate(17, Calendar.AUGUST, 2007))));

seriesTwo.add(new Task("Feature Addition - Tagged Mails",
new SimpleTimePeriod(makeDate(7, Calendar.MAY, 2007), makeDate(
1, Calendar.JUNE, 2007))));

seriesTwo.add(new Task("Feature Addition - H1B Visa Portal",
new SimpleTimePeriod(makeDate(2, Calendar.JUNE, 2007),
makeDate(4, Calendar.JUNE, 2007))));

seriesTwo.add(new Task("Feature Addition - Events Gallery",
new SimpleTimePeriod(makeDate(3, Calendar.JUNE, 2007),
makeDate(13, Calendar.JULY, 2007))));

seriesTwo.add(new Task("Google Adsense Integration",
new SimpleTimePeriod(makeDate(2, Calendar.AUGUST, 2007),
makeDate(7, Calendar.AUGUST, 2007))));

seriesTwo.add(new Task("Adbrite Advertisement Integration",
new SimpleTimePeriod(makeDate(10, Calendar.AUGUST, 2007),
makeDate(11, Calendar.AUGUST, 2007))));

seriesTwo.add(new Task("InfoLink Advertisement Integration",
new SimpleTimePeriod(makeDate(13, Calendar.AUGUST, 2007),
makeDate(15, Calendar.SEPTEMBER, 2007))));

seriesTwo.add(new Task("Feature Testing", new SimpleTimePeriod(
makeDate(13, Calendar.SEPTEMBER, 2007), makeDate(3,
Calendar.NOVEMBER, 2007))));

seriesTwo.add(new Task("Public Release", new SimpleTimePeriod(makeDate(
4, Calendar.NOVEMBER, 2007), makeDate(15, Calendar.NOVEMBER,
2007))));

seriesTwo.add(new Task("Post Release Bugs Collection",
new SimpleTimePeriod(makeDate(28, Calendar.NOVEMBER, 2007),
makeDate(3, Calendar.DECEMBER, 2007))));

final TaskSeriesCollection collection = new TaskSeriesCollection();

/**
* Adding the series to the collection
* Holds actual Dates.
*/
collection.add(seriesOne);
collection.add(seriesTwo);

return collection;
}

private static Date makeDate(final int day, final int month, final int year) {

final Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day);
final Date result = calendar.getTime();
return result;

}

/**
* Creates a Gantt chart based on input data set
*/
private JFreeChart createChart(final IntervalCategoryDataset dataset) {
final JFreeChart chart = ChartFactory.createGanttChart(
"Gantt Chart - Sanjaal.com Feature Implmentation", // chart title
"Task", // domain axis label
"Date", // range axis label
dataset, // data
true, // include legend
true, // tooltips
false // urls
);
return chart;

}

public void saveChart(JFreeChart chart, String fileLocation) {
String fileName = fileLocation;
try {
/**
* This utility saves the JFreeChart as a JPEG First Parameter:
* FileName Second Parameter: Chart To Save Third Parameter: Height
* Of Picture Fourth Parameter: Width Of Picture
*/
ChartUtilities.saveChartAsJPEG(new File(fileName), chart, 800, 600);
} catch (IOException e) {
e.printStackTrace();
System.err.println("Problem occurred creating chart.");
}
}

/**
* Testing the Gantt Chart Creation
*/
public static void main(final String[] args) {

final MyGanttChart chartCreator = new MyGanttChart();
System.out.println("...Creating Dataset");
IntervalCategoryDataset dataset = createDataset();

System.out.println("...Creating Chart");
JFreeChart chart = chartCreator.createChart(dataset);

String fileName = "C:/temp/myGantChartDemo.jpg";

System.out.println("...Saving the Chart");
chartCreator.saveChart(chart, fileName);

System.out.println("...Chart Created Successfully and Saved");
System.out.println("Output Chart File Location: " + fileName);

}
}

The following is the output of running this program:

...Creating Dataset
...Creating Chart
...Saving the Chart
...Chart Created Successfully and Saved
Output Chart File Location: C:/temp/myGantChartDemo.jpg

The following is the Gantt Chart generated by the Java Program above.

Creating A 3D Pie Chart In Java Using JFreeChart [Example Source Code]

JFreeChart is an open-source framework for the programming language Java, which allows the creation of complex charts in a simple way.

JFreeChart also works with GNU Classpath, a free software implementation of the standard class library for the Java programming language.

Following chart types are supported:

  • * X-Y charts (line, spline and scatter)
  • * Pie charts
  • * Gantt charts
  • * Bar charts (horizontal and vertical, stacked and independent)
  • * Single valued (thermometer, compass, speedometer)

In the following tutorial, I will show you how to create a 3D Pie Chart using JFreeChart. If you do not have the JFreeChart library and API, you can download it from their website www.jfree.org

package com.kushal.charts;
/**
 * @Author Kushal Paudyal
 * www.sanjaal.com/java
 * Last Modfied On: 2009-09-23
 * 
 * Using JFreeChart to create 3D Pie Chart
 */
import java.awt.Color;
import java.io.File;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;

public class My3DPieChart {
	private static final long serialVersionUID = -8625975218180144099L;

	private PieDataset createPieDataSet() {
		DefaultPieDataset pieDataset = new DefaultPieDataset();
		/**
		 * Filling the data Visit of Sanjaal.com on a random day by Browser
		 */
		pieDataset.setValue("MS Internet Explorer", 184707);
		pieDataset.setValue("Firefox", 144556);
		pieDataset.setValue("Google Chrome", 21638);
		pieDataset.setValue("Opera", 21609);
		pieDataset.setValue("Unknown", 17916);
		pieDataset.setValue("Safari", 10850);
		pieDataset.setValue("Mozilla", 7081);
		pieDataset.setValue("Netscape", 1010);
		pieDataset.setValue("Curl", 405);
		pieDataset.setValue("LibWWW", 121);

		return pieDataset;

	}

	private JFreeChart create3DPieChart(PieDataset dataset) {

		/**
		 * createPieChart3D method Parameters: --java.lang.String title,
		 * --PieDataset dataset, --boolean legend, --boolean tooltips, --boolean
		 * urls
		 */
		JFreeChart chart = ChartFactory.createPieChart3D(
				"Sanjaal.com Visits By Browser", dataset, true, true, true);

		PiePlot3D p = (PiePlot3D) chart.getPlot();
		p.setForegroundAlpha(0.5f);
		p.setBackgroundAlpha(0.2f);

		chart.setBackgroundPaint(Color.white);
		chart.setAntiAlias(true);
		chart.setBorderVisible(true);

		return chart;

	}

	public void saveChart(JFreeChart chart, String fileLocation) {
		String fileName = fileLocation;
		try {
			/**
			 * This utility saves the JFreeChart as a JPEG First Parameter:
			 * FileName Second Parameter: Chart To Save Third Parameter: Height
			 * Of Picture Fourth Parameter: Width Of Picture
			 */
			ChartUtilities.saveChartAsJPEG(new File(fileName), chart, 800, 600);
		} catch (IOException e) {
			e.printStackTrace();
			System.err.println("Problem occurred creating chart.");
		}
	}

	public static void main(String[] args) {
		My3DPieChart chartCreator = new My3DPieChart();

		/** Create a PieDataSet* */
		PieDataset pieDataset = chartCreator.createPieDataSet();

		/** Create 3D Pie Chart based on this dataset* */
		JFreeChart chart = chartCreator.create3DPieChart(pieDataset);

		/** Define a file location to save this chart */
		String fileLocation = "C:/temp/my3DPieChart.jpg";

		/** Save the chart to the file system* */
		chartCreator.saveChart(chart, fileLocation);

		System.out.println("3D Pie Chart has been created successfully");
		System.out.println("Chart has been saved to: " + fileLocation);
	}

	/*
	 * SANJAAL CORPS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
	 * SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
	 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
	 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SANJAAL CORPS SHALL NOT BE
	 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
	 * MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
	 * 
	 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
	 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
	 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
	 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
	 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
	 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
	 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). SANJAAL CORPS
	 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
	 * HIGH RISK ACTIVITIES.
	 */
}

The following is the output if this program:

3D Pie Chart has been created successfully
Chart has been saved to: C:/temp/my3DPieChart.jpg

Generated PieChart for the data provided looks like this:

Creating Category Chart Using JFreeChart

In this basic tutorial, I am walking through how to create category chart using JFreeChart. The program uses the following two jar files, and they come with the JFreeChart itself. You can download JFreeChart at their official website www.jfreechart.org

  • jcommon-1.0.15.jar
  • jfreechart-1.0.12.jar

The program also demonstrates how easily you can save a generated chart to your computer using the Charts Utilities from JFreeChart

package com.kushal.utilities;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;

public class CategoryChartDemo {

	public void createCategoryChart()
	{

		DefaultCategoryDataset  categoryDataset = new DefaultCategoryDataset();

		//Enrollment in Bachelors level
		categoryDataset.setValue(2003, "Bachelors", "2005");
		categoryDataset.setValue(1350, "Bachelors", "2006");
		categoryDataset.setValue(2408, "Bachelors", "2007");
		categoryDataset.setValue(2607, "Bachelors","2008");

		//Enrollment in Masters level
		categoryDataset.setValue(985, "Masters", "2005");
		categoryDataset.setValue(1400, "Masters", "2006");
		categoryDataset.setValue(1634, "Masters", "2007");
		categoryDataset.setValue(978, "Masters", "2008");

		//Enrollment in PhD level
		categoryDataset.setValue(356, "PhD", "2005");
		categoryDataset.setValue(390, "PhD", "2006");
		categoryDataset.setValue(350, "PhD", "2007");
		categoryDataset.setValue(687, "PhD", "2008");

		JFreeChart chart = ChartFactory.createBarChart3D
				     ("Program Enrollment (c) www.sanjaal.com", // Title
				      "Year",              // X-Axis label
				      "Number of Students",// Y-Axis label
				      categoryDataset,         // Dataset
				      PlotOrientation.VERTICAL,
				      true,                     // Show legend
				      true,
				      false
				     );

		saveChart(chart);
	}

	public void saveChart(JFreeChart chart)
	{
		String fileName="C:/Users/kushal/Desktop/myCategoryChart.jpg";
		try {
			/**
			 * This utility saves the JFreeChart as a JPEG
			 * First Parameter: FileName
			 * Second Parameter: Chart To Save
			 * Third Parameter: Height Of Picture
			 * Fourth Parameter: Width Of Picture
			 */
	    ChartUtilities.saveChartAsJPEG(new File(fileName), chart, 800, 600);
	} catch (IOException e) {
		e.printStackTrace();
	    System.err.println("Problem occurred creating chart.");
	}
	}
	public static void main(String args [])
	{
		new CategoryChartDemo().createCategoryChart();

	}

}


The following is the output when you run this program: