Java中使用JFreeChart生成甘特图
引言
甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配。它通过条形图显示任务的开始和结束时间,使项目经理能够直观地了解项目的整体情况。在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图表,包括甘特图。本文将详细介绍如何在Java中使用JFreeChart生成甘特图,并提供一个完整的代码示例。
一、JFreeChart简介
JFreeChart是一个用于生成各种图表的Java类库。它支持多种图表类型,如饼图、柱状图、折线图、散点图以及甘特图等。JFreeChart具有高度的可定制性,能够满足各种复杂的图表需求。
二、准备工作
在使用JFreeChart生成甘特图之前,需要完成以下准备工作:
1.引入JFreeChart库:确保在你的Java项目中已经引入了JFreeChart库。你可以通过Maven来引入这个库。以下是Maven的依赖配置:
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.3</version> <!-- 使用最新版本 -->
</dependency>
确保在pom.xml
文件中添加上述代码,并更新项目依赖。
2.创建Java项目:在你的IDE中创建一个新的Java项目,并配置好Maven依赖。
三、创建甘特图
创建甘特图的过程可以分为以下几个步骤:
- 定义数据集:在JFreeChart中,使用
GanttCategoryDataset
来存储任务信息。 - 创建甘特图:使用
ChartFactory.createGanttChart
方法根据数据集生成甘特图。 - 显示甘特图:将生成的甘特图显示在一个窗口中。
下面是一个详细的代码示例,展示了如何在Java中使用JFreeChart生成甘特图。
1. 定义数据集
首先,我们需要定义一个数据集来存储任务信息。在JFreeChart中,GanttCategoryDataset
接口用于存储甘特图的数据。我们可以使用DefaultGanttCategoryDataset
类来实现这个接口。
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.GanttCategoryDataset;
import org.jfree.data.gantt.DefaultGanttCategoryDataset;
import java.util.Date;
public class GanttChartData {
public GanttCategoryDataset createDataset() {
DefaultGanttCategoryDataset dataset = new DefaultGanttCategoryDataset();
// 创建任务
Task task1 = new Task("Task 1", new Date(2023, 9, 1), new Date(2023, 9, 10));
Task task2 = new Task("Task 2", new Date(2023, 9, 5), new Date(2023, 9, 15));
Task task3 = new Task("Task 3", new Date(2023, 9, 10), new Date(2023, 9, 20));
// 添加任务到数据集中
dataset.add(task1, "Project A", "Task 1");
dataset.add(task2, "Project A", "Task 2");
dataset.add(task3, "Project A", "Task 3");
return dataset;
}
}
在这个示例中,我们创建了一个GanttChartData
类,并在其中定义了一个createDataset
方法。这个方法创建了一个DefaultGanttCategoryDataset
对象,并添加了三个任务到数据集中。每个任务都有一个名称、开始日期和结束日期。
2. 创建甘特图
接下来,我们使用ChartFactory.createGanttChart
方法根据数据集生成甘特图。
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import javax.swing.*;
import java.awt.*;
public class GanttChartExample extends JFrame {
public GanttChartExample(String title) {
super(title);
// 创建数据集
GanttCategoryDataset dataset = new GanttChartData().createDataset();
// 创建甘特图
JFreeChart chart = ChartFactory.createGanttChart(
"Task Schedule", // 图表标题
"Task", // 任务轴标签
"Date", // 时间轴标签
dataset, // 数据集
true, // 显示图例
true, // 显示工具提示
false // 不显示 URL
);
// 创建和设置图表面板
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(800, 600));
setContentPane(chartPanel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
GanttChartExample example = new GanttChartExample("Gantt Chart Example");
example.setSize(800, 600);
example.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
example.setVisible(true);
});
}
}
在这个示例中,我们创建了一个GanttChartExample
类,它继承自JFrame
。在构造函数中,我们首先创建了数据集,然后使用ChartFactory.createGanttChart
方法生成甘特图。最后,我们将甘特图显示在一个ChartPanel
中,并将其设置为窗口的内容面板。
在main
方法中,我们使用SwingUtilities.invokeLater
来确保GUI更新在事件调度线程中进行。然后,我们创建一个GanttChartExample
对象,并设置窗口的大小、关闭操作和可见性。
3. 运行代码
将上述代码保存为两个Java文件:GanttChartData.java
和GanttChartExample.java
。确保你的项目已经正确配置了JFreeChart依赖。然后,运行GanttChartExample
类的main
方法。你将看到一个窗口显示生成的甘特图,其中包含了三个任务及其开始和结束时间。
四、代码解析
以下是代码的详细解析:
1.导入语句:
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.GanttCategoryDataset;
import org.jfree.data.gantt.DefaultGanttCategoryDataset;
import org.jfree.ui.ApplicationFrame; // 注意:这里我们使用JFrame而不是ApplicationFrame
import javax.swing.*;
import java.awt.*;
import java.util.Date;
导入必要的JFreeChart和Swing包,以便使用图表和创建窗口。
2.GanttChartData类:
public class GanttChartData {
public GanttCategoryDataset createDataset() {
// ...(同上)
}
}
定义一个GanttChartData
类,并在其中创建数据集。
3.GanttChartExample类:
public class GanttChartExample extends JFrame {
// 构造函数(同上)
public static void main(String[] args) {
// ...(同上)
}
}
定义一个GanttChartExample
类,继承自JFrame
。在构造函数中创建数据集和甘特图,并将其显示在窗口中。在main
方法中,创建并显示甘特图窗口。
五、自定义和扩展
JFreeChart提供了丰富的自定义和扩展功能。你可以根据需要调整图表的样式、添加交互功能、处理鼠标事件等。以下是一些常见的自定义选项:
- 调整样式:使用
JFreeChart
对象的getPlot()
方法和Plot
子类的方法来调整图表的样式,如坐标轴标签、网格线、图例等。 - 添加交互功能:使用
ChartMouseListener
和ChartPanel
的addChartMouseListener
方法来处理鼠标事件,如点击、悬停等。 - 导出图表:使用
ChartUtilities
类将图表导出为图像文件(如PNG、JPEG)或PDF文件。
六、实际应用
甘特图在项目管理中具有广泛的应用价值。通过甘特图,项目经理可以直观地了解项目的进度和任务分配情况。以下是一些实际应用的场景:
- 项目进度管理:显示项目的各个阶段和任务的开始和结束时间,帮助项目经理跟踪项目的进度。
- 资源分配:显示每个任务所需的资源(如人力、物力),帮助项目经理合理分配资源。
- 风险管理:显示项目的关键路径和潜在风险点,帮助项目经理识别和管理风险。
七、结论
本文详细介绍了如何在Java中使用JFreeChart生成甘特图。通过定义数据集、创建甘特图和显示甘特图三个步骤,我们成功地生成了一个包含三个任务的甘特图。此外,我们还介绍了代码解析、自定义和扩展以及实际应用等方面的内容。希望本文对你学习Java图表绘制有所帮助。
Java中使用JFreeChart生成甘特图的更多相关文章
- 利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全)
利用JFreeChart生成折线图 (4) (转自 JSP开发技术大全) 14.4 利用JFreeChart生成折线图 通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折 ...
- 利用JFreeChart生成时序图(6) (转自 JSP开发技术大全)
利用JFreeChart生成时序图(6) (转自 JSP开发技术大全) 14.6 利用JFreeChart生成时序图 通过JFreeChart插件只能生成普通效果的时序图,利用工厂类ChartFact ...
- 利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全)
利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全) 14.5 利用JFreeChart生成区域图 通过JFreeChart插件只能生成普通效果的区域图,利用工厂类ChartFac ...
- 在java中调用mockjs生成模拟数据
一.手写版 在前端有个模拟数据的神器 Mock.js 能生成随机数据,拦截 Ajax 请求,然后我觉得他的这个生成随机数据不错.然后我就到度娘一顿操作,没找到类似的java实现,于是就有了下面的代码: ...
- JAVA Swing使用JFreeChart实现折线图绘制
效果如下: 实现步骤: 1.导入JAR包 jfreechart官网下载的zip文件中包含这两个jar包 2.代码编写 import org.jfree.chart.ChartFactory; impo ...
- 在JAVA中使用JSONObject生成json
JSON是一种轻量级的数据交换格式,在现在的web开发中,是非常常见的.在没有方便的工具之前,我们或许会使用拼字符串的形式来生成json数组,今天我们使用一个json-lib.jar包来为我们实现生成 ...
- java中json数据生成和解析(复杂对象演示)
1.json简单介绍 1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用. 1.2 举个例子,下面是一个jso ...
- Java中使用OpenSSL生成的RSA公私钥进行数据加解密
当前使用的是Linux系统,已经按装使用OpenSSL软件包, 一.使用OpenSSL来生成私钥和公钥 1.执行命令openssl version -a 验证机器上已经安装openssl 1 open ...
- Java中使用OpenSSL生成的RSA公私钥
RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的 ...
- JAVA中使用freemark生成自定义文件(json、excel、yaml、txt)
原文:http://blog.csdn.net/jinzhencs/article/details/51461776 场景:在我们工作中,有时需要生成一些文件,可能它不是一种标准的格式,比如JSON. ...
随机推荐
- MVC PHP架构 博客论坛实现全过程
目录 1. MVC的历史 1.1 优点与缺点 1.1.1 优点 1.1.2 缺点 2. 个人博客论坛的MVC实现 2.1 前言 2.2 web代码结构 框架 2.2.1 web应用发展 2.2.2 C ...
- Tony Bai · Go语言第一课 _个人笔记 04|初窥门径:一个Go程序的结构是怎样的?
Tony Bai · Go语言第一课 _个人笔记 04|初窥门径:一个Go程序的结构是怎样的? 1.配置国内的Go模块的镜像 配置国内镜像代理(使用阿里云镜像) go env -w GOPROXY=h ...
- 一文解秘Rust如何与Java互操作
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议.转载请注明来自 唯你 使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情,而 Jav ...
- 3.6 Linux命令基本格式
本节开始,我们不会再见到图形界面了,因为对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务.开放更多的端口,这对服务器的稳定性和安全性都有负面影响.其实,服务器是一个连显示器都没有的家伙 ...
- Python 抓取猫眼电影排行
import json import re import requests from requests.exceptions import RequestException import time # ...
- Web实时消息推送的解决方案
什么是消息推送(push) 推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用. 消息推送(push)通常是指网站的运营工作等人员,通过某种工具对用户当前网 ...
- golang之Time时间函数
在编程中,我们经常会遭遇八小时时间差问题.这是由时区差异引起的,为了能更好地解决它们,我们需要理解几个时间定义标准. GMT(Greenwich Mean Time),格林威治平时.GMT 根据地球的 ...
- AWMS(ApeosWare Management Suite)的一些配置信息
富士胶片商业创新的富士施乐打印复印一体机,一般可用被称为亚特兰大(ApeosWare Management Suite)的管理软件. Windows Server 2012 上安装的SQLServer ...
- Mac m1 安装 Homebrew
Homebrew 是 Mac 的包管理器,类似于 Linux 中的 apt,Windows 中的 choco. 自从 M1 芯片发布,Homebrew 正在积极适配新架构,如今已经有了原生支持 ARM ...
- sql 依据时间间隔分组,获取第一条数据
时序数据的数据量比较大,抛去异常点外,变化相对比较有线性规律,业务上需要对结果进行抽取显示. 原始数据时序标签(部分示例) 根据时间字段,计算时间字段和指定时间的时间戳差值,然后除以固定间隔(示例中间 ...