我在画布的Rectangle
中添加了背景(Group
)和root
。我将较小的Rectangle
(播放器)添加到组中,然后通过AnimationTimer移动矩形(自定义无线程休眠)。当小Rectangle
到达centrain X位置时,我想从场景中删除此Rectangle。删除后,矩形保留在画布中,直到我移动/调整窗口大小。如何刷新画布使删除的矩形消失?
public class Test extends Application {
public static final int TILE_SIZE = 50;
public static final int WIDTH = 15;
public static final int HEIGHT = 15;
public static final int FRAMERATE = 30;
private Pane root;
private Group group = new Group();
private Rectangle player;
private Parent createContent() {
root = new Pane();
root.setPrefSize(500, 500);
Rectangle bg = new Rectangle(500, 500);
bg.setFill(Color.RED);
root.getChildren().addAll(bg, group);
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
onUpdate();
}
};
timer.start();
player = new Rectangle(20, 20);
player.setFill(Color.GREEN);
group.getChildren().add(player);
return root;
}
public void onUpdate() {
if (player.getTranslateY() > 100) {
group.getChildren().remove(player);
} else {
player.setTranslateX(player.getTranslateX() + 1);
player.setTranslateY(player.getTranslateY() + 1);
}
}
@Override
public void start(Stage primaryStage) throws Exception {
Scene scene = new Scene(createContent());
primaryStage.setTitle("Test");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:2)
这是known bug,仍未解决。
错误报告中建议的解决方法是禁用脏区域优化,您可以通过提供JVM选项-Dprism.dirtyopts=false
来执行此操作,即将其作为
java -Dprism.dirtyopts=false Test
如果main
方法在与Application
子类分开的类中(因为您需要在加载Application
类之前设置它),也可以以编程方式设置此项: / p>
import javafx.application.Application;
public class App {
public static void main(String[] args) {
System.setProperty("prism.dirtyopts", "false");
Application.launch(Test.class, args);
}
}
(然后以通常的方式运行App
类。)
另一个解决方法似乎是确保对组的子节点列表进行更复杂的更改,但这不太可能非常强大。例如,以下似乎适用于这种特殊情况。
public void onUpdate() {
if (player.getTranslateY() > 100) {
Rectangle dummy = new Rectangle();
group.getChildren().add(dummy);
group.getChildren().remove(player);
group.getChildren().remove(dummy);
} else {
player.setTranslateX(player.getTranslateX() + 1);
player.setTranslateY(player.getTranslateY() + 1);
}
}