javaFX学习笔记之 数据可视化-饼图

直接上代码:

/**
 * @author zhaoyong
 * @Date 2022/4/24
 * @Description javaFx饼图
 */
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.chart.*;
import javafx.scene.Group;

public class PieChartSample extends Application {

    @Override public void start(Stage stage) {
        Scene scene = new Scene(new Group());//创建场景并挂载节点组容器
        stage.setTitle("比例");//舞台标题
        stage.setWidth(500);//舞台宽
        stage.setHeight(500);//舞台高

        ObservableList<PieChart.Data> pieChartData =//饼图的数据组成结构
                FXCollections.observableArrayList(
                        new PieChart.Data("沈阳", 13),
                        new PieChart.Data("鞍山", 25),
                        new PieChart.Data("盘锦", 10),
                        new PieChart.Data("大连", 22),
                        new PieChart.Data("葫芦岛", 30));
        final PieChart chart = new PieChart(pieChartData);//创建饼图对象
        chart.setTitle("资源分布");//饼图标题

        ((Group) scene.getRoot()).getChildren().add(chart);//通过场景获取其上的节点组组容器,在节点组容器上添加饼图组件
        stage.setScene(scene);//舞台上挂载场景
        stage.show();//舞台展现
    }

    public static void main(String[] args) {
        launch(args);//启动javaFX组件程序
    }
}

设置饼图和图例

饼图的默认视图中包括带有标签的饼图和图例。标签的值即是PieChart.Data对象的name属性值。你可以通过调用setLabelsVisile方法来决定是否显示标签。类似地,你也可以通过调用setLegendVisible方法来决定是否显示图例。

你可以控制标签和图例的位置。使用setLabelLineLength方法可以指定标签到圆周之间连线的长度。使用setLegendSide方法可以控制图例相对于饼图的位置。样例示范了如何将这些方法应用到样例创建的饼图中。

改变Label和图例的位置

1

2

chart.setLabelLineLength(10);

chart.setLegendSide(Side.LEFT);

 

/**
 * @author zhaoyong
 * @Date 2022/4/24
 * @Description javaFx饼图
 */
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.chart.*;
import javafx.scene.Group;

public class PieChartSample extends Application {

    @Override public void start(Stage stage) {
        Scene scene = new Scene(new Group());//创建场景并挂载节点组容器
        stage.setTitle("比例");//舞台标题
        stage.setWidth(500);//舞台宽
        stage.setHeight(500);//舞台高

        ObservableList<PieChart.Data> pieChartData =//饼图的数据组成结构
                FXCollections.observableArrayList(
                        new PieChart.Data("沈阳", 13),
                        new PieChart.Data("鞍山", 25),
                        new PieChart.Data("盘锦", 10),
                        new PieChart.Data("大连", 22),
                        new PieChart.Data("葫芦岛", 30));
        final PieChart chart = new PieChart(pieChartData);//创建饼图对象
        chart.setTitle("资源分布");//饼图标题
        chart.setLegendSide(Side.LEFT);//图例位置重新设置
        chart.setLabelLineLength(10);//设置标签线段长度
        ((Group) scene.getRoot()).getChildren().add(chart);//通过场景获取其上的节点组组容器,在节点组容器上添加饼图组件
        stage.setScene(scene);//舞台上挂载场景
        stage.show();//舞台展现
    }

    public static void main(String[] args) {
        launch(args);//启动javaFX组件程序
    }
}

你的程序可能需要控制扇区在饼图中的排列方向。在默认情况下,扇区是按顺时针的方向放置的,然而,你可以通过调用setClockwise方法并指定参数值为false来将放置顺序改为逆时针:chart.setClockwise(false)。这个方法可以和setStartAngle方法组合使用来使各个扇区放置到理想的位置。图31-4展示了在对chart对象调用了setStartAngle(180)方法后饼图的样式 

处理饼图事件

尽管饼图中的扇区并不是一个Node对象,但每个PieChart.Data元素都有一个Node对象与之关联,该Node对象可以用来分析和处理事件。样例中的代码片段创建了一个EventHandler对象来处理特定扇区上激发的MOUSE_PRESSED事件。

处理饼图的鼠标事件 

/**
 * @author zhaoyong
 * @Date 2022/4/24
 * @Description javaFx饼图
 */
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.chart.*;
import javafx.scene.Group;

public class PieChartSample extends Application {

    @Override public void start(Stage stage) {

        final Label caption = new Label("");//创建一个标签作为一个 说明文字
        caption.setTextFill(Color.WHITE);//设置caption的颜色
        caption.setStyle("-fx-font: 24 arial;");//设置caption的字体大小和样式



        Scene scene = new Scene(new Group());//创建场景并挂载节点组容器
        stage.setTitle("比例");//舞台标题
        stage.setWidth(500);//舞台宽
        stage.setHeight(500);//舞台高

        ObservableList<PieChart.Data> pieChartData =//饼图的数据组成结构
                FXCollections.observableArrayList(
                        new PieChart.Data("沈阳", 13),
                        new PieChart.Data("鞍山", 25),
                        new PieChart.Data("盘锦", 10),
                        new PieChart.Data("大连", 22),
                        new PieChart.Data("葫芦岛", 30));
        final PieChart chart = new PieChart(pieChartData);//创建饼图对象
        chart.setTitle("资源分布");//饼图标题
        chart.setLegendSide(Side.LEFT);//图例位置重新设置
        chart.setLabelLineLength(10);//设置标签线段长度
        chart.setClockwise(false);//改变渲染方向

        for (final PieChart.Data data : chart.getData()) {//获取chart中的数据元素
            data.getNode().addEventHandler(MouseEvent.MOUSE_PRESSED,
                    new EventHandler<MouseEvent>() {//给饼图扇区对应的node节点对象添加鼠标单击事件处理机制
                        @Override public void handle(MouseEvent e) {//事件处理回调函数
                            caption.setTranslateX(e.getSceneX());//获取鼠标点击事件横坐标并且让caption的label的横坐标进行对应值的位移动画变化
                            caption.setTranslateY(e.getSceneY());//获取鼠标点击事件纵坐标caption的label的横坐标进行对应值的位移动画变化
                            caption.setText(String.valueOf(data.getPieValue()) + "%");//caption的文本内容设置为从饼图chart的数据元素中取值

                        }
                    });
        }

        ((Group) scene.getRoot()).getChildren().addAll(chart,caption);//通过场景获取其上的节点组组容器,在节点组容器上添加饼图组件
        stage.setScene(scene);//舞台上挂载场景
        stage.show();//舞台展现
    }

    public static void main(String[] args) {
        launch(args);//启动javaFX组件程序
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值