1

StackOverflow Passing Parameters JavaFX FXMLに関する別の回答のアドバイスに従いましたが、プログラムを実行しようとすると、nullポインター例外が発生しました。

新しいワーカーを作成してスレッドを開始し、プロファイラーダイアログを表示しようとするコードがあります。ただし、このダイアログは正しく開きません。

@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());
}

コントローラがNullのままであるため、initProgressを実行しようとするとNullPointerExceptionが発生します。このエラーを修正するにはどうすればよいですか?

ありがとう!

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 に答える