2016-09-18 2 views
1

많은 온라인지도에이 기능이 있습니다. 이미지의 왼쪽/오른쪽 끝에 도달하면 반대편을보고있는 것입니다. 이 기능은 JavaFX에서 어떻게 구현 가능하며 scrollPane과 호환됩니까? 또한, 래핑 할 때 원본 이미지 또는 이미지 복사본을 볼 것입니까 (이전의 선호도 포함)? 내가 구체적으로 달성하고자하는 것에 대해 질문 할 경우 아래에 질문하십시오.이미지가 화면을 "랩 어라운드"합니다. JavaFX

답변

2

동일한 Image을 여러 개의 ImageView에 표시 할 수 있습니다. 이렇게하면 이미지가 메모리에 한 번만 저장됩니다.

ScrollPane 여기서는 좋은 선택이 아닙니다. ScrollPane에서 지원하지 않는 "무한"창을 만들려고하기 때문입니다.

다음 예제에서는 사용자가 Mona Lisas의 2 x 2 그리드를 이동하고 창의 전체 내용 영역을 이미지로 덮도록 조정합니다. 이미지 크기와 보이는 영역에 따라 큰 격자가 필요할 수 있습니다. (왼쪽 상단부터 시작하여 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(); 
} 
관련 문제