将数据传递给控制器JAVAFX
我试图将数据(变量)从一个阶段传递到另一个阶段,但当我试图在第二个阶段访问它们时,它们是空的。主窗口的代码。转到window1将数据传递给控制器JAVAFX,java,javafx,netbeans-8,Java,Javafx,Netbeans 8,我试图将数据(变量)从一个阶段传递到另一个阶段,但当我试图在第二个阶段访问它们时,它们是空的。主窗口的代码。转到window1 public class PrincipalController { private Stage primaryStage; public void initStage( Stage stage){ primaryStage = stage;} @FXML private void goWindow1(ActionEvent event) { tr
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();}
}
}
如果我想访问以前收到的标题,则返回空
/**
* Initializes the controller class.
* @param url
* @param rb
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
System.out.println(""+ this.tituloAnterior);}
初始化在显示“Window1”时显示空值
}在加载FXML文件的过程中调用initialize()
方法-换句话说,在调用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
属性。这样,在调用load()
方法之前调用initStage()
方法,调用initialize()
时,tituloainterior
将不会为空。请用英语翻译并共享异常跟踪。我已经修改了它,您可以帮助我吗?步骤1。在加载Window1 class 2之前打印对象。打印Window1类中的对象。我相信你会与众不同。您现在应该尝试传递对象并进行验证。如果它能工作,这意味着在配置中的某些地方需要绑定类,这是丢失的。我如何从FXML文件中删除fx:controller属性?@MelDiaz是否删除它?从window1.FXML?@MelDiaz是,从window1.FXML
。只有在使用第二种解决方案(用Java代码设置控制器)时才需要它。正如我在回答中所说,我认为首先避免访问在initialize()
方法中设置的属性更简单。但是,我必须删除fx:controller中的哪一个?
@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();}
}
}