JavaFX中条形图的奇怪行为
我有一个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
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);
}
}