每个声明都需要@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 属性的元素注入到控制器中。它将寻找

  1. 变量名称与 fx:id 属性匹配的任何 public 字段,
  2. 任何字段(public 或不),其变量名称与用 @FXML.
  3. 注释的 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;