Have multiple FXML files (created in SceneBuilder), but only one controller. Does each scene load it's own copy of the controller?

Your controller file is a Java source file which gets compiled to a single Java class from which many Java object instances may be created.

At runtime the default fxml loader controller factory implementation will create a new controller instance (i.e. a new object), every time you invoke the fxml loader's load method.

Even if you are loading the same fxml file over and over again, the loader will create a new controller instance each time, each with it's own internal state independent of all others.

Similarly, if you load different fxml files all backed by the same controller class - each time you any fxml file, you will get a new controller instance.


Update to answer additional question on Controller data sharing

To share information between controllers using dependency injection or a separate initialization method, see:

Passing Parameters JavaFX FXML

Also, use of static class members will allow you to share information. Just don't use static in combination with @FXML, as that won't work.

There is a nice tutorial for working with multiple fxml files, which you may find helpful:

  • Part I
  • Part II

Note: it is technically possible to share a single controller among multiple FXML files

As pointed out in comments by Greg Brown:

it is possible to exercise greater control over controller instantiation using FXMLLoader#setController() and FXMLLoader#setControllerFactory().

I strongly do not recommend the following approach, which is further explained in the related answer to:

  • JavaFX multiple FXML and 1 shared controller