我有一个使用 lineChart 图表的 JavaFX 应用程序。我可以将图表写入应用程序并清除它,但是当我想编写一个新系列并显示它时,出现错误,
java.lang.IllegalArgumentException: Children: duplicate children added:
我明白意思,但不明白如何解决(我对 Java 很陌生,更不用说 FX 了)。
这是来自我的控制器的相关代码(减去一些类声明):
(由图表选项卡窗口中的“提交”按钮调用的方法)
@FXML
private void getEngDataPlot(ActionEvent event) {
//check time inputs
boolean start = FieldVerifier.isValidUtcString(startRange.getText());
boolean end = FieldVerifier.isValidUtcString(endRange.getText());
type = engData.getValue().toString();
// Highlight errors.
startRangeMsg.setTextFill(Color.web(start ? "#000000" : "#ff0000"));
endRangeMsg.setTextFill(Color.web(end ? "#000000" : "#ff0000"));
if (!start || !end ) {
return;
}
// Save the preferences.
Preferences prefs = Preferences.userRoot().node(this.getClass().getName());
prefs.put("startRange", startRange.getText());
prefs.put("endRange", endRange.getText());
prefs.put("engData", engData.getValue().toString());
StringBuilder queryString = new StringBuilder();
queryString.append(String.format("edit out",
startRange.getText(),
endRange.getText()));
queryString.append(type);
log(queryString.toString());
// Start the query task.
submitEngData.setDisable(true);
// remove the old series.
engChart.getData().clear();
engDataProgressBar.setDisable(false);
engDataProgressBar.setProgress(-1.0);
//ProgressMessage.setText("Working...");
Thread t = new Thread(new EngDataPlotTask(queryString.toString()));
t.setDaemon(true);
t.start();
}
(上述方法调用的任务:)
public EngDataPlotTask(String query) {
this.query = query;
}
@Override
protected Void call() {
try {
URL url = new URL(query);
String inputLine = null;
BufferedReader in = new BufferedReader(
new InputStreamReader(url.openStream()));
// while ( in.readLine() != null){
inputLine = in.readLine(); //}
Gson gson = new GsonBuilder().create();
DataObject[] dbin = gson.fromJson(inputLine, DataObject[].class);
in.close();
for (DataObject doa : dbin) {
series.getData().add(new XYChart.Data(doa.danTime, doa.Fvalue));
}
xAxis.setLabel("Dan Time (msec)");
} catch (Exception ex) {
log(ex.getLocalizedMessage());
}
Platform.runLater(new Runnable() {
@Override
public void run() {
submitEngData.setDisable(false);
// do some pretty stuff
String typeName = typeNameToTitle.get(type);
series.setName(typeName);
// put this series on the chart
engChart.getData().add(series);
engDataProgressBar.setDisable(true);
engDataProgressBar.setProgress(1.0);
}
});
return null;
}
}
图表第一次绘制,清除,然后出现异常。请求的堆栈跟踪如下:
Exception in runnable
java.lang.IllegalArgumentException:孩子:添加了重复的孩子:父 = Group@8922394[styleClass=plot-content] at javafx.scene.Parent$1.onProposedChange(Unknown Source) at com.sun.javafx.collections.VetoableObservableList.add( Unknown Source) at com.sun.javafx.collections.ObservableListWrapper.add(Unknown Source) at javafx.scene.chart.LineChart.seriesAdded(Unknown Source) at javafx.scene.chart.XYChart$2.onChanged(Unknown Source) at com .sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source) at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source) at com.sun.javafx.collections.ObservableListWrapper.callObservers(Unknown Source) at com .sun.javafx.collections.ObservableListWrapper.add(未知来源)在 com.sun.javafx.collections。ObservableListWrapper.add(Unknown Source) at edu.arizona.lpl.dan.DanQueryToolFX.QueryToolController$EngDataPlotTask$1.run(QueryToolController.java:231) at com.sun.javafx.application.PlatformImpl$4.run(Unknown Source) at com .sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.access $100(Unknown Source) at com.sun.glass.ui.win.WinApplication$2$1。在 java.lang.Thread.run(Thread.java:722) 运行(未知来源)WinApplication$2$1.run(Unknown Source) at java.lang.Thread.run(Thread.java:722)WinApplication$2$1.run(Unknown Source) at java.lang.Thread.run(Thread.java:722)
任何想法我做错了什么。我是 RANK NEWBIE,所以如果您想回复,请考虑到这一点。谢谢!