添加了 JavaFX 重复系列
Posted
技术标签:
【中文标题】添加了 JavaFX 重复系列【英文标题】:JavaFX Duplicate Series Added 【发布时间】:2015-11-16 01:18:46 【问题描述】:我目前正在学习 JavaFX,并正在尝试创建一个显示折线图的应用程序,并允许用户更改某些变量,然后更改绘制的线。我这样做的方法是删除系列(以及系列中的数据点),然后重新填充系列并再次添加它们,如下所示。
public void plot(double[] xArr, double[] yExactArr, double[] yApproxArr)
linePlot.getData().clear();
if (!exactValues.getData().isEmpty())
exactValues.getData().remove(0, xArr.length - 1);
approxValues.getData().remove(0, xArr.length - 1);
for (int i = 0; i < xArr.length; i++)
exactValues.getData().add(new XYChart.Data(xArr[i], yExactArr[i]));
approxValues.getData().add(new XYChart.Data(xArr[i], yApproxArr[i]));
linePlot.getData().addAll(exactValues, approxValues);
mainStage.show();
但是,当我这样做时,我收到以下错误:
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Duplicate series added
一旦第二次调用addAll()
,就会发生这种情况。当我在调用clear()
之后打印linePlot.getData()
的toString()
函数时,它会打印一个空数组,所以看起来应该没有问题。我的猜测是这不是改变线路的正确方法,但这是我的新手尝试。似乎我应该能够只更改系列中的数据(无需删除和读取它们),但是我的情节不会更新。
有什么想法/建议吗?
【问题讨论】:
看起来应该可以工作(假设您没有无意中让exactValues
和approxValues
指向同一个列表)。你能创建一个MCVE 来演示这个问题吗?
【参考方案1】:
如果您有以下情况,也可能发生此问题:
animated="true"
为您的折线图设置。 当 XYChart 类检查重复项时,它会从 displayedSeries 中获取所有系列,并将它们与您现有的数据系列进行比较。在此期间,如果您已清除数据,由于长时间的褪色效果,该系列仍将处于显示系列中,并导致“添加了重复系列”的错误。 如果是这种情况,只需设置:
animated="false"
【讨论】:
【参考方案2】:我认为这是一个 JavaFX 错误。我有同样的问题。我“解决”了它删除图表(在您的情况下为 linePlot)并再次创建它。
【讨论】:
【参考方案3】:当用动画改变图表数据时,这似乎是一个错误。正如@Anurag 所说,如果您关闭动画,您将不会遇到问题。
例如
linePlot.setAnimated(false);
【讨论】:
【参考方案4】:在创建图表时,最初只将您的系列添加到图表中一次。
更新数据而不再次添加系列:
public void plot(double[] xArr, double[] yExactArr, double[] yApproxArr)
linePlot.getData().clear();
if (!exactValues.getData().isEmpty())
exactValues.getData().remove(0, xArr.length - 1);
approxValues.getData().remove(0, xArr.length - 1);
for (int i = 0; i < xArr.length; i++)
exactValues.getData().add(new XYChart.Data(xArr[i], yExactArr[i]));
approxValues.getData().add(new XYChart.Data(xArr[i], yApproxArr[i]));
//linePlot.getData().addAll(exactValues, approxValues);
mainStage.show();
【讨论】:
【参考方案5】:如果您使用 FXML 和控制器,我想最好的解决方案是在控制器中使用 Initilizable 接口,并从中初始化函数。在初始化时你定义
@Override
public void initialize(URL url, ResourceBundle resourceBundle)
linePlot.getData().addAll(exactValues, approxValues);
您还必须将您的功能添加到控制器。这样您只需添加一次系列,但您可以使用您的功能编辑其中的数据。
public void plot(double[] xArr, double[] yExactArr, double[] yApproxArr)
linePlot.getData().clear();
if (!exactValues.getData().isEmpty())
exactValues.getData().remove(0, xArr.length - 1);
approxValues.getData().remove(0, xArr.length - 1);
for (int i = 0; i < xArr.length; i++)
exactValues.getData().add(new XYChart.Data(xArr[i], yExactArr[i]));
approxValues.getData().add(new XYChart.Data(xArr[i], yApproxArr[i]));
主要是你将拥有
@Override
public void start(Stage mainStage) throws Exception
Parent root = FXMLLoader.load(getClass().getResource("your FXML file"));
mainStage.setScene(new Scene(root, 989, 583));
mainStage.show();
【讨论】:
以上是关于添加了 JavaFX 重复系列的主要内容,如果未能解决你的问题,请参考以下文章
将项添加到comboBox javaFx FXML时出错[重复]