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


  // 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()函数在另一个类中使用

最佳答案

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);

关于java - removeChild()函数出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4845052/

10-10 01:28