当前位置: 首页 > 知识库问答 >
问题:

当初始化另一个控制器时使用来自一个控制器的变量时,NullPointerExctive和LoadExctive。JavaFX

梁丘兴腾
2023-03-14

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

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\u visualizator\u校友。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中得到一个LoadException。getChildren()。添加(visualizador_alumno.load()) nombre中的NullPointerException。setText(alumno.getNombre())

我想这是因为nombre.setText(alumno.getNombre());是初始化方法,变量alumno是从第一个控制器设置的,所以我还没有到那里,我不确定。如果你能帮mi解决它,我会很高兴的。任何帮助都是好的。谢谢你的时间。


共有1个答案

靳富
2023-03-14

正如你所说:

这是因为nombre.setText(alumno.getNombre());初始化()方法中,并且变量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());               
}
 类似资料:
  • 问题内容: 我有3个执行类似任务的控制器: PastController 向API查询过去的系统中断。 CurrentController 向API查询当前系统中断 FutureController 向API查询将来的系统中断 它们每个都是唯一的(尽管它们具有相似的功能)。但是,它们都从定义相同的变量开始: 我可以使用服务或工厂在一处初始化这些变量,而不用重复代码吗? 问题答案: 我没有测试代码,

  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢

  • 我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。

  • 问题内容: 使用SceneBuilder。我有2个阶段,每个阶段都有一个控制器: , 。 Stage1Controller: Stage2Controller: 这是使用2种方法 (称为in 方法)将这两个fxml文件加载到Main.java类中的方式: 该方法在第一阶段中用作方法,它在两个阶段都转换视图。 如何输入方法?谢谢 问题答案: “快速又脏”的方法是给的引用: 现在在您的主应用程序中:

  • 本文向大家介绍AngularJS控制器继承自另一控制器,包括了AngularJS控制器继承自另一控制器的使用技巧和注意事项,需要的朋友参考一下 AngularJS里控制器继承,常用的就是作用域嵌套作用域。默认情况下,当前作用域中无法找到某个属性时,就会在父级作用域中进行查找,若找不到直至查找到$rootScope。 但有些情况下,rootScope下就是我们的controller,不可能将大量的公

  • 我是JavaFx新手,因此我找不到解决问题的方法 假设我有以下应用程序结构: 在SecondController中显示文本的最佳/最佳方式是什么,从FirstController传递文本。我的意思是,我在中输入一个文本,然后按下按钮,按下按钮后,我希望文本显示在使用另一个控制器的中。我已经阅读了很多关于和可以用来解决这个问题的知识,但不幸的是,我无法实现一个有效的解决方案。 如果你们专家能在这方面