【问题标题】:ListChangeListener, JavaFXListChangeListener,JavaFX
【发布时间】:2013-09-10 13:50:06
【问题描述】:

我有一个与 ObservableList 上的过滤器有关的问题。我的代码工作正常,但我认为太慢了。这是因为我在应用程序开始时加载了大约 40,000 个订单,之后应用程序继续接收订单,但现在我只在初始加载时遇到问题。我的主要问题是我的原始订单集合的副本要慢得多,为什么?因为我在changeListener中的代码我认为可能会更好..但我还没有找到解决方案。好吧,这是我的代码示例。

public MainController()
{
    filteredData.addAll(Repository.masterObservableList);

    Repository.masterObservableList.addListener(new ListChangeListener<OrderVo>() 
    {
            @Override
            public void onChanged(ListChangeListener.Change<? extends OrderVo> change) 
            {               

                filteredData.clear();                                                              
                for (OrderVo o : Repository.masterObservableList) 
                    filteredData.add(o);
            }
        });
    }    
}

我会稍微解释一下代码。 “存储库”是一个单例,masterObservableList 是一个 ObservableList,顾名思义..是“主”或原始。 filtersData 也是一个 ObservableList,但仅在我的 fxml (MainController) 的控制器中声明,并作为主集合的副本。每次我的主集合收到更改(更新或新订单)时,filteredData 都应该应用该更改..但是我为每次迭代都做一个,这是问题,因为它有效但太慢了。为什么我说这很慢?因为一开始我使用主集合作为显示订单的 TableView 的数据提供者,它工作得又快又干净。之后我想在表格中添加过滤器,这就是我开始研究并发现过滤数据和另一种方法的时候..我保留了这个方法(是一个更大的代码,但主要问题在这里)..它工作.. 但是一开始加载订单的时间比以前多 1:30 分钟.. 所以伙计们,如果你有任何想法!关于如何在不为 changeListener 中的每个设置更新的情况下保持过滤数据的更新,我将非常高兴和感激。感谢阅读!

【问题讨论】:

  • 已解决..filteredData.clear(); filtersData.addAll((ObservableList)change.getList());完毕!! :D

标签: filter javafx iteration observablelist


【解决方案1】:

每次 masterObservableList 更改时,您的算法都会强制重置 filtersData 的所有元素。 这太详尽了,因为可以在添加或删除每个项目时触发侦听器。 也许最好只添加或删除已更改的元素?

 Repository.masterObservableList.addListener(new ListChangeListener<OrderVo>() 
    {
            @Override
            public void onChanged(ListChangeListener.Change<? extends OrderVo> change) 
            {               

                while(change.next()) {
                    if(change.wasAdded()) {
                        List added =  change.getAddedSubList();
                        //add those elements to your data
                    }
                    if(change.wasRemoved()) {
                        List removed = change.getRemoved();
                        //remove those elements from your data
                    }
                }
            }
        });
    }   

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 2015-06-10
    • 2020-07-14
    • 2014-06-13
    • 2019-07-23
    • 2018-04-28
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    相关资源
    最近更新 更多