Динамическое изменение цвета прямоугольника в Javafx

Я создаю два объекта javafx.scene.shape.Rectangle в GridPane и делаю следующее.

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);
...

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

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

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


person Wizard    schedule 22.09.2013    source источник


Ответы (1)


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

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

person assylias    schedule 22.09.2013