我试图用随机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
答案 0 :(得分:1)
出了什么问题
StackPane是一个布局窗格,它默认将所有内容都集中在一起。由于您希望手动将圈子放置在随机位置,因此您不希望使用管理布局的窗格。
如何解决
使用Pane或Group代替StackPane。 Pane和Group都没有为您管理项目布局,因此您在特定位置添加的项目将保留在这些位置。
除了
您可能希望使用Timeline for your periodic updates而不是使用runLater的任务(尽管后者仍然可以正常工作,使用时间轴,您不必处理其他复杂的并发代码)。