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: Children: duplicate children added: parent = Group@8922394[styleClass=plot-content] at javafx.scene.Parent$1.onProposedChange(Unknown Source) at com.sun.javafx.collections.VetoableObservableList.add(ソース不明) com.sun.javafx.collections.ObservableListWrapper.add(ソース不明) javafx.scene.chart.LineChart.seriesAdded(ソース不明) javafx.scene.chart.XYChart$2.onChanged(不明ソース) com .sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(不明なソース) com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(不明なソース) com.sun.javafx.collections.ObservableListWrapper.callObservers(不明なソース) com com.sun.javafx.collections の .sun.javafx.collections.ObservableListWrapper.add(不明なソース)。edu.arizona.lpl.dan.DanQueryToolFX.QueryToolController$EngDataPlotTask$1.run(QueryToolController.java:231) の ObservableListWrapper.add(不明なソース) com.sun.javafx.application.PlatformImpl$4.run(不明なソース) の com .sun.glass.ui.win.WinApplication._runLoop (ネイティブ メソッド) com.sun.glass.ui.win.WinApplication.access$100 (未知のソース) com.sun.glass.ui.win.WinApplication$2$1。 java.lang.Thread.run(Thread.java:722) で実行 (不明なソース)WinApplication$2$1.run(不明なソース) at java.lang.Thread.run(Thread.java:722)WinApplication$2$1.run(不明なソース) at java.lang.Thread.run(Thread.java:722)
私が間違っていることについてのアイデア。私はRANK NEWBIEなので、返信したい場合はそのことを考慮してください. ありがとうございました!