每个声明都需要@FXML吗?每个声明都需要@FXML,还是第一个?换句话说,我应该使用@FXMLpublic Label timerLabel = new Label();@FXMLpublic TextField mainTextField, projectTextField ;@FXMLpublic Button goButton, deleteAllButton ;@FXMLpublic ComboBox<String> projectComboBox ;@FXMLpublic TableView<Entry> mainTable ;@FXMLpublic TableColumn<Entry, String> titleColumn, timeColumn, dateColumn ;@FXMLpublic TableColumn<Entry, Boolean> checkColumn, buttonColumn ;@FXMLpublic checkBox checkAllCheckBox ;要么@FXMLpublic 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 ;谢谢!
3 回答
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
所述@FXML
注释使得能够FXMLLoader
注入以FXML文件中定义的值转换为在控制器类的引用。换句话说,如果你的注释timerLabel
用@FXML
,那么它将会被初始化FXMLLoader
时的load()
方法是通过与FXML文件中的元素叫fx:id="timerLabel"
。正如其他人在评论中指出的那样,这意味着你永远不应该写代码
@FXMLprivate Label timerLabel = new Label();
这里timerLabel
将首先初始化为new Label();
您在代码中创建的内容,然后几乎立即重新初始化为FXML文件中定义的值。这至多是多余的,最糟糕的是误导。如果未正确匹配变量名称,则fx:id
变量将引用错误,Label
并且很难跟踪错误。
要了解您的实际问题:
当FXMLLoader
加载FXML文件时,它将尝试将具有fx:id
属性的任何元素注入控制器。它会寻找
public
具有与fx:id
属性匹配的变量名称的任何字段,或任何
public
具有与使用fx:id
注释的属性匹配的变量名称的字段(或不具有)@FXML
。
因此,在您的示例中,由于您的所有字段都是public
,您可以省略所有@FXML
注释(即使是第一个),它仍然可以工作。
但是,如果您遵循良好做法并制作字段private
,则必须注释每个声明@FXML
以使注入工作。
所以
@FXMLprivate Label timerLabel;@FXMLprivate TextField mainTextField;
等会起作用,但是
@FXMLprivate Label timerLabel;private TextField mainTextField;
将不会。
波斯汪
TA贡献1811条经验 获得超4个赞
为每个人
fx:id="somename"
你需要一个
@FXMLpublic SomeClass somename;
我更喜欢把它写成一行,因为当有很多时候它更容易阅读
@FXML public SomeClass somename;
没有初始化
@FXMLpublic Label timerLabel = new Label(); // this is wrong
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
@FXMLprivate TextField idTextField;@FXMLprivate TextField passwordTextField;
要么
@FXMLprivate TextField idTextField, passwordTextField;
添加回答
举报
0/150
提交
取消