2016-04-29 2 views
0

Я пытаюсь создать программу, которая будет создавать новые круги с использованием javafx каждые три секунды. Но когда я запускаю свой цикл с thread.sleep(), мое графическое окно с кругами появляется, когда цикл завершен. Например, я хочу сделать 10 кругов. Мое графическое окно появится, когда будут сделаны все 10 кругов. Но я хочу, чтобы моя графика появлялась при создании первого круга. И в этом окне пропущенные круги появляются каждые три секунды.Создание кругов в javafx с thread.sleep()

@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); 
    } 

Я сделал класс формы, которые имеют сцены, а также я сделал круг класса, которые дают мне мои круги с местоположением и стилем, который я хочу. В этой программе выше мой gui появляется, когда все круги сделаны.

+0

Я не знаю javafx, но похоже, что вам нужно активировать цикл событий перед каждым сном. – totoro

+1

Вы вызываете 'Thread.sleep' в потоке пользовательского интерфейса JavaFX, поэтому он зависает, не может обновить отображение. Я думаю, что эти два вопроса должны дать вам представление о том, как это сделать: [Обновить пользовательский интерфейс из рабочего потока] (http://stackoverflow.com/questions/20497845/constantly-update-ui-in-java-fx-worker -thread) и [Почему потоки блокируют обновления JavaFX UI] (http://stackoverflow.com/questions/33112560/why-is-a-thread-blocking-my-javafx-ui-thread) – Itai

ответ

2

Как правило, для JavaFX: всякий раз, когда возникает соблазн использовать Thread.sleep, пересматривайте свой дизайн, потому что он, вероятно, ошибочен!

В вашем конкретном случае существуют различные способы решения этой проблемы. Я лично использовал бы ScheduledThreadPoolExecutor. Просто позаботьтесь о завершении создания кругов в вызове Platform.runLater.

Вы также можете использовать AnimationTimer для достижения своей цели.

Смежные вопросы