2016-12-03 19 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

そのため、ノード(Label)の位置も動的でなければなりません! –

+0

@BoHalimどのように修正するのですか – user6601127

答えて

2

これを実現する最も簡単な方法は、コンテンツ内のLabelを配置しないことだろうが、StackPaneScrollPaneLabelの両方が含まれています

@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); 
} 
関連する問題