2

checkBox と 2 つのアニメーション グラフ (円グラフと棒グラフ) を備えたアプリケーションがあります。checkBox がチェックされると、チャートに新しいデータを追加するメソッドが起動されます。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)

そして、これはすべて PieChart でのみ発生します。BarChart は正常に動作します。

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

2 に答える 2

2

残念ながら、バグが見つかりました。http://javafx-jira.kenai.com/browse/RT-21783として提出しました

その間、回避策として、クリックするたびにチェックボックスを1秒間無効にすることができます。

于 2012-05-24T15:58:29.447 に答える
2

セルゲイが回答で言及したバグの問題に添付されているコードを変更しました。ボタンを、アニメーションの再生中に無効になり、アニメーションが終了したときにさらに 0.5 秒無効になるチェックボックスに置き換えました。選択が変更されるたびに、このように動作します。

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);
于 2012-05-24T17:02:30.943 に答える