删除组(JavaFX)后不重绘画布

时间:2018-04-30 23:06:40

标签: java javafx

我在画布的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);
    }
}

1 个答案:

答案 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);
    }
}