在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》
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/9676.html