上一篇
使用JavaFX制作统计图需导入javafx.scene.chart包,常用图表包括折线图(LineChart)、饼图(PieChart)等,核心步骤:创建数据集合(如XYChart.Series或ObservableList),实例化图表对象并绑定数据,最后将图表添加到场景布局中,支持样式和交互定制。
JavaFX 图表核心类
JavaFX 的 javafx.scene.chart 包包含以下常用图表:
LineChart(折线图)BarChart(条形图)PieChart(饼图)AreaChart(面积图)ScatterChart(散点图)
每个图表通过 ObservableList 动态管理数据,实时更新。
创建基础图表(附完整示例)
折线图(LineChart)
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.*;
import javafx.stage.Stage;
import javafx.collections.FXCollections;
public class LineChartDemo extends Application {
@Override
public void start(Stage stage) {
// 定义X轴(类别轴)
CategoryAxis xAxis = new CategoryAxis();
xAxis.setLabel("月份");
// 定义Y轴(数值轴)
NumberAxis yAxis = new NumberAxis();
yAxis.setLabel("销售额 (万元)");
// 创建折线图
LineChart<String, Number> lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("2025年月度销售额");
// 添加数据系列
XYChart.Series<String, Number> series = new XYChart.Series<>();
series.setName("产品A");
series.getData().addAll(
new XYChart.Data<>("1月", 23),
new XYChart.Data<>("2月", 45),
new XYChart.Data<>("3月", 32),
new XYChart.Data<>("4月", 56)
);
lineChart.getData().add(series);
Scene scene = new Scene(lineChart, 600, 400);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
饼图(PieChart)
PieChart pieChart = new PieChart();
pieChart.setTitle("市场份额占比");
// 添加数据切片
ObservableList<PieChart.Data> pieData = FXCollections.observableArrayList(
new PieChart.Data("产品A", 35),
new PieChart.Data("产品B", 25),
new PieChart.Data("产品C", 40)
);
pieChart.setData(pieData);
pieChart.setClockwise(false); // 逆时针显示
pieChart.setLabelsVisible(true); // 显示标签
条形图(BarChart)
CategoryAxis xAxis = new CategoryAxis();
xAxis.setLabel("部门");
NumberAxis yAxis = new NumberAxis();
yAxis.setLabel("预算(万元)");
BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);
barChart.setTitle("年度部门预算");
XYChart.Series<String, Number> series = new XYChart.Series<>();
series.setName("2025年");
series.getData().addAll(
new XYChart.Data<>("技术部", 120),
new XYChart.Data<>("市场部", 95),
new XYChart.Data<>("财务部", 80)
);
barChart.getData().add(series);
高级定制技巧
修改样式 (CSS)
通过CSS文件 (style.css) 定制外观:
/* 修改图表背景 */
.chart {
-fx-background-color: #f5f5f5;
}
/* 折线图数据点颜色 */
.default-color0.chart-series-line { -fx-stroke: #3498db; }
.default-color0.chart-line-symbol { -fx-background-color: #2980b9; }
/* 饼图切片颜色 */
.data0.chart-pie { -fx-pie-color: #e74c3c; }
.data1.chart-pie { -fx-pie-color: #2ecc71; }
在Java代码中加载样式:

scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
动态更新数据
利用 ObservableList 实现实时刷新:
ObservableList<PieChart.Data> livePieData = FXCollections.observableArrayList();
PieChart liveChart = new PieChart(livePieData);
// 添加按钮更新数据
Button updateBtn = new Button("增加数据");
updateBtn.setOnAction(e -> {
livePieData.add(new PieChart.Data("新产品", 15));
});
交互事件
为数据点添加点击事件:
for (PieChart.Data data : pieChart.getData()) {
data.getNode().setOnMouseClicked(event -> {
System.out.println("点击了: " + data.getName() + " - " + data.getPieValue());
});
}
常见问题与解决
-
图表不显示

- 检查坐标轴是否绑定正确
- 确保数据系列
getData().add()已调用 - 验证
Scene是否设置了图表作为根节点
-
数据格式错误
- 折线图/条形图:X轴为
String类型时需用CategoryAxis - 数值轴数据必须为
Number类型
- 折线图/条形图:X轴为
-
性能优化

- 大数据集时启用
NodeCache:lineChart.setAnimated(false); // 禁用动画 lineChart.setCreateSymbols(false); // 隐藏数据点符号
- 大数据集时启用
-
乱码问题
在启动类中设置中文字体:public static void main(String[] args) { Font.loadFont(YourClass.class.getResource("字体.ttf").toExternalForm(), 12); launch(args); }
最佳实践建议
- 模块化设计:将图表封装成自定义组件(如
SalesChart extends VBox)。 - 数据分离:使用
Model类管理数据,通过FXCollections绑定到图表。 - 响应式布局:将图表置于
BorderPane中心区域,随窗口自动缩放。
引用说明
- Oracle官方JavaFX图表教程
- JavaFX CSS参考指南
- GitHub开源项目:JFoenix(Material Design风格组件)
本文代码基于 JavaFX 17 验证,建议使用 JDK 11+ 运行,通过结合CSS与Java动态能力,可快速构建企业级数据可视化应用。
