2016-12-28 7 views
0

Labelが静止しているように見えるように、下のコードは水平スクロールバーの位置に基づいてLabelを移動する必要があります。これはほぼ完璧に動作しますが、スクロールバーを最後まで動かすと、ラベルがわずかに動いて同じ位置にないように見えます。あなたがScrollPaneの幅を使用しラベルがゆっくりと後ろに移動する

enter image description here

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class LblMoves extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      VBox images = new VBox(); 
      images.setPadding(new Insets(0, 0, 0, 0)); 
      Label posLbl = new Label("0"); 

      images.getChildren().add(posLbl); 

      images.setPrefSize(Integer.MAX_VALUE, 50); 
      ScrollPane scrollPane = new ScrollPane(images); 
      scrollPane.setStyle("-fx-background: #FFFFFF;"); 

      scrollPane.hvalueProperty().addListener(new ChangeListener<Number>() { 
       public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) { 
        double screenPer = scrollPane.getHvalue() * scrollPane.getWidth(); 
        double pos = scrollPane.getHvalue() * images.getWidth(); 
        double marg = pos - screenPer; 
        posLbl.setPadding(new Insets(0, 0, 0, marg)); 
       } 
      }); 

      Scene scene = new Scene(scrollPane, 600, 600); 
      primaryStage.setScene(scene); 
      primaryStage.setMaximized(true); 

      primaryStage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

答えて

2

。しかし、ScrollPaneの計算に使用される幅はviewportBoundsです。
デフォルトでは、位置は完全ピクセルに丸められているため、paddingの代わりにtranslateXを使用して修正できるLabelの動きが発生します。

InvalidationListener listener = o -> { 
    double marg = (images.getWidth() - scrollPane.getViewportBounds().getWidth()) * scrollPane.getHvalue(); 
    posLbl.setTranslateX(marg); 
    // posLbl.setPadding(new Insets(0, 0, 0, marg)); 
}; 

scrollPane.hvalueProperty().addListener(listener); 
scrollPane.viewportBoundsProperty().addListener(listener); 
listener.invalidated(null); 
+0

ありがとう – Dan

関連する問題