javafx - 单击按钮时移动 ScrollPane 的视点

标签 javafx javafx-8

我的 JavaFX 应用程序有一个概念:

Concept

所有屏幕都在一个 ScrollPane 中。

例如,如果用户单击 loginScreen 中的“选项”按钮,我想对 ViewPort 的 Y 值进行动画处理,以将其移动到 optionsScreen >.

如何以编程方式移动 ScrollPane 的视口(viewport)并实现平滑的动画?

或者你可以提供更好的想法吗?

最佳答案

How can I programmatically move viewport of ScrollPane with smooth animation?

您可以使用 Timeline 的组合和 vvalueProperty of ScrollPane执行平滑的滚动动画。

这是一个简单的应用程序,其中包含三个部分

  • 置顶
  • 中心
  • 底部

我正在通过按钮操作上的时间线更改ScrollPane的vvalue

vvalue 的值可以在 0.0 到 1.0 之间,因此您可能需要自己计算才能找到要分配给它的准确值。

KeyValuescrollRoot.vvalueProperty() 执行操作。

KeyFrame完整的时间线设置为500 毫秒。您可以增加减少它,具体取决于您希望动画运行的时间。

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    // For just adjusting the center rectangle w.r.t ScrollPane
    private final int ADJUSTMENT_RATIO = 175;

    @Override
    public void start(Stage stage) {
        Rectangle topRegion = new Rectangle(300, 300, Color.ALICEBLUE);
        StackPane top = new StackPane(topRegion, new Label("Top"));

        Rectangle centerRegion = new Rectangle(300, 300, Color.GOLDENROD);
        StackPane center = new StackPane(centerRegion, new Label("center"));

        Rectangle bottomRegion = new Rectangle(300, 300, Color.BISQUE);
        StackPane bottom = new StackPane(bottomRegion, new Label("bottom"));

        Button topButton = new Button("Top");
        Button centerButton = new Button("Center");
        Button bottomButton = new Button("Bottom");

        HBox buttonBox = new HBox(15, topButton, centerButton, bottomButton);
        buttonBox.setPadding(new Insets(20));
        buttonBox.setAlignment(Pos.CENTER);

        final VBox root = new VBox();
        root.setSpacing(10);
        root.setPadding(new Insets(10, 10, 10, 10));
        root.getChildren().addAll(top, center, bottom);

        ScrollPane scrollRoot = new ScrollPane(root);
        Scene scene = new Scene(new VBox(buttonBox, scrollRoot));
        stage.setTitle("Market");
        stage.setWidth(350);
        stage.setHeight(400);

        stage.setScene(scene);
        stage.show();

        topButton.setOnAction(event -> {
            final Timeline timeline = new Timeline();
            final KeyValue kv = new KeyValue(scrollRoot.vvalueProperty(), 0.0);
            final KeyFrame kf = new KeyFrame(Duration.millis(500), kv);
            timeline.getKeyFrames().add(kf);
            timeline.play();
        });

        centerButton.setOnAction(event -> {
            final Timeline timeline = new Timeline();
            final KeyValue kv = new KeyValue(scrollRoot.vvalueProperty(), (top.getBoundsInLocal().getHeight() + ADJUSTMENT_RATIO) / root.getHeight());
            final KeyFrame kf = new KeyFrame(Duration.millis(500), kv);
            timeline.getKeyFrames().add(kf);
            timeline.play();
        });

        bottomButton.setOnAction(event -> {
            final Timeline timeline = new Timeline();
            final KeyValue kv = new KeyValue(scrollRoot.vvalueProperty(), 1.0);
            final KeyFrame kf = new KeyFrame(Duration.millis(500), kv);
            timeline.getKeyFrames().add(kf);
            timeline.play();
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

输出

enter image description here

关于javafx - 单击按钮时移动 ScrollPane 的视点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31515764/

相关文章:

java - 自 jre1.8.0_20 版本更新以来,移动选项卡不再起作用

Javafx 过滤 TableView

java - TreeCell 中的绑定(bind)是否会自动删除

Java多线程套接字客户端/服务器: sending and receiving Enummap objects

java - 无法在 map 中设置通用属性的值

JavaFX引用主数组列表

JavaFX 模块对 VM 不可见

javafx - 如何使用复选框显示 javafx 中密码字段的内容

JavaFX 在 fxml 中调整 Canvas 大小

JavaFX Controller 加载