2012-05-29 72 views
2

我用什么似乎是一个典型的JavaFX从FXML文件加载时start()方法:如何使用JavaFX中的首选项加载FXML?

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(); 
} 

我有一些变量对应的控制,如:

@FXML private TextField userName; 

我想从首初始化用户名的值,如:

prefs = Preferences.userRoot().node(this.getClass().getName()); 
    userName.setText(prefs.get("userName", userName.getText())); 

但是我什么时候能打电话吗?如果我的stage.show()之前做到这一点,的userName尚未实例化。

TIA

+0

过得好控制器?你是否在控制器类中创建了Preferences对象? –

+0

我在FXML中设置控制器,是的,我在那里创建首选项。请参阅下面的问题答案,并感谢您的关注。 – Michael

回答

7

让你的控制器实现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())); 
    }  
} 

另外请注意,您可以使用ResourceBundle并直接把你的默认fxml文件。只需创建my.properties文件和装载期间使用它:

FXMLLoader.load(
    getClass().getResource("layout.fxml"), 
    ResourceBundle.getBundle("my")); 

然后在FXML您可以使用从my.properties属性:

<TextField fx:id="userName" text="%userName" /> 
+1

谢谢!实际上,在翻阅了一些JavaFX文档后,我实际上只是想到了这一部分,但关于引用FXML文件中的设置的提示听起来非常有用。现在我需要弄清楚如何捕捉关闭事件并将值保存回去。你也可以帮忙吗? – Michael

+0

请为此更详细地写另一个问题。 –