событие мыши, которое продолжает работать при нажатии клавиши мыши - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над настраиваемой полосой прокрутки, которая перемещается, когда я нажимаю и удерживаю основную клавишу мыши. Я попытался setOnMousePressed, но это работает только один раз. Есть ли событие, которое продолжается, когда я удерживаю клавишу?

Изменить: я должен был упомянуть, что пользовательская полоса прокрутки на самом деле является обычной панелью, где я отображаю больший диапазон графика, который я показываю на панели прокрутки.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Как указано в комментариях, это поведение по умолчанию для полосы прокрутки. Однако, если вы хотите реализовать что-то подобное самостоятельно, по какой-то причине одним из вариантов является использование AnimationTimer в сочетании с прослушивателями мыши:

AnimationTimer scrollDownTimer = new AnimationTimer() {

    long lastMoveTime = -1 ;

    @Override
    public void handle(long now) {
        if (lastMoveTime > 0) {
            long elapsedNanos = now-lastMoveTime ;
            // scroll down amount based on time elapsed...
        }
        lastMoveTime = now ;
    }

    @Override
    public void start() {
        lastMoveTime = -1 ;
        super.start();
    }
};

А теперь просто

scrollDownButton.setOnMousePressed(e -> scrollDownTimer.start());
scrollDownButton.setOnMouseReleased(e -> scrollDownTimer.stop());

Вот полный пример:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ScrollingExample extends Application {

    private Rectangle rect ;
    private Pane rectPane ;

    @Override
    public void start(Stage primaryStage) {
        rect = new Rectangle(0, 200, 40, 40);
        rect.setFill(Color.CORAL);

        Label left = new Label("Left");
        Label right = new Label("Right");

        ScrollTimer scrollTimer = new ScrollTimer(); 

        left.setOnMousePressed(e -> {
            scrollTimer.setDirection(Direction.LEFT);
            scrollTimer.start();
        });

        left.setOnMouseReleased(e -> scrollTimer.stop());

        right.setOnMousePressed(e -> {
            scrollTimer.setDirection(Direction.RIGHT);
            scrollTimer.start();
        });

        right.setOnMouseReleased(e -> scrollTimer.stop());

        AnchorPane buttons = new AnchorPane(left, right);
        AnchorPane.setLeftAnchor(left, 5.0);
        AnchorPane.setRightAnchor(right, 5.0);

        rectPane = new Pane(rect);

        BorderPane root = new BorderPane(rectPane);
        root.setTop(buttons);

        Scene scene = new Scene(root, 800, 800);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public enum Direction { 
        LEFT(-1), RIGHT(1) ; 
        private int multiplier ;

        Direction(int multiplier) {
            this.multiplier = multiplier ;
        }

        public double multiply(double value) {
            return value * multiplier ;
        }
    }

    public  class ScrollTimer extends AnimationTimer {
        private double speed = 250 ; // pixels/second

        private Direction direction = Direction.LEFT ;

        private long lastUpdate ;

        @Override
        public void start() {
            lastUpdate = -1 ;
            super.start();
        }

        @Override
        public void handle(long now) {

            if (lastUpdate < 0) {
                lastUpdate = now ;
                return ;
            }

            long elapsedNanos = now - lastUpdate ;

            double elapsedSeconds = elapsedNanos / 1_000_000_000.0 ;
            double deltaX = elapsedSeconds * direction.multiply(speed);


            rect.setX(clamp(rect.getX() + deltaX, 0, rectPane.getWidth() - rect.getWidth()));

            lastUpdate = now ;
        }

        private double clamp(double value, double min, double max) {
            if (value < min) return min ;
            if (value > max) return max ;
            return value ;
        }

        public void setDirection(Direction direction) {
            this.direction = direction ;
        }

    }

    public static void main(String[] args) {
        launch(args);
    }
}
0 голосов
/ 02 мая 2018

Добавьте вашу полосу прокрутки a на метод перетаскивания, который будет проще достичь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...