每个声明都需要@FXML 吗?
Is @FXML needed for every declaration?
是每个声明都需要@FXML 还是只需要第一个声明?
换句话说,我应该使用
@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 ;
或
@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 ;
谢谢!
每个
fx:id="somename"
你需要一个
@FXML
public SomeClass somename;
我更喜欢写在一行中,因为当有很多的时候更容易阅读
@FXML public SomeClass somename;
没有初始化
@FXML
public Label timerLabel = new Label(); // this is wrong
@FXML
注释使 FXMLLoader
能够将 FXML 文件中定义的值注入到控制器 class 中的引用中。换句话说,如果您使用 @FXML
注释 timerLabel
,那么当 FXML 文件中的元素调用 load()
方法时,它将由 FXMLLoader
初始化fx:id="timerLabel"
。正如其他人在评论中指出的那样,这意味着您永远不应该编写像
这样的代码
@FXML
private Label timerLabel = new Label();
这里 timerLabel
将首先初始化为您在代码中创建的 new Label();
,然后几乎立即重新初始化为 FXML 文件中定义的值。这充其量是多余的,最坏的情况下是误导性的。如果您没有将变量名称与 fx:id
正确匹配,您的变量将引用错误的 Label
并且错误将很难追踪。
要回答您的实际问题:
当 FXMLLoader
加载 FXML 文件时,它将尝试将任何具有 fx:id
属性的元素注入到控制器中。它将寻找
- 变量名称与
fx:id
属性匹配的任何 public
字段,或
- 任何字段(
public
或不),其变量名称与用 @FXML
. 注释的 fx:id
属性匹配
因此在您的示例中,由于您的所有字段都是 public
,您可以省略所有 @FXML
注释(即使是第一个),它仍然有效。
但是,如果您遵循良好做法并制作字段 private
,则每个声明都必须注释 @FXML
才能使注入工作。
所以
@FXML
private Label timerLabel;
@FXML
private TextField mainTextField;
等可以,但是
@FXML
private Label timerLabel;
private TextField mainTextField;
不会。
@FXML
private TextField idTextField;
@FXML
private TextField passwordTextField;
或
@FXML
private TextField idTextField, passwordTextField;
是每个声明都需要@FXML 还是只需要第一个声明?
换句话说,我应该使用
@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 ;
或
@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 ;
谢谢!
每个
fx:id="somename"
你需要一个
@FXML
public SomeClass somename;
我更喜欢写在一行中,因为当有很多的时候更容易阅读
@FXML public SomeClass somename;
没有初始化
@FXML
public Label timerLabel = new Label(); // this is wrong
@FXML
注释使 FXMLLoader
能够将 FXML 文件中定义的值注入到控制器 class 中的引用中。换句话说,如果您使用 @FXML
注释 timerLabel
,那么当 FXML 文件中的元素调用 load()
方法时,它将由 FXMLLoader
初始化fx:id="timerLabel"
。正如其他人在评论中指出的那样,这意味着您永远不应该编写像
@FXML
private Label timerLabel = new Label();
这里 timerLabel
将首先初始化为您在代码中创建的 new Label();
,然后几乎立即重新初始化为 FXML 文件中定义的值。这充其量是多余的,最坏的情况下是误导性的。如果您没有将变量名称与 fx:id
正确匹配,您的变量将引用错误的 Label
并且错误将很难追踪。
要回答您的实际问题:
当 FXMLLoader
加载 FXML 文件时,它将尝试将任何具有 fx:id
属性的元素注入到控制器中。它将寻找
- 变量名称与
fx:id
属性匹配的任何public
字段,或 - 任何字段(
public
或不),其变量名称与用@FXML
. 注释的
fx:id
属性匹配
因此在您的示例中,由于您的所有字段都是 public
,您可以省略所有 @FXML
注释(即使是第一个),它仍然有效。
但是,如果您遵循良好做法并制作字段 private
,则每个声明都必须注释 @FXML
才能使注入工作。
所以
@FXML
private Label timerLabel;
@FXML
private TextField mainTextField;
等可以,但是
@FXML
private Label timerLabel;
private TextField mainTextField;
不会。
@FXML
private TextField idTextField;
@FXML
private TextField passwordTextField;
或
@FXML
private TextField idTextField, passwordTextField;