¿Se necesita @FXML para cada declaración?

Resuelto Romeo asked hace 9 años • 3 respuestas

¿Se necesita @FXML para cada declaración o solo para la primera?

En otras palabras, ¿debería utilizar

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

O

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

¡Gracias!

Romeo avatar May 13 '15 16:05 Romeo
Aceptado

La @FXMLanotación permite FXMLLoaderinyectar valores definidos en un archivo FXML en referencias en la clase de controlador. En otras palabras, si anota su timerLabelwith @FXML, será inicializado cuando FXMLLoaderun load()elemento en el archivo FXML llame al método con fx:id="timerLabel". Como otros han señalado en los comentarios, esto significa que nunca debes escribir código como

@FXML
private Label timerLabel = new Label();

Aquí timerLabelprimero se inicializará el valor que new Label();usted creó en el código y luego, casi inmediatamente, se reinicializará con el valor definido en el archivo FXML. Esto es, en el mejor de los casos, redundante y, en el peor, engañoso. Si no hace coincidir correctamente los nombres de las variables con el fx:id, su variable se referirá al error Labely será muy difícil localizar el error.

Para llegar a su pregunta real:

Cuando FXMLLoadercarga el archivo FXML, intentará inyectar cualquier elemento que tenga un fx:idatributo en el controlador. buscará

  1. Cualquier publiccampo con un nombre de variable que coincida con el fx:idatributo, o
  2. Cualquier campo ( publico no) con un nombre de variable que coincida con el fx:idatributo anotado con @FXML.

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

Sin embargo, si sigue las buenas prácticas y crea sus campos private, entonces se debe anotar cada declaración @FXMLpara que la inyección funcione.

Entonces

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

etc funcionará, pero

@FXML
private Label timerLabel;
private TextField mainTextField;

no lo hará.

James_D avatar May 13 '2015 11:05 James_D

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 muchas.

@FXML public SomeClass somename;

sin inicializar

@FXML
public Label timerLabel = new Label(); // this is wrong
hanbin615 avatar May 13 '2015 11:05 hanbin615