Гистограмма Javafx ось X неправильно масштабируется при обновлении данных - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь реализовать гистограмму, используя Javafx.Диаграмма работает нормально, если я строю данные только один раз.Но когда я обновляю данные и заново строю диаграмму, масштаб оси X остается прежним, а все данные обновляются правильно.Пожалуйста, проверьте следующие изображения.

Это правильный график, который отображает данные по неделям

данные по неделям

Когда я обновляю данные,диаграмма превращается в

данные по месяцам

Вы можете видеть, что данные были обновлены, но ось X не масштабируется правильно.Интересно, что когда я снова строю график без изменения данных, ось X становится нормальной, как это.

данные по месяцам2

Коды следующие:

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);
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы можете попробовать отключить анимацию гистограммы:

chart.setAnimated(false);

Это предотвратит, по-видимому, "плавный" переход между обновлениями гистограммы и, таким образом, предотвратит такие неожиданные визуальные ошибки, как переполненные гистограммы.

Это вдохновлено этим вопросом и работает в моем случае.

0 голосов
/ 30 мая 2018

Вы пытались не устанавливать данные каждый раз, когда рисуете:

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

И вместо этого делаете:

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]));
    }
}
...