本文目录导读:

- JFreeChart(最常用、功能全面)
- JavaFX Charts(现代Java应用推荐)
- ECharts for Java(Web项目推荐)
- XChart(轻量级、简单)
- 选择建议
- 实际项目案例 - 数据库驱动图表
Java中实现图表有多种方式,从简单的轻量级库到复杂的企业级解决方案,以下是几种主流的实现方案及案例:
JFreeChart(最常用、功能全面)
JFreeChart 是 Java 最经典的图表库,支持折线图、柱状图、饼图、散点图等。
Maven依赖
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.3</version>
</dependency>
折线图案例
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import javax.swing.*;
import java.awt.*;
public class LineChartExample extends JFrame {
public LineChartExample(String title) {
super(title);
// 创建数据集
DefaultCategoryDataset dataset = createDataset();
// 创建图表
JFreeChart chart = ChartFactory.createLineChart(
"月度销售统计", // 图表标题
"月份", // X轴标签
"销售额(万元)", // Y轴标签
dataset, // 数据集
PlotOrientation.VERTICAL,
true, // 显示图例
true, // 生成工具提示
false // 生成URL链接
);
// 设置图表到面板
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(800, 600));
setContentPane(chartPanel);
}
private DefaultCategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(120, "销售额", "1月");
dataset.addValue(150, "销售额", "2月");
dataset.addValue(180, "销售额", "3月");
dataset.addValue(210, "销售额", "4月");
dataset.addValue(240, "销售额", "5月");
dataset.addValue(280, "销售额", "6月");
return dataset;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
LineChartExample example = new LineChartExample("JFreeChart 折线图示例");
example.setSize(800, 600);
example.setLocationRelativeTo(null);
example.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
example.setVisible(true);
});
}
}
柱状图案例
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
// 主要代码类似,只需将 createLineChart 改为 createBarChart
JFreeChart chart = ChartFactory.createBarChart(
"各产品销量对比",
"产品名称",
"销量(件)",
dataset,
PlotOrientation.VERTICAL,
true,
true,
false
);
JavaFX Charts(现代Java应用推荐)
JavaFX 内置了强大的图表组件,适合现代Java应用开发。
折线图案例
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class JavaFXLineChart extends Application {
@Override
public void start(Stage stage) {
// 定义坐标轴
CategoryAxis xAxis = new CategoryAxis();
NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("月份");
yAxis.setLabel("销售额(万元)");
// 创建折线图
LineChart<String, Number> lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("月度销售统计");
// 创建数据集
XYChart.Series<String, Number> series = new XYChart.Series<>();
series.setName("销售额");
series.getData().add(new XYChart.Data<>("1月", 120));
series.getData().add(new XYChart.Data<>("2月", 150));
series.getData().add(new XYChart.Data<>("3月", 180));
series.getData().add(new XYChart.Data<>("4月", 210));
series.getData().add(new XYChart.Data<>("5月", 240));
series.getData().add(new XYChart.Data<>("6月", 280));
lineChart.getData().add(series);
// 显示
Scene scene = new Scene(lineChart, 800, 600);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
饼图案例
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.stage.Stage;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public class JavaFXPieChart extends Application {
@Override
public void start(Stage stage) {
// 创建饼图数据
ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(
new PieChart.Data("产品A", 30),
new PieChart.Data("产品B", 25),
new PieChart.Data("产品C", 20),
new PieChart.Data("产品D", 15),
new PieChart.Data("产品E", 10)
);
// 创建饼图
PieChart pieChart = new PieChart(pieChartData);
pieChart.setTitle("产品销售占比");
// 显示
Scene scene = new Scene(pieChart, 600, 400);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ECharts for Java(Web项目推荐)
通过Java集成ECharts,适合Web应用。
Maven依赖
<dependency>
<groupId>org.icepear.echarts</groupId>
<artifactId>echarts-java</artifactId>
<version>1.0.2</version>
</dependency>
案例
import org.icepear.echarts.Line;
import org.icepear.echarts.charts.line.LineSeries;
import org.icepear.echarts.serializer.EChartsSerializer;
public class EChartsExample {
public static void main(String[] args) {
// 创建折线图
Line line = new Line()
.setTitle("月度销售统计")
.addXAxis(new String[]{"1月", "2月", "3月", "4月", "5月", "6月"})
.addYAxis()
.addSeries(new LineSeries()
.setName("销售额")
.setData(new Number[]{120, 150, 180, 210, 240, 280}));
// 生成JSON
String json = EChartsSerializer.toJson(line);
System.out.println(json);
// 将JSON传递给前端ECharts渲染
}
}
XChart(轻量级、简单)
适合简单的图表需求,API非常简洁。
Maven依赖
<dependency>
<groupId>org.knowm.xchart</groupId>
<artifactId>xchart</artifactId>
<version>3.8.1</version>
</dependency>
案例
import org.knowm.xchart.*;
import org.knowm.xchart.style.Styler;
import javax.swing.*;
public class XChartExample {
public static void main(String[] args) {
// 创建数据
double[] xData = new double[]{1, 2, 3, 4, 5, 6};
double[] yData = new double[]{120, 150, 180, 210, 240, 280};
// 创建图表
XYChart chart = new XYChartBuilder()
.width(800)
.height(600)
.title("月度销售统计")
.xAxisTitle("月份")
.yAxisTitle("销售额(万元)")
.build();
chart.addSeries("销售额", xData, yData);
// 显示
new SwingWrapper<>(chart).displayChart();
}
}
选择建议
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| JFreeChart | 桌面应用、报表 | 功能全面、文档丰富 | 样式较旧、更新慢 |
| JavaFX Charts | 现代JavaFX应用 | 原生支持、动画效果好 | 需JavaFX环境 |
| ECharts for Java | Web应用 | 交互丰富、视觉效果佳 | 依赖前端渲染 |
| XChart | 简单需求 | API简洁、轻量级 | 功能有限 |
实际项目案例 - 数据库驱动图表
// 从数据库获取数据生成图表
public class DatabaseChartExample {
public JFreeChart createChartFromDatabase(String sql) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
String category = rs.getString("category");
double value = rs.getDouble("value");
dataset.addValue(value, "系列", category);
}
} catch (SQLException e) {
e.printStackTrace();
}
return ChartFactory.createBarChart(
"数据统计分析", "分类", "数值",
dataset, PlotOrientation.VERTICAL, true, true, false
);
}
}
根据你的项目类型(桌面应用/Web应用/报表系统)和具体需求选择合适的方案,对于新项目,推荐使用JavaFX Charts(桌面)或ECharts(Web)。