Как реализовать обновление Label в JavaFX с использованием FXML файла
Я переделываю свои программы на Swing в программы JavaFX. Одна из программ это часы. Суть заключается в том что нужно каждую секунду обновлять Label. Я задавал подробный вопрос только связаный с библиотекой Swing, а не JavaFX. Вот этот вопрос. Я поискал в Google решение моей проблемы и наткнулся на метод Platform.runLater() и переписал код под него. Она заработала, но я не могу использовать FXML файл. Как мне это реализовать? Также вот код для изменения Label:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("'Today' dd.MM.yyyy, HH:mm:ss");
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(() -> {
LocalDateTime now = LocalDateTime.now();
String nowFormatted = dateTimeFormatter.format(now);
Platform.runLater(() -> timer.setText(nowFormatted));
}, 0, 1, TimeUnit.SECONDS);
Ответы (1 шт):
Похоже что вы делаете что то не так.
1)Нужно связать fxml файл с контроллером. Для этого над классом контроллера нужна аннотация:
@ViewController(value = "/fxml/timer.fxml", title = "Таймер")
2)В fxml файле указать id для элемента.
<Label fx:id="timeLabel" />
3)В контроллере определить этот элемент
@FXML
private Label timeLabel;
Название id и имени переменной должны совпадать, тогда javafx сделает инжект.
4)Можно использовать @PostConstruct, метод с этой аннотацией выполнится после создания контроллера.
@PostConstruct
public void init() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("'Today' dd.MM.yyyy, HH:mm:ss");
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(() -> {
LocalDateTime now = LocalDateTime.now();
String nowFormatted = dateTimeFormatter.format(now);
Platform.runLater(() -> timer.setText(nowFormatted));
}, 0, 1, TimeUnit.SECONDS);
}