gpt4 book ai didi

javafx - 每个声明都需要 @FXML 吗?

转载 作者:行者123 更新时间:2023-12-02 19:42:12 25 4
gpt4 key购买 nike

@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 文件中定义的值注入(inject)到 Controller 类中的引用中。换句话说,如果您使用 @FXML 注解您的 timerLabel,那么当 load() 时,它将由 FXMLLoader 初始化。 方法由 FXML 文件中带有 fx:id="timerLabel" 的元素调用。正如其他人在评论中指出的那样,这意味着您永远不应该编写这样的代码

@FXML
private Label timerLabel = new Label();

这里 timerLabel 将首先初始化为您在代码中创建的 new Label();,然后几乎立即重新初始化为中定义的值FXML 文件。这往好了说是多余的,往坏了说是误导性的。如果您没有将变量名称与 fx:id 正确匹配,您的变量将引用错误的Label,并且该错误将很难追踪。

要回答您的实际问题:

FXMLLoader加载FXML文件时,它将尝试将任何具有fx:id属性的元素注入(inject)到 Controller 中。它将寻找

  1. 变量名称与 fx:id 属性匹配的任何 public 字段,
  2. 变量名与使用 @FXML 注释的 fx:id 属性匹配的任何字段(无论是否为 public)。<

因此,在您的示例中,由于所有字段都是 public,因此您可以省略所有 @FXML 注释(甚至是第一个),并且它仍然有效。

但是,如果您遵循良好实践并将字段设置为私有(private),则每个声明都必须注释为@FXML,注入(inject)才能正常工作。

所以

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

等等都可以,但是

@FXML
private Label timerLabel;
private TextField mainTextField;

不会。

关于javafx - 每个声明都需要 @FXML 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30210170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com