📜  JavaFX |饼图类(1)

📅  最后修改于: 2023-12-03 15:31:35.964000             🧑  作者: Mango

JavaFX | 饼图类

概览

JavaFX 饼图类是用于创建饼图的类,它提供了一个可视化的方式展示数据占比。该类位于 javafx.scene.chart.PieChart 包中,并且继承自 javafx.scene.chart.Chart.

特性
  • 可以在饼图上显示数据标签。
  • 饼图可以是一个完整的圆形或者是一个半圆形。
  • 可以自定义每个扇形(切片)的颜色和标签。
  • 饼图可以联动其它的控件,比如一个下拉框或者一个滑动条。
  • 饼图支持 CSS 样式。
使用方法
创建一个基本的饼图

创建一个饼图的基本步骤如下:

  1. 创建一个 Group 对象,并加入到场景图中。我们使用 Group 对象来包含我们创建的饼图。
  2. 创建一个 ObservableList 对象,用来存放饼图的数据。
  3. 创建 PieChart 对象,将 ObservableList 对象作为参数传入。
  4. PieChart 对象加入到 Group 对象中。

下面是一个简单的示例代码:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.stage.Stage;
 
public class MyPieChart extends Application {
 
    @Override
    public void start(Stage primaryStage) {
 
        //1.创建一个Group对象
        Group root = new Group();
 
        //2.创建数据列表
        ObservableList<PieChart.Data> pieChartData =
                FXCollections.observableArrayList(
                        new PieChart.Data("Apple", 30),
                        new PieChart.Data("Banana", 20),
                        new PieChart.Data("Grape", 40),
                        new PieChart.Data("Orange", 10));
 
        //3.创建一个饼图对象
        PieChart chart = new PieChart(pieChartData);
        chart.setTitle("Fruit");
 
        //4.将饼图加入到group中
        root.getChildren().add(chart);
 
        //创建一个Scene对象
        Scene scene = new Scene(root, 600, 400);
 
        //将Scene对象添加到primaryStage窗口中
        primaryStage.setScene(scene);
 
        //显示primaryStage窗口
        primaryStage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
 
}

上面的代码中,我们首先创建了一个 Group 对象,并将其加入到场景图中。然后,我们创建了一个 ObservableList 对象来存放饼图的数据,最后创建了一个 PieChart 对象以及相关的配置。

自定义饼图

JavaFX 饼图类允许您自定义饼图的各个方面。以下是一些常见的自定义饼图的方法:

设置鼠标悬停效果

鼠标悬停效果是饼图的一种常见效果。要设置这个效果,我们只需要使用 setOnMouseEntered()setOnMouseExited() 方法,并通过 JavaFX 的 Timeline 类来创建一个渐变效果。以下是一个例子:

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.effect.Glow;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
 
public class CustomPieChart extends Application {
 
    private Text caption;
 
    @Override
    public void start(Stage primaryStage) {
        //1.创建一个Group对象
        Group root = new Group();
 
        //2.创建数据列表
        ObservableList<PieChart.Data> pieChartData =
                FXCollections.observableArrayList(
                        new PieChart.Data("Apple", 30),
                        new PieChart.Data("Banana", 20),
                        new PieChart.Data("Grape", 40),
                        new PieChart.Data("Orange", 10));
 
        //3.创建一个饼图对象
        PieChart chart = new PieChart(pieChartData);
 
        chart.setTitle("Fruit");
        chart.setLegendVisible(false);
 
        //4.修改slice渲染器
        for (final PieChart.Data data : chart.getData()) {
            data.getNode().setStyle("-fx-pie-color: " + data.getName().toLowerCase() + ";");
            final Glow glow = new Glow();
            glow.setInput(new Glow());
            data.getNode().setEffect(null);
            data.getNode().setOnMouseEntered(e -> {
                data.getNode().setEffect(glow);
                caption.setX(data.getNode().getLayoutX());
                caption.setY(data.getNode().getLayoutY() - 30);
                caption.setFill(Color.WHITE);
                caption.setText(data.getName() + "\n" + data.getPieValue() + "%");
            });
            data.getNode().setOnMouseExited(e -> {
                data.getNode().setEffect(null);
                caption.setVisible(false);
            });
        }
 
        //5.创建一个文本对象用于显示鼠标悬停时的标签
        caption = new Text("");
        caption.setFont(Font.font("Verdana", 15));
        caption.setVisible(false);
 
        //6.将饼图以及文本加入到group中
        root.getChildren().addAll(chart, caption);
 
        //创建一个Scene对象
        Scene scene = new Scene(root, 600, 400);
 
        //将Scene对象添加到primaryStage窗口中
        primaryStage.setScene(scene);
 
        //显示primaryStage窗口
        primaryStage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

在上面的代码中,我们为每个切片设置了鼠标事件,并在鼠标悬停时添加了一个 Glow 特效和一个文本标签。

修改饼图的颜色

JavaFX 饼图类允许您自定义每个切片的颜色。要实现这一点,我们可以为每个 PieChart.Data 对象设置颜色。下面是一个例子:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.stage.Stage;
 
public class CustomPieChart extends Application {
 
    @Override
    public void start(Stage primaryStage) {
        //1.创建一个Group对象
        Group root = new Group();
 
        //2.创建数据列表
        ObservableList<PieChart.Data> pieChartData =
                FXCollections.observableArrayList(
                        new PieChart.Data("Apple", 30),
                        new PieChart.Data("Banana", 20),
                        new PieChart.Data("Grape", 40),
                        new PieChart.Data("Orange", 10));
 
        //3.创建一个饼图对象
        PieChart chart = new PieChart(pieChartData);
 
        chart.setTitle("Fruit");
        chart.setLegendVisible(false);
 
        //4.修改slice渲染器
        for (final PieChart.Data data : chart.getData()) {
            data.getNode().setStyle("-fx-pie-color: " + data.getName().toLowerCase() + ";");
        }
 
        //5.将饼图加入到group中
        root.getChildren().add(chart);
 
        //创建一个Scene对象
        Scene scene = new Scene(root, 600, 400);
 
        //将Scene对象添加到primaryStage窗口中
        primaryStage.setScene(scene);
 
        //显示primaryStage窗口
        primaryStage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
 
}

上面的代码中,我们为每个 PieChart.Data 对象设置了颜色。注意,颜色可以是 CSS 颜色,也可以是十六进制颜色。

总结

JavaFX 饼图类是一个非常强大的类,可以很容易地创建和自定义饼图。通过 JavaFX 饼图类,您可以轻松地显示和比较数据,而无需编写复杂的代码。