有一个图像"环绕"屏幕。 JavaFX的

时间:2016-09-18 19:47:37

标签: java image javafx scrollpane

许多在线地图具有此功能,当一个人到达图像的左/右端时,他们发现自己正在看另一端。这是如何在JavaFX中实现的并且它与scrollPane兼容?另外,当我被包裹时,我会看原始图像或图像的副本(前者更可取)?如果对我特别想要完成的内容有任何疑问,请在下面提出。

1 个答案:

答案 0 :(得分:2)

您可以在多个Image中显示相同的ImageView。这样,图像只在存储器中存储一次。

ScrollPane在这里不是一个好选择,因为您正在尝试创建ScrollPane不支持的“无限”窗格。

以下示例允许用户移动2 x 2网格的Mona Lisas并调整窗口的整个内容区域覆盖图像。根据图像大小和可见区域,您可能需要更大的网格。 (检查从左上角开始在x / y方向上适合可见区域的图像数量,然后在这些数字上加一个以确定所需的网格尺寸。)

@Override
public void start(Stage primaryStage) {
    Image image = new Image("https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/687px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg");
    GridPane images = new GridPane();

    for (int x = 0; x < 2; x++) {
        for (int y = 0; y < 2; y++) {
            images.add(new ImageView(image), x, y);
        }
    }

    Pane root = new Pane(images);
    images.setManaged(false);

    class DragHandler implements EventHandler<MouseEvent> {

        double startX;
        double startY;
        boolean dragging = false;

        @Override
        public void handle(MouseEvent event) {
            if (dragging) {
                double newX = (event.getX() + startX) % image.getWidth();
                double newY = (event.getY() + startY) % image.getHeight();

                if (newX > 0) {
                    newX -= image.getWidth();
                }

                if (newY > 0) {
                    newY -= image.getHeight();
                }
                images.setLayoutX(newX);
                images.setLayoutY(newY);
            }
        }

    }

    DragHandler handler = new DragHandler();
    root.setOnMouseDragged(handler);
    root.setOnDragDetected(evt -> {
        images.setCursor(Cursor.MOVE);
        handler.startX = images.getLayoutX() - evt.getX();
        handler.startY = images.getLayoutY() - evt.getY();
        handler.dragging = true;
    });

    root.setOnMouseReleased(evt -> {
        handler.dragging = false;
        images.setCursor(Cursor.DEFAULT);
    });

    Scene scene = new Scene(root, 400, 400);

    primaryStage.setScene(scene);
    primaryStage.setResizable(false);
    primaryStage.show();
}