在不改变其范围的情况下为StackedBarChart设置动画

时间:2018-04-24 09:07:38

标签: javafx javafx-8

任务

我必须使用JavaFX创建一个分为多个部分的条形图,其中每个部分代表一种类型的数据。一些CheckBox允许用户选择他想要显示的数据类型。

我使用了StackedBarChart,当我隐藏所有标记时,它看起来就像我想要的那样。

但是,当我更改数据时,我需要将其设置为动画。

问题

我想修改条形图的大小,所以我将上限设置为100,然后我做了一些数学运算来按百分比分割我的数据。它有效,但通过这样做,我的图表有一个固定的范围,由于这个固定的范围,我已经失去了图表的自动动画。

我需要的动画是,当我删除或添加一种数据时,子栏会逐渐增长以填充空白区域或减少以显示新的子栏。

我已经尝试在每次更改时清除我的图表,但我得到的动画并不是我想要的。

这是我的酒吧的FXML(我也尝试将自动调整设置为true,但没有结果,这是正常的,因为我的范围无论如何都是固定的):

hashCode()

这是我将数据放入图表的Java代码

<StackedBarChart fx:id="stackedBar" 
        horizontalGridLinesVisible="false" horizontalZeroLineVisible="false"
        verticalGridLinesVisible="false" verticalZeroLineVisible="false"
        legendVisible="false"
        minHeight="20" maxHeight="100" 
        >
            <xAxis>
                <NumberAxis fx:id="xAxis" side="BOTTOM" autoRanging="false"  lowerBound="0"  opacity="0"/>
            </xAxis>
            <yAxis>
                <CategoryAxis side="LEFT" opacity="0" />
            </yAxis>
        </StackedBarChart>

提前谢谢!抱歉我的英语,我不是母语人士^^&#39;

1 个答案:

答案 0 :(得分:0)

我终于得到了它:我只需要修改图表中已有的数据,而不是像我一样重置它。

现在看起来像这样:

if (stackedBar.getData().isEmpty()) 
    {
        ObservableList<XYChart.Series<Number, String>> stackedBarData = FXCollections.observableArrayList();

        StackedBarChart.Series<Number, String> serie1 = new StackedBarChart.Series<Number, String>();
        serie1.setName(strNouvelle);
        serie1.getData().add(new XYChart.Data<Number, String>(pourcentageNouvelle, "actions"));

        StackedBarChart.Series<Number, String> serie2 = new StackedBarChart.Series<Number, String>();
        serie2.setName(strEnCours);
        serie2.getData().add(new XYChart.Data<Number, String>(pourcentageEnCours, "actions"));

        StackedBarChart.Series<Number, String> serie3 = new StackedBarChart.Series<Number, String>();
        serie3.setName(strTermine);
        serie3.getData().add(new XYChart.Data<Number, String>(pourcentageTermine, "actions"));

        StackedBarChart.Series<Number, String> serie4 = new StackedBarChart.Series<Number, String>();
        serie4.setName(strRefuse);
        serie4.getData().add(new XYChart.Data<Number, String>(pourcentageRefuse, "actions"));

        StackedBarChart.Series<Number, String> serie5 = new StackedBarChart.Series<Number, String>();
        serie5.setName(strHorsDelais);
        serie5.getData().add(new XYChart.Data<Number, String>(pourcentageHorsDelais, "actions"));

        stackedBarData.addAll(serie1,serie2, serie3, serie4, serie5);
        stackedBar.setData(stackedBarData);
    }
    else
    {
        ((StackedBarChart.Series<Number, String>)stackedBar.getData().get(0)).getData().set(0, new XYChart.Data<Number, String>(pourcentageNouvelle, "actions"));
        ((StackedBarChart.Series<Number, String>)stackedBar.getData().get(1)).getData().set(0, new XYChart.Data<Number, String>(pourcentageEnCours, "actions"));
        ((StackedBarChart.Series<Number, String>)stackedBar.getData().get(2)).getData().set(0, new XYChart.Data<Number, String>(pourcentageTermine, "actions"));
        ((StackedBarChart.Series<Number, String>)stackedBar.getData().get(3)).getData().set(0, new XYChart.Data<Number, String>(pourcentageRefuse, "actions"));
        ((StackedBarChart.Series<Number, String>)stackedBar.getData().get(4)).getData().set(0, new XYChart.Data<Number, String>(pourcentageHorsDelais, "actions"));
    }