example - javafx fx controller
¿Se necesita @FXML para cada declaración? (3)
¿Se necesita @FXML para cada declaración 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<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 anotación
@FXML
permite que un
FXMLLoader
inyecte valores definidos en un archivo FXML en referencias en la clase de controlador.
En otras palabras, si anota su
timerLabel
con
@FXML
,
@FXML
lo inicializará cuando un elemento del archivo FXML invoque el método
load()
con
fx:id="timerLabel"
.
Como otros han señalado en los comentarios, esto significa que nunca debe escribir código como
@FXML
private Label timerLabel = new Label();
Aquí
timerLabel
se inicializará primero en la
new Label();
crea en el código y luego se reiniciará casi de inmediato al 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á a la
Label
incorrecta y el error será muy difícil de rastrear.
Para llegar a su pregunta real:
Cuando
FXMLLoader
carga el archivo FXML, intentará inyectar cualquier elemento que tenga un atributo
fx:id
en el controlador.
Buscará
-
Cualquier campo
public
con un nombre de variable que coincida con el atributofx:id
, o -
Cualquier campo (
public
o no) con un nombre de variable que coincida con el atributofx:id
anotado con@FXML
.
Entonces, en su ejemplo, dado que todos sus campos son
public
, puede omitir todas las anotaciones
@FXML
(incluso la primera) y aún funcionará.
Sin embargo, si sigue las buenas prácticas y hace que sus campos sean
private
, cada declaración debe anotarse en
@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 muchos
@FXML public SomeClass somename;
sin inicializar
@FXML
public Label timerLabel = new Label(); // this is wrong
@FXML
private TextField idTextField;
@FXML
private TextField passwordTextField;
O
@FXML
private TextField idTextField, passwordTextField;