首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX pane.getChildren().remove(子)抛出IllegalArgumentException

JavaFX pane.getChildren().remove(子)抛出IllegalArgumentException
EN

Stack Overflow用户
提问于 2015-08-15 15:48:18
回答 1查看 10.8K关注 0票数 0

我正在尝试创建一个组件,它在line的父节点上注册一个侦听器,当它更改时,它会在行的父节点上添加/移除一个矩形。

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

  • 将该行添加到demoPane中
  • 删除demoPane中的行

正如我已经解释过的,我还在网上注册了一个侦听器。

当我点击Add Button的时候一切都很好..。添加了这一行,随后还添加了矩形。

当我按下“删除”时,行将从demoPane中移除,但在删除矩形时,将引发以下异常:

代码语言:javascript
复制
 -Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = AnchorPane[id=demoPane]
    at javafx.scene.Parent$2.onProposedChange(Unknown Source)
    at com.sun.javafx.collections.VetoableListDecorator.remove(Unknown Source)
    at demo.Delete.lambda$2(Delete.java:63)

这发生在第63行,也就是我从demoPane中删除矩形的地方。

代码语言:javascript
复制
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);
        }); 
    }

有人能帮我吗?我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2015-08-16 14:27:22

现在我知道您想做什么了,我建议创建一个新的类。假设您希望在两点之间设置一个水平箭头:

代码语言:javascript
复制
public class Arrow extends Path {
    private static Double ARROW_HEAD_SIZE = 10D;
    private Point2D startPoint;
    private Point2D endPoint;

    public Arrow(Point2D start, Point2D end) {
        super();
        setStrokeWidth(1);
        startPoint = start;
        endPoint = end;
        draw();
    }

    public void draw() {
        getElements().clear();
        // Goto start point
        MoveTo startMove = new MoveTo();
        startMove.setX(startPoint.getX());
        startMove.setY(startPoint.getY());
        getElements().add(startMove);
        // Horizontal line from start point to end point
        HLineTo line = new HLineTo();
        line.setX(endPoint.getX());
        getElements().add(line);
        // First line for the arrow
        LineTo firstArrow = new LineTo();
        firstArrow.setX(endPoint.getX() - ARROW_HEAD_SIZE);
        firstArrow.setY(endPoint.getY() - ARROW_HEAD_SIZE);
        getElements().add(firstArrow);
        // Return to end point
        MoveTo lastMove = new MoveTo();
        lastMove.setX(endPoint.getX());
        lastMove.setY(endPoint.getY());
        getElements().add(lastMove);
        // Second line for the arrow
        LineTo secondArrow = new LineTo();
        secondArrow.setY(endPoint.getY() + ARROW_HEAD_SIZE);
        secondArrow.setX(endPoint.getX() - ARROW_HEAD_SIZE);
        getElements().add(secondArrow);
    }
}

这样,您只需要从这个类中添加/删除一个实例:

代码语言:javascript
复制
Point2D startPoint = new Point2D(50, 50);
Point2D endPoint = new Point2D(100, 50);
Arrow arrow = new Arrow(startPoint, endPoint);
buttonAdd.setOnMouseClicked((event) -> root.getChildren().add(arrow));
buttonRemove.setOnMouseClicked((event) -> root.getChildren().remove(arrow));

另外,不用使用路径,您可以让新的类扩展某种类型的窗格,只需在其中加入几行,或者一条线和一个三角形之类的。

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

https://stackoverflow.com/questions/32026419

复制
相关文章

相似问题

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