直接上代码:
/**
* @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组件程序
}
}