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包含数据中的节点,因此最终会出现“添加了重复的子对象”异常。