Java案例如何实现图表?

wen python案例 2

本文目录导读:

Java案例如何实现图表?

  1. JFreeChart(最常用、功能全面)
  2. JavaFX Charts(现代Java应用推荐)
  3. ECharts for Java(Web项目推荐)
  4. XChart(轻量级、简单)
  5. 选择建议
  6. 实际项目案例 - 数据库驱动图表

Java中实现图表有多种方式,从简单的轻量级库到复杂的企业级解决方案,以下是几种主流的实现方案及案例:

JFreeChart(最常用、功能全面)

JFreeChart 是 Java 最经典的图表库,支持折线图、柱状图、饼图、散点图等。

Maven依赖

<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.5.3</version>
</dependency>

折线图案例

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import javax.swing.*;
import java.awt.*;
public class LineChartExample extends JFrame {
    public LineChartExample(String title) {
        super(title);
        // 创建数据集
        DefaultCategoryDataset dataset = createDataset();
        // 创建图表
        JFreeChart chart = ChartFactory.createLineChart(
            "月度销售统计",     // 图表标题
            "月份",            // X轴标签
            "销售额(万元)",     // Y轴标签
            dataset,           // 数据集
            PlotOrientation.VERTICAL,
            true,              // 显示图例
            true,              // 生成工具提示
            false              // 生成URL链接
        );
        // 设置图表到面板
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(800, 600));
        setContentPane(chartPanel);
    }
    private DefaultCategoryDataset createDataset() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(120, "销售额", "1月");
        dataset.addValue(150, "销售额", "2月");
        dataset.addValue(180, "销售额", "3月");
        dataset.addValue(210, "销售额", "4月");
        dataset.addValue(240, "销售额", "5月");
        dataset.addValue(280, "销售额", "6月");
        return dataset;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            LineChartExample example = new LineChartExample("JFreeChart 折线图示例");
            example.setSize(800, 600);
            example.setLocationRelativeTo(null);
            example.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            example.setVisible(true);
        });
    }
}

柱状图案例

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
// 主要代码类似,只需将 createLineChart 改为 createBarChart
JFreeChart chart = ChartFactory.createBarChart(
    "各产品销量对比",
    "产品名称",
    "销量(件)",
    dataset,
    PlotOrientation.VERTICAL,
    true,
    true,
    false
);

JavaFX Charts(现代Java应用推荐)

JavaFX 内置了强大的图表组件,适合现代Java应用开发。

折线图案例

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class JavaFXLineChart extends Application {
    @Override
    public void start(Stage stage) {
        // 定义坐标轴
        CategoryAxis xAxis = new CategoryAxis();
        NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("月份");
        yAxis.setLabel("销售额(万元)");
        // 创建折线图
        LineChart<String, Number> lineChart = new LineChart<>(xAxis, yAxis);
        lineChart.setTitle("月度销售统计");
        // 创建数据集
        XYChart.Series<String, Number> series = new XYChart.Series<>();
        series.setName("销售额");
        series.getData().add(new XYChart.Data<>("1月", 120));
        series.getData().add(new XYChart.Data<>("2月", 150));
        series.getData().add(new XYChart.Data<>("3月", 180));
        series.getData().add(new XYChart.Data<>("4月", 210));
        series.getData().add(new XYChart.Data<>("5月", 240));
        series.getData().add(new XYChart.Data<>("6月", 280));
        lineChart.getData().add(series);
        // 显示
        Scene scene = new Scene(lineChart, 800, 600);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

饼图案例

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.stage.Stage;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public class JavaFXPieChart extends Application {
    @Override
    public void start(Stage stage) {
        // 创建饼图数据
        ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(
            new PieChart.Data("产品A", 30),
            new PieChart.Data("产品B", 25),
            new PieChart.Data("产品C", 20),
            new PieChart.Data("产品D", 15),
            new PieChart.Data("产品E", 10)
        );
        // 创建饼图
        PieChart pieChart = new PieChart(pieChartData);
        pieChart.setTitle("产品销售占比");
        // 显示
        Scene scene = new Scene(pieChart, 600, 400);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

ECharts for Java(Web项目推荐)

通过Java集成ECharts,适合Web应用。

Maven依赖

<dependency>
    <groupId>org.icepear.echarts</groupId>
    <artifactId>echarts-java</artifactId>
    <version>1.0.2</version>
</dependency>

案例

import org.icepear.echarts.Line;
import org.icepear.echarts.charts.line.LineSeries;
import org.icepear.echarts.serializer.EChartsSerializer;
public class EChartsExample {
    public static void main(String[] args) {
        // 创建折线图
        Line line = new Line()
            .setTitle("月度销售统计")
            .addXAxis(new String[]{"1月", "2月", "3月", "4月", "5月", "6月"})
            .addYAxis()
            .addSeries(new LineSeries()
                .setName("销售额")
                .setData(new Number[]{120, 150, 180, 210, 240, 280}));
        // 生成JSON
        String json = EChartsSerializer.toJson(line);
        System.out.println(json);
        // 将JSON传递给前端ECharts渲染
    }
}

XChart(轻量级、简单)

适合简单的图表需求,API非常简洁。

Maven依赖

<dependency>
    <groupId>org.knowm.xchart</groupId>
    <artifactId>xchart</artifactId>
    <version>3.8.1</version>
</dependency>

案例

import org.knowm.xchart.*;
import org.knowm.xchart.style.Styler;
import javax.swing.*;
public class XChartExample {
    public static void main(String[] args) {
        // 创建数据
        double[] xData = new double[]{1, 2, 3, 4, 5, 6};
        double[] yData = new double[]{120, 150, 180, 210, 240, 280};
        // 创建图表
        XYChart chart = new XYChartBuilder()
            .width(800)
            .height(600)
            .title("月度销售统计")
            .xAxisTitle("月份")
            .yAxisTitle("销售额(万元)")
            .build();
        chart.addSeries("销售额", xData, yData);
        // 显示
        new SwingWrapper<>(chart).displayChart();
    }
}

选择建议

方案 适用场景 优点 缺点
JFreeChart 桌面应用、报表 功能全面、文档丰富 样式较旧、更新慢
JavaFX Charts 现代JavaFX应用 原生支持、动画效果好 需JavaFX环境
ECharts for Java Web应用 交互丰富、视觉效果佳 依赖前端渲染
XChart 简单需求 API简洁、轻量级 功能有限

实际项目案例 - 数据库驱动图表

// 从数据库获取数据生成图表
public class DatabaseChartExample {
    public JFreeChart createChartFromDatabase(String sql) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                String category = rs.getString("category");
                double value = rs.getDouble("value");
                dataset.addValue(value, "系列", category);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ChartFactory.createBarChart(
            "数据统计分析", "分类", "数值",
            dataset, PlotOrientation.VERTICAL, true, true, false
        );
    }
}

根据你的项目类型(桌面应用/Web应用/报表系统)和具体需求选择合适的方案,对于新项目,推荐使用JavaFX Charts(桌面)或ECharts(Web)。

抱歉,评论功能暂时关闭!