JavaFX Spinner продолжает работать после удаления со сцены - PullRequest
2 голосов
/ 01 мая 2019

Я обнаружил, что обнаружил проблему с JavaFX Spinner в JavaFX JDK Linux 1.8.0_144. Если вы нажимаете кнопку увеличения или уменьшения, когда спиннер удален со сцены, он продолжает движение.

выход

Spinner update 501.0
Spinner update 502.0
Spinner update 503.0
Spinner update 504.0
Spinner update 505.0
Spinner update 506.0
Spinner removed from scene
Spinner update 507.0    <== unexpected
Spinner update 508.0
Spinner update 509.0
Spinner update 510.0
Spinner update 511.0
Spinner update 512.0

код

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Spinner;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class SpinnerProblem extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Spinner<Double> spinner = new Spinner<>(0d, 1000d, 500d);
        spinner.valueProperty().addListener((obs, oldValue, newValue) -> {
            System.out.println("Spinner update " + newValue);
        });
        HBox container = new HBox(spinner);
        primaryStage.setScene(new Scene(container));
        primaryStage.show();

        // remove the spinner from scene after 5 seconds
        Timeline timeline = new Timeline();
        timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(5), event -> {
    System.out.println("Spinner removed from scene");
    container.getChildren().clear();
 }));
        timeline.play();
    }

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

}

Анализ

In com.sun.javafx.scene.control.skin.SpinnerSkin<T> com.sun.javafx.scene.control.behavior.SpinnerBehavior.stopSpinning() вызывается только при MOUSE_RELEASED событии. Появляется, когда спиннер удален со сцены, это событие никогда не вызывается, и не существует никакого другого кода, чтобы остановить вращение.

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

Вопрос

Это известная ошибка или я что-то не так делаю? Как я могу избежать этого?

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