JavaFX ScaleTransition

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

public void transitionAnimation(ImageView imageView,Image image){
    ScaleTransition front = new ScaleTransition(Duration.seconds(0.15),imageView);
    ScaleTransition back = new ScaleTransition(Duration.seconds(0.15),imageView);

    front.setFromX(1);
    front.setToX(0);
    front.setCycleCount(1);
    front.play();

    back.setFromX(0);
    back.setToX(1);
    back.setCycleCount(1);
    back.setDelay(Duration.seconds(0.15));
    back.play();

    Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            imageView.setImage(image);
            timer.cancel();
            timer.purge();
        }
    };
    timer.schedule(timerTask,148);
}
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 180
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:359)
    at java.base/java.util.ArrayList.get(ArrayList.java:427)
    at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1701)
    at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1645)
    at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1498)
    at javafx.graphics/javafx.scene.Parent.access$200(Parent.java:79)
    at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
    at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
    at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
    at javafx.graphics/javafx.scene.layout.Region.access$300(Region.java:147)
    at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
    at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3837)
    at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3799)
    at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3747)
    at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3901)
    at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3693)
    at javafx.graphics/javafx.scene.Parent.getChildTransformedBounds(Parent.java:1845)
    at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1634)
    at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1498)
    at javafx.graphics/javafx.scene.Parent.access$200(Parent.java:79)
    at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
    at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
    at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
    at javafx.graphics/javafx.scene.layout.Region.access$300(Region.java:147)
    at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
    at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3837)
    at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3799)
    at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3747)
    at javafx.graphics/javafx.scene.Node.intersectsBounds(Node.java:5282)
    at javafx.graphics/javafx.scene.Node$1.intersectsBounds(Node.java:548)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.intersectsBounds(NodeHelper.java:262)
    at javafx.graphics/javafx.scene.layout.Region.doPickNodeLocal(Region.java:3158)
    at javafx.graphics/javafx.scene.layout.Region.access$600(Region.java:147)
    at javafx.graphics/javafx.scene.layout.Region$1.doPickNodeLocal(Region.java:184)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.pickNodeLocalImpl(RegionHelper.java:104)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.pickNodeLocal(NodeHelper.java:128)
    at javafx.graphics/javafx.scene.Node.pickNode(Node.java:5192)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.pickNode(Scene.java:3993)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Scene.java:3579)
    at javafx.graphics/javafx.scene.Scene.pick(Scene.java:2029)
    at javafx.graphics/javafx.scene.Scene.access$6800(Scene.java:172)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3805)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579)
    at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
    at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
    at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:832)

Process finished with exit code 0
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
240
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш TimerTask работает в фоновом потоке и обновляет ImageView из этого потока. Поскольку JavaFX, как и большинство инструментальных средств пользовательского интерфейса, является однопоточным, поведение здесь не определено; вы видите последствия несогласованности данных в нескольких потоках.

Просто используйте API анимации исключительно для управления подобными функциями; например используйте SequentialTransition:

public void transitionAnimation(ImageView imageView,Image image){
    ScaleTransition front = new ScaleTransition(Duration.seconds(0.15),imageView);
    ScaleTransition back = new ScaleTransition(Duration.seconds(0.15),imageView);

    front.setFromX(1);
    front.setToX(0);
    front.setCycleCount(1);

    front.setOnFinished(e -> imageView.setImage(image));

    back.setFromX(0);
    back.setToX(1);
    back.setCycleCount(1);

    new SequentialTransition(front, back).play();

}

или Timeline:

public void transitionAnimation(ImageView imageView,Image image){

    KeyFrame start = new KeyFrame(Duration.ZERO, new KeyValue(imageView.scaleXProperty(), 1.0));
    KeyFrame middle = new KeyFrame(
        Duration.millis(150),
        e -> imageView.setImage(image),
        new KeyValue(imageView.scaleXProperty(), 0.0)
    );
    KeyFrame end = new KeyFrame(Duration.millis(300), new KeyValue(imageView.scaleXProperty(), 1.0));
    new Timeline(start, middle, end).play();
}

Сэр, первый сработал. Большое спасибо, это было очень большой проблемой для меня.

Cem Oner 16.12.2020 20:34

Другие вопросы по теме