将数据传递给控制器 JAVAFX
Passing data to the controller JAVAFX
my image我试图将数据(变量)从一个阶段传递到另一个阶段,但是当我尝试在第二阶段访问它们时,它们为空。主窗口的代码。转到窗口 1
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();}
}
}
// 窗口 1 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 "Window1"
}
initialize()
方法作为加载 FXML 文件过程的一部分被调用 - 换句话说,它在您调用 miCargador.load()
.
时被调用
显然这发生在你调用window1.initStage(...)
之前,所以当调用initialize()
时,tituloAnterior
仍然是空的。
简单的解决办法就是不在initialize()
方法中访问tituloAnterior
,而是在initStage()
方法中做任何你需要做的事情。例如
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()
方法之前调用,initialize()
调用时tituloAnterior
不会为null。
my image我试图将数据(变量)从一个阶段传递到另一个阶段,但是当我尝试在第二阶段访问它们时,它们为空。主窗口的代码。转到窗口 1
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();}
}
}
// 窗口 1 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 "Window1" }
initialize()
方法作为加载 FXML 文件过程的一部分被调用 - 换句话说,它在您调用 miCargador.load()
.
显然这发生在你调用window1.initStage(...)
之前,所以当调用initialize()
时,tituloAnterior
仍然是空的。
简单的解决办法就是不在initialize()
方法中访问tituloAnterior
,而是在initStage()
方法中做任何你需要做的事情。例如
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()
方法之前调用,initialize()
调用时tituloAnterior
不会为null。