首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程"JavaFX应用程序线程“中的异常java.lang.IllegalArgumentException:

线程"JavaFX应用程序线程“中的异常java.lang.IllegalArgumentException:
EN

Stack Overflow用户
提问于 2018-04-15 22:02:29
回答 1查看 689关注 0票数 0

这是错误

代码语言:javascript
复制
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = Group@5ea0c6fc
at javafx.graphics/javafx.scene.Parent$3.onProposedChange(Unknown Source)
at javafx.base/com.sun.javafx.collections.VetoableListDecorator.add(Unknown Source)
at project1.Crab.setCrab(Crab.java:45)
at project1.SeaAnimals.addCrab(SeaAnimals.java:65)
at project1.ProjectOne.mouseClick(ProjectOne.java:133)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ClickGenerator.postProcess(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ClickGenerator.access$8300(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Unknown Source)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)

下面是有问题的代码行

代码语言:javascript
复制
public class Crab {

    private final Image c = new Image("File:crab.gif");
    private ArrayList<ImageView> crabList = new ArrayList<ImageView>();
    private int _counter;
    private Group _crab = new Group();
    /** Constructor <br>
     * Initializes counter to -1
     */
    public Crab() {
        _counter = -1;
    }
    /** Setter <br>
     * Adds a crab to the array list
     */
    public void addCrab() {
        if(_counter < 5) {
            crabList.add(new ImageView(c));
            _counter++;
        }
    }
    /** Setter <br> 
     * Deletes a crab from the array list
     */
    public void deleteCrab() {
        if(_counter > 0) {
            crabList.remove(_counter);
            _counter--;
        }
    }
    /** Getter <br>
     * 
     * @return returns crab group
     */
    public Group setCrab() {
        if(_counter >= 0) { //adds the first crab
            crabList.get(0).setTranslateX(80);
            crabList.get(0).setTranslateY(500);
            crabList.get(0).setFitHeight(100);
            crabList.get(0).setFitWidth(100);
            _crab.getChildren().add(crabList.get(0));
            if(_counter >= 1) { //adds the second crab
                crabList.get(1).setTranslateX(230);
                crabList.get(1).setTranslateY(500);
                crabList.get(1).setFitHeight(100);
                crabList.get(1).setFitWidth(100);
                _crab.getChildren().add(crabList.get(1));       
                if (_counter >= 2) { // adds the third crab
                    crabList.get(2).setTranslateX(380);
                    crabList.get(2).setTranslateY(500);
                    crabList.get(2).setFitHeight(100);
                    crabList.get(2).setFitWidth(100);
                    _crab.getChildren().add(crabList.get(2));
                    if (_counter >= 3) { //adds the fourth crab
                        crabList.get(3).setTranslateX(530);
                        crabList.get(3).setTranslateY(500);
                        crabList.get(3).setFitHeight(100);
                        crabList.get(3).setFitWidth(100);
                        _crab.getChildren().add(crabList.get(3));   
                        if (_counter >= 4) { //adds the fifth crab
                            crabList.get(4).setTranslateX(680);
                            crabList.get(4).setTranslateY(500);
                            crabList.get(4).setFitHeight(100);
                            crabList.get(4).setFitWidth(100);
                            _crab.getChildren().add(crabList.get(4));           
                            if (_counter == 5) { //adds the sixth crab
                                crabList.get(5).setTranslateX(830);
                                crabList.get(5).setTranslateY(500);
                                crabList.get(5).setFitHeight(100);
                                crabList.get(5).setFitWidth(100);
                                _crab.getChildren().add(crabList.get(5));
                            }
                        }
                    }
                }
            }
        }
        return _crab;
    }
}
代码语言:javascript
复制
    public Group addCrab() {
        _crab.addCrab();
        _gCrab = _crab.setCrab();
        return _gCrab;
    }
    public Group deleteCrab() {
        _crab.deleteCrab();
        _gCrab = _crab.setCrab();
        return _gCrab;
    }
}
代码语言:javascript
复制
public void mouseClick(MouseEvent mouse) {
    if(mouse.getClickCount() == 1) {
        root.getChildren().remove(gCrab);
        gCrab.getChildren().clear();
        gCrab.getChildren().add(animals.addCrab());
        root.getChildren().add(gCrab);
    }
    else if(mouse.getClickCount() == 2) {
        root.getChildren().remove(gCrab);
        gCrab.getChildren().clear();
        gCrab.getChildren().add(animals.deleteCrab());
        root.getChildren().add(gCrab);
    }
}

我不知道如何解决这个问题,也不知道问题是什么。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-16 08:37:13

您的setCrab方法尝试将所有the图像添加到Group中,而不删除任何子级。这样,如果在Group中再次添加螃蟹,就会导致异常,因为JavaFX不允许这样做。

还需要确保永远不要向同一个父节点添加两次相同的节点。

此外,向setCrab类的用户隐藏Crab将降低使用该类的复杂性。为什么要让用户调用2个方法,而一个调用将完成相同的工作。您甚至可以编写一个节点本身的CrabGroup类,并避免将Group移除并读取到它的父节点。

例如。

代码语言:javascript
复制
public class CrabGroup extends HBox {

    private static final Image c = new Image("File:crab.gif");

    public CrabGroup() {
        setSpacing(50);
    }

    /**
     * Adds a crab
     */
    public void addCrab() {
        if(getChildren().size() < 6) {
            ImageView image = new ImageView(c);
            image.setFitWidth(100);
            image.setFitHeight(100);
            crabList.add(image);
        }
    }

    /** 
     * Deletes a crab
     */
    public void deleteCrab() {
        if(!getChildren().isEmpty()) {
            getChildren().remove(getChildren().size() - 1);
        }
    }

}
代码语言:javascript
复制
CrabGroup crabGroup = new CrabGroup();
crabGroup.setTranslateX(80);
crabGroup.setTranslateY(500);
代码语言:javascript
复制
crabGroup.addCrab();
...
crabGroup.deleteCrab();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49847224

复制
相关文章

相似问题

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