我尝试创建一个在Line的父级上注册侦听器的组件,当它更改时,它会添加/删除Parent的父级矩形。
您可以看到下面的代码。 基本上我有2个按钮
我也按照我已经解释的那样在线父母上注册了一个监听器。
当我点击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);
});
}
任何人都可以帮助我吗?我做错了什么?
答案 0 :(得分:0)
继承自javafx.scene.layout.Pane的childrenProperty是一个list-property。这是保持儿童秩序所必需的。
但是在你的用例中它会产生抛出的异常。列表允许多次插入同一个对象,而列表的所有者(demoPane
)则不会。
一种解决方案是检查子列表是否已包含行的实例。