使用JFreeChart创建图象遇到问题,提示java.lang.noclassdeffounderror: org/jfree/chart/ChartPanel

本文详细介绍了如何在Eclipse环境中下载并导入JFreeChart包,实现数据的图形化显示。包括从官网获取最新版本,正确安装至Java lib目录,以及在项目中设置ClassPath的具体步骤。

使用eclipse编码的时候,想用jfreechart包实现图像化的显示,所以进行了下载和使用。

JFreeChart下载和导入

1、从官网下载一个最新的jfreechart包

2、将其解压到电脑上Java文件夹下的lib包中(这并不会使项目自动导入jfreechart,仅仅是为了找起来方便,也可以解压到你觉得方便的文件夹中)

3、打开eclipse,右击需要导入jar的项目,点击Properties,在弹出的窗口中找到Java Build Path

4、选中ClassPath(很重要!!!)后,点击Add External JARs,找到刚刚下载的jfreechart包所在文件夹,将所需要的包加载上就好了。上图中的是我已经添加好后的结果。

注意:添加到Modulepath中并没有啥用,即使当时添加好后不会报编译错误(找不到包的那种错误),但是在运行的时候还是会报NoClassDefFoundError,下图是没有将jar添加到ClassPath中运行遇到的问题:

解决这个小问题,就可以继续往下做了。

 

这个错误表明您尝试将 **`PiePlot`** 强制转换为 **`RingPlot`**,但这两个类 **没有继承关系**,因此会抛出 `ClassCastException`。 ### **🔍 原因分析** 1. **JFreeChart 版本问题** - **旧版本(1.0.x)** 有 `RingPlot` 类,但 **新版本(1.5.0+)** 已移除,改用 `PiePlot + setInteriorGap()` 实现环形图。 - 如果您使用的是 **新版 JFreeChart**,直接使用 `PiePlot` 即可,无需转换。 2. **错误的强制类型转换** - 您的代码可能类似这样: ```java RingPlot plot = (RingPlot) chart.getPlot(); // ❌ 错误!新版没有 RingPlot ``` - 应该改为: ```java PiePlot plot = (PiePlot) chart.getPlot(); // ✅ 正确 ``` --- ### ✅ **解决方案(适用于 JFreeChart 1.5.0+)** #### **1. 使用 `PiePlot` 替代 `RingPlot`** ```java JFreeChart chart = ChartFactory.createPieChart(...); PiePlot plot = (PiePlot) chart.getPlot(); // 直接使用 PiePlot // 设置环形图样式 plot.setInteriorGap(0.35); // 35% 空心(0.35 = 35%) plot.setCircular(true); // 确保是圆形 plot.setOutlineVisible(false); // 隐藏边框 ``` #### **2. 检查 JFreeChart 版本** - 如果您 **必须使用 `RingPlot`**,请降级到 **JFreeChart 1.0.x**: ```xml <dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.19</version> <!-- 旧版支持 RingPlot --> </dependency> ``` - 但 **强烈建议使用新版 `PiePlot`**,因为 `RingPlot` 已废弃。 --- ### **📌 关键区别** | 版本 | 类名 | 实现方式 | 推荐度 | |------|------|----------|--------| | **JFreeChart 1.0.x** | `RingPlot` | 直接支持环形图 | ❌ 不推荐(旧版) | | **JFreeChart 1.5.0+** | `PiePlot` | `setInteriorGap()` 模拟环形图 | ✅ 推荐 | --- ### **💡 额外建议** 1. **如果 `setInteriorGap()` 无效** - 尝试 **强制刷新**: ```java plot.setDataset(plot.getDataset()); // 强制重绘 ``` - 或者 **调整 `setSectionDepth()`**(如果可用): ```java plot.setSectionDepth(0.65); // 65% 实心(35% 空心) ``` 2. **如何生成多层环形图?** - JFreeChart 原生不支持,但可以 **叠加多个 `PiePlot`** 或使用 **`MultiplePiePlot`** 模拟。 --- ### **📄 完整代码示例(新版 JFreeChart)** ```java import org.jfree.chart.*; import org.jfree.chart.plot.PiePlot; import org.jfree.data.general.DefaultPieDataset; import java.io.File; public class DonutChartExample { public static void main(String[] args) throws Exception { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("Java", 40); dataset.setValue("Python", 30); dataset.setValue("C++", 20); JFreeChart chart = ChartFactory.createPieChart( "编程语言使用率", dataset, true, true, false ); PiePlot plot = (PiePlot) chart.getPlot(); plot.setInteriorGap(0.35); // 35% 空心 plot.setCircular(true); plot.setOutlineVisible(false); ChartUtils.saveChartAsPNG(new File("donut.png"), chart, 600, 400); } } ``` --- ### **❓ 常见问题** **Q1: 为什么 `setInteriorGap()` 不生效?** - 可能是 **版本问题** 或 **渲染器未刷新**,尝试 `plot.setDataset(plot.getDataset())` 强制更新。 **Q2: 如何让环形图的标签显示百分比?** - 使用 `StandardPieSectionLabelGenerator`: ```java plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}: {2}")); ``` **Q3: 如何调整环形图的颜色?** - 使用 `plot.setSectionPaint(key, color)`: ```java plot.setSectionPaint("Java", Color.RED); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值