2016-12-18 13 views
0

AnimationTimerは、実行中かどうかを知る方法がありませんでした....そして、私はこの問題に直面していることもあります。JavaFXなぜAnimationTimerがgetStatus()またはそれに類似したメソッドを持っていないのですか?

ソリューションは、handle()メソッド内volatile variableを作成して、それがハンドル内部で実行されるたびにそれが本当作るために、それはstop()に入るたびに)それは私が@Override両方の方法を持っているfalse.Soようにする方法。


質問:

AnimationTimerは、それが実行されているかどうかを決定するための方法を持っていないのはなぜ?

何らかの理由で不足しているのは間違ったデザインですか?


相対質問:

Is AnimationTimer running in its own thread?

How can I know if an AnimationTimer is running?

答えて

1

この方法が欠落していることを確かに非常に奇妙ですが、あなたと私を除いて誰も気にしていないようにみえます。私はこの問題を4年以上前に と報告していますが、それ以降は何も起こっていませんが、修正は些細なようです。 JDK-8092345

+0

何か暗いことがあります.... xaxa私は冗談を言っています。私はソースコードを取り、メソッドを追加します。 – GOXR3PLUS

+0

JavaFXのソースコードにまだたくさんの制限付きAPIがあるのを知っていますか?com.sun.scenario.animation' – GOXR3PLUS

+0

いいえ、わかりません。 – mipa

0

今からそれが仲間のオラクルから、それを追加するまでの方法isRunning()を持っています。

Java 9 http://download.java.net/java/jdk9/jfxdocs/javafx/animation/AnimationTimer.htmlには存在しません。


AnimationTimerコード:

/* 

* 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; 
    } 

} 
関連する問題