JavaFX - 按下按钮时滚动 scrollPane

标签 java javafx javafx-2 javafx-8

我有一个 scrollPane 可以通过按下按钮来滚动,使用下面的代码

@FXML
public void scrollUp(ActionEvent event) {
    if (scrollPane.getVvalue() > scrollPane.getVmin()) {
        scrollPane.setVvalue(scrollPane.getVvalue() - scrollPaneIncrement);
    }
}

@FXML
public void scrollDown(ActionEvent event) {
    if (scrollPane.getVvalue() < scrollPane.getVmax()) {
        scrollPane.setVvalue(scrollPane.getVvalue() + scrollPaneIncrement);
    }
}

这些函数在按下按钮时从 onAction 事件中调用。

现在,只要按下按钮,我就需要上下滚动 scrollPane。

有人知道怎么做吗?

最佳答案

使用 AnimationTimer 更新每个渲染帧上的滚动位置。您可以使用 isArmed() 方法检查按钮是否被按下,并相应地更新滚动条的值。

这是一个 SSCCE:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class ScrollWhileButtonDown extends Application {

    @Override
    public void start(Stage primaryStage) {
        ScrollPane scroller = new ScrollPane();
        Pane pane = new Pane();
        pane.setMinHeight(1000);
        scroller.setContent(pane);

        Button upButton = new Button("Up");
        Button downButton = new Button("Down");

        HBox controls = new HBox(10, upButton, downButton);
        controls.setPadding(new Insets(10));
        controls.setAlignment(Pos.CENTER);

        Scene scene = new Scene(new BorderPane(scroller, null, null, controls, null), 600, 400);
        primaryStage.setScene(scene);
        primaryStage.show();

        final double scrollSpeed = 0.5 ; // scrollpane units per second

        AnimationTimer timer = new AnimationTimer() {

            private long lastUpdate = 0 ;
            @Override
            public void handle(long time) {
                if (lastUpdate > 0) {
                    long elapsedNanos = time - lastUpdate ;
                    double elapsedSeconds = elapsedNanos / 1_000_000_000.0 ;
                    double delta = 0 ;
                    if (upButton.isArmed()) {
                        delta = -scrollSpeed * elapsedSeconds ;
                    }
                    if (downButton.isArmed()) {
                        delta = scrollSpeed * elapsedSeconds ;
                    }
                    double newValue = 
                            clamp(scroller.getVvalue() + delta, scroller.getVmin(), scroller.getVmax());
                    scroller.setVvalue(newValue);
                }
                lastUpdate = time ;
            }
        };

        timer.start();
    }

    private double clamp(double value, double min, double max) {
        return Math.min(max, Math.max(min, value));
    }

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

关于JavaFX - 按下按钮时滚动 scrollPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28632657/

相关文章:

java - 在 JavaFx 中使用数组列表显示图像

printing - 打印 JavaFx TableView 的内容

javafx-2 - 如何在 JavaFX 中列出所有颜色

JBoss 中的 java.sql.SQLException : Generated keys not requested.

java - 我如何让这两段代码互相看到

java - java中的串联?

java - 如何使用嵌入式 JavaFx 小程序更新 Swing 中的饼图 - 空点异常

java播放mp3声音

javafx-2 - JavaFX TableView : Cannot Override '-fx-text-fill' !

java - XSD 架构字符串元素加密/解密