JavaFX中条形图的奇怪行为

JavaFX中条形图的奇怪行为,java,javafx,charts,collections,observable,Java,Javafx,Charts,Collections,Observable,我有一个JavaFX条形图,我正在根据一个组合框选择的项目更改图表中的值。完整代码如下 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

我有一个JavaFX条形图,我正在根据一个组合框选择的项目更改图表中的值。完整代码如下

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

您可以通过制作一个防御性副本来检查您的假设:
addAll(newarraylist(costMap.get(newValue))@c0der我也试过了,但行为还是一样:(请发布@c0der这是一个最小且完整的示例。如果有人想尝试,他们只需要创建一个扩展类应用程序类,并将给定的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>
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);
    }
}