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; }
答案 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()
时不会为空。