如何禁用或部分禁用javafx子场景的选择?

时间:2015-01-19 21:57:25

标签: javafx scene picking

我正在构建一个关于我正在构建的图形浏览程序的问题。我有两个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;
}

2 个答案:

答案 0 :(得分:1)

所以,似乎SubScene采用其内容的形状,通常默认为一个完整且填充的矩形。

但是,如果SubScene用于现场导航,则为其提供自己的摄像头;而一个简单的Pane用于单挑;可以从两者中挑选。对于所有适当的小组,当然必须将选择范围设置为假。

答案 1 :(得分:0)

确保在setFill(null)

上致电subScene

使用颜色(甚至是透明色)进行设置将导致subScene被选中'如果它位于相机和场景之间。