答えはlocated hereある:JavaFXの2.1およびそれ以前で
、コントローラクラスは に必要とされた関連FXML文書の内容 が完全にロードされたときに通知されるように初期化可能インタフェースを実装します。 JavaFX 2.2ではこれはもう必要ありません。 FXMLLoaderクラスのインスタンスは、コントローラのinitialize()メソッドを探し、利用可能な場合は を呼び出します。他のFXMLコールバックメソッド (イベントハンドラなど)と同様に、@FXML アノテーションが公開されていない場合、このメソッドにアノテーションを付ける必要があります。
開発者は、このアプローチを新しい 開発に使用することをお勧めします。 Initializableインターフェイスは廃止されていませんが、 は将来のリリースに含まれる可能性があります。
EDITは
より多くの研究の後、私は今、今注釈をコントローラにリソースバンドルを注入する方法を示すSSCCEを提供することができます。このSSCCEには、this SO questionへの回答からのわずかな変更が含まれています。
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:
ここ
はSSCCEです
<?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/_20107 463/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。プロパティ:
key1=Apellido
key2=Que tal?
スーザン@fxmlタグは、このヘルプあなた 'stackoverflow.com/questions/19523341/adding-a-tilepaneかもしれ変数またはコントローラは、より良いFXML方法を設計するための... FXMLで設計されていることを示しています-instmiated-in-java-files-to-fxml' –
私は答えがまだ受け入れられていないのに驚いています。 :) – axiopisty