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
});
}
我想让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
});
}