Узлы JavaFX следует изменять только из потока приложения JavaFX.Вы изменяете свойство layoutX
из фонового потока, что приводит к ненадежным результатам.
Вы можете обновить свойство value
и использовать прослушиватель для свойства Task.value
, чтобы позаботиться о синхронизации для вас.:
class MyThread extends Task<Integer> {
@Override
protected Integer call() throws Exception {
final int minX = (737 / 109) * 109; // use rounding of integer division to find greatest int <= 737 divisible by 109
while(true) {
for (int i = 737; i >= minX; i--) {
updateValue(i);
}
}
}
}
MyThread task = new MyThread();
task.valueProperty().addListener((o, oldValue, newValue) -> circle.setLayoutX(newValue.doubleValue()));
new Thread(task).start();
Обратите внимание, что результаты этого кода могут быть совершенно непредсказуемыми: между обновлениями нет задержки, поэтому значение в момент обновления привязки может быть случайным ...
В противном случае вам придется использовать Platform.runLater
для обновления графического интерфейса, но это довольно сложно с вашим кодом, так как вы делаете обновления с достаточно высокой частотой, чтобы JavaFX не смог справиться со всемиRunnable
s отправлено.
Я рекомендую использовать класс JavaFX, такой как AnimationTimer
.Эти виды классов предоставляются для использования.Попытка реализовать что-то подобное самостоятельно, скорее всего, принесет больше хлопот, чем того стоит, особенно как неопытный программист.