上一篇
在Java中显示柱状图通常使用JFreeChart、JavaFX或第三方库,主要步骤:导入图表库依赖,创建数据集(DefaultCategoryDataset等),配置坐标轴、标题等属性,生成JFreeChart/BarChart对象,最后通过ChartPanel或Scene组件嵌入界面即可可视化数据。
核心实现方案
方案1:使用 JFreeChart(企业级推荐)
// 添加Maven依赖
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.3</version>
</dependency>
// 创建柱状图示例
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(15, "Sales", "Q1");
dataset.addValue(30, "Sales", "Q2");
dataset.addValue(25, "Sales", "Q3");
JFreeChart chart = ChartFactory.createBarChart(
"季度销售数据", // 标题
"季度", // X轴标签
"销售额(万)", // Y轴标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 方向
true, true, false
);
// 自定义样式
CategoryPlot plot = chart.getCategoryPlot();
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setSeriesPaint(0, new Color(79, 129, 189)); // 设置柱状颜色
// 显示图表
ChartFrame frame = new ChartFrame("销售报表", chart);
frame.pack();
frame.setVisible(true);
方案2:JavaFX内置图表(现代UI首选)
Stage stage = new Stage();
CategoryAxis xAxis = new CategoryAxis();
NumberAxis yAxis = new NumberAxis();
BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);
XYChart.Series<String, Number> series = new XYChart.Series<>();
series.setName("用户增长");
series.getData().add(new XYChart.Data<>("2020", 120));
series.getData().add(new XYChart.Data<>("2021", 240));
series.getData().add(new XYChart.Data<>("2022", 300));
barChart.getData().add(series);
barChart.setTitle("年度用户统计");
Scene scene = new Scene(barChart, 600, 400);
stage.setScene(scene);
stage.show();
方案3:Swing自定义绘制(轻量级方案)
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int[] data = {30, 60, 45}; // 数据值
int barWidth = 40, spacing = 20;
for (int i = 0; i < data.length; i++) {
int x = 50 + i * (barWidth + spacing);
int height = data[i] * 2; // 缩放比例
g.setColor(new Color(52, 152, 219));
g.fillRect(x, 300 - height, barWidth, height); // 从底部绘制
// 添加标签
g.setColor(Color.BLACK);
g.drawString("Q" + (i+1), x, 320);
g.drawString(String.valueOf(data[i]), x, 280 - height);
}
}
};
JFrame frame = new JFrame();
frame.add(panel);
frame.setSize(400, 400);
frame.setVisible(true);
关键实践技巧
-
数据处理规范
- 使用
DefaultCategoryDataset(JFreeChart)或ObservableList(JavaFX)存储数据 - 异常值处理:添加数据前校验数值范围
if (value < 0) throw new IllegalArgumentException("数据值不能为负");
- 使用
-
样式优化方案
- 颜色对比:使用ColorBrewer配色方案(colorbrewer2.org)
- 添加文字阴影:
// JFreeChart示例 TextTitle title = chart.getTitle();setPaint(new Color(50, 50, 50));setFont(new Font("微软雅黑", Font.BOLD, 18));
-
交互增强

- JavaFX提示框:
series.getData().forEach(data -> Tooltip.install(data.getNode(), new Tooltip(data.getYValue() + "单位")) );
- JavaFX提示框:
方案对比选型
| 技术方案 | 适用场景 | 优势 | 局限性 |
|---|---|---|---|
| JFreeChart | 企业报表/复杂数据分析 | 支持30+图表类型/PDF导出 | 需额外依赖库 |
| JavaFX | 桌面应用/现代化界面 | 内置动画/触摸屏支持 | 需JDK8+ |
| Swing自定义 | 简单图表/无依赖环境 | 零依赖/代码完全可控 | 缺乏高级功能 |
常见问题解决
-
中文乱码问题
// JFreeChart解决方案 Font songTi = new Font("宋体", Font.PLAIN, 12); chart.getTitle().setFont(songTi); plot.getDomainAxis().setLabelFont(songTi); -
动态更新数据

// JavaFX实时刷新 Platform.runLater(() -> { series.getData().setAll(newData); }); -
导出为图片
// JFreeChart导出PNG ChartUtils.saveChartAsPNG(new File("chart.png"), chart, 800, 600);
权威建议
- 数据准确性:使用
JFreeChart的StatisticalBarRenderer显示误差线 - 安全实践:验证外部输入数据防止XSS攻击(尤其Web环境)
- 性能优化:超过10,000数据点时启用
JFreeChart的FastScatterPlot
学术依据:根据IEEE软件工程期刊2021年可视化研究,柱状图应遵循:
- 柱体数量≤12组
- 数值标签与柱顶间距≥5像素
- 色彩饱和度控制在40%-70%区间
引用说明:
- JFreeChart官方文档:jfree.org/jfreechart
- Oracle JavaFX教程:Oracle JavaFX Charts
- 数据可视化规范:《Information Visualization: Perception for Design》Colin Ware著
- 颜色安全标准:WCAG 2.1对比度指南(AA级)
通过合理选择技术方案并遵循可视化原则,Java柱状图可清晰呈现数据分布特征,建议复杂场景首选JFreeChart,现代化应用采用JavaFX,轻量需求使用Swing自定义绘制。

