JavaFX pane.getChildren()。remove(child)抛出IllegalArgumentException

时间:2015-08-15 15:48:19

标签: java javafx javafx-8 observablelist

我尝试创建一个在Line的父级上注册侦听器的组件,当它更改时,它会添加/删除Parent的父级矩形。

您可以看到下面的代码。 基本上我有2个按钮

  • 添加>将该行添加到demoPane
  • 删除>从demoPane
  • 中删除该行

我也按照我已经解释的那样在线父母上注册了一个监听器。

当我点击Add Button时,一切都很顺利......添加了一行,随后也添加了矩形。

当我按下删除时,该行从demoPane中移除但删除了矩形时,会抛出以下异常:

- 线程中的异常" JavaFX应用程序线程" java.lang.IllegalArgumentException:Children:添加了重复的子项:parent = AnchorPane [id = demoPane]     在javafx.scene.Parent $ 2.onProposedChange(未知来源)     at com.sun.javafx.collections.VetoableListDecorator.remove(Unknown Source)     在demo.Delete.lambda $ 2(Delete.java:63)

这发生在第63行,这是我从demoPane

中删除矩形的地方
private static void mountDemo(AnchorPane demoPane) {
        Button buttonAdd = new Button("Add");
        Button buttonRemove = new Button("Remove");
        Line line = new Line(100, 100, 400, 100);
        Rectangle rectangle = new Rectangle(20, 20);

        demoPane.getChildren().add(buttonAdd);
        demoPane.getChildren().add(buttonRemove);

        buttonAdd.setOnMouseClicked((event)->demoPane.getChildren().add(line));
        buttonRemove.setOnMouseClicked((event)->demoPane.getChildren().remove(line));

        line.parentProperty().addListener((observable, oldParent, newParent)->{
            if(newParent != null)
                ((Pane)newParent).getChildren().add(rectangle);
            else
                ((Pane)oldParent).getChildren().remove(rectangle);
        }); 
    }

任何人都可以帮助我吗?我做错了什么?

1 个答案:

答案 0 :(得分:0)

继承自javafx.scene.layout.Pane的childrenProperty是一个list-property。这是保持儿童秩序所必需的。 但是在你的用例中它会产生抛出的异常。列表允许多次插入同一个对象,而列表的所有者(demoPane)则不会。

一种解决方案是检查子列表是否已包含行的实例。