2016-12-03 77 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); 
}