removeChild()函数有问题

时间:2011-01-30 19:45:30

标签: java 3d

我想从BranchGroup删除一个孩子 并使用函数removeChild(),但发生了异常。 这是我的代码的一部分; root是一个分支组。

  

// root是一个分支组

public BranchGroup Creat()
{
    td.setTranslation(new Vector3d(.5f,.5f,.5f));


    tg.setTransform(td);
    tg.addChild(cube);

    td1.setTranslation(new Vector3d(x, y, z));
    tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    collision ob = new collision(cube,bounds);
    collision ob1 = new collision(cube1, bounds);
    root.addChild(ob1);  
    cube.setUserData(new String("cube"));
    tg1.setTransform(td1);
    tg1.addChild(cube1);
    root.addChild(tg);       
    root.addChild(tg1);
    //root.addChild(new ColorCube(.03));

    return root;
}

public void delete(int x)
{        
    root.removeChild(x);
}

这是例外

Exception occurred during Behavior execution:
javax.media.j3d.RestrictedAccessException: Group: only a BranchGroup node may be removed

    at javax.media.j3d.Group.removeChild(Group.java:217)
    at td44.Draw.delete(Draw.java:95)
    at td44.Draw$collision.Remove(Draw.java:240)
    at td44.Draw$collision.processStimulus(Draw.java:216)
    at javax.media.j3d.BehaviorScheduler.doWork(BehaviorScheduler.java:192)
    at javax.media.j3d.J3dThread.run(J3dThread.java:275)

delete()函数用于另一个类

1 个答案:

答案 0 :(得分:1)

来自Group.removeChild()的Javadoc:

  

抛出:       CapabilityNotSetException - 如果未设置适当的功能且此对象是实时或编译的场景图形的一部分

     

RestrictedAccessException - 如果此组节点是实时或编译的场景图的一部分,并且要删除的子节点不是BranchGroup节点

虽然我们还没有看到代码中调用delete()的部分,但这种描述可能适合您的情况。

解决方案是在BranchGroup中包装您计划删除的任何节点。从代码中可以看出,您可能试图这样做,但最终没有。

root.addChild(new BranchGroup());
...
root.addChild(ob1);  
...
root.addChild(tg);       
root.addChild(tg1);

因此,您向根和几个独立对象添加了一个空组。你可能需要这个:

BranchGroup bg = new BranchGroup();
root.addChild(bg);
...
bg.addChild(ob1);  
...
bg.addChild(tg);       
bg.addChild(tg1);