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:孩子:添加了重复的孩子:父 = 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,所以如果您想回复,请考虑到这一点。谢谢!

4

3 回答 3

4

花了很长时间才找到解决此问题的解决方案。

请添加以下代码并测试:

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

根据您不完整的代码,我对根本原因的猜测是这一行:

engChart.getData().add(series);

例如,您应该只在初始化块中添加一次系列。但我认为在您的任务线程中,您正在再次添加已经添加的同一系列并有提到的异常。如果您的目标是刷新唯一的系列数据,那么只需操作系列,获取它engChart.getData().get(0);并删除代码中的该行。

于 2012-08-16T11:15:33.703 回答
0

将系列添加到图表后,您所做的就是编辑系列。不要再次将其添加到图表中。图表将跟随系列发生的任何事情,即只需更改系列数据,图表将自动反映更改。

于 2013-12-25T13:33:06.373 回答