Странное поведение с BarChart в JavaFX - PullRequest
0 голосов
/ 31 мая 2018

У меня есть JavaFX BarChart, и я изменяю значения в диаграмме на основе выбранного элемента комбинированного списка.Полный код ниже

import javafx.scene.chart.XYChart;
import javafx.scene.control.ComboBox;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class TestController {

    @FXML
    private BarChart testChart;

    @FXML
    private ComboBox cmb1;

    @FXML
    protected void initialize() {
        Random random = new Random();
        Map<String, List<XYChart.Series<String, Float>>> costMap = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            List<XYChart.Series<String, Float>> lstCost = new ArrayList<>(2);
            XYChart.Series series = new XYChart.Series();
            series.setName("Cost");
            series.getData().add(new XYChart.Data("Cost", random.nextFloat()));
            XYChart.Series series2 = new XYChart.Series();
            series2.setName("Bill");
            series2.getData().add(new XYChart.Data("Bill", random.nextFloat()));
            lstCost.add(series);
            lstCost.add(series2);
            costMap.put(i + "", lstCost);
        }

        cmb1.getItems().addAll(costMap.keySet());

        cmb1.valueProperty().addListener((observable, oldValue, newValue) -> {
            if (oldValue != null) {
                testChart.getData().clear();
            }
            testChart.getData().addAll(costMap.get(newValue));
        });
    }
}

FXML прост, как показано ниже (test.fxml)

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.chart.BarChart?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.121"
            xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.TestController">
    <children>
        <BarChart fx:id="testChart" layoutX="14.0" layoutY="46.0" prefHeight="340.0" prefWidth="572.0"
                  AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0"
                  AnchorPane.topAnchor="46.0">
            <xAxis>
                <CategoryAxis side="BOTTOM"/>
            </xAxis>
            <yAxis>
                <NumberAxis side="LEFT"/>
            </yAxis>
        </BarChart>
        <ComboBox fx:id="cmb1" layoutX="14.0" layoutY="14.0" prefWidth="150.0"/>
    </children>
</AnchorPane>

Странно, когда я прохожу все пункты, как только диаграмма правильно отображает значения.Но если я снова выберу предыдущее значение, тогда значения полностью изменятся.Я не могу понять, в чем причина этого странного поведения.Может кто-нибудь сказать, что здесь не так?

Как я понимаю testChart.getData().clear() манипулирует моим исходным набором данных.Но это не должно происходить.

Отредактировано

Если кто-то хочет попробовать здесь, это основной класс

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        AnchorPane root = FXMLLoader.load(getClass().getResource("test.fxml"));
        Scene scene = new Scene(root, 1024, 768);
        stage.setScene(scene);
        stage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
...