为了账号安全,请及时绑定邮箱和手机立即绑定

每个声明都需要@FXML吗?

/ 猿问

每个声明都需要@FXML吗?

SMILET 2019-08-19 17:40:18

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

谢谢!


查看完整描述

3 回答

?
慕尼黑8549860

所述@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属性的任何元素注入控制器。它会寻找

  1. public具有与fx:id属性匹配的变量名称的任何字段,

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

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

但是,如果您遵循良好做法并制作字段private,则必须注释每个声明@FXML以使注入工作。

所以

@FXMLprivate Label timerLabel;@FXMLprivate TextField mainTextField;

等会起作用,但是

@FXMLprivate Label timerLabel;private TextField mainTextField;

将不会。


查看完整回答
反对 回复 2019-08-19
?
波斯汪

为每个人

fx:id="somename"

你需要一个

@FXMLpublic SomeClass somename;

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

@FXML public SomeClass somename;

没有初始化

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


查看完整回答
反对 回复 2019-08-19
?
繁星点点滴滴
@FXMLprivate TextField idTextField;@FXMLprivate TextField passwordTextField;

要么

@FXMLprivate TextField idTextField, passwordTextField;


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信