当前位置: 首页 > 知识库问答 >
问题:

在 JavaFX 折线图中重写序列

葛宏爽
2023-03-14

我有一个使用折线图的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]位于javafx.scene.Parent$1.onProposedChange(未知源),位于com.sun.javafx.collections.VetoableObservableList。add(未知源)位于com.sun.javafx.collections.ObservableListWrapper。在javafx.scene.chart.LineChart添加(未知源)。seriesAdded(未知源代码)位于javafx.scene.chart.XYChart$2.onChanged(未知源),位于com.sun.javfx.collections.ListListenerHelper$SingleChange。com.sun.javafx.collections.ListListenerHelper处的fireValueChangedEvent(未知源)。com.sun.javafx.collections.ObservableListWrapper处的fireValueChangedEvent(未知源)。com.sun.javafx.collections.ObservableListWrapper上的callObservers(未知源)。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.WinApplication_com.sun.glass.ui.win.WinApplication上的runLoop(本机方法)。访问com.sun.glass.ui.win.WinApplication$2$1.run(未知源)(java.lang.Thread.run)(Thread.java:722)

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

共有3个答案

夏雅志
2023-03-14

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

谭新知
2023-03-14

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

engChart.getData().add(series);

对于实例,在初始化块中只应添加一次序列。但是我认为在你的任务线程中,你再次添加了已经添加的相同系列,并且有提到的例外。如果您的目标是刷新唯一的系列数据,那么只需通过< code>engChart.getData()操作该系列。get(0);并删除代码中的这一行。

闾丘文昌
2023-03-14

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

请添加以下代码并进行测试:

engChart.getData().retainAll();
engChart.getData().add(series);
 类似资料:
  • 基本折线图 <template> <ve-line :data="chartData" :settings="chartSettings"></ve-line> </template> <script> export default { data () { this.chartSettings = {} return { chartData: { columns: ['日期',

  • 实时显示传感器数据。 用法 Your browser does not support the video tag. 案例:数据变化趋势 功能:显示数字改变的规律

  • 本文向大家介绍具有多个系列(线)的JavaFX折线图示例,包括了具有多个系列(线)的JavaFX折线图示例的使用技巧和注意事项,需要的朋友参考一下 内联图,数据值表示由一条线连接的一系列点。在JavaFX中,可以通过实例化javafx.scene.chart.LineChart类来创建折线图。 在实例化此类时,必须传递Axis类的两个对象,它们代表x轴和y轴(作为构造函数的参数)。由于Axis类是

  • 本文向大家介绍如何在JavaFX折线图中将x轴移到顶部?,包括了如何在JavaFX折线图中将x轴移到顶部?的使用技巧和注意事项,需要的朋友参考一下 内联图,数据值已表示由一条线连接的一系列点。在JavaFX中,可以通过实例化javafx.scene.chart.LineChart类来创建折线图。 默认, JavaFX折线图包含沿x轴指出系列中的值的符号。通常,这些是小圆圈。 图底部的X轴。 左侧的

  • 主要内容:JavaFX多边形折线JavaFX多边形折线 多边形,一个简单的示例代码如下所示 - 上面的代码生成以下结果。 折线示例,一个简单的示例代码如下所示 - 上面的代码生成以下结果。

  • 主要内容:绘制单条折线,绘制多条折线图折线图(line chart)是我们日常工作、学习中经常使用的一种图表,它可以直观的反映数据的变化趋势。与绘制柱状图、饼状图等图形不同,Matplotlib 并没有直接提供绘制折线图的函数,因此本节着重讲解如何绘制一幅折线图。 绘制单条折线 下面示例是关于 小牛知识库用户活跃度的折线图: 显示结果如下: 绘制多条折线图 当学习完如何绘制单条折线的绘制后,再绘制多条折线也变的容易,只要准备好绘制多条