我想让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,而当前正在写入时我希望第一个时钟得到真实...我尝试了不同的变化,我在这里发布的只是最后一个版本,但我的所有尝试都是假的。
我把哪些东西搞砸了?
答案 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
});
}