首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LiveList在更新时调用两次

LiveList在更新时调用两次
EN

Stack Overflow用户
提问于 2017-12-05 18:57:56
回答 1查看 117关注 0票数 0

我使用LiveList将一个组的孩子绑定到一个包含孩子数据的列表。下面是一个示例:

代码语言:javascript
复制
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        ObservableList<Integer> intList = FXCollections.observableArrayList();
        LiveList<Circle> circleList = LiveList.map(intList, i -> {
            System.out.println("in");
            return new Circle(i);
        });

        Group group = new Group();
        Bindings.bindContent(group.getChildren(), circleList);

        intList.add(2);
        intList.clear();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

我的问题是,对于intList中的每个更改,绑定列表都会更新两次,这会创建比所需更多的对象。运行代码会得到以下结果:

代码语言:javascript
复制
in
in
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = Group@68887c42
    at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
    at com.sun.javafx.collections.VetoableListDecorator$VetoableSubListDecorator.clear(VetoableListDecorator.java:529)
    at com.sun.javafx.binding.ContentBinding$ListContentBinding.onChanged(ContentBinding.java:114)
    at org.reactfx.collection.ChangeListenerWrapper.onChange(LiveList.java:439)
    at org.reactfx.collection.ChangeListenerWrapper.onChange(LiveList.java:417)
    at org.reactfx.util.ListNotifications.lambda$takeHead$0(NotificationAccumulator.java:317)
    at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
    at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
    at org.reactfx.collection.MappedList.sourceChanged(MappedList.java:41)
    at org.reactfx.collection.LiveList.lambda$observeQuasiChanges$7(LiveList.java:256)
    at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
    at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
    at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
    at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
    at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
    at com.sun.javafx.collections.ObservableListWrapper.clear(ObservableListWrapper.java:157)
    at test1.Main.start(Main.java:27)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:748)

我希望对于intList中的每个元素,在组的子元素中都会有一个Circle。为什么会发生这种情况?我如何才能使其正常工作?

EN

回答 1

Stack Overflow用户

发布于 2017-12-05 21:30:14

异常描述是在转移注意力-每当在更改的末尾,子项的数量与更改预测的数量不匹配时,就会给出消息“已添加重复的子项”。

在您的例子中,实际发生的情况是圆圈没有被删除,所以Group以一个子元素结束,但是clear预测它应该以0结束。

没有删除圆的原因是因为它不是同一个圆-您的映射器在被要求执行映射时会创建一个新的Circle对象,因此在添加它时会得到一个圆,而在清除列表时会得到一个完全不同的圆-这个新的Circle不能从组的子级中删除,所以即使在调用clear之后,它也会保留一个子级,从而触发异常。

要解决这个问题,你必须确保为相同的源-对象返回相同的目标-对象-如果你的整数列表可能包含重复的,这可能是不可能的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47651930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档