Почему добавление SubScene изменяет вывод функции localToScreen в JavFX? - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь разработать инструмент с JavaFX, который имеет несколько окон просмотра, и я думаю, что лучший способ сделать это - использовать SubScenes. Одно из моих требований - это способность знать, где на данной плоскости сцены соответствует пиксель, на который щелкнул мышью. Я подумал, что могу использовать для этого функции Node.localToScreen () и Node.screenToLocal (), однако при добавлении SubScene я получаю другие значения, несмотря на то, что больше ничего не меняется.

Ниже приведен пример, где при запуске кода с withSubScene = false консоль показывает:

Point2D [x = 996.0, y = 514.8333400189878]
Point2D [x = 117.98005476276654, y = 514.8333400189878]

И работает с withSubScene = true, консоль показывает:

Point2D [x = 997.0, y = 529.3333400189878]
Point2D [x = 64.91937872905163, y = 529.3333400189878]

Почему эти значения будут другими, если камера находится в том же месте и смотрит на тот же объект?

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ScreenToLocalTest extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        // Change this variable to swap to adding a SubScene
        boolean withSubScene = false;

        // Set the stage to be the same size each time
        primaryStage.setWidth(1000);
        primaryStage.setHeight(500);

        Group root = new Group();
        Scene rootScene = new Scene(root);

        // Create out camera
        Camera camera = new PerspectiveCamera(true);
        camera.setTranslateZ(-1000);
        camera.setNearClip(1);
        camera.setFarClip(10000);

        Group groupToAddRectangle;

        if(withSubScene) {
            Group sceneRoot = new Group();
            SubScene subScene = new SubScene(sceneRoot, primaryStage.getWidth(), primaryStage.getHeight());
            root.getChildren().add(subScene);

            subScene.setCamera(camera);

            groupToAddRectangle = sceneRoot;
        } else {
            rootScene.setCamera(camera);

            groupToAddRectangle = root;
        }

        Rectangle rectangle = new Rectangle(1000, 300, Color.ALICEBLUE);
        groupToAddRectangle.getChildren().add(rectangle);
        rectangle.setTranslateZ(1);

        root.setOnMouseMoved(event-> {
            System.out.println(rectangle.screenToLocal(event.getScreenX(), event.getScreenY()));
        });

        primaryStage.setScene(rootScene);
        primaryStage.show();


        System.out.println(rectangle.localToScreen(0, 0));
        rectangle.translateXProperty().set(-1000);
        System.out.println(rectangle.localToScreen(0, 0));
    }

    public static void main(String[] args) {
        launch(args);
    }
}
...