When you begin with JavaFX, one problem you might come up with is the communication between different controllers to communicate between scenes. In this article, we will see how to properly communicate between two different controllers in JavaFX.
JavaFX Controller Communication Method
The solution here is to get the controller from FXMLLoader. We use JavaFX FXMLLoader for inflating fxml and loading new views. This loader has a method called getController(). getController method will return an instance of the controller corresponding to the view we are going to load.
In this example, we take input to a text field from the user. When a button is clicked, new window will be opened and we pass the typed text to new window.
First Scene Controller
When the button actionBtn is clicked, a new window will be called which is the second scene window. We take the input from inputField textfield and pass it with transfer data.
public class Scene1Controller implements Initializable {
@FXML
private TextField inputField;
@FXML
private Button actionBtn;
@Override
public void initialize(URL url, ResourceBundle rb) {
//When button clicked, load window and pass data
actionBtn.setOnAction(event -> {
loadSceneAndSendMessage();
});
}
private void loadSceneAndSendMessage() {
try {
//Load second scene
FXMLLoader loader = new FXMLLoader(getClass().getResource("/javafxcontrollercommunication/scene2/scene2.fxml"));
Parent root = loader.load();
//Get controller of scene2
Scene2Controller scene2Controller = loader.getController();
//Pass whatever data you want. You can have multiple method calls here
scene2Controller.transferMessage(inputField.getText());
//Show scene 2 in new window
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.setTitle("Second Window");
stage.show();
} catch (IOException ex) {
System.err.println(ex);
}
}
}
Second Scene Controller
This controller is elementary. You just have to write a method that accepts the string. Once the string is received, we set that in the display TextField.
public class Scene2Controller {
@FXML
private TextField display;
//Receive message from scene 1
public void transferMessage(String message) {
//Display the message
display.setText(message);
}
}
Watch another example on YouTube
You may also find following interesting:-
- JavaFX animation with examples: https://genuinecoder.com/javafx-animation-tutorial/
- JavaFX Splash Screen: https://genuinecoder.com/javafx-splash-screen-loading-screen/















