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()
andFXMLLoader#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