NullPointerException 和 LoadException 在初始化另一个控制器时使用来自一个控制器的变量。 JavaFX
NullPointerException and LoadException when using variables from one controller when initializing another. JavaFX
我正在使用 JavaFX 和 FXML 文件在 netbeand 和 SceneBuilder 上开发应用程序。对于主 window 中弹出的不同内容,我有不同的控制器。我从 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;
}
}
因此,当主 window 中的方法被调用并且新内容应该弹出时,我在 centro.getChildren().add(visualizador_alumno.load());
中得到一个 LoadException,在 nombre.setText(alumno.getNombre());
[=17= 中得到一个 NullPointerException ]
我想这是因为 nombre.setText(alumno.getNombre());
是初始化方法,变量 alumno
是从第一个控制器设置的,所以我还没有,我不确定。如果你能帮助我解决它,我将非常高兴。
任何帮助都是好的。谢谢你的时间。
如你所说:
This is because nombre.setText(alumno.getNombre());
is in the initialize()
method and the variable alumno
is set from the first controller so it
is not there yet.
准确地说,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());
}
我正在使用 JavaFX 和 FXML 文件在 netbeand 和 SceneBuilder 上开发应用程序。对于主 window 中弹出的不同内容,我有不同的控制器。我从 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;
}
}
因此,当主 window 中的方法被调用并且新内容应该弹出时,我在 centro.getChildren().add(visualizador_alumno.load());
中得到一个 LoadException,在 nombre.setText(alumno.getNombre());
[=17= 中得到一个 NullPointerException ]
我想这是因为 nombre.setText(alumno.getNombre());
是初始化方法,变量 alumno
是从第一个控制器设置的,所以我还没有,我不确定。如果你能帮助我解决它,我将非常高兴。
任何帮助都是好的。谢谢你的时间。
如你所说:
This is because
nombre.setText(alumno.getNombre());
is in theinitialize()
method and the variablealumno
is set from the first controller so it is not there yet.
准确地说,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());
}