2012-10-11 91 views

回答

10

您需要在content之內找到該內部節點的座標,並相應地調整ScrollPanevValuehValue

ensureVisible()方法在接下來的小的應用程序:

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

我創建了一個稍微更優雅版這種情況。但是,我只能在y軸上進行測試。希望它有幫助

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); 
} 
相關問題