Javafx 条形图/折线图-仅显示最后一个数据点的标签

Javafx 条形图/折线图-仅显示最后一个数据点的标签,javafx,linechart,Javafx,Linechart,我无法获得条形图或折线图来显示X轴上的所有标签。正如您在提供的打印屏幕中所看到的,只有最新的数据点显示其标签 这是在使用场景生成器时发生的。我是否必须有一个ObservableList,其中包含类别轴的字符串 我已经对我当前的代码进行了MVCE: @FXML LineChart<String, Integer> lineChart; @FXML private Label label; @FXML private void handleButtonAction(ActionEve

我无法获得条形图或折线图来显示X轴上的所有标签。正如您在提供的打印屏幕中所看到的,只有最新的数据点显示其标签

这是在使用场景生成器时发生的。我是否必须有一个ObservableList,其中包含类别轴的字符串

我已经对我当前的代码进行了MVCE:

@FXML
LineChart<String, Integer> lineChart;
@FXML
private Label label;

@FXML
private void handleButtonAction(ActionEvent event) {

XYChart.Series series1 = new XYChart.Series();

series1.getData().add(new XYChart.Data<String, Integer>("austria", 300));
series1.getData().add(new XYChart.Data<String, Integer>("rr", 400));
series1.getData().add(new XYChart.Data<String, Integer>("qq", 3003));
lineChart.getData().addAll(series1);
@FXML
线形图;
@FXML
自有品牌;
@FXML
私有无效把手按钮操作(ActionEvent事件){
XYChart.Series系列1=新的XYChart.Series();
series1.getData().add(新的XYChart.Data(“austria”,300));
series1.getData().add(新的XYChart.Data(“rr”,400));
series1.getData().add(新的XYChart.Data(“qq”,3003));
lineChart.getData().addAll(series1);

根据您的方法,每次单击按钮,图表中都会添加一个新的序列,数据始终相同。请注意,对于第二个序列,您将获得所有标签

或者,如您所指出的,如果只需要一个系列,并有适当的标签,则创建一个全局的
可观察列表
,将其添加到系列的开头,然后在
初始化
中将系列添加到图表中

然后,如果要处理单击事件,只需将新值添加到序列中,您将看到新标签也将被添加

@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)));
}
@FXML私有线形图线形图;
私人最终观察者1=
FXCollections.observableArrayList(
新XYChart.数据(“奥地利”,300),
新XYChart.数据(“rr”,400),
新的XYChart.Data(“qq”,3003));
私有最终XYChart.Series系列1=新的XYChart.Series(xyList1);
@凌驾
公共void初始化(URL、ResourceBundle rb){
系列1.集合名(“名称”);
lineChart.getData().addAll(series1);
}    
@FXML
公共无效把手按钮动作(动作事件e){
//采样新点
series1.getData().add(新的XYChart.Data(“点”+(series1.getData().size()+1),
newrandom().nextInt(3000));
}
编辑

如果每次单击按钮时都要添加新系列,可以按照最初的建议执行

但请注意,这似乎是第一个系列中的一个bug,如果图表是动画的,则只显示最后一个标签。为了避免此bug(考虑将其提交给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)));   
}
@FXML私有线形图线形图;
@凌驾
公共void初始化(URL、ResourceBundle rb){
//添加系列后允许动画的变通方法
lineChart.getData().addListener(

(ListChangeListener.Change这是j8_u20中的一个bug。在Java聊天的帮助下,我们使用u20、u25和u11进行了测试。结果如下:

  • U25错误是可见的
  • U20错误是可见的
  • U11错误不可见

Bug归档到JAVA jira。

如果我不想在初始化中使用它,而是在用户单击按钮时使用它,那该怎么办?每次用户单击按钮时,我还需要一个新的序列。注意,您不需要禁用动画,因为添加序列后对侦听器的延迟评估似乎允许从第一个序列开始播放动画此错误出现在j8_u25上,但不出现在u11上。尚未使用任何版本进行测试。此错误也出现在j8_u20和u25上