javafx 8时间轴 - 如何获取动画的来源

时间:2015-01-05 12:20:12

标签: animation lambda javafx-8 timeline

我想让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个这种类型的不同对象,每个对象都嵌套在一个clockcontrol类中 (换句话说,我有clockcontrol1 clockcontrol2和3其中每一个都有一个MyClock myclock在其中)

我所拥有的印刷品对于我拥有的所有时钟(总共3个)都返回false,而当前正在写入时我希望第一个时钟得到真实...我尝试了不同的变化,我在这里发布的只是最后一个版本,但我的所有尝试都是假的。

我把哪些东西搞砸了?

1 个答案:

答案 0 :(得分:0)

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