Java FX饼图-数据的更改顺序
我实现了一个带有按钮的小图表,用于旋转图表内的切片,为此,我实现了以下步骤:Java FX饼图-数据的更改顺序,java,javafx,Java,Javafx,我实现了一个带有按钮的小图表,用于旋转图表内的切片,为此,我实现了以下步骤: 将图表的实际数据复制到新的ObservableList“ActualData”中 创建一个新的ObservableList“NewList”为空 将ActualData的最后一个值添加到NewList,然后添加剩余值(ind:0,1,2,3) 清除图表中的数据 使用循环输入新列表“NewList”的所有数据 我的问题是: 有没有更好的方法来实施这样的行动 是否有一种方法可以删除每个片段之间丑陋的空格 谢谢 pa
- 将图表的实际数据复制到新的ObservableList“ActualData”中
- 创建一个新的ObservableList“NewList”为空
- 将ActualData的最后一个值添加到NewList,然后添加剩余值(ind:0,1,2,3)
- 清除图表中的数据
- 使用循环输入新列表“NewList”的所有数据
- 有没有更好的方法来实施这样的行动
- 是否有一种方法可以删除每个片段之间丑陋的空格
package application;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.geometry.Side;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.chart.PieChart.Data;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
PieChart pieChart = new PieChart();
int counter = 0;
EnterValues(pieChart);
pieChart.setLegendVisible(false);
pieChart.setClockwise(true);
pieChart.setStartAngle(90);
StackPane.setAlignment(pieChart, Pos.TOP_CENTER);
Button button = new Button("Change Values");
StackPane.setAlignment(button, Pos.BOTTOM_CENTER);
StackPane stackPane = new StackPane();
stackPane.setPrefSize(500, 500);
stackPane.getChildren().add(pieChart);
stackPane.getChildren().add(button);
Scene scene = new Scene(stackPane);
primaryStage.setTitle("Test");
primaryStage.setMinHeight(500);
primaryStage.setMinWidth(500);
primaryStage.setScene(scene);
primaryStage.show();
button.setOnAction((EventHandler<ActionEvent>) new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
// GET DATA FROM CURRENT LIST
ObservableList<Data> ActualData = pieChart.getData();
// CREATE NEW EMPTY LIST
ObservableList<Data> NewList = FXCollections.observableArrayList();;
// ADD ITEMS TO NEW LIST ( LAST BECOMES THE FIRST ONE )
NewList.add(ActualData.get(4));
NewList.add(ActualData.get(0));
NewList.add(ActualData.get(1));
NewList.add(ActualData.get(2));
NewList.add(ActualData.get(3));
// CLEAR DATA FROM CURRENT CHART
pieChart.getData().clear();
// ENTER NEW DATA TO CHART
for(int i = 0;i<NewList.size();i++)
{
PieChart.Data slice = new PieChart.Data(NewList.get(i).getName(),NewList.get(i).getPieValue());
pieChart.getData().add(slice);
}
}
});
}
public void EnterValues(PieChart chart) {
PieChart.Data slice1 = new PieChart.Data("USA", 30);
PieChart.Data slice2 = new PieChart.Data("EU", 20);
PieChart.Data slice3 = new PieChart.Data("China", 100);
PieChart.Data slice4 = new PieChart.Data("Japan", 50);
PieChart.Data slice5 = new PieChart.Data("Others", 10);
chart.getData().add(slice1);
chart.getData().add(slice2);
chart.getData().add(slice3);
chart.getData().add(slice4);
chart.getData().add(slice5);
}
public static void main(String[] args) {
Application.launch(args);
}
}
包应用;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.ListIterator;
导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Pos;
导入javafx.geometry.Side;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.chart.PieChart;
导入javafx.scene.chart.PieChart.Data;
导入javafx.scene.control.Button;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
public void start(Stage primaryStage)引发异常{
PieChart PieChart=新PieChart();
int计数器=0;
输入值(pieChart);
pieChart.setLegendVisible(假);
pieChart.设置为顺时针(真);
pieChart.设置起始角(90);
StackPane.setAlignment(pieChart,位置顶部\中间);
按钮按钮=新按钮(“更改值”);
StackPane.setAlignment(按钮,位置底部\中间);
StackPane StackPane=新的StackPane();
stackPane.setPrefSize(500500);
stackPane.getChildren().add(pieChart);
stackPane.getChildren().add(按钮);
场景=新场景(stackPane);
初级阶段。设置标题(“测试”);
初级阶段。最低设置高度(500);
初级阶段设置最小宽度(500);
初级阶段。场景(场景);
primaryStage.show();
setOnAction((EventHandler)neweventhandler(){
@重写公共无效句柄(ActionEvent e){
//从当前列表中获取数据
ObservableList ActualData=pieChart.getData();
//创建新的空列表
ObservableList NewList=FXCollections.observableArrayList();;
//将项目添加到新列表(最后一个成为第一个)
NewList.add(ActualData.get(4));
NewList.add(ActualData.get(0));
NewList.add(ActualData.get(1));
NewList.add(ActualData.get(2));
NewList.add(ActualData.get(3));
//清除当前图表中的数据
pieChart.getData().clear();
//在图表中输入新数据
对于(int i=0;i,理论上,您应该只能够使用饼图数据。但是,由于图表API具有节点
,该节点将数据表示为数据类的一部分(我认为这代表了一个主要的设计缺陷,并使图表API不适合于生产代码),因此会导致“添加重复的子项”错误
因此,似乎唯一的解决方法是创建数据的深度副本,并旋转该列表,这基本上就是您要做的。请注意,没有必要为数据副本创建一个可观察列表
;一个普通的列表
(开销较小)就可以了。因此,您的代码可以减少一点:
button.setOnAction(e -> {
List<Data> dataCopy = new ArrayList<>();
for (Data d : pieChart.getData())
dataCopy.add(new Data(d.getName(), d.getPieValue()));
Collections.rotate(dataCopy, 1);
pieChart.getData().setAll(dataCopy);
});
按钮。设置操作(e->{
List dataCopy=new ArrayList();
对于(数据d:pieChart.getData())
添加(新数据(d.getName(),d.getPieValue());
集合。轮换(数据拷贝,1);
pieChart.getData().setAll(dataCopy);
});
是否执行Collections.rotate(pieChart.getData(),1);
是否有效?好的,它不起作用,因为brain dead图表API包含数据中的节点,因此最终会出现“添加了重复的子对象”异常。