Hej, też miałem z tym problemy. Musisz to zrobić w kodzie, który będzie to okno zmieniał/wyświetlał nowe.
Najpierw tworzysz obiekt FXMLloadera, i ustawiasz lokalizacje do pliku FXML:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource(pathToViewFXML));
Potem żeby coś przesłać do kontrolera, korzystając z loadera, ładujesz hierarchię obiektów z pliku FXML do obiektu Node czy klas pochodnych takich jak Parent, Pane, VBox, Hbox, BorderPane etc.
container = loader.load();
W moim przypadku to był akurat VBox, ale nie ma to znaczenia
Dopiero teraz wyciągasz z loadera controller pliku FXML:
ChatController chatController = loader.getController();
Mając wcześniej zdefiniowane pola w kontrolerze, w moim przypadku będzie to String textToSet, a może to tez być obiekt Person, ustawiasz tą zmienną poprzez setter, a w kolejnej metodzie wykonujesz operacje wykorzystując ten obiekt. Nie ma potrzeby korzystania z metody Initialize w kontrolerze!
chatController.setTemporaryText("trololololo");
chatController.setTextOnChatArea();
I w dalszej części albo tworzysz nowe okno, poprzez utworzenie nowej sceny, dodanie do sceny Obiektu Node(Parent, VBox, Pane etc), utworzenie Stage i przekazanie do niego sceny, a następnie wyświetlenie okienka Stage np.:
Scene scene = new Scene(container);
Stage window = new Stage();
window.setScene(scene);
window.show();
Lub dodanie wszystkich elementów hierarchii FXML do akutalnego kontera, po uprzednim jego wyczyszczeniu:
public void show(VBox currentVBoxContainer, VBox changedContainer){
currentVBoxContainer.getChildren().clear();
currentVBoxContainer.setVgrow(changedContainer,Priority.ALWAYS); // nie jest wymagane
currentVBoxContainer.getChildren().addAll(changedContainer);
}
Moja klasa odpowiadająca za zmianę sceny ( z dodatkowymi przykładami :P)
public class SceneSwitcherModel {
private VBox container;
public VBox loadScreen(String pathToViewFXML) throws IOException {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource(pathToViewFXML));
container = loader.load();
ChatController chatController = loader.getController();
chatController.setTemporaryText("trololololo");
chatController.setTextOnChatArea();
return container;
}
public void show(VBox currentVBoxContainer, VBox changedContainer){
currentVBoxContainer.getChildren().clear();
currentVBoxContainer.setVgrow(changedContainer,Priority.ALWAYS);
currentVBoxContainer.getChildren().addAll(changedContainer);
}
}
Jest jeszcze kilka innych sposobów, np poprzez wykorzystanie Singletona, ale to tylko w odpowiedniej sytuacji. Wtedy w metodzie initialize, możesz pobrać instancje obiektu, który jest singletonem i dzięki temu obiektowi (wykorzystując pola tego obiektu etc) coś zmieniać na formatce.
Mam nadzieję, że pomogłem, jeśli tak zostaw najlepszą odpowiedź! :D W razie czego pisz :)