Вы блокируете поток приложения JavaFX с помощью Thread.sleep
, который предотвращает изменение отрисовки. (В вашем коде на самом деле нет изменений, поскольку вы просто заменяете цвет, используемый для рисования, при условии, что этот цвет больше нигде не используется, но это то, что произойдет, если вы нарисовали что-то в дополнение к изменению fill
property.)
Я рекомендую использовать один из классов из javafx.animation
пакета , чтобы изменить это.
В этом случае PauseTransition
кажется самым простым способомчтобы пойти, но если вы хотите включить цикл обновления, я рекомендую вместо этого использовать AnimationTimer
или Timeline
и интегрировать этот тип логики в «цикл» обновления. Используя одну из последних возможностей, вы можете просто сохранить последний раз, когда мяч ударился о стену, и на основе этой информации решить, какой цвет использовать для рисования фона.
Пример использования PauseTransition
:
gc.setFill(Color.WHITESMOKE);
gc.fillRect(x, y, w, h);
// schedule update without blocking
PauseTransition pause = new PauseTransition(Duration.millis(100));
pause.setOnFinished(evt -> {
gc.setFill(Color.BLACK);
gc.fillRect(x, y, w, h);
});
pause.play();
Обратите внимание, что вам, вероятно, потребуется перерисовать не только фон, так как использование fillRect
заменяет все содержимое, находящееся в данный момент в прямоугольнике.