我想从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/