jfreechart画gaitt图

本文通过一个图书出版项目的实例展示了如何使用甘特图来规划和跟踪项目进度。介绍了甘特图的基本概念及其在项目管理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.data.category.IntervalCategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;

/** */
public class GanttTest {

    
public static void main(String[] args) {
        IntervalCategoryDataset dataset 
= createSampleDataset();
        JFreeChart jfc 
= ChartFactory.createGanttChart("项目管理系统""项目各阶段详细实施计划""项目周期", dataset,
                 
falsefalsefalse);
        
        FileOutputStream fop 
= null;
        
try {
            System.out.println(
"----->begin!!");
            fop 
= new FileOutputStream("D:/gantt.jpg");
            ChartUtilities.writeChartAsJPEG(fop,1f, jfc, 
800600,null);
            System.out.println(
"----->successful!!");
        }
 catch (IOException e) {
            e.printStackTrace();
        }
 finally {
            
try {
                fop.close();
            }
 catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

    
    
/**
     * Utility method for creating <code>Date</code> 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;

    }


    
/**
     * Creates a sample dataset for a Gantt chart, using sub-tasks.  In general, you won't 
     * hard-code the dataset in this way - it's done here so that the demo is self-contained.
     *
     * 
@return The dataset.
     
*/

    
private static IntervalCategoryDataset createSampleDataset() {

        
final TaskSeries s1 = new TaskSeries("日程表");
        
        
final Task t1 = new Task(
            
"项目立项", date(1, Calendar.APRIL, 2001), date(5, Calendar.APRIL, 2001)
        );
        t1.setPercentComplete(
1.00);
        s1.add(t1);
        
        
final Task t2 = new Task(
            
"项目启动", date(9, Calendar.APRIL, 2001), date(9, Calendar.APRIL, 2001)
        );
        t2.setPercentComplete(
1.00);
        s1.add(t2);

        
// 创建一个任务并插入两个子任务
        final Task t3 = new Task(
            
"需求分析"
            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(
1.0);
        
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 t4 = new Task(
            
"基本设计"
            date(
6, Calendar.MAY, 2001), date(30, Calendar.MAY, 2001)
        );
        
final Task st41 = new Task(
             
"设计1"
             date(
6, Calendar.MAY, 2001), date(10, Calendar.MAY, 2001)
        );
        st41.setPercentComplete(
1.0);
        
final Task st42 = new Task(
            
"设计2"
            date(
15, Calendar.MAY, 2001), date(20, Calendar.MAY, 2001)
        );
        st42.setPercentComplete(
1.0);
        
final Task st43 = new Task(
            
"设计3"
            date(
23, Calendar.MAY, 2001), date(30, Calendar.MAY, 2001)
        );
        st43.setPercentComplete(
0.50);
        t4.addSubtask(st41);
        t4.addSubtask(st42);
        t4.addSubtask(st43);
        s1.add(t4);

        
final Task t5 = new Task(
            
"设计结束", date(2, Calendar.JUNE, 2001), date(2, Calendar.JUNE, 2001)
        ); 
        s1.add(t5);
                        
        
final Task t6 = new Task(
            
"实现", date(3, Calendar.JUNE, 2001), date(31, Calendar.JULY, 2001)
        );
        t6.setPercentComplete(
0.60);
        
        s1.add(t6);
        
        
final Task t7 = new Task(
            
"设计Review", date(1, Calendar.AUGUST, 2001), date(8, Calendar.AUGUST, 2001)
        );
        t7.setPercentComplete(
0.0);
        s1.add(t7);
        
        
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.0);
        s1.add(t10);
        
        
final Task t11 = new Task(
            
"最终实现"
            date(
1, Calendar.NOVEMBER, 2001), date(15, Calendar.NOVEMBER, 2001)
        );
        t11.setPercentComplete(
0.0);
        s1.add(t11);
        
        
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;
    }

    
}

生成的图片:

 

 甘特图(Gantt chart)是在20世纪初由亨利.甘特开发的。它基本上是一种线条图,横轴表示时间,纵轴表示要安排的活动,线条表示在整个期间上计划的和实际的活动完成情况。甘特图直观地表明任务计划在什么时候进行,以及实际进展与计划要求的对比。
   下面我们来举一个图书出版的例子来说明甘特图。
    时间以月为单位表示在图的下方,主要活动从上到下列在图的左边。计划需要确定数的出版包括哪些活动,这些活动的顺序,以及每项活动持续的时间。时间框里的线条表示计划的活动顺序,空白的现况表示活动的实际进度。甘特图作为一种控制工具,帮助管理者发现实际进度偏离计划的情况。在本例中,除了打印长条校样以外,其他活动都是按计划完成的。


<think>好的,我需要解决用户的问题,即如何用JFreeChart绘制环形并提供示例代码。首先,我得回忆一下JFreeChart的基本使用步骤,因为用户已经提到他们看过相关文档和示例。 用户提到了引用[1]和[2],其中引用[1]详细介绍了JFreeChart的特点和基本步骤,包括使用ChartFactory工厂类。而引用[2]则提到了生成各种表类型到JSP的示例。不过用户现在需要的是环形,也就是Doughnut Chart,这可能和普通的饼类似,但中间有一个空洞。 首先,我需要确认JFreeChart是否支持环形。根据我所知,JFreeChart的标准表类型中有PieChart,而环形通常是通过设置饼的属性来实现的,比如调整内半径来形成环形。因此,可能需要创建一个饼,然后通过渲染器设置内半径百分比,使其呈现为环形。 接下来,我需要构造示例代码的步骤。根据基本步骤,首先创建数据集,这里应该使用PieDataset。然后,使用ChartFactory创建饼,但之后需要获取渲染器并设置内半径。例如,使用PiePlot的setInteriorGap方法,或者可能通过渲染器的某个参数来调整。需要查证正确的API方法。 另外,可能需要自定义渲染器,比如使用StandardChartTheme来设置样式,确保表显示美观。同时,生成表后,可能需要将其保存为片或显示在GUI中,比如使用JFrame。 需要注意的是,用户可能需要完整的Java代码示例,包括导入的类、数据集的创建、表的配置以及如何展示或保存表。代码需要正确无误,符合JFreeChart的版本要求。例如,JFreeChart 1.5.0的API可能和旧版本有所不同,但通常setInteriorGap是PiePlot的方法,接受一个百分比值,如0.3表示30%的内半径,从而形成环形。 此外,用户可能需要了解如何将环形嵌入到JSP中,但根据引用[2],用户已有生成其他表到JSP的经验,因此示例代码可能只需展示生成表的Java部分,保存为片后,在JSP中通过img标签引用即可。 需要确保代码中的关键步骤有注释,解释各部分的作用,比如如何设置环形效果,如何自定义颜色等。同时,提醒用户注意异常处理,比如IO异常当保存片时。 最后,可能生成相关问题,比如如何调整环形的宽度、如何添加例或如何动态更新数据等,以帮助用户进一步探索。</think>### 如何用 JFreeChart 绘制环形JFreeChart 的环形(Doughnut Chart)本质上是通过调整饼的内半径实现的。以下是具体实现步骤和示例代码: --- #### **实现步骤** 1. **创建数据集**:使用 `DefaultPieDataset` 定义环形的数据。 2. **生成基础饼**:通过 `ChartFactory.createPieChart` 创建饼对象。 3. **配置环形效果**:从表中获取 `PiePlot` 对象,设置内半径比例(例如 `0.3` 表示内半径占30%)。 4. **自定义样式**(可选):调整颜色、标签等属性。 5. **保存或展示表**:输出为片文件或嵌入 GUI 界面。 --- #### **示例代码** ```java import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PiePlot; import org.jfree.data.general.DefaultPieDataset; import java.awt.Color; public class DoughnutChartExample { public static void main(String[] args) { // 1. 创建数据集 DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("Category A", 45); dataset.setValue("Category B", 25); dataset.setValue("Category C", 30); // 2. 生成基础饼 JFreeChart chart = ChartFactory.createPieChart( "环形示例", // 表标题 dataset, // 数据集 true, // 显示例 true, // 显示工具提示 false // 不生成URL链接 ); // 3. 配置环形效果 PiePlot plot = (PiePlot) chart.getPlot(); plot.setInteriorGap(0.3); // 设置内半径占比为30% // 4. 自定义样式(可选) plot.setSectionPaint("Category A", new Color(255, 99, 132)); plot.setSectionPaint("Category B", new Color(54, 162, 235)); plot.setSectionPaint("Category C", new Color(255, 206, 86)); // 5. 展示表 ChartFrame frame = new ChartFrame("环形", chart); frame.pack(); frame.setVisible(true); } } ``` --- #### **关键说明** - `setInteriorGap(0.3)`:设置内半径占比为30%,形成环形效果。数值越大,环形越细。 - `setSectionPaint`:自定义数据块颜色,增强可视化效果[^1]。 - 若需保存为片,可调用 `ChartUtils.saveChartAsPNG(File, JFreeChart, Width, Height)`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值