JFreeChart画甘特图实例

jopen 9年前

因为开发的需要,今天用JFreeChart画了甘特图,以下是测试用的代码, 分享一下:

package net.task.core.chart;  import java.awt.Font;  import java.io.FileOutputStream;  import java.io.IOException;  import java.text.SimpleDateFormat;  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.axis.CategoryAxis;  import org.jfree.chart.axis.DateAxis;  import org.jfree.chart.axis.ValueAxis;  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;  /**  * @author Danny  *  * TODO To change the template for this generated type comment go to  * Window - Preferences - Java - Code Style - Code Templates  */  public class GanttChart{       public static void main(String[] args) {           IntervalCategoryDataset dataset = createSampleDataset();           JFreeChart chart = ChartFactory.createGanttChart("任务管理系统",               "任务各阶段详细实施计划",               "任务周期",               dataset,                   false,                   false,                   false);                      CategoryPlot plot=chart.getCategoryPlot();                      chart.getTitle().setFont(new Font("新宋体",Font.BOLD,20));           CategoryAxis domainAxis=plot.getDomainAxis();      //水平底部列表      domainAxis.setLabelFont(new Font("新宋体",Font.BOLD,14));      //水平底部标题      domainAxis.setTickLabelFont(new Font("新宋体",Font.BOLD,12));      //垂直标题           ValueAxis rangeAxis = plot.getRangeAxis();           rangeAxis.setLabelFont(new Font("新宋体",Font.BOLD,16));           //用来控制时间轴的显示,防止乱码           DateAxis da = (DateAxis)plot.getRangeAxis(0);           da.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));                      FileOutputStream fop = null;           try{               System.out.println("Danny>> begin.");               fop = new FileOutputStream("D:gantt.jpg");               ChartUtilities.writeChartAsJPEG(fop,1f, chart, 800, 600,null);               System.out.println("Danny>> end..");               System.out.println("Danny>> successful...");           } catch (IOException e){               e.printStackTrace();           } finally{               try{                   fop.close();               } catch (IOException e){                   e.printStackTrace();               }           }       }              /** *//**        * Utility method for creating Date objects.        *        * @param day 日        * @param month 月        * @param year 年        *        * @return a date.        */       private static Date date(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;       }       /**        *        * @return The dataset.        */       private static IntervalCategoryDataset createSampleDataset() {           final TaskSeries s1 = new TaskSeries("SCHEDULE");                      final Task t1 = new Task("任务1", date(1, Calendar.JANUARY, 2001), date(5, Calendar.APRIL, 2001));           t1.setPercentComplete(0.8);           s1.add(t1);           // 创建一个任务并插入两个子任务           final Task t3 = new Task("任务2", date(10, Calendar.APRIL, 2001), date(5, Calendar.MAY, 2001));           final Task st31 = new Task("需求1", date(10, Calendar.APRIL, 2001), date(25, Calendar.APRIL, 2001));           st31.setPercentComplete(0.50);           final Task st32 = new Task("需求2", date(1, Calendar.MAY, 2001), date(5, Calendar.MAY, 2001));           st32.setPercentComplete(1.0);           t3.addSubtask(st31);           t3.addSubtask(st32);           s1.add(t3);           final Task t5 = new Task( "任务3", date(2, Calendar.JUNE, 2001), date(2, Calendar.JUNE, 2001));           s1.add(t5);                                     final Task t6 = new Task("任务4", date(3, Calendar.MARCH, 2001), date(31, Calendar.JULY, 2001));           t6.setPercentComplete(0.60);                      s1.add(t6);                      final Task t8 = new Task("任务结束", date(10, Calendar.AUGUST, 2001), date(10, Calendar.AUGUST, 2001));           t8.setPercentComplete(0.0);           s1.add(t8);                      final Task t9 = new Task("任务试用", date(12, Calendar.AUGUST, 2001), date(12, Calendar.SEPTEMBER, 2001));           t9.setPercentComplete(0.0);           s1.add(t9);                      final Task t10 = new Task("任务测试", date(13, Calendar.SEPTEMBER, 2001), date(31, Calendar.OCTOBER, 2001));           t10.setPercentComplete(0.2);           s1.add(t10);                      final Task t12 = new Task("全部结束", date(28, Calendar.NOVEMBER, 2001), date(30, Calendar.NOVEMBER, 2001));           t12.setPercentComplete(0.0);           s1.add(t12);           final TaskSeriesCollection collection = new TaskSeriesCollection();           collection.add(s1);           return collection;       }    } 


效果图:

102344pqozpdpda1dqn113_jpg_thumb.jpg
相关API:
GanttBarRenderer(IntervalBarRenderer)类:
void setCompletePaint(Paint paint)     完成进度颜色
void setIncompletePaint(Paint paint)     未完成进度颜色
void setStartPercent(double percent)     设置进度条在整条中的起始位置(0.0~1.0)
void setEndPercent(double percent)     设置进度条在整条中的结束位置(0.0~1.0)