将数据传递给控制器​​JAVAFX

时间:2017-04-24 07:52:47

标签: java javafx netbeans-8

my image我试图将数据(变量)从一个阶段传递到另一个阶段,但是当我尝试在第二阶段访问它们时,它们是空的。主窗口的代码。转到window1

 public class PrincipalController {
 private Stage primaryStage;
 public void initStage( Stage stage){ primaryStage = stage;}



@FXML
 private void goWindow1(ActionEvent event) {
    try {
         FXMLLoader miCargador = new
                 FXMLLoader(getClass().getResource("/vista/Window1.fxml"));
         Parent root = (Parent) miCargador.load();

                     // Access to window driver 1


 Window1Controller window1 = miCargador.
                  <window1Controlador>getController();
      windnow1.initStage(primaryStage);
      Scene scene = new Scene(root);
      primaryStage.setScene(scene);
      primaryStage.show();
     } catch (IOException e) {e.printStackTrace();}
    }
}

// window1 class:

 public class Window1Controlador {
    private Stage primaryStage;
    private Scene escenaAnterior;
    private String tituloAnterior;
    public void initStage(Stage stage){
         primaryStage = stage;
         escenaAnterior = stage.getScene();
         tituloAnterior = stage.getTitle();
         primaryStage.setTitle("Window 1");
     }

如果我想访问我收到的上一个标题,则为空

/**
     * Initializes the controller class.
     * @param url
     * @param rb
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
       System.out.println(""+ this.tituloAnterior);}

初始化显示为null,它应该显示我&#34; Window1&#34; }

1 个答案:

答案 0 :(得分:0)

initialize()方法在加载FXML文件的过程中被调用 - 换句话说,当您调用miCargador.load()时会调用它。

显然,在您调用window1.initStage(...) 之前会发生这种情况,因此在调用initialize()时,tituloAnterior仍为空。

简单的解决方案就是不要在tituloAnterior方法中访问initialize(),而是在initStage()方法中执行您需要执行的操作。 E.g。

public void initStage(Stage stage){
     primaryStage = stage;
     escenaAnterior = stage.getScene();
     tituloAnterior = stage.getTitle();
     primaryStage.setTitle("Window 1");
     someLabelFromFXML.setText(tituloAnterior);
 }

如果您愿意,可以在Java代码中为FXML加载器设置控制器:

@FXML
private void goWindow1(ActionEvent event) {
    try {
         FXMLLoader miCargador = new
                 FXMLLoader(getClass().getResource("/vista/Window1.fxml"));

         Window1Controller window1 = new Window1Controller();
         window1.initStage(primaryStage);
         miCargador.setController(window1);

         Parent root = (Parent) miCargador.load();

                     // Access to window driver 1



      Scene scene = new Scene(root);
      primaryStage.setScene(scene);
      primaryStage.show();
     } catch (IOException e) {e.printStackTrace();}
    }
}

然后从FXML文件中删除fx:controller属性。这样,initStage()方法在load()方法之前调用,tituloAnterior在调用initialize()时不会为空。