2013-11-20 3 views
7

Nella descrizione di Initializable dell'interfaccia è detto:Che cos'è "iniezione automatica di proprietà di ubicazione e risorse nel controller" in JavaFX?

NOTA Questa interfaccia è stata sostituita da iniezione automatica di posizione e le risorse proprietà nel controllore. FXMLLoader chiama automaticamente qualsiasi metodo no-arg initialize() definito dal controller. Si consiglia di utilizzare l'approccio di iniezione quando possibile.

La domanda è: come utilizzare i metodi di "annotazione adeguata"? Trovo solo un'annotazione - @FXML. Ce ne sono altri?

+0

tag @fxml Suzan dimostra che la variabile o il controller sono in progettazione fxml ... per la progettazione di un modo migliore fxml può essere questo aiuterà 'stackoverflow.com/questions/19523341/adding-a-tilepane -instantiated-in-java-files-to-fxml' –

+0

Sono sorpreso che la risposta non sia stata ancora accettata. :) – axiopisty

risposta

15

La risposta è located here:

In JavaFX 2.1 e versioni precedenti, classi controller sono stati necessari per implementare l'interfaccia Initializable ricevere una notifica quando il contenuto del documento FXML associata era stato completamente caricato. In JavaFX 2.2, questo non è più necessario. Un'istanza della classe FXMLLoader cerca semplicemente il metodo initialize() sul controller e chiama lo , se disponibile. Si noti che, analogamente ad altri metodi di callback FXML come gestori di eventi, questo metodo deve essere annotato con l'annotazione @FXML se non è pubblico.

Si consiglia agli sviluppatori di utilizzare questo approccio per il nuovo sviluppo . L'interfaccia Inizializzabile non è stata deprecata, ma potrebbe essere in una versione futura.

EDIT

Dopo ulteriori ricerche, ora posso ora fornire uno SSCCE che dimostra come iniettare un pacchetto di risorse in un controller con annotazioni. Si noti che questo SSCCE contiene lievi modifiche dalla risposta allo this SO question.

Ecco la 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/_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.proprietà:

key1=Apellido 
key2=Que tal?