我有一個使用lineChart圖表的JavaFX應用程序。我可以寫一個圖表的應用程序,並清除它,但是當我想要寫一個新系列,並將它顯示出來,我得到一個錯誤,在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異常:兒童:兒童重複說:父=集團@ 8922394 [=的styleClass情節內容] 在javafx.scene.Parent $ 1.onProposedChange(來源不明) 在com.sun.javafx.collections.VetoableObservableList.add(未知來源) 在com.sun.javafx.collections.ObservableListWrapper.add(未知來源) 在javafx.scene.chart.LineChart.seriesAdded(未知來源) 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(Unknown Source ) 在com.sun.javafx.collections.ObservableListWrapper.add(來源不明) 在edu.arizona.lpl.dan.DanQueryToolFX.QueryToolController $ EngDataPlotTask $ 1.run(QueryToolController.java:231) 在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.run(Unknown Source) at jav a.lang.Thread.run(Thread.java:722)
任何想法我做錯了。我是RANK NEWBIE,所以如果您想回復,請考慮這一點。謝謝!
如果有問題,請更新問題以包含完整堆棧跟蹤到異常。 – jewelsea 2012-08-16 00:35:23
如果仍然面臨這個問題,請參考答案。
[https://stackoverflow.com/a/46234511/4821500](https://stackoverflow.com/a/46234511/4821500) – 2017-09-15 08:00:47