Как анимировать пользовательский интерфейс без остановки, когда мышь не находится над окном? - PullRequest
0 голосов
/ 04 мая 2018

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

Я также пытался использовать Timer и TimerTask, но та же проблема

Я создал замечательный минимальный и полный пример , который объясняет, что:

public class Tests extends Application {    
    public static void main(String[] args) {    launch(args);    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane pane = new BorderPane(); 
        pane.setPrefSize(300, 300);
        Arc arc = new Arc(150, 150, 50, 50, 0, 190.0);
        arc.setFill(Paint.valueOf("#f32f32"));
        Label label = new Label();
        pane.setCenter(arc);
        pane.setTop(label);
        primaryStage.setScene(new Scene(pane));
        primaryStage.show();
        primaryStage.centerOnScreen();

        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                try {
                    Thread.sleep(2000);
                    Platform.runLater(() -> label.setText("Start"));
                    for (int i = 0; i < 360 * 5; i++) {
                        arc.setRotate(i);
                        Thread.sleep(5);
                    }
                    Platform.runLater(() -> label.setText("Stop"));
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return null;
            }
        };    
        new Thread(task).start();
        task.setOnSucceeded(e -> { Platform.exit(); System.exit(0); });
    }
}

Ответы [ 2 ]

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

Я думаю, что вам не хватает Platform.runLater для вращения:

for (int i = 0; i < 360 * 5; i++) {
    final int j = i;
    Platform.runLater(() -> arc.setRotate(j));
    Thread.sleep(5)
}
0 голосов
/ 04 мая 2018

Я не ожидал ответить на мой вопрос, но поскольку я нашел решение (благодаря комментарию James_D ), используя Timeline, вот оно:

// Instead of all the Task, only : 
Timeline timeline = new Timeline();
final KeyValue kv = new KeyValue(arc.rotateProperty(), 1800);
final KeyFrame kf = new KeyFrame(Duration.millis(5000), kv);
timeline.getKeyFrames().add(kf);
timeline.play();
timeline.setOnFinished(e -> label.setText("Stop"));
...