1

It seems pretty strange that AnimationTimer has not a method to know if it is running or not.... And i am facing this problem, cause sometimes it is starting and sometimes not.

A solution is creating a volatile variable inside the handle() method and every time it is running inside the handle to make it true and every time it enters stop()) method to make it false.So i have to @Override both methods.


The Question:

Why the AnimationTimer has not a method to determine if it is running?

Is it a bad design it is missing for some reason?


Relative questions:

Is AnimationTimer running in its own thread?

How can I know if an AnimationTimer is running?

Community
  • 1
  • 1
GOXR3PLUS
  • 6,877
  • 9
  • 44
  • 93

2 Answers2

1

It is indeed very strange that this method is missing but with the exception of you and me nobody seems to care. I have reported this issue more than 4 years ago and nothing has happened since then although the fix seems to be trivial. JDK-8092345

mipa
  • 10,369
  • 2
  • 16
  • 35
0

From now it has the method isRunning() until bro's from Oracle add it.

By looking here although it is not present in Java 9 http://download.java.net/java/jdk9/jfxdocs/javafx/animation/AnimationTimer.html.


AnimationTimer code:

    /*

 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.

 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

 *

 * This code is free software; you can redistribute it and/or modify it

 * under the terms of the GNU General Public License version 2 only, as

 * published by the Free Software Foundation.  Oracle designates this

 * particular file as subject to the "Classpath" exception as provided

 * by Oracle in the LICENSE file that accompanied this code.

 *

 * This code is distributed in the hope that it will be useful, but WITHOUT

 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License

 * version 2 for more details (a copy is included in the LICENSE file that

 * accompanied this code).

 *

 * You should have received a copy of the GNU General Public License version

 * 2 along with this work; if not, write to the Free Software Foundation,

 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

 *

 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

 * or visit www.oracle.com if you need additional information or have any

 * questions.

 */


import com.sun.javafx.tk.Toolkit;

import com.sun.scenario.animation.AbstractMasterTimer;

import com.sun.scenario.animation.shared.TimerReceiver;

import java.security.AccessControlContext;

import java.security.AccessController;

import java.security.PrivilegedAction;


/**

 * The class {@code AnimationTimer} allows to create a timer, that is called in

 * each frame while it is active.

 *

 * An extending class has to override the method {@link #handle(long)} which

 * will be called in every frame.

 *

 * The methods {@link AnimationTimer#start()} and {@link #stop()} allow to start

 * and stop the timer.

 *

 *

 * @since JavaFX 2.0

 */

public abstract class AnimationTimer {


    private class AnimationTimerReceiver implements TimerReceiver {

        @Override public void handle(final long now) {

            if (accessCtrlCtx == null) {

                throw new IllegalStateException("Error: AccessControlContext not captured");

            }


            AccessController.doPrivileged((PrivilegedAction<Void>) () -> {

                AnimationTimer.this.handle(now);

                return null;

            }, accessCtrlCtx);

        }

    }


    private final AbstractMasterTimer timer;

    private final AnimationTimerReceiver timerReceiver = new AnimationTimerReceiver();

    private boolean active;


    // Access control context, captured in start()

    private AccessControlContext accessCtrlCtx = null;


    /**

     * Creates a new timer.

     */

    public AnimationTimer() {

        timer = Toolkit.getToolkit().getMasterTimer();

    }


    // For testing only

    AnimationTimer(AbstractMasterTimer timer) {

        this.timer = timer;

    }


    /**

     * This method needs to be overridden by extending classes. It is going to

     * be called in every frame while the {@code AnimationTimer} is active.

     *

     * @param now

     *            The timestamp of the current frame given in nanoseconds. This

     *            value will be the same for all {@code AnimationTimers} called

     *            during one frame.

     */

    public abstract void handle(long now);


    /**

     * Starts the {@code AnimationTimers}. Once it is started, the

     * {@link #handle(long)} method of this {@code AnimationTimers} will be

     * called in every frame.

     *

     * The {@code AnimationTimers} can be stopped by calling {@link #stop()}.

     */

    public void start() {

        if (!active) {

            // Capture the Access Control Context to be used during the animation pulse

            accessCtrlCtx = AccessController.getContext();

            timer.addAnimationTimer(timerReceiver);

            active = true;

        }

    }


    /**

     * Stops the {@code AnimationTimers}. It can be activated again by calling

     * {@link #start()}.

     */

    public void stop() {

        if (active) {

            timer.removeAnimationTimer(timerReceiver);

            active = false;

        }

    }

    /**Determines if the AnimationTimer is Running
     * @return True if it is running
     */
    public boolean isRunning() {
        return active;
    }

}
GOXR3PLUS
  • 6,877
  • 9
  • 44
  • 93