2012-10-11 51 views

Trả lời

10

Bạn cần phải tìm tọa độ của nút bên trong này bên trong content và điều chỉnh ScrollPane 's vValuehValue tương ứng.

Xem ensureVisible() phương pháp trong ứng dụng nhỏ bên cạnh:

public class ScrollPaneEnsureVisible extends Application { 

    private static final Random random = new Random(); 

    private static void ensureVisible(ScrollPane pane, Node node) { 
     double width = pane.getContent().getBoundsInLocal().getWidth(); 
     double height = pane.getContent().getBoundsInLocal().getHeight(); 

     double x = node.getBoundsInParent().getMaxX(); 
     double y = node.getBoundsInParent().getMaxY(); 

     // scrolling values range from 0 to 1 
     pane.setVvalue(y/height); 
     pane.setHvalue(x/width); 

     // just for usability 
     node.requestFocus(); 
    } 

    @Override 
    public void start(Stage primaryStage) { 

     final ScrollPane root = new ScrollPane(); 
     final Pane content = new Pane(); 
     root.setContent(content); 

     // put 10 buttons at random places with same handler 
     final EventHandler<ActionEvent> handler = new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       int index = random.nextInt(10); 
       System.out.println("Moving to button " + index); 
       ensureVisible(root, content.getChildren().get(index)); 
      } 
     }; 

     for (int i = 0; i < 10; i++) { 
      Button btn = new Button("next " + i); 
      btn.setOnAction(handler); 
      content.getChildren().add(btn); 
      btn.relocate(2000 * random.nextDouble(), 2000 * random.nextDouble()); 
     } 

     Scene scene = new Scene(root, 300, 250); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     // run once to don't search for a first button manually 
     handler.handle(null); 
    } 

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

Tôi tạo ra một phiên bản nhẹ thanh lịch hơn cho trường hợp này. Tuy nhiên, tôi chỉ có thể kiểm tra trên trục y. Hy vọng điều này sẽ giúp

private static void ensureVisible(ScrollPane pane, Node node) { 
    Bounds viewport = scrollPane.getViewportBounds(); 
    double contentHeight = scrollPane.getContent().localToScene(scrollPane.getContent().getBoundsInLocal()).getHeight(); 
    double nodeMinY = node.localToScene(node.getBoundsInLocal()).getMinY(); 
    double nodeMaxY = node.localToScene(node.getBoundsInLocal()).getMaxY(); 

    double vValueDelta = 0; 
    double vValueCurrent = scrollPane.getVvalue(); 

    if (nodeMaxY < 0) { 
     // currently located above (remember, top left is (0,0)) 
     vValueDelta = (nodeMinY - viewport.getHeight())/contentHeight; 
    } else if (nodeMinY > viewport.getHeight()) { 
     // currently located below 
     vValueDelta = (nodeMinY + viewport.getHeight())/contentHeight; 
    } 
    scrollPane.setVvalue(vValueCurrent + vValueDelta); 
} 
Các vấn đề liên quan