答案是located here:
在 JavaFX 2.1 及更早版本中,控制器类需要
实现Initializable接口,当内容被通知时
相关的 FXML 文档已完全加载。在 JavaFX 中
2.2,这不再是必要的。 FXMLLoader 类的一个实例只是在控制器上查找 initialize() 方法并调用
它,如果有的话。请注意,类似于其他 FXML 回调方法
例如事件处理程序,这个方法必须用@FXML注解
如果不公开,则注释。
建议开发者在新的
发展。 Initializable 接口尚未被弃用,但
可能在未来的版本中。
编辑
经过更多研究,我现在可以提供一个 SSCCE 来演示如何将资源包注入带有注释的控制器。请注意,此 SSCCE 包含对 this SO question 答案的轻微修改。
这里是 SSCCE:
com/stackexchange/stackoverflow/_20107463/MyController.java:
package com.stackexchange.stackoverflow._20107463;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class MyController {
@FXML
private Label label;
@FXML private ResourceBundle resources;
@FXML
private void initialize() {
label.setText(resources.getString("key1"));
}
// Or if you don't want to use @FXML you could do:
//public void initialize() {
// label.setText(resources.getString("key1"));
//}
}
com/stackexchange/stackoverflow/_20107463/MyView.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.*?>
<BorderPane fx:controller="com.stackexchange.stackoverflow._20107463.MyController" xmlns:fx="http://javafx.com/fxml">
<top>
<!-- This label's text will be set by the controller -->
<Label fx:id="label"/>
</top>
<center>
<!-- This label's text will be taken from the bundle automatically -->
<Label text="%key2"/>
</center>
</BorderPane>
com/stackexchange/stackoverflow/_20107463/BundleDemo.java:
package com.stackexchange.stackoverflow._20107463;
import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class BundleDemo extends Application {
private Stage stage;
@Override
public void start(Stage primaryStage) {
stage = primaryStage;
Button btnEN = new Button();
btnEN.setText("English");
btnEN.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
loadView(new Locale("en", "EN"));
}
});
Button btnKG = new Button();
btnKG.setText("Español");
btnKG.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
loadView(new Locale("es", "ES"));
}
});
VBox root = new VBox(20);
root.getChildren().add(HBoxBuilder.create().spacing(10).style("-fx-background-color: gray").padding(new Insets(5)).children(btnEN, btnKG).build());
root.getChildren().add(new StackPane());
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
private void loadView(Locale locale) {
try {
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setResources(ResourceBundle.getBundle("com.stackexchange.stackoverflow.bundles.MyBundle", locale));
Pane pane = (BorderPane) fxmlLoader.load(this.getClass().getResource("MyView.fxml").openStream());
// replace the content
StackPane content = (StackPane) ((VBox) stage.getScene().getRoot()).getChildren().get(1);
content.getChildren().clear();
content.getChildren().add(pane);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
com/stackexchange/stackoverflow/_20107463/MyBundle_en.properties:
key1=Name Surname
key2=How are you?
com/stackexchange/stackoverflow/_20107463/MyBundle_es.properties:
key1=Apellido
key2=Que tal?