Is @FXML needed for every declaration or just for the first?
In other words, should I use
@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 ;
Or
@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 ;
Thank you!
The @FXML annotation is used to tag nonpublic controller member fields and handler methods for use by FXML markup. The handleSubmtButtonAction method sets the actiontarget variable to Sign in button pressed when the user presses the button. You can run the application now to see the complete user interface.
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
public
field with a variable name matching the fx:id
attribute, or
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With