1

我遵循了关于 StackOverflow Passing Parameters JavaFX FXML的另一个答案的建议,但是当我尝试运行我的程序时,我得到了一个空指针异常。

我有代码可以创建一个新工作人员并启动一个线程,然后尝试显示一个分析器对话框。但是,此对话框无法正确打开。

@FXML
private void profilePDBFoldertoCSVAction(ActionEvent e) {
PDBProfilerOperator worker = new PDBProfilerOperator();
FileChooser fc = new FileChooser();
DirectoryChooser dc = new DirectoryChooser();
Stage s = new Stage();
worker.setPdbsdirectory(dc.showDialog(s));
worker.setOutputCSV(fc.showSaveDialog(s));
Thread th = new Thread(worker);
th.setDaemon(true);
th.start();
worker.showProfilerDialog(worker);
}

showProfilerDialog 如下:

public Stage showProfilerDialog(PDBProfilerOperator operator) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/pdpro/gui/dialogues/dataset/ProfilingProgress.fxml"));
ProfilingProgressController controller = loader.<ProfilingProgressController>getController();
controller.initProgress(operator);
Parent root = null;
try {
  root = (Parent) loader.load();
} catch (IOException ex) {
  Logger.getLogger(PDPro.class.getName()).log(Level.SEVERE, null, ex);
}
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.setTitle("Profiling Progress");
stage.show();
return stage;
}

initProgress 如下:

public void initProgress(PDBProfilerOperator operator) {
  this.profilingFiles.progressProperty().bind(operator.progressProperty());
}

尝试运行 initProgress 时出现 NullPointerException,因为控制器仍为 Null。如何修复此错误?

谢谢!

4

1 回答 1

0

我之前对传递参数 JavaFX FXML的回答中的代码不正确 - 必须在从 FXMLLoader 检索控制器之前加载 fxml。我更新了答案中的错误代码。

对 Kylamus 的代码应用相同的修复:

public Stage showProfilerDialog(PDBProfilerOperator operator) {
  try {
    FXMLLoader loader = new FXMLLoader(
      getClass().getResource(
        "/pdpro/gui/dialogues/dataset/ProfilingProgress.fxml"
      )
    );
    Parent root = (Parent) loader.load();

    ProfilingProgressController controller = 
      loader.<ProfilingProgressController>getController();
    controller.initProgress(operator);

    Stage stage = new Stage(new Scene(root));
    stage.setTitle("Profiling Progress");
    stage.show();

    return stage;
  } catch (IOException ex) {
    Logger.getLogger(PDPro.class.getName()).log(Level.SEVERE, null, ex);
  }

  return null;
}

有一个可执行示例,我在回答How can I use a variable from another Controller in JavaFX中使用了类似的结构


其他可能导致加载 fxml 文件失败的原因如下(尽管在这种情况下这些都不是真正的原因):

  1. 您的 fxml 格式错误 => 在SceneBuilder中打开它并查看 SceneBuilder 是否记录任何错误。
  2. 您的 fxml 不在应有的位置 => 是否getClass().getResource("/pdpro/gui/dialogues/dataset/ProfilingProgress.fxml")返回 null?
  3. 您的 fxml 没有引用您的控制器 => 了解如何引用控制器
于 2013-01-23T07:30:15.483 回答