问题
Please how to share object User between Controllers? I have a TabPanelController. In initialization send to other controllers Data with object User. Its OK, but I cant acces to this object before stage shown.
Its possible acces to Stage in initialize method in controller, when controller is loaded before Stage? Or how handle onWindowShow in loader (When windows show, object User was filled)?
@FXML
private ActionController panelActionController;
@FXML
private StoreController panelStoreController;
@FXML
private ProfilesController panelProfilesController;
@FXML
private UsersController panelUsersController;
@FXML
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
Platform.runLater(new Runnable() {
@Override
public void run() {
menuUserInfo.setText(" " + loggedInUser.getName() + " " +
loggedInUser.getForname() + " (" + loggedInUser.getLogin() + ")");
menuUserInfo.setUserData(loggedInUser);
panelActionController.setLoggedUser(loggedInUser);
panelStoreController.setLoggedUser(loggedInUser);
panelProfilesController.setLoggedUser(loggedInUser);
panelUsersController.setLoggedUser(loggedInUser);
}
});
}
In panelActionController
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
System.out.println(loggedInUser); // NULL..
}
When i press any button in stage, loggedUser is not null. But i need set buttons, textfields by user role (Admin, User) during initialization.
回答1:
SOLVED:
1. Inject Controllers in Main TabPanel Controller
in fxml must have a root element (e.g. GridPane) with fx:id="panelAction". Controller must name: fx:id of GridPane + word Controller : panelActionController
@FXML
private ActionController panelActionController;
@FXML
private StoreController panelStoreController;
@FXML
private ProfilesController panelProfilesController;
@FXML
private UsersController panelUsersController;
2. I write getters for all child controllers in main TabPanelController:
public ActionController getActionController() {
return panelActionController;
}
public StoreController getStoreController() {
return panelStoreController;
}
public ProfilesController getProfilesController() {
return panelProfilesController;
}
public UsersController getUsersController() {
return panelUsersController;
}
3. And in main TabPanelStage (here i have Object loggedInUser) get all controllers
TabPanelController tabPanelController = fxmlLoader.getController();
ActionController actionController = tabPanelController.getActionController();
StoreController storeController = tabPanelController.getStoreController();
ProfilesController profilesController = tabPanelController.getProfilesController();
UsersController usersController = tabPanelController.getUsersController();
4. And then:
actionController.setComponentsByRole(loggedInUser.getRole());
来源:https://stackoverflow.com/questions/21848068/javafx-share-object-between-controllers