¿Se necesita @FXML para cada statement?

¿Se necesita @FXML para cada statement o solo para la primera?

En otras palabras, ¿debería usar

@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 ; 

¡Gracias!

La anotación @FXML permite a un FXMLLoader inyectar valores definidos en un archivo FXML en referencias en la clase de controlador. En otras palabras, si anota su timerLabel con @FXML , @FXML inicializará cuando un elemento en el archivo FXML invoca el método load() con fx:id="timerLabel" . Como otros han señalado en los comentarios, esto significa que nunca se debe escribir código como

 @FXML private Label timerLabel = new Label(); 

Aquí timerLabel primero se inicializará a la new Label(); usted crea en el código, y luego casi de inmediato se reinicializará al valor definido en el archivo FXML. Esto es, en el mejor de los casos, redundante y, en el peor, engañoso. Si no coincide correctamente con los nombres de las variables en fx:id , su variable se referirá a la Label incorrecta y será muy difícil rastrear el error.

Para llegar a su pregunta real:

Cuando el FXMLLoader carga el archivo FXML, intentará inyectar cualquier elemento que tenga un atributo fx:id en el controlador. Buscará

  1. Cualquier campo public con un nombre de variable que coincida con el atributo fx:id , o
  2. Cualquier campo ( public o no) con un nombre de variable que coincida con el atributo fx:id que está anotado con @FXML .

Entonces, en su ejemplo, dado que todos sus campos son public , puede omitir todas las anotaciones @FXML (incluso la primera) y seguirá funcionando.

Sin embargo, si sigue las buenas prácticas y hace que sus campos sean private , cada statement debe anotarse @FXML para que @FXML la inyección.

Asi que

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

etc. funcionará, pero

 @FXML private Label timerLabel; private TextField mainTextField; 

no lo hará

para cada

 fx:id="somename" 

tu necesitas un

 @FXML public SomeClass somename; 

Prefiero escribirlo en una línea, porque es más fácil de leer cuando hay muchos

 @FXML public SomeClass somename; 

sin inicializar

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