我正在构建一个关于我正在构建的图形浏览程序的问题。我有两个JavaFX子场景,其中一个以类似于飞行模拟器的方式浏览一个非常大的图形(即图形的数学构造,而不是简单的线图或饼图;可能是几千兆字节)。另一个包含一组控件,它们始终位于屏幕上的固定点。
我遇到的唯一问题是,当我尝试从主场景中获取拾取结果时,它总是停在第一个SubScene(抬头显示器)。我已经检查过PickResult.getIntersectedNode(),它肯定是SubScene拦截的选择。
我试过这个(在两个SubScenes上,确定):
layer.setPickOnBounds(false);
但它没有效果。
我怀疑分层SubScene的某些透明部分仍然将空间划分为占用空间。我不确定这一点。
如何将SubScene设置为不可删除,同时保留其内容?
作为讨论的附录,这里是我创建(在实验中)构建平视显示器的方法的示例。这是在我将其切换为简单返回窗格之前。 (参数“fillPaint”始终设置为Color.TRANSPARENT)。
/**
* Creates a subscene of set parameters
*
* @param scene
* primary scene (into which subscene is injected)
*/
private SubScene makeHeadsUpSubScene(Scene scene, Camera camera, Paint fillPaint,
Node node) {
Group root = new Group();
PointLight light = new PointLight(Color.WHITE);
light.setTranslateX(50);
light.setTranslateY(-300);
light.setTranslateZ(-400);
PointLight light2 = new PointLight(Color.color(0.6, 0.3, 0.4));
light2.setTranslateX(400);
light2.setTranslateY(0);
light2.setTranslateZ(-400);
String title = "Title Stand-in";
boolean msaa = true;
AmbientLight ambientLight = new AmbientLight(Color.color(0.2, 0.2, 0.2));
node.setRotationAxis(new Point3D(2, 1, 0).normalize());
node.setTranslateX(180);
node.setTranslateY(180);
root.getChildren().addAll(new Label(title), ambientLight, light, light2, node);
SubScene subScene = new SubScene(root, 640, 480, true, msaa ? SceneAntialiasing.BALANCED : SceneAntialiasing.DISABLED);
subScene.widthProperty().bind(scene.widthProperty());
subScene.heightProperty().bind(scene.heightProperty());
subScene.setFill(fillPaint);
subScene.setCamera(camera);
return subScene;
}
答案 0 :(得分:1)
所以,似乎SubScene采用其内容的形状,通常默认为一个完整且填充的矩形。
但是,如果SubScene用于现场导航,则为其提供自己的摄像头;而一个简单的Pane用于单挑;可以从两者中挑选。对于所有适当的小组,当然必须将选择范围设置为假。
答案 1 :(得分:0)
确保在setFill(null)
subScene
使用颜色(甚至是透明色)进行设置将导致subScene
被选中'如果它位于相机和场景之间。