2013-09-22 8 views
0

Я создаю два объекта javafx.scene.shape.Rectangle в GridPane и делаю следующее.Динамическое изменение цвета прямоугольника в Javafx

rectArray = new Rectangle[2]; 

boardGrid.setStyle("-fx-background-color: #C0C0C0;"); 

rectArray[0] = new Rectangle(12,12); 
rectArray[0].setFill(Color.AQUA); 
boardGrid.add(rectArray[0], 2, 0); 

rectArray[1] = new Rectangle(12,12); 
rectArray[1].setFill(Color.BLACK); 
boardGrid.add(rectArray[1], 2, 1);  

Button buttonStart = new Button("Change color"); 
buttonStart.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      rectArray[0].setFill(Color.RED); 
      try { 
       Thread.sleep(2000); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      rectArray[1].setFill(Color.AZURE); 
     } 
}); 
boardGrid.add(buttonStart, 3, 1); 
initializeScene(primaryStage, boardGrid); 
... 

Когда я запускаю код, который я могу видеть два прямоугольника (один в Акве и один в черном цвете), и когда я нажимаю кнопку, мне придется ждать 2 секунды, чтобы увидеть изменения в цветах обоих прямоугольников.

Я меняю цвет одного прямоугольника до того, как вызывается Thread.sleep(2000), а затем меняю цвет следующего прямоугольника.

Мой вопрос: почему я должен ждать 2 секунды? Есть ли способ, которым я могу динамически обновлять цвета прямоугольника?

ответ

1

Вы спите в потоке пользовательского интерфейса, который блокирует дальнейшую обработку (включая обновление экрана).

Если вам нужно задержать некоторый код, вы можете использовать PauseTransition, чтобы подождать две секунды и использовать его метод onFinished для запуска остальной части вашего кода после ожидания.

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