2

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なので、返信したい場合はそのことを考慮してください. ありがとうございました!

4

3 に答える 3

4

この問題の回避策を見つけるのに長い時間がかかりました。

以下のコードを追加してテストしてください。

engChart.getData().retainAll();
engChart.getData().add(series);
于 2012-08-19T09:38:21.097 に答える
0

シリーズをグラフに追加したら、シリーズを編集するだけです。再びグラフに追加しないでください。グラフはシリーズに何が起こっても従います。つまり、シリーズ データを変更するだけで、グラフは自動的に変更を反映します。

于 2013-12-25T13:33:06.373 に答える
0

不完全なコードに従って根本原因についての私の推測は、この行です。

engChart.getData().add(series);

たとえば、初期化ブロックでシリーズを 1 回だけ追加する必要があります。しかし、あなたのタスクスレッドでは、すでに追加された同じシリーズを再度追加していて、その言及された例外があると思います。唯一のシリーズ データを更新することが目的の場合は、シリーズを操作してengChart.getData().get(0);、コード内のその行を削除します。

于 2012-08-16T11:15:33.703 に答える