每个声明都需要@FXML吗?

@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 ; 

谢谢!

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

 @FXML private Label timerLabel = new Label(); 

这里timerLabel将首先被初始化为new Label(); 你在代码中创build,然后几乎立即被重新初始化为在FXML文件中定义的值。 这至多是多余的,最糟糕的是误导。 如果你没有正确地将variables名称与fx:id匹配,你的variables将引用错误的Label ,并且错误将很难被追踪。

为了得到你的实际问题:

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

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

所以在你的例子中,因为所有的字段都是public ,所以你可以省略所有的@FXML注解(即使是第一个),它仍然可以工作。

但是,如果您遵循良好的做法,并使您的字段是private ,那么每个声明必须注释@FXML注射工作。

所以

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

等将工作,但

 @FXML private Label timerLabel ; private TextField mainTextField ; 

将不会。

为每个

 fx:id="somename" 

你需要一个

 @FXML public SomeClass somename; 

我更喜欢把它写在一行中,因为当有很多时候更容易阅读

 @FXML public SomeClass somename; 

没有初始化

 @FXML public Label timerLabel = new Label(); // this is wrong