2012-05-29 69 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

請爲此更詳細地寫另一個問題。 –