上一篇
在Java中使用JFreeChart库创建柱状图时,可通过ChartFactory的createBarChart方法设置参数,并在plot对象中调用setDataset方法绑定数据表,最后用ChartPanel将图表嵌入Swing界面实现可视化展示。
在Java中为柱状图添加数据表能直观呈现数值细节,提升数据可视化效果,下面详细介绍使用主流库JFreeChart实现柱状图与数据表联动显示的完整方案:
核心实现原理
通过JFreeChart生成柱状图,利用CategoryTable组件创建数据表格,结合ChartComposite与JScrollPane实现图表和表格的联动展示。
关键类说明:
DefaultCategoryDataset:存储柱状图数据JFreeChart:核心图表对象CategoryTable:表格渲染器ChartComposite:图表显示容器
环境准备
-
添加Maven依赖:

<dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.jfree</groupId> <artifactId>jcommon</artifactId> <version>1.0.24</version> </dependency>
-
手动下载:
JFreeChart官网 | JCommon库
分步实现代码
步骤1:创建数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(12000, "销售额", "1月"); dataset.addValue(18000, "销售额", "2月"); dataset.addValue(9000, "销售额", "3月");
步骤2:生成柱状图
JFreeChart chart = ChartFactory.createBarChart(
"2025年季度销售统计", // 标题
"月份", // X轴标签
"金额(元)", // Y轴标签
dataset, // 数据源
PlotOrientation.VERTICAL,
true, true, false // 显示图例/提示/URL
);
// 自定义样式
CategoryPlot plot = chart.getCategoryPlot();
plot.setBackgroundPaint(Color.WHITE);
plot.setRangeGridlinePaint(Color.GRAY);
步骤3:创建数据表
String[] columns = {"月份", "销售额"};
CategoryTable table = new CategoryTable(dataset, columns);
JTable dataTable = table.createTable();
步骤4:整合显示组件
public static void displayChartAndTable() {
JFrame frame = new JFrame("柱状图数据表联动");
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加图表
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(600, 400));
frame.add(chartPanel, BorderLayout.NORTH);
// 添加表格(带滚动条)
JScrollPane tableScrollPane = new JScrollPane(dataTable);
tableScrollPane.setPreferredSize(new Dimension(600, 150));
frame.add(tableScrollPane, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
效果说明
最终界面分为上下两部分:
- 上半部分:动态交互柱状图(支持缩放、平移)
- 下半部分:可滚动数据表格
(示意图:柱状图+数据表格联动显示)
完整代码示例
import org.jfree.chart.*;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.ui.CategoryTable;
import org.jfree.data.category.DefaultCategoryDataset;
import javax.swing.*;
import java.awt.*;
public class ChartWithTableExample {
public static void main(String[] args) {
// 1. 创建数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(12000, "Sales", "Jan");
dataset.addValue(18000, "Sales", "Feb");
dataset.addValue(9000, "Sales", "Mar");
// 2. 生成柱状图
JFreeChart chart = ChartFactory.createBarChart(
"2025 Q1 Sales Report", "Month", "Amount (¥)",
dataset, PlotOrientation.VERTICAL, true, true, false
);
customizeChart(chart);
// 3. 创建数据表
String[] headers = {"Month", "Sales Amount"};
CategoryTable tableModel = new CategoryTable(dataset, headers);
JTable dataTable = new JTable(tableModel);
// 4. 显示界面
showUI(chart, dataTable);
}
private static void customizeChart(JFreeChart chart) {
CategoryPlot plot = chart.getCategoryPlot();
plot.setBackgroundPaint(Color.WHITE);
plot.setRangeGridlinePaint(Color.LIGHT_GRAY);
chart.getTitle().setFont(new Font("微软雅黑", Font.BOLD, 16));
}
private static void showUI(JFreeChart chart, JTable table) {
JFrame frame = new JFrame("Chart with Data Table");
frame.setLayout(new BorderLayout());
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new Dimension(700, 400));
frame.add(chartPanel, BorderLayout.CENTER);
JScrollPane tablePane = new JScrollPane(table);
tablePane.setPreferredSize(new Dimension(700, 150));
frame.add(tablePane, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
进阶优化方案
-
数据动态更新:

// 更新数据集后刷新组件 dataset.addValue(21000, "Sales", "Apr"); chartPanel.repaint(); ((AbstractTableModel) dataTable.getModel()).fireTableDataChanged();
-
导出功能:
// 保存为PNG ChartUtils.saveChartAsPNG(new File("chart.png"), chart, 800, 600); -
样式美化:

- 使用
ChartFactory.setChartTheme()应用统一主题 - 修改柱子颜色:
plot.getRenderer().setSeriesPaint(0, Color.BLUE)
- 使用
常见问题解决
- 表格不显示:检查
JScrollPane是否正确包裹JTable - 中文乱码:设置字体
chart.getTitle().setFont(new Font("宋体", Font.PLAIN, 12)) - 依赖冲突:确保jfreechart与jcommon版本匹配
引用说明:本文代码基于JFreeChart 1.5.3官方文档实现,参考资源:
JFreeChart Developer Guide
Oracle Java Swing Tutorial
数据可视化最佳实践参考《Data Visualization with Java》
