2016-04-29 119 views
0

我正在尝试使每三秒钟使用javafx创建新的圆的程序。但是当我用thread.sleep()运行我的循环时,循环结束时出现带有圆圈的图形窗口。例如,我想制作10个圆圈。当所有10个圆圈被制成时,我的图形窗口将会出现。但是我想让我的图形在第一个圆圈出现时出现。在那个窗口上,每三秒钟就会出现一个圈子。使用thread.sleep创建javafx中的圆圈()

@Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     Pane pane = new Pane(); 
     //pane.setStyle("-fx-fill: linear-gradient(orange,orangered,blue);"); 
     pane.setPrefSize(1200,1000); 
     pane.getChildren().add(new MyCircle().getCircle()); 
     for(int i=0; i<10; i++) 
     { 
      try 
      { 
       Thread.sleep(3000); 
      }catch(InterruptedException e){} 
      pane.getChildren().add(new MyCircle().getCircle()); 
     } 
     Form f = new Form("This is hello world", pane); 
    } 

我做了具有场景的Form类,并且还制作了Circle类,它给了我所需的位置和样式的圈子。在上面的这个程序中,当所有的圈子被制作时,我的gui会出现。

+0

我不知道javafx,但它听起来像你需要在每次睡眠之前激活其事件循环。 – totoro

+1

您正在调用JavaFX UI线程上的'Thread.sleep',因此它冻结,无法更新显示。我认为这两个问题应该让你知道它应该如何完成:[从工作线程更新UI](http://stackoverflow.com/questions/20497845/constantly-update-ui-in-java-fx-worker线程阻塞JavaFX UI更新](http://stackoverflow.com/questions/33112560/why-is-a-thread-blocking-my-javafx-ui-thread) – Itai

回答

2

作为JavaFX的经验法则:无论何时您试图使用Thread.sleep重新考虑您的设计,因为它可能是错误的!

在您的特殊情况下,有多种方法可以解决此问题。我会亲自使用ScheduledThreadPoolExecutor。只要注意在Platform.runLater调用中包装Circles的实际创建。

您也可以使用AnimationTimer来实现您的目标。