初始化另一个控制器时使用一个控制器中的变量时出现NullPointerException和LoadException.J



我正在netbeand和SceneBuilder上用JavaFX和FXML文件开发一个应用程序。我有不同的控制器,不同的内容弹出在主窗口。我从主控制器调用FXML弹出,它有自己的独立控制器。这是主控制器中调用新内容的函数:

public void mostrar_alumno(Alumno a) throws IOException {
centro.getChildren().clear();
FXMLLoader visualizador_alumno = new FXMLLoader(getClass().getResource("/visualizador_alumno/FXMLVisualizadorAlumno.fxml"));
centro.getChildren().add(visualizador_alumno.load());
FXMLVisualizadorAlumnoController controlador_visualizador_alumno = visualizador_alumno.getController();
controlador_visualizador_alumno.setAlumno(a);
boton_crear.setDisable(true);
}

很抱歉变量中有西班牙语名称>:(

问题是,使用controlador_visualizador_alumno.setAlumno(a);,我在控制器上设置了该变量。这是来自另一个控制器的代码,必须弹出的代码:

public class FXMLVisualizadorAlumnoController implements Initializable {
@FXML
private ImageView foto;
@FXML
private TextField nombre;
@FXML
private TextField apellidos;
@FXML
private TextField correo;
private Tutorias misTutorias;
private Alumno alumno;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
misTutorias = AccesoBD.getInstance().getTutorias();
//Inicializamos los datos.
nombre.setText(alumno.getNombre());
apellidos.setText(alumno.getApellidos());
correo.setText(alumno.getEmail());               

}    
public void setAlumno(Alumno a) {
alumno = a;
}

}

因此,当调用主窗口中的方法并弹出新内容时,我在centro.getChildren().add(visualizador_alumno.load());中得到LoadException,在nombre.setText(alumno.getNombre());中得到NullPointerException

我想这是因为nombre.setText(alumno.getNombre());是初始化方法,而变量alumno是从第一个控制器设置的,所以我还不在那里,我不确定。如果你能帮我解决这个问题,我将非常高兴。任何帮助都是好的。谢谢你抽出时间。

正如您所说:

这是因为nombre.setText(alumno.getNombre());initialize()中方法和变量alumno是从第一个控制器设置的,因此还没有。

确切地说,initialize()方法是作为对load()调用的一部分调用的,这必然发生在您访问控制器之前。

您所需要做的就是将依赖于alumno的代码移动到setAlumno(...)方法。这也具有语义意义(当您更改alumno时,更新显示其数据的文本字段(:

@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
misTutorias = AccesoBD.getInstance().getTutorias();
//Inicializamos los datos.

}    
public void setAlumno(Alumno a) {
alumno = a;
nombre.setText(alumno.getNombre());
apellidos.setText(alumno.getApellidos());
correo.setText(alumno.getEmail());               
}

最新更新