2016-04-15 248 views
1

我想繪製隨機x/y中心的隨機圓圈,但我的代碼的結果只是在舞臺(窗口)中心的一個圓圈。JavaFX8 - 如何繪製隨機x/y中心的隨機圓?

我使用任務類來更新我的UI每1秒。

這是我的代碼:

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

到底哪裏出問題了

StackPane是佈局面板,它由中心的一切默認。由於您想手動將圓圈放置在隨機位置,因此您不想使用爲您管理佈局的窗格。

如何修復

使用PaneGroup代替StackPane。 Pane和Group都不會爲您管理項目佈局,因此您在特定位置添加的項目將保留在這些位置。

除了

您可能希望使用一個Timeline for your periodic updates而不是runLater任務(雖然後來仍會工作確定,以時間軸你不必應付額外的並行代碼的複雜性) 。