2016-10-20 13 views
1

scrollpane에 대한 내장 패닝 도구의 문제로 인해 안녕하세요. 천천히 실행되고 유동적이지 않고 청크로 전환됩니다. 사용자 지정 패닝 처리기를 만들려고합니다. 아래는 내 시도이지만 if 문은 올바르게 작동하지 않습니다.사용자 정의 패닝 처리기 Javafx

mapScroll.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> { 
     startX = e.getX(); 
     startY = e.getY(); 
    }); 
    mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { 
     endX = e.getX(); 
     endY = e.getY(); 
     Bounds viewBounds = mapScroll.getViewportBounds(); 
     Bounds mapBounds = mapScroll.getBoundsInParent(); 
     double xMin = viewBounds.getMinX(); 
     double xMax = viewBounds.getMaxX(); 
     double yMin = viewBounds.getMinY(); 
     double yMax = viewBounds.getMaxY(); 
     double startEndX = endX - startX; 
     double startEndY = endY - startY; 
     if(mapBounds.contains(xMin + startEndX, yMin + startEndY) && mapBounds.contains(xMin + startEndX, yMax + startEndY) && mapBounds.contains(xMax + startEndX, yMin + startEndY) && mapBounds.contains(xMax + startEndX, yMax + startEndY)) 
     { 
      double fullWidth = mapScroll.getWidth(); 
      double fullHeight = mapScroll.getHeight(); 
      double hChange = startEndX/fullWidth; 
      double vChange = startEndY/fullHeight; 
      mapScroll.setHvalue(mapScroll.getHvalue() + hChange); 
      mapScroll.setVvalue(mapScroll.getVvalue() + vChange); 
     } 
     endX = startX; 
     endY = startY; 
    }); 

답변

1

계산에 콘텐츠의 너비를 사용하지 마십시오. 즉, 콘텐츠의 크기에 관계없이 한 쪽에서 다른 한 쪽으로 스크롤하려면 마우스를 동일한 거리로 움직여야합니다. 내용이 뷰포트보다 10 픽셀 크거나 내용의 크기가 뷰포트 크기의 10 배보다 큰지 여부는 코드에서 차이가 없습니다. 또한 이벤트 필터의 모든 호출이 시작할 때 값을 덮어 쓰므로

은 절대 쓸모가 없습니다. 과제를 다른 방향으로 돌리고 싶어했을 것입니다.

또한 마우스 동작과 동일한 방향으로 스크롤 위치를 이동합니다. 그러나 마우스 위치가 내용에 비례하여 동일하게 유지되도록하려면 스크롤 위치를 반대 방향으로 이동해야합니다.

private double startX; 
private double startY; 

@Override 
public void start(Stage primaryStage) { 
    ImageView image = new ImageView("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"); 
    ScrollPane mapScroll = new ScrollPane(image); 
    Scene scene = new Scene(mapScroll, 400, 400); 
    mapScroll.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> { 
     startX = e.getX(); 
     startY = e.getY(); 
    }); 
    mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { 
     double endX = e.getX(); 
     double endY = e.getY(); 
     Bounds viewBounds = mapScroll.getViewportBounds(); 

     double startEndX = startX - endX; 
     double startEndY = startY - endY; 

     Bounds contentBounds = mapScroll.getContent().getLayoutBounds(); 

     double hChange = startEndX/(contentBounds.getWidth() - viewBounds.getWidth()); 
     double vChange = startEndY/(contentBounds.getHeight() - viewBounds.getHeight()); 
     mapScroll.setHvalue(mapScroll.getHvalue() + hChange); 
     mapScroll.setVvalue(mapScroll.getVvalue() + vChange); 

     startX = endX; 
     startY = endY; 
    }); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
: 여기

은 (경계 테스트를 단순 제거)이 예제