繁体   English   中英

如何在Swing应用程序中更新JavaFX BarChart?

[英]How can I update JavaFX BarChart in Swing application?

我想更新一个JavaFX BarChart。 我使用以下方法初始化BarChart:

private void initFxComponents(String questionName){

    Platform.runLater(() -> {
        final CategoryAxis xAxis = new CategoryAxis();
        final NumberAxis yAxis = new NumberAxis();
        final BarChart<String, Number> barChart = new BarChart<>(xAxis,yAxis);
        barChart.setTitle(questionName);
        barChart.setLegendVisible(false);
        xAxis.setLabel("Answer");       
        yAxis.setLabel("Number of times answered");
        series = new Series();
        int nbAnswersForProposal;      
        String proposal;
        for(Proposal p : question.getListProposals()){
            nbAnswersForProposal = Answers.getInstance().getNbAnswersForProposal(quiz.getId(), question.getId(), p.getId());
            proposal = p.getProposal();                               
            StringBuilder sb = new StringBuilder(proposal);
            int i = 0;
            while ((i = sb.indexOf(" ", i + 30)) != -1)
                sb.replace(i, i + 1, "\n");                
            series.getData().add(new Data(sb.toString(), nbAnswersForProposal));
        } 
        Scene scene = new Scene(barChart,800,800);
        barChart.getData().addAll(series);
        fxPanel.setScene(scene);
    });

}

我使用这种方法来更新数据:

public void updateData(){
    Platform.runLater(() -> {
        series.getData().clear();
        int nbAnswersForProposal;       
        String proposal; 
        for(Proposal p : question.getListProposals()){
            nbAnswersForProposal = Answers.getInstance().getNbAnswersForProposal(quiz.getId(), question.getId(), p.getId());
            proposal = p.getProposal();                               
            StringBuilder sb = new StringBuilder(proposal);
            int i = 0;
            while ((i = sb.indexOf(" ", i + 30)) != -1)
                sb.replace(i, i + 1, "\n");
            series.getData().add(new Data(sb.toString(), nbAnswersForProposal));
        }
    });
}

但是,当我更新数据时,BarChart是错误的,并且无法正确显示数据。 我认为我没有做正确的事情来更新我的BarChart,有人可以帮助我吗? 谢谢 !

好的,我找到了解决问题的方法。 显然,该动画导致数据无法正确显示并中断自动调整大小。

因此,只需添加: barChart.setAnimated(false);

您将不再有动画,但是它将解决问题。


变化

我也更新了这个:

private final Series series = new Series();
...
series.getData().add(new Data(sb.toString(), nbAnswersForProposal));
...
barChart.getData().addAll(series); 

这样:

private final XYChart.Series<String, Number> series = new XYChart.Series<>();
...
series.getData().add(new XYChart.Data(sb.toString(), nbAnswersForProposal));
...
barChart.setData(FXCollections.observableArrayList(series));

更新数据-图表将自动重新绘制

public void updateData(){
    // You need to run it in thread
    Platform.runLater(() -> {
        // Update chart's name
        barChart.setTitle(questionName);
        // Remove all data
        series.getData().clear();
        // Add as many data as you want         
        series.getData().add(new XYChart.Data("xData", yValue));
    });
}

就我而言,我需要删除数据并添加新数据。 但是,如果您的x值不变,您也可以更新值(y值)。

感谢Roland帮助我解决JavaFX图表自动缩放错误(数字偏低)的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM