2016-11-18 5 views
2

まず、悪い英語のために申し訳ありません。ここでステージを閉じる前に値を返す方法は?

はケースです:

私は私がテーブルを持っている「第二段階」を開くためのボタンを押すと、ユーザーがテーブルの一つの項目を選択し、をクリックし、「メインステージ」を持っています"asignar"ボタン(単に確認ボタン)ですが、一度クリックすると、テーブルで選択された項目のコードをメインステージに戻し、第2ステージを閉じる必要があります。

ここは重要なコードです。

私はINT変数ウィッヒは、関数の値を取る必要があります:このような

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; 
} 

そして "asignarSeleccion":

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

"setVista" 機能は、このように書きます

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

私の問題は、 "codigo_horario"の値を最初の変数 "codigo"に入れることができないことですステージが終了する前に、私は何が欠けていますか?

+0

何か読みたいもの:http://stackoverflow.com/questions/14187963/passing-parameters-javafx-fxml – DVarga

+0

その記事の@DVargaは、最初のものから2番目のものにデータを渡します、私はそれをしたい逆の方法 –

+0

sqliteや組み込みのプロパティクラスを使ってコントローラ間でデータをやり取りし始めました。 – Sedrick

答えて

1

これは可能な例です。構造はin the answer in my commentと同じです。

第2のStageは、Stageが閉じていても返されるべきデータを格納し、ゲッターを使用して外界から値を取得することを公開する「コントローラ」によって開かれます。

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; 
     } 
    } 
} 
+0

この例題は私の問題解決に本当に役立ちました!ありがとうございました! –

1

returnステートメントで独自のStageクラスを作成できます。

public class MyStage extends Stage { 
    public String showAndReturn(myFXControll controll) {  
     super.showAndWait(); 
     return controll.getReturn(); 
    } 
} 

その後、コントローラにリターン機能を定義する必要があります。

public class TableFilterControll implements Initializable { 
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
    } 
    public String getReturn() { 
     return "I'm a nice return value"; //return what you want controlled by your controller class 
    } 
} 

これで、親コントローラからの返品を制御することができます。

String retValue=myStage.showAndReturn(childControll); 

System.out.println(retValue); 

これはクリーンコードのための良い解決策だと思います。また、Screne BuilderでFXMLをスタイルすることもできます。

関連する問題