更新数据时,Javafx条形图X轴无法正确缩放

更新数据时,Javafx条形图X轴无法正确缩放,java,javafx,bar-chart,Java,Javafx,Bar Chart,我正在尝试使用Javafx实现一个条形图。如果我只绘制一次数据,图表工作正常。但当我更新数据并重新绘制图表时,X轴比例保持不变,而所有数据都正确更新。请检查以下图片 这是按周绘制数据的正确图表 当我更新数据时,图表会变成 您可以看到数据已更新,但X轴未正确缩放。有趣的是,当我在不改变数据的情况下再次绘制图表时,X轴变得像这样正常 代码如下: private static void drawChart(int timeMode) { stayAvg = new XYChart.Ser

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

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

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

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

代码如下:

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);
        }
    });
}
private静态无效绘图图(int-timeMode)
{
stayAvg=new XYChart.Series();
stayAvg.setName(“平均停留时间(分钟)”);
//向数据集添加数据
如果(时间模式==1)
{

对于(int i=firstWeek;i您是否尝试过在每次绘制时不设置数据:

 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]));
    }
}
private静态无效绘图图(int-timeMode)
{
sbc.getData().clear();
//向数据集添加数据
如果(时间模式==1)
{

对于(int i=firstWeek;i您可以尝试禁用条形图的动画:

chart.setAnimated(false);
这将阻止条形图更新之间看似“平滑”的过渡,从而防止出现诸如过度拥挤的条形标签等意外的视觉错误


这是从问题中得到的启发,在我的案例中起作用。

首先,启用图表动画。最后禁用聊天动画

    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

1) 这与Swing有什么关系?2)请学习常见的Java命名法(命名约定-例如
EachWordUpperCaseClass
firstWordLowerCaseMethod()
firstWordLowerCaseAttribute
,除非它是
大写常量
)并始终如一地使用它。谢谢Andrew,我以前没有注意Java术语。我会编辑代码。谢谢你的回答,但它不起作用。如果不调用setData,图表中就不会有任何内容。