JavaFX-在TranslateTransition之后更改节点的位置

JavaFX-在TranslateTransition之后更改节点的位置,javafx,transition,Javafx,Transition,所以这里有一个问题。在每次TranslateTransition(tt)之后,我想通过setX()和setY()更改节点的位置,然后暂停transition(pt)一秒钟,然后从新位置重新使用tt。但是在tt在新的所需位置运行之前,按钮会在一个奇怪的坐标处短暂闪烁-更具体地说,就是说节点最初放置在(0,0)处,并且tt会将按钮向下移动100像素。在每个tt=>pt序列之后,节点的位置会通过将100添加到其先前的x坐标(setX(getX()+100))进行更新,因此下一个位置是(100,0)。但

所以这里有一个问题。在每次
TranslateTransition
tt
)之后,我想通过
setX()
setY()
更改
节点的位置,然后
暂停transition
pt
)一秒钟,然后从新位置重新使用
tt
。但是在
tt
在新的所需位置运行之前,按钮会在一个奇怪的坐标处短暂闪烁-更具体地说,就是说
节点最初放置在
(0,0)
处,并且
tt
会将按钮向下移动100像素。在每个
tt
=>
pt
序列之后,
节点的位置会通过将100添加到其先前的x坐标(
setX(getX()+100)
)进行更新,因此下一个位置是
(100,0)
。但是在
(100,0)
启动
tt
之前,它会短暂地闪烁按钮
(100,100)
-经过一些调试,我了解到这会发生,因为在上一次
tt.play()
结束时,坐标从
(0,0)
移动到
(0,100)
,因此当
setX(getX()+100)时使用
时,它将
节点放置在
(100100)
处,并将其保留在那里,直到下一个
tt.play()
,此时
节点将自身正确地重新定位到
(100,0)

详情:

我有一个
节点
,更具体地说是
图像视图
,其中加载了一个
图像
,基本上充当屏幕上的移动按钮。我使用
TranslateTransition
在按钮周围移动

TranslateTransition tt = new TranslateTransition();

tt = new TranslateTransition(Duration.seconds(5), button);
tt.setFromX(0);
tt.setFromY(0);
tt.setByX(0);
tt.setByY(100);   // shifts the button down by 100 pixels
tt.setAutoReverse(true);
这里,
按钮
指的是
图像视图
对象。执行
TranslateTransition
后,我想通过设置
按钮来清空屏幕。设置可见(false)
并保持空屏幕3秒钟。我希望:

PauseTransition pt = new PauseTransition(Duration.seconds(3));

tt.setOnFinished((ActionEvent event) -> {
    tt.stop();   // not really necessary though
    button.setVisible(false);
    pt.play();
});
因为我想要移动按钮=>消失和暂停=>移动按钮=>消失和暂停的模式继续,所以我还让
tt
pt
完成后播放。同样为了更新
按钮的位置(新的随机位置),我加入了
button.setX(rand.nextInt(500))
其中
random rand=new random()

我已尝试将更新行
setX()
移动到
tt
pt
setOnFinished
块中,但似乎没有生效


因此,我的问题是,在运行
TranslateTransition
之后,是否有办法撤消其效果,从而不影响
setX()
setY()
操作?对于我的应用程序,设置
循环(2)
并且在半个周期后设置
节点
不可见不是一个选项,因为我想添加其他依赖于时间的功能。

我了解到最好的做法是显式
删除
添加
节点
对象,而不是使用
setVisible(布尔)

因此,当一个
节点
对象应该从屏幕上消失时,应该通过
root.getChildren().add(节点)完成。同样,当
节点
对象返回屏幕时,
root.getChildren().remove(节点)。这种方法解决了已解决的问题

pt.setOnFinished((ActionEvent) -> {
    button.setX(rand.nextInt(500));
    button.setVisible(true);
    updateButtons();
    tt.play();
});