我有一个带有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;
}
答案 0 :(得分:2)
不幸的是你发现了一个错误。我已将其归档为http://javafx-jira.kenai.com/browse/RT-21783
同时作为一种解决方法,您可以在每次点击后禁用一秒钟。
答案 1 :(得分:2)
我修改了谢谢在回答中提到的bug问题附带的代码。用动画播放时被禁用的复选框替换按钮,动画结束时再用半秒。每次选择改变时,它都会以这种方式运行。
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);