How to make Navigation Drawer (Side Panel) in JavaFX – JavaFX Drawer

Navigation drawer provides an intuitive way to keep main navigation controls of the UI clean. The drawer will only be made visible to the user on certain actions like button click so that we can make use of that space for much more important things yet keeping controls reachable with single click.

Android introduced the material design Navigation bar or side pane or whatever you call, with its Material design goodness. JFoenix library provides JFXDrawer component.

Today, I will be showing how to implement the Navigation drawer on your JavaFX application using JFoenix material design library. If you want some help on setting up the JFoenix material design library, see my post JavaFX Material Design : Setting Up and Making Login Application.

I have made a video to make things more clear. You can watch it right here.


If you are the kind of person who do not like to watch tutorial videos, read from here. I will explain it step by step.

Step 1 : Design Content For Navigation Drawer 

At first, you have to create an FXML layout for the Navigation bar itself. This layout can then be inflated to the navigation bar holder later. The above image shows a pretty simple VBox layout that consists of 4 Buttons and one image view. This content can the be loaded to a VBox variable in our code (from the main controller) using the following code

VBox box = FXMLLoader.load(getClass().getResource("SidePanelContent.fxml");
Step 2 : Design The Container (Main) Window
Main window with Hamburger
Main window with Hamburger

Now we  have the navigation bar content. In this step, you have to design the main application window. The JFXDrawer can be added using scene builder by drag and drop. Once you position the drawer on the space you want, you can set the drawer direction to LEFT, RIGHT, TOP or BOTTOM from the Properties section of Scene Builder.

I have added a JFXHamburger for material design look and feel. I have thouroughly explained how to use JFXHamburger in this video . If you don’t like to have a Hamburger, you can use a simple button. Add an action listener to your button and add this code.
//Accessing FXML Element
JFXDrawer drawer;
//Add this in ActionListener

The navigation drawer can be made visible by using the open() method. It can be made invisible through the function call close().

Step 3 : Setting the content of Drawer

Now we have two separate components. The Drawer and Main window. We can attach the box loaded in step 1 to our drawer in main window using the following code.

Step 4 : There is no 4th step. You are done !
I used to get happier when things get completed sooner that expected. That’s why there is a step 4 🙂
Run the code now. When you click on your button or Hamburger,you should see the navigation drawer like this. If you have some alignment issues for the drawer, increase the value of “Default Drawer Size” from the Scene Builder.

Recently, as part of library management software tutorial, I have created more elaborate tutorial about creating Navigation Drawer. It contains more complex buttons with icons and CSS styling. Watch those tutorial videos from the following link.

  1. Designing The Drawer
  2. Attaching drawer to Dashboard
  3. Handling Button Click Events

Get Project From GitHub


You might also be interested in:-

  1. JavaFX Library Management System Development:
  2. JavaFX Animation Tutorial:
  3. JavaFX 3D Tutorial:
Muhammed Afsal Villan
Muhammed Afsal Villan is an experienced full-stack developer, specialized in desktop and mobile application development. He also regularly publishes quality tutorials on his YouTube channel named 'Genuine Coder'. He likes to contribute to open-source projects and is always enthusiastic about new technologies.


  1. I downloaded your source code, but when I run it I encounter this error.

    Exception in Application start method


    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(

    at java.lang.reflect.Method.invoke(

    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(

    at com.sun.javafx.application.LauncherImpl.launchApplication(

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(

    at java.lang.reflect.Method.invoke(

    at sun.launcher.LauncherHelper$FXHelper.main(

    Caused by: java.lang.RuntimeException: Exception in Application start method

    at com.sun.javafx.application.LauncherImpl.launchApplication1(

    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(

    at com.sun.javafx.application.LauncherImpl$$Lambda$48/ Source)


    Caused by: java.lang.NullPointerException: Location is required.

    at javafx.fxml.FXMLLoader.loadImpl(

    at javafx.fxml.FXMLLoader.loadImpl(

    at javafx.fxml.FXMLLoader.loadImpl(

    at javafx.fxml.FXMLLoader.loadImpl(

    at javafx.fxml.FXMLLoader.loadImpl(

    at javafx.fxml.FXMLLoader.load(

    at naivgationdrawer.NaivgationDrawer.start(

    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(

    at com.sun.javafx.application.LauncherImpl$$Lambda$51/ Source)

    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(

    at com.sun.javafx.application.PlatformImpl$$Lambda$44/ Source)

    at com.sun.javafx.application.PlatformImpl.lambda$null$164(

    at com.sun.javafx.application.PlatformImpl$$Lambda$47/ Source)

    at Method)

    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(

    at com.sun.javafx.application.PlatformImpl$$Lambda$45/ Source)


    at Method)


    at$$Lambda$37/ Source)

    … 1 more

    Exception running application naivgationdrawer.NaivgationDrawer

    C:UsersYESSI PACDownloadsJFXDrawerNaivgationDrawernbprojectbuild-impl.xml:1051: The following error occurred while executing this line:

    C:UsersYESSI PACDownloadsJFXDrawerNaivgationDrawernbprojectbuild-impl.xml:805: Java returned: 1

    BUILD FAILED (total time: 4 seconds)