我有一个使用折线图的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,所以如果你想回复,请考虑到这一点。谢谢你!
将序列添加到图形后,您所做的就是编辑序列。不要再将其添加到图表中。图表将跟随序列发生的任何情况,即只更改序列数据,图表将自动反映变化。
根据您不完整的代码,我猜测根本原因是这一行:
engChart.getData().add(series);
对于实例,在初始化块中只应添加一次序列。但是我认为在你的任务线程中,你再次添加了已经添加的相同系列,并且有提到的例外。如果您的目标是刷新唯一的系列数据,那么只需通过< code>engChart.getData()操作该系列。get(0);并删除代码中的这一行。
花了很长时间才找到解决此问题的解决方法。
请添加以下代码并进行测试:
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 并没有直接提供绘制折线图的函数,因此本节着重讲解如何绘制一幅折线图。 绘制单条折线 下面示例是关于 小牛知识库用户活跃度的折线图: 显示结果如下: 绘制多条折线图 当学习完如何绘制单条折线的绘制后,再绘制多条折线也变的容易,只要准备好绘制多条