JFreeChart 是經典 Java 圖表庫,需依賴 jfreechart、jcommon。核心流程:創建 Dataset → ChartFactory 生成 JFreeChart → 包裝為 ChartPanel 嵌入 Swing。解決中文亂碼需設置標題、圖例、坐標軸字體。
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "蘋果");
dataset.addValue(200, "北京", "梨子");
// ...更多數據
JFreeChart chart = ChartFactory.createBarChart3D(
"水果產量", "地區", "產量", dataset,
PlotOrientation.VERTICAL, true, false, false);
// 設置中文字體
chart.getTitle().setFont(new Font("微軟雅黑", Font.BOLD, 18));
CategoryPlot plot = chart.getCategoryPlot();
plot.getDomainAxis().setLabelFont(new Font("微軟雅黑", Font.PLAIN, 12));
plot.getRangeAxis().setLabelFont(new Font("微軟雅黑", Font.PLAIN, 12));
ChartPanel panel = new ChartPanel(chart);
DefaultPieDataset pieData = new DefaultPieDataset();
pieData.setValue("蘋果", 100);
pieData.setValue("梨子", 200);
JFreeChart pieChart = ChartFactory.createPieChart3D("產量佔比", pieData, true, false, false);
PiePlot piePlot = (PiePlot) pieChart.getPlot();
piePlot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}: {2}", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));
TimeSeries series = new TimeSeries("價格", Month.class);
series.add(new Month(1, 2023), 100.5);
series.add(new Month(2, 2023), 102.3);
// ...
TimeSeriesCollection dataset = new TimeSeriesCollection(series);
JFreeChart lineChart = ChartFactory.createTimeSeriesChart(
"價格走勢", "日期", "價格", dataset, true, true, false);
XYPlot xyPlot = (XYPlot) lineChart.getPlot();
xyPlot.getDomainAxis().setDateFormatOverride(new SimpleDateFormat("yyyy-MM"));
圖表可導出為 PNG/JPG 或直接嵌入 Web (Servlet 輸出流)。