2016-12-03 79 views
1

我有一個錨窗格內的滾動窗格。並在這個錨窗格內有一個標籤。當我滾動時,我需要這個標籤始終可見。我需要移動,以便用戶始終看到它,就好像它沒有改變。誰能幫忙?如何在滾動時始終可見節點?

@FXML 
private ScrollPane s; 


public void initialize(URL location, ResourceBundle resources) {       
       AnchorPane p = new AnchorPane(); 
       VBox v = new VBox(); 
       p.getChildren().add(v); 
       s.setContent(p);} 
+0

你應該顯示一些代碼,這將有助於獲得一些swers – Yanga

+0

爲此,節點(標籤)的位置也必須是動態的! –

+0

@BoHalim我如何解決這個問題 – user6601127

回答

2

做到這一點會不會放置Label裏面的內容最簡單的方法,但在包含StackPane同時ScrollPaneLabel

@Override 
public void start(Stage primaryStage) { 
    Region content = new Region(); 
    content.setPrefSize(2000, 2000); 
    content.setBackground(new Background(new BackgroundFill(
      new LinearGradient(0, 0, 1, 1, true, CycleMethod.NO_CYCLE, new Stop(0, Color.RED), new Stop(1, Color.BLUE)), 
      CornerRadii.EMPTY, 
      Insets.EMPTY))); 

    Label label = new Label("Hello World!"); 
    label.setTextFill(Color.WHITE); 
    StackPane.setAlignment(label, Pos.TOP_LEFT); 
    StackPane.setMargin(label, new Insets(10)); 

    ScrollPane scrollPane = new ScrollPane(content); 

    StackPane root = new StackPane(); 
    root.getChildren().addAll(scrollPane, label); 

    Scene scene = new Scene(root, 200, 200); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

或者你可以或者調整位置使用翻譯屬性:

@Override 
public void start(Stage primaryStage) { 
    Label label = new Label("Hello World!"); 
    label.setTextFill(Color.WHITE); 

    Pane content = new Pane(label); 
    content.setPrefSize(2000, 2000); 
    content.setBackground(new Background(new BackgroundFill(
      new LinearGradient(0, 0, 1, 1, true, CycleMethod.NO_CYCLE, new Stop(0, Color.RED), new Stop(1, Color.BLUE)), 
      CornerRadii.EMPTY, 
      Insets.EMPTY))); 

    ScrollPane scrollPane = new ScrollPane(content); 

    double targetX = 10; 
    double targetY = 10; 

    InvalidationListener listener = o -> { 
     Bounds viewportBounds = scrollPane.getViewportBounds(); 
     Bounds contentBounds = content.getBoundsInLocal(); 
     Bounds labelBounds = label.getBoundsInLocal(); 

     double factorX = Math.max(contentBounds.getWidth() - viewportBounds.getWidth(), 0); 
     double factorY = Math.max(contentBounds.getHeight() - viewportBounds.getHeight(), 0); 

     label.setTranslateX(targetX + scrollPane.getHvalue() * factorX - labelBounds.getMinX()); 
     label.setTranslateY(targetY + scrollPane.getVvalue() * factorY - labelBounds.getMinY()); 
    }; 

    scrollPane.viewportBoundsProperty().addListener(listener); 
    scrollPane.hvalueProperty().addListener(listener); 
    scrollPane.vvalueProperty().addListener(listener); 
    label.boundsInLocalProperty().addListener(listener); 

    Scene scene = new Scene(scrollPane, 200, 200); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

    listener.invalidated(null); 
}