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
All operations of a particular job have the same color.
Use the same
TaskSeries
to get the first color from the defaultDrawingSupplier
, as shown here.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.Change the
Axis
toInteger
time units.The
DateAxis
instantiated by the relevantChartFactory
interprets data values as milliseconds from the Java epoch; to alter the display, overridesetDateFormatOverride()
with the desired format, as shown here.
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.
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
Drawing in Jlayeredpane Over Exising JPAnels
Get Maven Artifact Version at Runtime
Try-Catch-Finally-Return Clarification
Why F Is Placed After Float Values
Select an Option from the Right-Click Menu in Selenium Webdriver - Java
How to Flatten 2D Array to 1D Array
Swingworker, Thread.Sleep(), or Javax.Swing.Timer? I Need to "Insert a Pause"
Dbcp - Validationquery for Different Databases
Using Jaxb to Unmarshal/Marshal a List<String>
How to Display a Svg Byte Array as an Image in a Jasperreport
Spring Boot How to Hide Passwords in Properties File
Optional Orelse Optional in Java
How to Get a List of Ip Connected in Same Network (Subnet) Using Java
Java Jtextfield with Input Hint
Use Custom Fonts When Creating PDF Using Ireport