JavaFX FXML
How to import fxml
import javafx.fxml.FXML;
When should I use the @FXML
annotation?
The @FXML
annotation enables an FXMLLoader
to inject values defined in an FXML file into references in the controller class.
In other words, if you annotate your timerLabel with @FXML
, then it will be initialized by the FXMLLoader
when the load()
method is called by an element in the FXML file with fx:id=”timerLabel”.
As others have pointed out in the comments, this means you should never write code like
@FXML
private Label timerLabel = new Label();
Here timerLabel
will first be initialized to the new Label()
; you create in the code, and will then almost immediately be re-initialized to the value defined in the FXML file. This is at best redundant, and at worst misleading. If you don’t correctly match the variable names to the fx:id, your variable will be referring to the wrong Label and the error will be very difficult to track down.
To get to your actual question:
When the FXMLLoader
loads the FXML file, it will attempt to inject any elements that have an fx:id
attribute into the controller.
It will look for any public field with a variable name matching the fx:id attribute, or any field (public or not) with a variable name matching the fx:id attribute that is annotated with @FXML
.
So in your example, since all your fields are public, you can omit all the @FXML
annotations (even the first) and it will still work.
However, if you follow good practice and make your fields private, then each declaration must be annotated @FXML
for the injection to work.
So
@FXML
private Label timerLabel;
@FXML
private TextField mainTextField;
etc will work, but
@FXML
private Label timerLabel;
private TextField mainTextField;
will not.
.fxml
file format example
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
</padding>
<Label fx:id="welcomeText"/>
<Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>
References
javafx - Is @FXML needed for every declaration? - Stack Overflow