JavaFX在循环中更新项目符号位置UI

时间:2016-05-10 14:43:01

标签: javafx

对于我的学校项目,我必须制作一个大炮必须向飞机射击子弹的游戏,问题是,当我们射击时,我们可以在控制台上看到子弹的所有位置(X.Y)但是bullet没有在UI上更新

这是测试代码:

vel = Slider.getValue();
double angle = panelNero.getRotate();
boolean dead = false;

while (dead == false) {
    double X = P.getLayoutX();
    double Y = P.getLayoutY();
    if (X > 1 && Y > 1 && X < MP.getWidth() && Y < MP.getHeight()) {
        System.out.println("x: " + X + " y: " + Y + " maxX: " + MP.getWidth() + " maxY: " + MP.getHeight());

        double x = P.getLayoutX();
        double y = P.getLayoutY();
        P.setLayoutX(x += (Math.cos(Math.toRadians(angle)) * vel));
        P.setLayoutY(y += (Math.cos(Math.toRadians(angle)) * vel));
        System.out.println("VIVO");
        try {
            TimeUnit.MILLISECONDS.sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(FileFXMLController.class.getName()).log(Level.SEVERE, null, ex);
        }
    } else {
        System.out.println("MORTO");

        P.setLayoutX(pro.posX);
        P.setLayoutY(pro.posY);
        dead = true;
    }
}

1 个答案:

答案 0 :(得分:0)

请看一下这篇文章:Platform.runLater and Task in JavaFX

您可以使用Platform.runlater()从非GUI线程更新GUI。在这种情况下,您的更新请求将放入队列中,并由GUI线程尽快处理。

但由于这是一个更复杂的迭代,您可以考虑在新的Task上使用Thread

我建议你使用这样的东西:

Task task = new Task<Void>() {
    @Override
    public Void call() throws Exception {
        while (dead == false) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    P.setLayoutX(...);
                    P.setLayoutY(...);
                }
            });
            Thread.sleep(500);
        }
    }
};
Thread th = new Thread(task);
th.start();