WHAT I HAVE is a standard JavaFX application:
Main.java, MainController.java & main.fxml. To add custom component, I created
PROBLEM is that in
CustomComponentController methods I need to reference other methods and standard components from
MenuController. I add
public static MainController mc; to
MainController class body, so that it can be seen from
MainController.mc.neededMethod()). Then I try to pass everything to it in
MainController.initialize() method (
mc = this;) - when debugging this breakpoint, I see
this full of components instances, but
mc remains with null components afterwards.
QUESTION is how to reference the running instance of
MainController to use its components and methods in other classes and to crossreference different custom components from each other? How to clean
MainController code from event handlers and assistance methods of components by moving it all to component's own class?
I tried the following approaches, but found no way to make them work without errors:
The problem can be solved if you comply the following conditions:
Not only public, but obligatory static
MainController mc should be.
Do not forget id in fxml for CustomComponentController:
<CustomComponentController fx:id="cc"/>, where cc is the name of the "@FXML imported" CustomComponentController in your MainController class.
custom_component_controller.fxml as it results in "Controller value already specified" error (a conflict between
custom_component_controller.fxml markup declared controllers).
mc = this; in the beginning of
initialize() method. Before using
mc in CustomComponentController class, check if it's not null. It can be null when all components, including
CustomComponentController, are instantiated at application startup, but there is no mc instance yet. MainController method
initialize() where MainController is instantiated is called after components are loaded. Therefore better practice is to use approach in the next paragraph.
main.fxml create primary component of the same type that
CustomComponentController and with the only
fx:id parameter. Replace primary component with your
CustomComponentController by creating
reloadCustomComponents() method and calling it from
initialize() method. Do it by adding the following to
customComponent = new customComponent();
Thus all components can be placed outside
CustomComponentController with all their methods and reloaded at the startup of the apllication. All component declarations stay in
MainController class and can be reached through
MainController mc reference. No duplicate creating of components in detail with parameters is needed.
Your problem looks like the classic catalog-crud forms updating, I implemented an interface that I called
Updatable with an
update method so I could reference any catalog form with any crud form easy after passing
Controller Main Class as the
UserData Property of the Child Root Component's Form
Hope it Can Solve your problem