标签慢慢向后移动

时间:2016-12-28 20:24:30

标签: java javafx position

下面的代码应根据水平滚动条的位置移动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();
        }
    }
}

1 个答案:

答案 0 :(得分: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);