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() {
// ...
}
}
我刚刚意识到我的控制器中有两个初始化方法 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
andresources
properties into the controller.FXMLLoader
will now automatically call any suitably annotated no-arginitialize()
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() {
// ...
}
}