2

Many online maps have this feature where when one reaches the left/right end of an image they find themselves looking at the opposite end. How is this implementable in JavaFX and is it compatible with a scrollPane? In addition, when wrapped around will I be looking at the original image or a copy of the image(with the former preferable)? If there are any questions about what I am specifically trying to accomplish ask below.

1 Answers1

2

You could show the same Image in multiple ImageViews. This way the image is stored only once in memory.

ScrollPane wouldn't be a good choice here, since you're trying to create a "infinite" pane which ScrollPane does not support.

The following example allows the user to move a 2 x 2 grid of Mona Lisas and adjusts the whole content area of the window is covered with images. Depending on the image size and the visible area you may need a larger grid. (Check how many images fit into the visible area in x / y direction starting at the top left and then add one to these numbers to determine the required grid size.)

@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();
}
fabian
  • 80,457
  • 12
  • 86
  • 114