2012-08-15 74 views
2

我有一個使用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,所以如果您想回復,請考慮這一點。謝謝!

+0

如果有問題,請更新問題以包含完整堆棧跟蹤到異常。 – jewelsea 2012-08-16 00:35:23

+0

如果仍然面臨這個問題,請參考答案。

[https://stackoverflow.com/a/46234511/4821500](https://stackoverflow.com/a/46234511/4821500) – 2017-09-15 08:00:47

回答

0

我對根據自己的殘缺碼的根本原因的猜測是,這條線:

engChart.getData().add(series); 

你應該在初始化塊添加系列只有一次實例。但是我認爲在你的任務線程中,你再次添加已經添加的相同系列,並提到異常。如果您的目標是刷新唯一的系列數據,那麼只需操作該系列,獲取engChart.getData().get(0);並刪除代碼中的該行。

+0

Uluk - 好的。精細。但是當我刪除那行代碼時,圖形不會刷新。我可以清除這個系列,我可以操作這個系列,但是你可以引用的那一行是系列在圖表上的位置。因此,在其他方法中,我沒有看到在現有圖表上重新繪製更新後的系列的一種明顯方法,一旦創建完畢後,系列就會重繪。 – passiflora 2012-08-16 17:27:59

+0

@ user1579974請參閱更新。 – 2012-08-17 09:20:35

4

找到解決此問題的解決方案花了很長時間。一旦該系列添加到圖表你要做的就是編輯的系列

engChart.getData().retainAll(); 
engChart.getData().add(series); 
0

請在下面添加一段代碼和測試。不要再將它添加到圖中。 圖表將遵循系列發生的任何事情,即只更改系列數據,圖表將自動反映更改。