【问题标题】:javafx8 timeline - how to get the source of the animationjavafx8时间线-如何获取动画的来源
【发布时间】:2015-01-05 12:20:12
【问题描述】:

我想让 3 个对象做不同的事情,所以我想获取调用者的来源。 我为此使用 lambda,并且我没有使用关键帧,动画是相同且循环的,因此我不需要为不同的关键帧指定不同的行为。

也许我在 lambda 上做错了什么?

这是我的代码:

class MyClock extends ClockPane //clockpane extends pane
    {
         Timeline animation;            
        int id;

        EventHandler<ActionEvent> eventHandler = e -> 
        {//startAnimationById();
        System.out.println(e.getSource()==clockControl1.myclock.animation);
        };

        public MyClock(int c,int id)    
        {
            super(c);

            this.id=id;         
            animation = new Timeline(new KeyFrame(Duration.millis(1000),eventHandler));
            animation.setCycleCount(Timeline.INDEFINITE);
            animation.play();
        }   

startanimationbyid 方法使用我定义的 id 来避免这个问题,但它确实会困扰我。

我有 3 个这种类型的不同对象,每个对象都嵌套在一个时钟控制类中 (换句话说,我有 clockcontrol1 clockcontrol2 和 3 其中每个都有一个 MyClock myclock)

对于我拥有的所有时钟(总共 3 个),我在那里的打印返回 false,而正如目前所写的那样,我希望第一个时钟为 true...我尝试了不同的变体,我在这里发布的只是最后一个变体,但我所有的尝试都错了。

我在哪里搞砸了?

【问题讨论】:

    标签: animation lambda javafx-8 timeline


    【解决方案1】:

    API for KeyFrame 没有指定ActionEvent 的来源。你可以只做System.out.println(e.getSource()) 来查看(似乎事件的来源是KeyFrame 对象,而不是动画),但不能真正保证它总是你所期望的。

    如果您希望MyClock 的不同实例具有不同的行为,您可以为不同的行为提供一个参数。在这种情况下,您可以使用 Runnable 在事件处理程序中执行不同的代码:

    class MyClock extends ClockPane //clockpane extends pane
        {
             Timeline animation;            
            // int id;
    
    
    
    
            public MyClock(int c, Runnable handler)    
            {
                super(c);
    
                EventHandler<ActionEvent> eventHandler = e -> handler.run() ;
    
                animation = new Timeline(new KeyFrame(Duration.millis(1000),eventHandler));
                animation.setCycleCount(Timeline.INDEFINITE);
                animation.play();
            }
    }
    

    然后你可以根据需要实例化这些:

    public class Controller1 {
    
        // ...
    
        MyClock clock = new MyClock(..., () -> {
            // code to execute for this clock
        });
    }
    

    public class Controller2 {
    
        // ...
        MyClock clock = new MyClock(..., () -> {
            // code to execute for this clock
        });
    }
    

    【讨论】:

    • 感谢您的回复,鉴于其结构,这似乎是解决我提出的问题的好方法。我想出了一个更好的解决方案来解决我的具体问题。虽然不是通用的,但它足以满足我的需求。我将动画更改为:animation = new Timeline(new KeyFrame(Duration.millis(1000),ev ->startAnimation()));方法本身是: private void startAnimation() { if(this.getParent()==clockControl1) ... }
    • 这看起来不太好维护,但是还可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多