Нужно ли @FXML для каждого объявления?

Требуется ли @FXML для каждого объявления или только для первого?

Другими словами, следует ли использовать

@FXML
public Label timerLabel = new Label();
@FXML
public TextField mainTextField, projectTextField ;
@FXML
public Button goButton, deleteAllButton ;
@FXML
public ComboBox<String> projectComboBox ;
@FXML
public TableView<Entry> mainTable ;
@FXML
public TableColumn<Entry, String> titleColumn, timeColumn, dateColumn ;
@FXML
public TableColumn<Entry, Boolean> checkColumn, buttonColumn ;
@FXML
public checkBox checkAllCheckBox ;

или

@FXML
public Label timerLabel = new Label();
public TextField mainTextField, projectTextField ;
public Button goButton, deleteAllButton ;
public ComboBox<String> projectComboBox ;
public TableView<Entry> mainTable ;
public TableColumn<Entry, String> titleColumn, timeColumn, dateColumn ;
public TableColumn<Entry, Boolean> checkColumn, buttonColumn ;
public checkBox checkAllCheckBox ;

Спасибо!

Ответ 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;

не будет.

Ответ 2

для каждого

fx:id="somename"

вам понадобится

@FXML
public SomeClass somename;

Я предпочитаю писать его в одной строке, потому что его легче читать, когда есть много

@FXML public SomeClass somename;

без инициализации

@FXML
public Label timerLabel = new Label(); // this is wrong

Ответ 3

@FXML
private TextField idTextField;

@FXML
private TextField passwordTextField;

ИЛИ ЖЕ

@FXML
private TextField idTextField, passwordTextField;