Java FX P ie Chart - Изменить порядок данных - PullRequest
0 голосов
/ 19 июня 2020

Я реализовал небольшую диаграмму с кнопкой для поворота фрагмента внутри диаграммы, для этого я выполнил следующие шаги:

  • Скопируйте фактические данные диаграммы в новую ObservableList «ActualData»
  • Создать новый ObservableList «NewList» пустой
  • Добавить в NewList последнее значение ActualData, а затем добавить оставшиеся значения (ind: 0,1,2,3)
  • Очистить данные диаграммы
  • Введите с помощью al oop все данные нового списка «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);
       }
}

1 Ответ

0 голосов
/ 19 июня 2020

Теоретически вы должны иметь возможность rotate данных диаграммы p ie. Однако, поскольку API диаграммы имеет Node, который представляет данные как часть класса данных (который, на мой взгляд, представляет собой серьезный недостаток дизайна и делает API диаграмм непригодным для производственного кода), это приводит к Ошибка «добавлены дубликаты дочерних элементов».

Таким образом, кажется, единственный способ обойти это - создать глубокую копию данных и повернуть этот список, что, по сути, вы и делаете. Обратите внимание, что на самом деле нет необходимости создавать ObservableList для копии данных; подойдет обычный старый List (у которого меньше накладных расходов). Так что ваш код можно немного сократить:

       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);

        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...