每个声明都需要@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
属性的元素注入到控制器中。 它会寻找
- 任何具有与
fx:id
属性匹配的variables名称的public
字段 - 具有与用
@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