Динамическое обновление состояния и положения движущихся объектов в JavaFX
Подскажите, что использовать для отображения хаотично движущихся точек, меняющих цвет в JavaFX ?
Количество точек может быть разным (параметр). Цвет точек передает принадлежность к определенному классу (их всего 3).

Пока есть такой набросок:
this.allPoints = (ObservableList<CoquilleBille>) model.getAllPoints();
Timer timer = new Timer();
TimerTask tTask = new TimerTask()
{
@Override
public void run()
{
for (CoquilleBille cb : allPoints)
{
String state = cb.getIndividual().getClass().getSimpleName();
double coordX = cb.getPosition().getX();
double coordY = cb.getPosition().getY();
Dot point = new Dot(coordX, coordY);
if (state.equals("Recovered")) { point.changeColor("#ff1f40"); }
if (state.equals("Sick")) { point.changeColor("#ffa07a"); }
}
}
};
И далее планирую делать апдейт картинки 30 раз в секунду
timer.schedule(tTask, 0, 33);
Но не могу понять как это имплементировать в контроллере, чтобы оно вписалось в fxml
<AnchorPane layoutX="31.0" layoutY="232.0" prefHeight="323.0" prefWidth="460.0" style="-fx-background-color: #ffffff;">
<children>
<Circle fx:id="dot1" centerX="30.0" centerY="30.0" fill="#ff1f40" radius="2.0" stroke="#ff1f40" strokeType="INSIDE" />
<Circle centerX="50.0" centerY="50.0" fill="ffa07a" radius="2.0" stroke="ffa07a" strokeType="INSIDE" />
<Circle fx:id="dot" centerX="100.0" centerY="100.0" fill="#14902b" radius="2.0" stroke="#14902b" strokeType="INSIDE" />
</children>
</AnchorPane>
Пока там нарисованы 3 круга разных цветов, но мне то нужно, чтобы их можно было отрисовывать нефиксированное количество, плюс передавать параметры цвета сюда.
Ответы (2 шт):
Есть вот такой вариант,он не связан с вашим кодом, но может быть вам интересен как возможный инструмент. :
public class SlideLiveTimer extends Task<Void> {
@Override
protected Void call() throws Exception {
int counts = 0;
while (counts<100){
Thread.sleep(105);
counts++;
}
SlideModalError.hideStatus.play();
SlideModalError.showsStatus = false;
return null;
}
}
Вызов из другого класса :
SlideLiveTimer slt = new SlideLiveTimer();
Thread thread = new Thread(slt);
thread.setDaemon(true);
thread.start();
В данном примере, спустя какое-то время скрывается объект X.
Вам нужно будет в ваш класс, расширяемый "таском" запихнуть контроллер(передать в конструкторе). Затем в цикле выполнять операции. Изменения связанные с GUI необходимо оборачивать в
Platform.runLater(()->{
// ВАш КОД
});
Передаваемые параметры (в данном случае координаты, должны быть final(Перед вызовом Platform). Безопасность здесь рекомендовать не могу, поскольку возможен рассинхрон.
Многопоточность препод сказал не делать, мол нам пока будет сложно синхронизировать потоки (эта симуляция делается небольшой группой студентов второкурсников )). Получается, в ней несколько таймеров, работающих параллельно из разных классов на одном потоке. Пока реализовала с помощью Timeline, вроде работает. Но, подозреваю, вероятно в последствии это придется переделать, поэтому большое спасибо за все идеи, что вы здесь предложили, возможно я вернусь к ним.