Hello folks,
Today I would like to blog about the FXML define and include tag which can be very useful for those who are very keen to use FXML in their application. The FXML is an XML file which is loaded by javafx using FXMLLoader . It’s all loaded at the runtime and it’s really fast to load and easy to learn too. The previous blog about the FXML as Flexible XML is just a basic about FXML . Today in this blog here you will learn about how to include FXML files in your main FXML file.
I’m talking about the <fx:include> tag of the FXML.
Let’s see the basic flow of how the are loaded. Let’s assume there are two FXML <fx:include>Main.fxml and Child.fxml

Here in the above image you can see the Child.fxml is called inside Main.fxml embeded by Now you need to know that the <fx:define> are used for defining any variables or any instances inside FXML.<fx:define>
Let’s see things in real . We are going to make one simple Tab based application which simply get’s it’s tab content from different FXML files. Firstly we’ll make Main.fxml which contains the TabPane.
Main.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.effect.*?>
<?import fxmlstuff.Main?>
<Main xmlns:fx="http://javafx.com/fxml" fx:controller="fxmlstuff.Main" >
<fx:define>
<fx:include source="Home.fxml" fx:id="homeContent" />
<fx:include source="About.fxml" fx:id="aboutContent" />
</fx:define>
<center>
<TabPane fx:id="tabpane" translateY="5" translateX="5" >
<tabs>
<Tab text="HOME" fx:id="homeTab" content="$homeContent" closable="false" />
<Tab text="ABOUT" fx:id="aboutTab" content="$aboutContent" closable="false"/>
</tabs>
</TabPane>
</center>
</Main>
You can see the highlighted lines of which helps to load the content of Home.fxml and About.fxml in the Main.fxml . Also we ‘ve added fx:id property for making instances available of Home and About class. Now let’s see the FXController class of Main.fxml
package fxmlstuff;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.BorderPane;
/**
* @author Narayan
*/
public class Main extends BorderPane implements Initializable{
@FXML
private Home homeContent;
@FXML
private About aboutContent;
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
Here in the controller we have just made the instance of Home and About class with respective to their fx:id
Home.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import fxmlstuff.Home?>
<Home id="homeContent" xmlns:fx="http://javafx.com/fxml"
spacing="10" translateY="40" translateX="20" fx:controller="fxmlstuff.Home" >
<children>
<Label text="Add New Dock of Home" />
<Button text="Add !" onAction="#handleAction" />
</children>
</Home>
Home.java
package fxmlstuff;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.VBox;
/**
* @author Narayan
*/
public class Home extends VBox implements Initializable{
@FXML
private void handleAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
About.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import fxmlstuff.About?>
<About id="aboutContent" xmlns:fx="http://javafx.com/fxml"
spacing="10" translateY="40" translateX="20" fx:controller="fxmlstuff.About">
<children>
<Label text="Add New Dock of About" />
<Button text="Add !" onAction="#handleButtonAction" />
</children>
</About>
About.java
package fxmlstuff;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.VBox;
/**
* @author Narayan
*/
public class About extends VBox implements Initializable {
@FXML
private void handleButtonAction(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
Now you have finally finished the FXML stuffs of adding components inside the FXML. You can now just create one FXML Executor class which helps to execute and load your FXML using FXMLLoader.load() . I’m going to use the FXMLTest class as the executor of the FXML files in Stage.
FXMLTest.java
package fxmlstuff;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author Narayan
*/
public class FXMLTest extends Application{
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
Scene scene = new Scene(root,800,600);
stage.setTitle("FXML Test");
stage.setScene(scene);
stage.show();
}
}
The preview of this javafx class will be something like this.

The continue of this blog will be posted in coming week. The next blog post will contain the extended part of this application where you can take control over the event triggered from About.fxml and Home.fxml FXML component to the Main fxml.
That’s it for today. You can now easily include the fxml file inside the FXML file using things like this.
Have a
good day and fell free on commenting your views about this post.
Thanks

Pingback: Java desktop links of the week, January 30 | Jonathan Giles
#1 by Bill van Melle on February 1, 2012 - 7:34 am
Quote
One caution: you’re doing something that doesn’t do what it looks like it’s doing — you’re specifying that the controller for your fxml tree is the same as the root of the tree. In fact, they’re not. The controller for Main.fxml is a *different instance* of Main than the root of its tree (and ditto for your other two classes).
That doesn’t really matter for your simple example, but it will bite you if you decide to add any interesting functionality to any of your classes. Suppose you define setInterestingFeature in your Main class to do something to the display, and in your start method, you try to call it on the instance of Main that you created there (it’s your root variable). However, *that* instance of Main is not the controller, and thus does not have any access to its @FXML-annotated fields (e.g., aboutContent), so it cannot do anything at all to the display.
If you changed the root element of your fxml files to be BorderPane or VBox (as appropriate), and made your controller classes not extend BorderPane or VBox, the example should work identically, but would not suffer this confusion. And, of course, your controller classes wouldn’t carry any of the baggage that comes with subclassing a display node.
This isn’t explained at all well in the FXML documentation. If you come from the WPF world, you can easily be misled by thinking of FXML as XAML, an analogy that only goes so far. I’ve been spending the last week or so exploring reasonable alternative design patterns to use with FXML.
#2 by Narayan G. Maharjan on February 1, 2012 - 10:00 am
Quote
Hi,
The Main fxml have all instances access like About, Home fx controller
Thr setFeature function as u told in main class can be called by other instances only if its the static function. You cannot call the function directly by fxml without static.
I think you are also talking about this same thing
One more thing The next coming blog will contain how will the fml does conversation with each other.
Thanks for your comment.
#3 by Bill van Melle on February 2, 2012 - 12:29 am
Quote
No, I wasn’t talking about using static methods, which wouldn’t make any sense except for controls that only occur once in your application, and even then it would be kludgy.
I look forward to seeing your approach to communication between controls.
#4 by riley porter on February 9, 2012 - 7:59 am
Quote
I am with bill. I am doing (trying to) do exactly what you have said. Each tab has its own FXML file. However not sure how to get changes from ui components on one tab to affect another?
#5 by helasz on February 13, 2012 - 2:27 pm
Quote
Finally a comprehensive sample about fx:include!
I was searching for it since a while. Maybe it needs some refinement in root class issue like above, but it definitely works. Official FXML introduction description did not help me much to realize this fx:include feature.
So thanks a lot Narayan!