javafxreturn-valuestage

How to return value from a stage before closing it?


I have a "main stage" where I press a button to open a "second stage" where I have a table, the user selects one item of the the table and click on "asignar" button (which is just a confirm button), once clicked, it must return the code of the item selected in the table to the main stage and close the second stage.

Here is the code that matters.

I have an INT variable which must take the value of a function:

codigo = controller.setVista(this, usuario, password);

The "setVista" function goes like this:

public int setVista(ListHorarios vista, String usuario, String password) {
this.vista = vista;
this.usuario = usuario;
this.password = password;
this.inicializarTabla();
this.actualizarTabla(0, "%");
   
btnSeleccionar.setOnAction(e -> {
    asignarSeleccion();
    Stage stage = (Stage) btnSeleccionar.getScene().getWindow(); 
    stage.close();
});
    return codigo_horario;
}

And the "asignarSeleccion" like this:

private void asignarSeleccion() {
    final HorarioTableModelo aux_horario = getTablaSeleccionada();
    posicion = datos.indexOf(aux_horario);
    if (aux_horario != null) {
        codigo_horario = aux_horario.getCodigo();
    }
}

My problem is that I can't get the "codigo_horario" value into the first variable "codigo" before the stage closes, what do I am missing?


Solution

  • Here is a possible example. The structure is the same as in the answer in my comment.

    The second Stage is opened through a "controller" that is stores the data that should be returned even when the Stage is closed and exposes a getter to be used to retrieve the value from the outer world.

    import javafx.application.Application;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.VBox;
    
    
    public class Main extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            try {
                BorderPane root = new BorderPane();
                Scene scene = new Scene(root,400,400);
    
                Button bSecondStage = new Button("Show second Stage");
                bSecondStage.setOnAction(e -> {
                    WindowController wc = new WindowController();
                    wc.showStage();
                    System.out.println(wc.getData());
                });
    
                root.setCenter(bSecondStage);
    
    
                primaryStage.setScene(scene);
                primaryStage.show();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
        class WindowController {
            private String data;
    
            void showStage() {
                Stage stage = new Stage();
                stage.initModality(Modality.APPLICATION_MODAL);
    
                VBox root = new VBox();
                Scene scene = new Scene(root);
                TextField tf = new TextField();
                Button submit = new Button("Submit");
    
                submit.setOnAction(e -> {
                    data = tf.getText();
                    stage.close();
                });
    
                root.getChildren().addAll(tf, submit);
                stage.setScene(scene);
                stage.showAndWait();
            }
    
            String getData() {
                return data;
            }
        }
    }