将数据传递给控制器JAVAFX
我的图像我正在尝试将数据(变量)从一个阶段传递到另一个阶段,但是当我尝试在第二阶段访问它们时,它们是空的。 主窗口的代码。 转到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. getController(); windnow1.initStage(primaryStage); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.show(); } catch (IOException e) {e.printStackTrace();} } }
// window1类:
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"); }
如果我想访问之前的标题,我收到的是null
/** * Initializes the controller class. * @param url * @param rb */ @Override public void initialize(URL url, ResourceBundle rb) { System.out.println(""+ this.tituloAnterior);}
当它应该显示“Window1”时,初始化显示为null
initialize()
方法在加载FXML文件的过程中被调用 – 换句话说,当你调用miCargador.load()
时会调用miCargador.load()
。
显然, 在调用window1.initStage(...)
之前会发生这种情况,所以当调用initialize()
时, tituloAnterior
仍然为null。
简单的解决方案不是在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()
方法之前调用initStage()
方法,并且在调用initialize()
时tituloAnterior
将不为null。