How to pass object created in FXML Controller1 to Controller2 of inner FXML control
In FX 2.2 new API for controller-node was introduced:
// 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);
}
}
with next fxml (note tag fx:root
):
<fx:root type="javafx.scene.layout.HBox" xmlns:fx="http://javafx.com/fxml">
<children>
<ComboBox fx:id="cb" />
</children>
</fx:root>
By this you've created a new control, which you can use as regular JavaFX controls. E.g. in your case:
@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);
}
and in fxml:
<InnerFxmlControl />
i'm using 1.7.0_21, it can now code like this: in main app fxml file ,
<VBox ...>
<fx:include fx:id="tom" source="Tom.fxml" />
</VBox>
and the included fxml can defind it's own fxml file , like this :
<AnchorPane id="AnchorPane" fx:id="tomPan" ... xmlns:fx="http://javafx.com/fxml" fx:controller="**com.tom.fx.TomController**">
and then , in the main application contoller require the "Tom.fxml" 's controller like this :
@FXML private TomController tomController;
notice the "@FXML" . maybe it invoke the contoller automatic.