【问题标题】:rewriting a series in JavaFX linechart在 JavaFX 折线图中重写系列
【发布时间】:2012-08-12 07:33:59
【问题描述】:

我有一个使用 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: 添加了重复的子项:parent = Group@8922394[styleClass=plot-content] 在 javafx.scene.Parent$1.onProposedChange(未知来源) 在 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.sun.javafx.collections.ObservableListWrapper.add(未知来源) 在 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(未知来源) 在 com.sun.glass.ui.win.WinApplication._runLoop(本机方法) 在 com.sun.glass.ui.win.WinApplication.access $100(未知来源) 在 com.sun.glass.ui.win.WinApplication$2$1.run(未知来源) 在 java.lang.Thread.run(Thread.java:722)

任何想法我做错了什么。我是 RANK NEWBIE,所以如果您想回复,请考虑到这一点。谢谢!

【问题讨论】:

标签: javafx-2


【解决方案1】:

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

请添加以下代码并测试:

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

【讨论】:

    【解决方案2】:

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

    engChart.getData().add(series);
    

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

    【讨论】:

    • 乌鲁克-好的。美好的。但是当我删除那行代码时,图表不会刷新。我可以清除系列,我可以操纵系列,但是您引用的那条线是系列在图表上绘制的位置,据我所知。因此,在其他方法中,我看不到在现有图表上重绘更新系列的明显方法。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      相关资源
      最近更新 更多