添加了 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() 函数时,它会打印一个空数组,所以看起来应该没有问题。我的猜测是这不是改变线路的正确方法,但这是我的新手尝试。似乎我应该能够只更改系列中的数据(无需删除和读取它们),但是我的情节不会更新。

有什么想法/建议吗?

【问题讨论】:

看起来应该可以工作(假设您没有无意中让exactValuesapproxValues 指向同一个列表)。你能创建一个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时出错[重复]

使用两个线程会导致 JavaFX 崩溃 [重复]

在 java 13 中找不到模块 javafx.base [重复]

在JavaFX中播放带字幕的视频[重复]

我不能使用 JavaFX [重复]

使用JAVAFX和SWING有啥区别[重复]