Ответ 1
Аннотация @FXML
позволяет FXMLLoader
вводить значения, определенные в файле FXML, в ссылки в классе контроллера. Другими словами, если вы аннотируете свой timerLabel
с помощью @FXML
, то он будет инициализирован FXMLLoader
, когда метод load()
вызывается элементом в файле FXML с fx:id="timerLabel"
. Как указывали другие в комментариях, это означает, что вы никогда не должны писать код, например
@FXML
private Label timerLabel = new Label();
Здесь timerLabel
сначала будет инициализироваться new Label();
, который вы создаете в коде, и затем почти сразу будет повторно инициализирован значением, определенным в файле FXML. Это в лучшем случае избыточно и в худшем случае вводит в заблуждение. Если вы неправильно сопоставляете имена переменных с fx:id
, ваша переменная будет ссылаться на неправильный Label
, и ошибка будет очень сложной для отслеживания.
Чтобы перейти к вашему фактическому вопросу:
Когда FXMLLoader
загружает файл FXML, он попытается внедрить в контроллер любые элементы, которые имеют атрибут fx:id
. Он будет искать
- Любое поле
public
с именем переменной, соответствующим атрибутуfx:id
, или - Любое поле (
public
или нет) с именем переменной, соответствующим атрибутуfx:id
, который аннотируется с помощью@FXML
.
Итак, в вашем примере, поскольку все ваши поля public
, вы можете опустить все аннотации @FXML
(даже первые), и он все равно будет работать.
Однако, если вы придерживаетесь хорошей практики и делаете свои поля private
, то каждое объявление должно быть аннотировано @FXML
для работы инъекции.
So
@FXML
private Label timerLabel;
@FXML
private TextField mainTextField;
и т.д., но
@FXML
private Label timerLabel;
private TextField mainTextField;
не будет.