JavaFX8 - 如何使用随机x / y中心绘制随机圆?

时间:2016-04-15 16:19:21

标签: javafx-8

我试图用随机x / y中心绘制随机圆圈,但我的代码的结果只是在舞台(窗口)中心的一个圆圈。

我使用Task类每1秒更新一次UI。

这是我的代码:

package javafxupdateui;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class JavaFXUpdateUI extends Application {

    private Stage window;
    private StackPane layout;
    private Scene scene;

    @Override
    public void start(Stage primaryStage) {
        window = primaryStage;
        window.setTitle("JavaFX - Update UI");

        layout = new StackPane();
        scene = new Scene(layout, 500, 500);
        window.setScene(scene);
        window.show();

        Thread th = new Thread(task);
        th.setDaemon(true);
        th.start();
    }

    Task task = new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            while (true) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                            drawCircles();
                    }
                });

                Thread.sleep(1000);
            }
        }
    };

    public void drawCircles() {
        Circle circle;
        float x = (float)(Math.random()*501);
        float y = (float)(Math.random()*501);
        circle = new Circle(x, y, 25, Color.RED);
        layout.getChildren().add(circle);
        scene.setRoot(layout);
        window.setScene(scene);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

上述代码的结果是: Result GUI

1 个答案:

答案 0 :(得分:1)

出了什么问题

StackPane是一个布局窗格,它默认将所有内容都集中在一起。由于您希望手动将圈子放置在随机位置,因此您不希望使用管理布局的窗格。

如何解决

使用PaneGroup代替StackPane。 Pane和Group都没有为您管理项目布局,因此您在特定位置添加的项目将保留在这些位置。

除了

您可能希望使用Timeline for your periodic updates而不是使用runLater的任务(尽管后者仍然可以正常工作,使用时间轴,您不必处理其他复杂的并发代码)。