【问题标题】:Javafx bar chart X axis does not scale properly when updating dataJavafx 条形图 X 轴在更新数据时无法正确缩放
【发布时间】:2018-11-08 18:00:45
【问题描述】:

我正在尝试使用 Javafx 实现条形图。如果我只绘制一次数据,图表就可以正常工作。但是当我更新数据并重新绘制图表时,X 轴刻度保持不变,而所有数据都正确更新。请检查以下图片。

这是按周绘制数据的正确图表

data by week

当我更新数据时,图表变成了

data by month

您可以看到数据已更新,但 X 轴未正确缩放。有趣的是,当我在不更改数据的情况下再次绘制图表时,X 轴变成了这样的正常状态。

data by month2

代码如下:

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

【问题讨论】:

  • 1) 这与 Swing 有什么关系? 2) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。
  • 谢谢 Andrew,我以前没有关注 Java 命名法。我将编辑代码。

标签: java javafx bar-chart


【解决方案1】:

首先开启图表动画,最后关闭聊天动画。

    lineChart.getData().clear();
    lineChart.setAnimated(true);// enable animation
    XYChart.Series series = new XYChart.Series();

    String query = "SELECT time, total_purchase FROM sales WHERE date = '"+ 
    text.getText() +"'";

    con = new Connector().connector();
    pst = con.prepareStatement(query);
    ResultSet rs = pst.executeQuery();
    rs.beforeFirst();

    while(rs.next()){

        String time = rs.getString(rs.findColumn("time"));
        float purchase = rs.getFloat(rs.findColumn("total_purchase"));

        series.getData().add(new XYChart.Data(time, purchase));
    }
    lineChart.getData().addAll(series);
    lineChart.setAnimated(false);// disable animation

【讨论】:

    【解决方案2】:

    你有没有试过每次画图都不setData:

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

    【讨论】:

    • 感谢您的回答,但它不起作用。如果不调用 setData,图表中将没有任何内容。
    【解决方案3】:

    您可以尝试禁用条形图的动画:

    chart.setAnimated(false);
    

    这将防止条形图更新之间看似“平滑”的过渡,从而防止那些意外的视觉错误,如过度拥挤的条形标签。

    这是受到this 问题的启发,适用于我的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      相关资源
      最近更新 更多