javafx8 timeline - 如何获取动画源

javafx8 timeline - how to get the source of the animation

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

我那里的印刷品 returns 对于我拥有的所有时钟(总共 3 个)都是假的,而按照目前的写法,我希望第一个时钟是真的......我试过了这个的不同变体,我 post 这里只是最后一个变体,但我的所有尝试都是错误的。

我哪里搞砸了?

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