JavaFX控制器的两个初始化方法

JavaFX controller's two initialize methods

我刚刚意识到我的控制器中有两个初始化方法 class。

一个由 Scene Builder 创建,不要求 class 实现 Initializable 接口。

@FXML
void initialize()
{
    assert birthDate != null
            : "fx:id=\"birthDate\" was not injected: check your FXML file 'baptismEntryView.fxml'.";
    assert baptismDate != null
            : "fx:id=\"baptismDate\" was not injected: check your FXML file 'baptismEntryView.fxml'.";
    ...
}

另外一个带两个参数的需要实现Initalizable接口

@Override
public void initialize(URL location, ResourceBundle resources)
{
    ...
}

我看到有区别,需要实现 Initializable 接口的初始化允许我在创建控制器期间访问 ResourceBundle。

我想问的是它们的调用顺序是什么以及我应该在其中做什么(也许是一些 docs/tutorial 参考?)。

你不应该两者兼而有之。我找不到关于此的文档,但似乎如果控制器实现了 Initializable,则永远不会调用无参数 initialize() 方法。

其实是recommended你没有实现Initializable:

NOTE This interface has been superseded by automatic injection of location and resources properties into the controller. FXMLLoader will now automatically call any suitably annotated no-arg initialize() method defined by the controller. It is recommended that the injection approach be used whenever possible.

如果您仍然需要访问 ResourceBundle(and/or 位置 URL),那么您可以执行以下操作:

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;

public class Controller {
  
  // you don't need to declare both 'location' and 'resources'
  @FXML private URL location;
  @FXML private ResourceBundle resources;

  @FXML
  private void initialize() {
    // ...
  }
}