从FXML文件加载时,我正在使用看似典型的JavaFX start()方法:
public void start(Stage stage) throws Exception {
this.stage = stage;
Scene scene = new Scene(FXMLLoader.<AnchorPane>load(getClass().getResource("layout.fxml")));
stage.setScene(scene);
stage.show();
}
Run Code Online (Sandbox Code Playgroud)
我有一些与控件对应的变量,例如:
@FXML private TextField userName;
Run Code Online (Sandbox Code Playgroud)
我想将userName初始化为Preferences中的值,如下所示:
prefs = Preferences.userRoot().node(this.getClass().getName());
userName.setText(prefs.get("userName", userName.getText()));
Run Code Online (Sandbox Code Playgroud)
但我什么时候可以打电话给他?如果我在stage.show()之前执行此操作,则userName尚未实例化.
TIA
使您的Controller实现Initializable并将加载initialize():
public class Sample implements Initializable {
@FXML private TextField userName;
@Override
public void initialize(URL url, ResourceBundle rb) {
Preferences prefs = Preferences.userRoot().node(this.getClass().getName());
userName.setText(prefs.get("userName", userName.getText()));
}
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您可以ResourceBundle将默认值直接用于fxml文件.只需创建my.properties文件并在加载过程中使用它:
FXMLLoader.load(
getClass().getResource("layout.fxml"),
ResourceBundle.getBundle("my"));
Run Code Online (Sandbox Code Playgroud)
然后在你的fxml中你可以使用以下属性my.properties:
<TextField fx:id="userName" text="%userName" />
Run Code Online (Sandbox Code Playgroud)