2013-11-20 4 views
7

In der Beschreibung der Initializable Schnittstelle heißt es:Was ist "automatische Injektion von Standort- und Ressourceneigenschaften in den Controller" in JavaFX?

HINWEIS Diese Schnittstelle durch automatische Injektion von Lage und Ressourcen-Eigenschaften in die Steuerung abgelöst wurde. FXMLLoader wird nun automatisch jede entsprechend annotierte Methode no-arg initialize() aufrufen, die vom Controller definiert wurde. Es wird empfohlen, die Injektion zu verwenden, wann immer dies möglich ist.

Die Frage ist: wie "geeignete Annotate" Methoden? Ich finde nur eine Anmerkung - @FXML. Gibt es noch andere?

+0

suzan @fxml Tag zeigt, dass der Variable oder Reglerentwurf in fxml ist ... für eine bessere fxml zu gestalten, können diese Ihnen helfen, 'stackoverflow.com/questions/19523341/adding-a-tilepane -instantiated-in-java-files-to-fxml' –

+0

Ich bin überrascht, dass die Antwort noch nicht akzeptiert wurde. :) – axiopisty

Antwort

15

Die Antwort ist located here:

In JavaFX 2.1 und früher wurden Controller-Klassen erforderlich, um die initialisierbare Schnittstelle implementieren benachrichtigt werden, wenn der Inhalt des zugehörigen FXML Dokument vollständig geladen worden war. In JavaFX 2.2 ist dies nicht mehr notwendig. Eine Instanz der FXMLLoader-Klasse sucht einfach nach der initialize() -Methode auf dem Controller und ruft , sofern verfügbar, auf. Beachten Sie, dass diese Methode ähnlich wie andere FXML-Rückrufmethoden wie Ereignisbehandlungsroutinen mit der Anmerkung @FXML kommentiert werden muss, wenn sie nicht öffentlich ist.

Es wird empfohlen, dass Entwickler diesen Ansatz für neue Entwicklung verwenden. Die Schnittstelle Initialisierbar wurde nicht veraltet, aber könnte in einer zukünftigen Version enthalten sein.

EDIT

Nach mehr Forschung, kann ich jetzt liefern nun eine SSCCE demonstriert, wie ein Ressourcenbündel in einen Controller mit Anmerkungen zu injizieren. Bitte beachten Sie, dass dieses SSCCE geringfügige Änderungen von der Antwort auf this SO question enthält. Hier

ist die SSCCE:

com/Stack/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/Stack/Stackoverflow/_20107463/MyView.fxml:

com/staplexchange/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/Stack/Stackoverflow/_20107463/MyBundle_en.properties:

key1=Name Surname 
key2=How are you? 

com/Stack/Stackoverflow/_20107463/MyBundle_es.Eigenschaften:

key1=Apellido 
key2=Que tal? 
Verwandte Themen