在组中删除后不重新绘制画布(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);
    }
}