2013-11-20 21 views
7

は、それが言われている:このインタフェースは、コントローラに 位置及びリソース特性の自動注射によって置き換えられたJavaFXの「コントローラへの位置とリソースのプロパティの自動挿入」とは何ですか? <a href="http://docs.oracle.com/javafx/2/api/javafx/fxml/Initializable.html" rel="noreferrer"><code>Initializable</code></a>インタフェースの説明で

NOTE。 FXMLLoader は、コントローラーによって定義された適切に注釈された引数なしのinitialize() メソッドを自動的に呼び出します。可能であれば注入 のアプローチを使用することをお勧めします。

質問はどのように「適切な注釈付け」方法ですか? 1つの注釈しか見つかりません - @FXML他に何かありますか?

+0

スーザン@fxmlタグは、このヘルプあなた 'stackoverflow.com/questions/19523341/adding-a-tilepaneかもしれ変数またはコントローラは、より良いFXML方法を設計するための... FXMLで設計されていることを示しています-instmiated-in-java-files-to-fxml' –

+0

私は答えがまだ受け入れられていないのに驚いています。 :) – axiopisty

答えて

15

答えは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? 
関連する問題

 関連する問題