2012-03-15 19 views
11

Tengo la aplicación JavaFX 2.0, que consta de dos archivos FXML, y 2 controladores para ellos + un archivo .java "principal".Cómo pasar un objeto creado en FXML Controller1 a Controller2 del control FXML interno

A la hora de inicio, FXML1 se inicializa, así:

public void start(Stage stage) throws Exception { 
    stage.setTitle("Demo Jabber JavaFX Chat"); 

    Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"), 
     ResourceBundle.getBundle("fxmlexample.fxml_example"));   
    Scene scene = new Scene(root, 226, 264); 
    stage.setScene(scene); 
    scene.getStylesheets().add("fxmlexample/fxmlstylesheet.css"); 
    stage.show(); 
} 

Entonces, cuando se hace clic en un botón de ESCENA1, en su controlador de eventos en la clase Controller1, cambio de raíz ESCENA1, para mostrar la nueva interfaz gráfica de usuario -vista para un usuario. Y en este controlador inicializo algún objeto. Por ejemplo así:

public class FXMLExampleController { 
    //some fields... 
    private MySuperObject c; 
    @FXML protected void handleSubmitButtonAction(ActionEvent event) { 
    //some fields... 
    c = new MySuperObject(); //here i initialize my object, i'm interested in 
    try { 
     c.login(username, password); // some actions with this object, which i need to make. 
     Scene cc = buttonStatusText.getScene(); 
     Parent root = null; 
     try { 
      //changing a scene content... 
      root = FXMLLoader.load(getClass().getResource("fxml_example2.fxml"), 
      ResourceBundle.getBundle("fxmlexample.fxml_example")); 
     } catch (IOException ex) { 
      Logger.getLogger(FXMLExampleController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     cc.setRoot(root); 
     } 

Y, después de eso, tengo que hacer un trabajo con ese objeto en la escena siguiente, y no debe ser una nueva instancia de la misma clase, pero el objeto, i' ve inicializado en la primera escena.

Entiendo cómo hacer todo esto usando "standart java", pero estoy un poco confundido en esta tarea usando JavaFX + FXML.

Respuesta

24

En FX 2.2 se introdujo nueva API de controlador de nodos:

// create class which is both controller and node 
public class InnerFxmlControl extends HBox implements Initializable { 
    @FXML public ComboBox cb; 

    public InnerFxmlControl() { 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml_example2.fxml")); 
    fxmlLoader.setRoot(this); 
    fxmlLoader.setController(this); 
    try { 
     fxmlLoader.load();    
    } catch (IOException exception) { 
     throw new RuntimeException(exception); 
    } 
    } 

con el siguiente fxml (etiqueta nota fx:root):

<fx:root type="javafx.scene.layout.HBox" xmlns:fx="http://javafx.com/fxml"> 
    <children> 
    <ComboBox fx:id="cb" /> 
    </children> 
</fx:root> 

Por esto se ha creado un nuevo control, el cual puede usar como controles regulares de JavaFX. P.ej. en su caso:

@FXML protected void handleSubmitButtonAction(ActionEvent event) { 
    // you just create new control, all fxml tricks are encapsulated 
    InnerFxmlControl root = new InnerFxmlControl(); 
    // and you can access all its' methods and fields including matched by @FXML tag: 
    root.cb.getItems().add("new item"); 

    Scene cc = buttonStatusText.getScene(); 
    cc.setRoot(root); 
    } 

y en fxml:

<InnerFxmlControl /> 
+0

¿Cuáles son los root.cb. ** minutes ** .getItems(). add ("nuevo elemento"); y ** cc ** .setRoot (root); en la última pieza de código? –

+0

Lo sentimos, los 'minutos' son de copiar y pegar incorrectamente. Y 'cc' del ejemplo original del código de Victoria. Actualizado. –

3

estoy usando 1.7.0_21, que ahora puede código como este: en el archivo de aplicación principal fxml,

<VBox ...> 
     <fx:include fx:id="tom" source="Tom.fxml" /> 
</VBox> 

y el fxml incluido puede definir su propio archivo fxml, así:

<AnchorPane id="AnchorPane" fx:id="tomPan" ... xmlns:fx="http://javafx.com/fxml" fx:controller="**com.tom.fx.TomController**"> 

y luego, en el controlador principal de la aplicación requieren controlador de la "Tom.fxml" 's como esto:

@FXML private TomController tomController; 

aviso el "@FXML". tal vez invoque el controlador automático.

+0

¡Gracias por contribuir! Una pregunta: el fx: id es tom pero el controlador inyectado se llama tomController? ¿Por qué mecanismo están asociados? –

+0

JavaFX inyecta "Controlador" a fx: id. – Marckaraujo

+0

En caso de que no esté claro, javaFX inyectará automáticamente el controlador en el campo denominado Controlador . Entonces, si fx: id = "tom" inyectará una instancia del controlador en un campo llamado tomController. – uesports135

Cuestiones relacionadas