@FXML è necessario per ogni dichiarazione?

@FXML è necessario per ogni dichiarazione o solo per la prima?

In altre parole, dovrei usare

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

O

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

Grazie!

L’annotazione @FXML consente a un FXMLLoader di iniettare valori definiti in un file FXML in riferimenti nella class controller. In altre parole, se timerLabel tuo timerLabel con @FXML , verrà inizializzato da FXMLLoader quando il metodo load() viene chiamato da un elemento nel file FXML con fx:id="timerLabel" . Come altri hanno sottolineato nei commenti, questo significa che non si dovrebbe mai scrivere codice come

 @FXML private Label timerLabel = new Label(); 

Qui timerLabel sarà inizialmente inizializzato con la new Label(); tu crei nel codice e poi sarai quasi reinizializzato al valore definito nel file FXML. Questo è al massimo ridondante e nel peggiore dei casi fuorviante. Se non si abbinano correttamente i nomi delle variabili a fx:id , la variabile si riferirà Label errata e l’errore sarà molto difficile da rintracciare.

Per arrivare alla tua domanda attuale:

Quando FXMLLoader carica il file FXML, tenterà di iniettare qualsiasi elemento che abbia un attributo fx:id nel controller. Cercherà

  1. Qualsiasi campo public con un nome di variabile che corrisponde all’attributo fx:id , o
  2. Qualsiasi campo ( public o meno) con un nome di variabile che corrisponde all’attributo fx:id annotato con @FXML .

Quindi nel tuo esempio, dato che tutti i tuoi campi sono public , puoi omettere tutte le annotazioni @FXML (anche la prima) e funzionerà ancora.

Tuttavia, se segui le buone pratiche e rendi private tuoi campi, allora ogni dichiarazione deve essere annotata @FXML perché l’iniezione funzioni.

Così

 @FXML private Label timerLabel; @FXML private TextField mainTextField; 

ecc lavorerà, ma

 @FXML private Label timerLabel; private TextField mainTextField; 

non lo farò.

per ciascuno

 fx:id="somename" 

avete bisogno di un

 @FXML public SomeClass somename; 

Preferisco scriverlo in una riga, perché è più facile da leggere quando ce ne sono molti

 @FXML public SomeClass somename; 

senza inizializzare

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