javafx 8烛台图表无法摆脱陈旧数据

时间:2014-09-08 13:33:35

标签: javafx-8

我使用样本蜡烛图表代码绘制图表。当我在java7中工作时,图表工作正常。但是当我尝试使用Java8时。这儿存在一个问题。 我跟踪了这​​样的问题:这段代码来自Ensemble示例代码:CandlStickChart.java

 @Override protected void layoutPlotChildren() {
        // we have nothing to layout if no data is present
        if(getData() == null) return;

        // update candle positions
        for (int seriesIndex=0; seriesIndex < getData().size(); seriesIndex++) {
            Series<Number,Number> series = getData().get(seriesIndex);
            Iterator<Data<Number,Number>> iter = getDisplayedDataIterator(series);
            Path seriesPath = null;

            if (series.getNode() instanceof Path) {
                seriesPath = (Path)series.getNode();

                seriesPath.getElements().clear();

            }
            while(iter.hasNext()) {
                System.out.println(i++); // the different place
                Data<Number,Number> item = iter.next();
                double x = getXAxis().getDisplayPosition(getCurrentDisplayedXValue(item));
                double y = getYAxis().getDisplayPosition(getCurrentDisplayedYValue(item));
                Node itemNode = item.getNode();
                CandleStickExtraValues extra = (CandleStickExtraValues)item.getExtraValue();
                if (itemNode instanceof Candle && extra != null) {
                    Candle candle = (Candle) itemNode;

这是代码的一部分。问题在于&#34;不同的地方&#34; 对于iter.hasNext()将保留陈旧的值。因此,每次我设置新数据时,列表会更长。 setdata代码如:

ObservableList<XYChart.Data<Number, Number>> newData
                = FXCollections.<XYChart.Data<Number, Number>>observableArrayList();

  for (int j = 1; j <= leno; j++) {
            newData.add(。。。。。。。);//
series.getData().clear();
 series.setData(newData);

当我通过Iter.remove删除陈旧数据时,例外情况是:我们不支持从显示的数据列表中删除项目。

1 个答案:

答案 0 :(得分:0)

您必须向{em> dataItemRemoved 方法添加两次removeDataItemFromDisplay调用。

注意:我在示例代码中创建了 series item final。

@Override
    protected void dataItemRemoved(final Data<Number, Number> item,
            final Series<Number, Number> series) {
        final Node candle = item.getNode();
        if (shouldAnimate()) {
            // fade out old candle
            FadeTransition ft = new FadeTransition(Duration.millis(500), candle);
            ft.setToValue(0);
            ft.setOnFinished(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent actionEvent) {
                    getPlotChildren().remove(candle);
                    removeDataItemFromDisplay(series, item);                    
                }
            });
            ft.play();
        } else {
            getPlotChildren().remove(candle);
            removeDataItemFromDisplay(series, item);

        }
    }