2 votes

L'axe X du graphique à barres Javafx ne s'étend pas correctement lors de la mise à jour des données

J'essaie d'implémenter un graphique à barres en utilisant Javafx. Le graphique fonctionne bien si je trace les données une seule fois. Mais lorsque je mets à jour les données et que je trace à nouveau le graphique, l'échelle de l'axe des X reste la même, alors que toutes les données sont correctement mises à jour. Veuillez consulter les images suivantes.

Voici le graphique correct qui représente les données par semaine.

données par semaine

Lorsque je mets à jour les données, le graphique se transforme en

données par mois

Vous pouvez voir que les données ont été mises à jour, mais l'axe des X ne s'échelonne pas correctement. Ce qui est intéressant, c'est que lorsque je trace à nouveau le graphique sans modifier les données, l'axe des X devient normal comme ceci.

données par mois2

Les codes sont les suivants :

private static void drawChart(int timeMode)
{
    stayAvg = new XYChart.Series<String, Number>();
    stayAvg.setName("Avg.Stay (mins)");

    // add data to the dataset
    if (timeMode == 1)
    {
        for (int i = firstWeek; i <= lastWeek; i++)
        {
            stayAvg.getData().add(new XYChart.Data<String, Number>(weeks[i], weeksTotalCount[i]));
        }
    }
    else if (timeMode == 2)
    {
        for (int i = firstMonth; i <= lastMonth; i++)
        {
            stayAvg.getData().add(new XYChart.Data<String, Number>(months[i], monthsTotalCount[i]));
        }
    }

    // display chart
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            // plot data sets to the chart
            // Update UI here.
            // set up tooltips when cursor hovers on bars
            sbc.setData(FXCollections.observableArrayList(stayAvg));
            stayAvg.getData().forEach(d -> {
                    Tooltip tip = new Tooltip();
                    tip.setText(d.getYValue() + "\n" + d.getXValue());
                    Tooltip.install(d.getNode(), tip);
            });
            // sbc is a StackedBarChart
            sbc.setTitle("Average Stay");
            chart.setScene(scene);
        }
    });
}

0voto

seb Points 56

Avez-vous essayé de ne pas définir les données à chaque fois que vous dessinez :

 sbc.setData(FXCollections.observableArrayList(stayAvg));

Et au lieu de faire :

private static void drawChart(int timeMode)
{
 sbc.getData().clear();

// add data to the dataset
if (timeMode == 1)
{
    for (int i = firstWeek; i <= lastWeek; i++)
    {
        stayAvg.getData().add(new XYChart.Data<String, Number>(weeks[i], weeksTotalCount[i]));
    }
}
else if (timeMode == 2)
{
    for (int i = firstMonth; i <= lastMonth; i++)
    {
        stayAvg.getData().add(new XYChart.Data<String, Number>(months[i], monthsTotalCount[i]));
    }
}

0voto

Harry Ho Points 1

Vous pouvez essayer de désactiver l'animation de l'histogramme :

chart.setAnimated(false);

Cela permettra d'éviter une transition apparemment "douce" entre les mises à jour des graphiques à barres, et donc d'éviter ces bugs visuels inattendus comme des étiquettes de barres surchargées.

Ceci est inspiré par ce question et fonctionne dans mon cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X