Is there a way to set the controller for the <fx:include> element before loading the fxml of the same ?? This is what i am trying but it seems like the FXMLLoader which is loading the <fx:include> element is setting some other controller for the same. Is there a way to access the FXMLLoader loading the <fx:include> and set my own controller before loading the fxml ???
package fxminclude;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
public class ParentController implements Initializable {
@FXML
private TextField nameField;
@FXML
private TextField valueField;
@FXML
private HBox title;
@FXML
private TitleController titleController;
private Model model;
public ParentController(Model model) {
this.model = model;
titleController = new TitleController(model);
}
@Override
public void initialize(URL location, ResourceBundle resources) {
nameField.setText(model.nameProperty().get());
model.nameProperty().bind(nameField.textProperty());
valueField.setText(model.valueProperty().get());
model.valueProperty().bind(valueField.textProperty());
titleController.initialize(location, resources);
}
}
package fxminclude;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
public class TitleController implements Initializable {
@FXML
private TextField titleField;
private Model model;
public TitleController(Model model) {
this.model = model;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
titleField.setText(model.titleProperty().get()); // Getting NPE here
model.titleProperty().bind(titleField.textProperty());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox prefHeight="412.0" prefWidth="352.0" xmlns:fx="http://javafx.com/fxml">
<children>
<HBox alignment="CENTER" prefHeight="53.0" prefWidth="352.0">
<children>
<Label id="Name" text="Name" />
<TextField fx:id="nameField" prefWidth="200.0" />
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="47.0" prefWidth="352.0">
<children>
<Label text="Value" />
<TextField fx:id="valueField" prefWidth="200.0" />
</children>
</HBox>
<Pane prefHeight="312.0" prefWidth="352.0">
<children>
<fx:include fx:id="title" source="title.fxml" layoutX="42.0" /> //here
</children>
</Pane>
</children>
</VBox>
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<HBox alignment="CENTER" prefHeight="38.0" prefWidth="269.0" xmlns:fx="http://javafx.com/fxml">
<children>
<Label text="Title" />
<TextField fx:id="titleField" prefWidth="200.0" />
</children>
</HBox>
package fxminclude;
import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.VBox;
public class ParentView {
protected VBox template;
public ParentView(ParentController controller) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.setController(controller);
try {
loader.load();
} catch (IOException ex) {
ex.printStackTrace();
}
template = loader.getRoot();
}
public VBox getTemplate() {
return template;
}
}