我想从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()函数用于另一个类
答案 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);