Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8115252

[StackedBarChart] is wrongly animated

XMLWordPrintable

      Look at the attached movie.

      Use code to reproduce this:

      import java.util.Random;
      import javafx.application.Application;
      import javafx.collections.FXCollections;
      import javafx.collections.ObservableList;
      import javafx.event.Event;
      import javafx.event.EventHandler;
      import javafx.scene.Scene;
      import javafx.scene.chart.*;
      import javafx.scene.control.*;
      import javafx.scene.layout.HBox;
      import javafx.scene.layout.Pane;
      import javafx.scene.layout.VBox;
      import javafx.stage.Stage;

      public class JavaCharts extends Application {

          public static void main(String[] args) {
              launch(args);
          }
          NumberAxis axisY = new NumberAxis(0, 100, 10);
          ObservableList<String> existingCategories = FXCollections.observableArrayList();
          CategoryAxis axisX = new CategoryAxis(existingCategories);
          StackedBarChart testedStackedBarChart = new StackedBarChart(axisX, axisY);
          VBox vb = new VBox();

          @Override
          public void start(Stage stage) throws Exception {
              testedStackedBarChart.setTitle("BarChart");
              testedStackedBarChart.setStyle("-fx-border-color: darkgray;");
              existingCategories.addAll("category1", "category2", "category3");

              addData();

              Pane pane = new Pane();
              pane.setPrefSize(600, 600);

              pane.setPrefSize(600, 600);
              pane.getChildren().add(testedStackedBarChart);

              vb.getChildren().addAll(pane, getAddItemHBox(), getAddCategoryDialog(), getRemoveCategoryDialog());

              Scene scene = new Scene(vb, 700, 700);
              stage.setScene(scene);
              stage.show();
          }

          public void addData() {

              String serieName = "Serie";
              double min = 0;
              double max = 100;
              int amount = 3;

              ObservableList list = FXCollections.observableArrayList();

              XYChart.Series serie = new XYChart.Series(serieName, list);

              for (int i = 0; i < amount; i++) {
                  XYChart.Data newData = new XYChart.Data();
                  String category = existingCategories.get(i);
                  Double value = new Random().nextDouble() * (max - min) + min;
                  newData.setYValue(value);
                  newData.setXValue(category);
                  list.add(newData);
                  System.out.println(newData + " to category " + category + " value " + value);
              }

              testedStackedBarChart.getData().add(serie);
          }

          public HBox getRemoveCategoryDialog() {
              HBox hb = new HBox();
              Label lb = new Label("From index");
              final TextField tf = TextFieldBuilder.create().text("0").prefWidth(50).build();
              Button bt = ButtonBuilder.create().text("Remove category!").build();
              bt.setOnAction(new EventHandler() {

                  @Override
                  public void handle(Event t) {
                      int index = Integer.parseInt(tf.getText());
                      existingCategories.remove(index);
                      axisX.getCategories().remove(index);
                  }
              });
              hb.getChildren().addAll(lb, tf, bt);
              return hb;
          }

          public HBox getAddCategoryDialog() {
              HBox hb = new HBox();
              Label lb = new Label("Category");
              final TextField tf = TextFieldBuilder.create().text("").prefWidth(50).build();

              Label lind = new Label("to index");
              final TextField tfind = TextFieldBuilder.create().text("0").prefWidth(50).build();

              Button bt = ButtonBuilder.create().text("Add!").build();
              bt.setOnAction(new EventHandler() {

                  @Override
                  public void handle(Event t) {
                      int index = Integer.parseInt(tfind.getText());
                      existingCategories.add(index, tf.getText());
                      axisX.getCategories().add(index, tf.getText());
                  }
              });
              hb.getChildren().addAll(lb, tf, lind, tfind, bt);
              return hb;
          }

          public HBox getAddItemHBox() {
              HBox hb = new HBox();
              Label lb = new Label("Add series named ");
              final TextField tf = TextFieldBuilder.create().prefWidth(50).id("Named").build();

              Label minLabel = new Label(" min ");
              final TextField minText = TextFieldBuilder.create().prefWidth(50).build();

              Label maxLabel = new Label(" max ");
              final TextField maxText = TextFieldBuilder.create().prefWidth(50).build();

              Button bt = ButtonBuilder.create().text("Add!").build();
              bt.setOnAction(new EventHandler() {

                  @Override
                  public void handle(Event t) {
                      String serieName = tf.getText();
                      double min = Double.parseDouble(minText.getText());
                      double max = Double.parseDouble(maxText.getText());

                      ObservableList list = FXCollections.observableArrayList();

                      XYChart.Series serie = new XYChart.Series(serieName, list);

                      for (int i = 0; i < 3; i++) {
                          XYChart.Data newData = new XYChart.Data();
                          String category = existingCategories.get(i);
                          Double value = new Random().nextDouble() * (max - min) + min;
                          newData.setYValue(value);
                          newData.setXValue(category);
                          list.add(newData);
                          System.out.println(newData + " to category " + category + " value " + value);
                      }

                      testedStackedBarChart.getData().add(serie);
                  }
              });
              hb.getChildren().addAll(lb, tf, minLabel, minText, maxLabel, maxText, bt);
              return hb;
          }
      }

      To add new data: type name of serie, type minimalX, type maximalX, click button.
      To remove category (with according data from chart): type index and click according button.
      To add category: type name, type index to add, click button.

            psomashe Parvathi Somashekar (Inactive)
            akirov Alexander Kirov (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: