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();
});
因为我想要移动按钮 => 消失并暂停 => 移动按钮 => 消失并暂停以继续的模式,所以我还让 tt
在 pt
完成后播放。此外,为了更新 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()
都移到 tt
和 pt
的 setOnFinished
块中,但似乎没有生效。
所以我的问题是,在 运行 一个 TranslateTransition
之后,有没有办法撤销它的影响,这样它就不会影响 setX()
和 setY()
操作?出于我的应用程序的目的,设置 cycle(2)
并设置 Node
在半个周期后不可见不是一个选项,因为我想添加其他取决于时间的功能。
我了解到,最好的做法是显式 remove
和 add
Node
对象,而不是使用 setVisible(boolean)
更改它们的可见性。
所以当 Node
对象应该从屏幕上消失时,应该通过 root.getChildren().add(node);
来完成。同样,当 Node
对象重新出现在屏幕上时,应该使用 root.getChildren().remove(node);
代替。此方法解决了已解决的问题。
所以问题来了。在每个 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();
});
因为我想要移动按钮 => 消失并暂停 => 移动按钮 => 消失并暂停以继续的模式,所以我还让 tt
在 pt
完成后播放。此外,为了更新 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()
都移到 tt
和 pt
的 setOnFinished
块中,但似乎没有生效。
所以我的问题是,在 运行 一个 TranslateTransition
之后,有没有办法撤销它的影响,这样它就不会影响 setX()
和 setY()
操作?出于我的应用程序的目的,设置 cycle(2)
并设置 Node
在半个周期后不可见不是一个选项,因为我想添加其他取决于时间的功能。
我了解到,最好的做法是显式 remove
和 add
Node
对象,而不是使用 setVisible(boolean)
更改它们的可见性。
所以当 Node
对象应该从屏幕上消失时,应该通过 root.getChildren().add(node);
来完成。同样,当 Node
对象重新出现在屏幕上时,应该使用 root.getChildren().remove(node);
代替。此方法解决了已解决的问题。