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

JavaFX - Changing location of a Node after TranslateTransition

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

详情:

我有一个 Node,更具体地说 ImageView,上面加载了一个 Image,它基本上充当屏幕上的移动按钮。我用 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);

这里的button指的是ImageView对象。执行TranslateTransition后,我想通过设置button.setVisible(false)来清空屏幕并保持空屏3秒。我会有以下内容:

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

tt.setOnFinished((ActionEvent event) -> {
    tt.stop();   // not really necessary though
    button.setVisible(false);
    pt.play();
});

因为我想要移动按钮 => 消失并暂停 => 移动按钮 => 消失并暂停以继续的模式,所以我还让 ttpt 完成后播放。此外,为了更新 button(新的随机位置)的位置,我在 Random rand = new Random().

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

我试过将更新行 setX() 都移到 ttptsetOnFinished 块中,但似乎没有生效。

所以我的问题是,在 运行 一个 TranslateTransition 之后,有没有办法撤销它的影响,这样它就不会影响 setX()setY() 操作?出于我的应用程序的目的,设置 cycle(2) 并设置 Node 在半个周期后不可见不是一个选项,因为我想添加其他取决于时间的功能。

我了解到,最好的做法是显式 removeadd Node 对象,而不是使用 setVisible(boolean) 更改它们的可见性。

所以当 Node 对象应该从屏幕上消失时,应该通过 root.getChildren().add(node); 来完成。同样,当 Node 对象重新出现在屏幕上时,应该使用 root.getChildren().remove(node); 代替。此方法解决了已解决的问题。