Code for Changing the Color of Subtasks in Gantt Chart

How to change color of particular sub-task in JFreeChart Gantt Chart?

You can override the renderer's getItemPaint() method, as discussed here.

Addendum: As a Gnatt chart uses a GanttRenderer, you'd do something like this to see the existing colors. Just return your chosen color for a given row and column.

plot.setRenderer(new MyRenderer());
...
private static class MyRenderer extends GanttRenderer {

@Override
public Paint getItemPaint(int row, int col) {
System.out.println(row + " " + col + " " + super.getItemPaint(row, col));
return super.getItemPaint(row, col);
}
}

JFree Gantt Chart - Different Color for each Job and Integer TimeUnit

  1. All operations of a particular job have the same color.

    Use the same TaskSeries to get the first color from the default DrawingSupplier, as shown here.

    same color

  2. Define a color for each job and its respective operations.

    Override getItemPaint() to supply the desired color; this example supplies a palette of varying saturations for each subtask.

    different color

  3. Change the Axis to Integer time units.

    The DateAxis instantiated by the relevant ChartFactory interprets data values as milliseconds from the Java epoch; to alter the display, override setDateFormatOverride() with the desired format, as shown here.

    integer ticks

How to show information of each task in Gantt chart

As invoked, the factory sets a IntervalCategoryToolTipGenerator, as shown here. You can customize the generator to see if the other MessageFormat values are helpful, as shown here for StandardCategoryToolTipGenerator, or you can create a new generator.

Addendum: Here's an example of accessing the Gantt chart's TaskSeriesCollection dataset in the generator. For individual subtasks, you can track the index as shown here.

image

import java.awt.EventQueue;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.IntervalCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;

/**
* @see https://stackoverflow.com/a/15241250/230513
*/
public class Test {

class MyToolTipGenerator extends IntervalCategoryToolTipGenerator {

DateFormat format;

private MyToolTipGenerator(String value, DateFormat format) {
super(value, format);
this.format = format;
}

@Override
public String generateToolTip(CategoryDataset cds, int row, int col) {
final String s = super.generateToolTip(cds, row, col);
TaskSeriesCollection tsc = (TaskSeriesCollection) cds;
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < tsc.getSubIntervalCount(row, col); i++) {
sb.append(format.format(tsc.getStartValue(row, col, i)));
sb.append("-");
sb.append(format.format(tsc.getEndValue(row, col, i)));
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
}

private JFreeChart createChart() {
IntervalCategoryDataset xyDataset = createDataset();
JFreeChart jFreeChart = ChartFactory.createGanttChart("Gantt",
"time", "value", xyDataset, true, true, true);
CategoryPlot plot = jFreeChart.getCategoryPlot();
plot.getRenderer().setBaseToolTipGenerator(
new MyToolTipGenerator(
"{0}, {1}: ", DateFormat.getTimeInstance(DateFormat.SHORT)));
return jFreeChart;
}

private IntervalCategoryDataset createDataset() {
TaskSeriesCollection dataset = new TaskSeriesCollection();
TaskSeries unavailable = new TaskSeries("Unavailable");
Task t1 = new Task("Meeting Room 1", date(7), date(18));
t1.addSubtask(new Task("Meeting 1", date(9), date(16)));
unavailable.add(t1);

Task t2 = new Task("Meeting Room 2", date(8), date(18));
t2.addSubtask(new Task("Meeting 4", date(10), date(11)));
t2.addSubtask(new Task("Meeting 5", date(13), date(15)));
t2.addSubtask(new Task("Meeting 6", date(16), date(18)));
unavailable.add(t2);
dataset.add(unavailable);
return dataset;
}

private Date date(int hour) {
final Calendar calendar = Calendar.getInstance();
calendar.set(2009, Calendar.DECEMBER, 1, hour, 0, 0);
return calendar.getTime();
}

private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new ChartPanel(createChart()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test().display();
}
});
}
}


Related Topics



Leave a reply



Submit