【问题标题】:Issue with JavaFX PieChartJavaFX PieChart 的问题
【发布时间】:2012-05-24 13:04:19
【问题描述】:

我有一个带有复选框和 2 个动画图表的应用程序:饼图和条形图。 选中复选框时,将触发向图表添加新数据的方法。 当 checkBox *un*选中时,会触发从图表中删除数据的方法。

当我单击复选框不是很快时,一切正常。但是如果我在动画完成之前再次点击复选框,我会收到这个错误:

 java.lang.NullPointerException
at javafx.scene.chart.PieChart$7.handle(PieChart.java:370)
at javafx.scene.chart.PieChart$7.handle(PieChart.java:367)
at   com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(TimelineClipCore.java:217)
at com.sun.scenario.animation.shared.TimelineClipCore.playTo(TimelineClipCore.java:158)
at javafx.animation.Timeline.impl_playTo(Timeline.java:182)
at com.sun.scenario.animation.shared.SingleLoopClipEnvelope.timePulse(SingleLoopClipEnvelope.java:119)
at javafx.animation.Animation.impl_timePulse(Animation.java:953)
at com.sun.scenario.animation.shared.AnimationPulseReceiver.timePulse(AnimationPulseReceiver.java:117)
at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:366)
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:289)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:454)
at com.sun.javafx.tk.quantum.QuantumToolkit$8.run(QuantumToolkit.java:325)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$2$1.run(WinApplication.java:62)
at java.lang.Thread.run(Unknown Source)

而这一切都只发生在饼图上。条形图正常工作。

这里是checkBox onAction事件的方法:

  public void OnCheckFired(ActionEvent event) {
    Boolean b = checkBox.isSelected();
    chart.modifyChart(currentChart,b);
}

Thant 是一个用于修改饼图的代码:

@Override
public void makeModifications(Chart chart, Boolean b) {
    PieChart pie = (PieChart) chart;
    ObservableList<PieChart.Data> pieChartData = pie.getData();
    pieChartData = modify(b, pieChartData);
    pie.setData(pieChartData);
}

private ObservableList<Data> modify(Boolean b, ObservableList<PieChart.Data> pieChartData)  {
    if (b) {
        pieChartData.add(new PieChart.Data("newValue", 34));
    } else {
        int size = pieChartData.size() - 1;
        pieChartData.remove(size);
    }
    return pieChartData;
}

【问题讨论】:

    标签: java javafx-2


    【解决方案1】:

    我已经修改了附加到错误问题的代码,这是 Sergey 在他的回答中提到的。用动画播放时禁用的复选框替换按钮,动画完成时额外半秒。每次选择更改时,它都会以这种方式运行。

    public class Tdesst extends Application {
    
        private void init(Stage primaryStage) {
            VBox root = new VBox();
            Scene scene = new Scene(root);
            primaryStage.setScene(scene);
            final ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(
                    new PieChart.Data("Sun", 20),
                    new PieChart.Data("IBM", 12),
                    new PieChart.Data("HP", 25),
                    new PieChart.Data("Dell", 22),
                    new PieChart.Data("Apple", 30));
            final PieChart chart = new PieChart(pieChartData);
    
            final CheckBox chkbox = new CheckBox("add/remove data");
    
            final Timeline animation = new Timeline(
                    new KeyFrame(Duration.seconds(.5),
                    new EventHandler<ActionEvent>() {
                        @Override public void handle(ActionEvent actionEvent) {
                            chkbox.setDisable(false);
                        }
                    }));
            animation.setCycleCount(1);
    
            chkbox.selectedProperty().addListener(new ChangeListener<Boolean>() {
    
                @Override
                public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldVal, Boolean newVal) {
                    chkbox.setDisable(true);
                    if (newVal) {
                        pieChartData.add(new PieChart.Data("newValue", 34));
                    } else {
                        pieChartData.remove(pieChartData.size() - 1);
                    }
                    animation.play();
                }
            });
    
            root.getChildren().add(chart);
            root.getChildren().add(chkbox);
        }
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            init(primaryStage);
            primaryStage.show();
            primaryStage.setTitle(VersionInfo.getRuntimeVersion());
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    或者你可以完全禁用动画

    chart.setAnimated(false);
    

    【讨论】:

      【解决方案2】:

      不幸的是,您发现了一个错误。我已将其归档为http://javafx-jira.kenai.com/browse/RT-21783

      同时,作为一种解决方法,您可以在每次单击后禁用复选框一秒钟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-31
        • 2018-09-25
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多