Cómo pasar el objeto creado en FXML Controller1 a Controller2 del control interno de FXML

Tengo la aplicación JavaFX 2.0, que consta de dos archivos FXML y 2 controladores para ellos + un archivo .java “principal”.

En el momento 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(); } 

Luego, cuando se hace clic en un botón de scene1, en su controlador de eventos en la clase Controller1, cambio scene1 root, para mostrar una nueva gui-view 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 trabajar con ese objeto en la escena siguiente, y NO debe ser una instancia nueva de la misma clase, pero el objeto, me he 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.

En FX 2.2 se introdujo una nueva API para controlador-nodo:

 // 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 de nota fx:root ):

      

Con esto, ha creado un nuevo control, que puede usar como controles regulares de JavaFX. Por ejemplo, en tu 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:

  

Estoy usando 1.7.0_21, ahora puede codificar de esta manera: en el archivo fxml de la aplicación principal,

    

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

  

y luego, en la aplicación principal, el controlador requiere el controlador “Tom.fxml” de la siguiente manera:

  @FXML private TomController tomController; 

fíjate en “@FXML”. tal vez invoque el controlador automático.