通过您的方法,每次单击按钮时,都会将一个新系列添加到图表中,并且始终具有相同的数据。请注意,对于第二个系列,您将获得所有标签......
另一方面,正如您已经指出的那样,只有一个系列,带有适当的标签,创建一个全球ObservableList
,将其添加到系列的开头,然后继续Initialize
将系列添加到图表中。
然后,如果您想处理点击事件,只需向该系列添加新值,您就会看到新标签也将被添加。
@FXML private LineChart<String, Integer> lineChart;
private final ObservableList<XYChart.Data<String,Integer>> xyList1 =
FXCollections.observableArrayList(
new XYChart.Data<>("austria", 300),
new XYChart.Data<>("rr", 400),
new XYChart.Data<>("qq", 3003));
private final XYChart.Series series1 = new XYChart.Series(xyList1);
@Override
public void initialize(URL url, ResourceBundle rb) {
series1.setName("Name");
lineChart.getData().addAll(series1);
}
@FXML
public void handleButtonAction(ActionEvent e){
// sample new points
series1.getData().add(new XYChart.Data<>("Point "+(series1.getData().size()+1),
new Random().nextInt(3000)));
}
EDIT
如果您想在每次单击该按钮时添加新系列,您可以按照最初的建议进行操作。
但请注意,这似乎是第一个系列中的一个错误,如果图表是动画的,则仅显示最后一个标签。为了避免这个错误(考虑将其提交到 JIRA),只需禁用动画即可。
如果您想要动画,您可以向图表添加一个侦听器,并在图表至少有一个系列后设置动画。这将起作用:
@FXML private LineChart<String, Integer> lineChart;
@Override
public void initialize(URL url, ResourceBundle rb) {
// Workaround to allow animation after series is added
lineChart.getData().addListener(
(ListChangeListener.Change<? extends XYChart.Series<String, Integer>> c) -> {
lineChart.setAnimated(c.getList().size()>1);
});
}
@FXML
public void handleButtonAction(ActionEvent e){
XYChart.Series series1 = new XYChart.Series();
series1.setName("Series "+lineChart.getData().size() );
lineChart.getData().addAll(series1);
series1.getData().add(new XYChart.Data<>("Point "+(series1.getData().size()+1),
new Random().nextInt(3000)));
series1.getData().add(new XYChart.Data<>("Point "+(series1.getData().size()+1),
new Random().nextInt(3000)));
series1.getData().add(new XYChart.Data<>("Point "+(series1.getData().size()+1),
new Random().nextInt(3000)));
}