JavaFX尝试创建新对话框并将其中的进度条绑定到工作进程时出错

JavaFX尝试创建新对话框并将其中的进度条绑定到工作进程时出错,java,javabeans,javafx,Java,Javabeans,Javafx,我遵循了StackOverflow的另一个答案的建议,但是当我试图运行我的程序时,我得到了一个空指针异常 我有一段代码,可以创建一个新的worker,启动一个线程,然后尝试显示一个profiler对话框。但是,此对话框无法正常打开 @FXML private void profilePDBFoldertoCSVAction(ActionEvent e) { PDBProfilerOperator worker = new PDBProfilerOperator(); FileChooser fc

我遵循了StackOverflow的另一个答案的建议,但是当我试图运行我的程序时,我得到了一个空指针异常

我有一段代码,可以创建一个新的worker,启动一个线程,然后尝试显示一个profiler对话框。但是,此对话框无法正常打开

@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;
}
public void initProgress(PDBProfilerOperator operator) {
  this.profilingFiles.progressProperty().bind(operator.progressProperty());
}
我在尝试运行initProgress时收到一个NullPointerException,因为控制器仍然为Null。如何修复此错误


谢谢

我之前对的回答中的代码不正确-必须先加载fxml,然后才能从FXMLLoader检索控制器。我更新了答案中的错误代码

要对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;
}
public Stage showProfilerDialog(PDBProfiler操作员){
试一试{
FXMLLoader=新的FXMLLoader(
getClass().getResource(
“/pdpro/gui/dialogies/dataset/ProfilingProgress.fxml”
)
);
父根=(父)加载程序。加载();
ProfilingProgressController=
loader.getController();
controller.initProgress(操作员);
舞台=新舞台(新场景(根));
阶段。设置标题(“分析进度”);
stage.show();
返回阶段;
}捕获(IOEX异常){
Logger.getLogger(PDPro.class.getName()).log(Level.SEVERE,null,ex);
}
返回null;
}

有一个可执行文件,我在它的答案中使用了类似的结构


其他可能导致加载fxml文件失败的原因如下(尽管在本例中,这些都不是实际原因):

  • 您的fxml格式不正确=>在中打开它,查看SceneBuilder是否注意到任何错误
  • 您的fxml不在应该的位置=>Dos
    getClass().getResource(“/pdpro/gui/dialogs/dataset/ProfilingProgress.fxml”)
    是否返回null
  • 您的fxml没有引用控制器=>请参阅

  • 我的FXML似乎有0个错误,并在SceneBuilder 1.0和1.1中打开。getClass()不返回null,系统输出返回:jar:file:/X:/Work/PDPro/PDPro/dist/PDPro.jar/pdpro/gui/dialogies/dataset/ProfilingProgress.fxml我的fxml引用了这里的控制器:fx:controller=“pdpro.gui.dialogs.dataset.ProfilingProgressController”,并且SceneBuilder在下拉菜单中识别其中的不同方法。还有什么我应该测试的吗?!谢谢,朱厄西!