在组中删除后不重新绘制画布(JavaFX)
我将背景(在组中删除后不重新绘制画布(JavaFX),java,javafx,Java,Javafx,我将背景(矩形)和组添加到画布的根。我将较小的矩形(player)添加到组中,然后通过AnimationTimer移动矩形(自定义,无线程睡眠)。当小的矩形到达X位置时,我想从场景中删除这个矩形。删除后,矩形将保留在画布中,直到我移动/调整窗口大小。如何刷新画布以使删除的矩形消失 public class Test extends Application { public static final int TILE_SIZE = 50; public static final
矩形
)和组
添加到画布的根
。我将较小的矩形(player)添加到组中,然后通过AnimationTimer移动矩形(自定义,无线程睡眠)。当小的矩形
到达X位置时,我想从场景中删除这个矩形。删除后,矩形将保留在画布中,直到我移动/调整窗口大小。如何刷新画布以使删除的矩形消失
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);
}
}
这是一个尚未解决的问题
bug报告中建议的解决方法是禁用脏区域优化,您可以通过提供JVM选项-Dprism.dirtyopts=false
来实现,即以
java-Dprism.dirtyopts=false测试
如果main
方法位于与应用程序
子类分开的类中,您还可以通过编程方式设置此选项(因为您需要在加载应用程序
类之前进行设置):
(然后以通常的方式运行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);
}
}
所以只有移除组中的最后一个节点时才会发生这种情况?这就是为什么你创建并移除了假人?@Baterka不确定。我完全是通过反复试验才得到的。您可以搜索jdbugs,看看这是否已知,是否有更好的解决方法。它似乎是特定于组的
,因此如果您可以使用窗格
,这是您的最佳选择,但我假设您选择了组
来管理布局
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);
}
}