如何在JavaFX中使用Preferences中的值加载FXML?

Mic*_*ael 3 javafx-2

从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

Ser*_*nev 8

使您的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)