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