2016-12-28 70 views
0

下面的代碼應根據水平滾動條的位置移動Label,以便Label看起來保持不動。這幾乎可以完美地工作,但是當您將滾動條移動到最後時,標籤已略微移動,因此看起來不像它處於相同的位置。標籤緩慢向後移動

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的寬度。然而,ScrollPane的計算中使用的寬度使用viewportBounds
此外,由於默認位置四捨五入爲全像素,導致Label(可使用translateX而不是padding修復)的某些移動。

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