¿Se necesita @FXML para cada declaración?
¿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!
La @FXML
anotación permite FXMLLoader
inyectar valores definidos en un archivo FXML en referencias en la clase de controlador. En otras palabras, si anota su timerLabel
with @FXML
, será inicializado cuando FXMLLoader
un 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í timerLabel
primero 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 Label
y será muy difícil localizar el error.
Para llegar a su pregunta real:
Cuando FXMLLoader
carga el archivo FXML, intentará inyectar cualquier elemento que tenga un fx:id
atributo en el controlador. buscará
- Cualquier
public
campo con un nombre de variable que coincida con elfx:id
atributo, o - Cualquier campo (
public
o no) con un nombre de variable que coincida con elfx:id
atributo anotado con@FXML
.
Entonces, en su ejemplo, dado que todos sus campos son public
, puede omitir todas las @FXML
anotaciones (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 @FXML
para 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á.
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