19

每个声明都需要@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 ;

谢谢!

4

3 回答 3

51

@FXML注释允许将FXMLLoaderFXML 文件中定义的值注入到控制器类中的引用中。换句话说,如果你用 注释你timerLabel的,那么当FXML 文件中的元素调用该方法时@FXML,它将被初始化。正如其他人在评论中指出的那样,这意味着您永远不应该编写类似的代码FXMLLoaderload()fx:id="timerLabel"

@FXML
private Label timerLabel = new Label();

这里timerLabel将首先初始化为new Label();您在代码中创建的值,然后几乎立即重新初始化为 FXML 文件中定义的值。这充其量是多余的,最坏的情况是误导。如果您没有将变量名正确匹配到fx:id,您的变量将引用错误Label,并且该错误将很难追踪。

要解决您的实际问题:

FXMLLoader加载 FXML 文件时,它会尝试将任何具有fx:id属性的元素注入到控制器中。它会寻找

  1. 具有与属性public匹配的变量名称的任何字段,fx:id
  2. 具有与带有注释的属性public匹配的变量名称的任何字段(或不) 。fx:id@FXML

因此,在您的示例中,由于您的所有字段都是public,您可以省略所有@FXML注释(甚至是第一个),它仍然可以工作。

但是,如果您遵循良好的做法并设置您的 fields private,则必须对每个声明进行注释@FXML以使注入工作。

所以

@FXML
private Label timerLabel;
@FXML
private TextField mainTextField;

等会工作,但是

@FXML
private Label timerLabel;
private TextField mainTextField;

将不会。

于 2015-05-13T11:09:22.630 回答
7

对于每个

fx:id="somename"

你需要一个

@FXML
public SomeClass somename;

我更喜欢用一行写,因为很多时更容易阅读

@FXML public SomeClass somename;

无需初始化

@FXML
public Label timerLabel = new Label(); // this is wrong
于 2015-05-13T11:05:45.270 回答
0
@FXML
private TextField idTextField;

@FXML
private TextField passwordTextField;

或者

@FXML
private TextField idTextField, passwordTextField;
于 2019-07-07T09:18:22.683 回答