web-dev-qa-db-ja.com

コントローラクラスからJavaFX FileChooserを開くにはどうすればよいですか?

私の問題は、FileChooserを使用するすべての例で、ステージを渡す必要があることです。唯一の問題は、メインのステージとは別のコントローラークラスを使用するfxmlファイルでUIが定義されていることです。

@FXML protected void locateFile(ActionEvent event) {
    FileChooser chooser = new FileChooser();
    chooser.setTitle("Open File");
    chooser.showOpenDialog(???);
}

???に何を置いて機能させるのですか?先ほど言ったように、コントローラークラスのどのステージも参照していないので、どうすればよいですか?

28
Electric Coffee

シーン内の任意のノード(たとえば、ルートノード。ただし、@FXMLを挿入したノードはすべて実行します)を実行します。

chooser.showOpenDialog(node.getScene().getWindow());
50
James_D

次のいずれかの方法で、アプリケーションで作成されたステージに固執する必要はありません。

@FXML protected void locateFile(ActionEvent event) {
    FileChooser chooser = new FileChooser();
    chooser.setTitle("Open File");
    File file = chooser.showOpenDialog(new Stage());
}

または、同じステージを使い続けたい場合は、事前にステージをコントローラーに渡す必要があります。

    FXMLLoader loader = new FXMLLoader(getClass().getResource("yourFXMLDocument.fxml"));
    Parent root = (Parent)loader.load();
    MyController myController = loader.getController();
    myController.setStage(stage);

アプリケーションのメインステージがあり、必要に応じて使用できます。

16
Mansueli

メニュー項目から

public class SerialDecoderController implements Initializable {

  @FXML
  private MenuItem fileOpen;

  @Override
  public void initialize(URL url, ResourceBundle rb) {
    // TODO
 }    


public void fileOpen (ActionEvent event) {

    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open Resource File"); 
    fileChooser.showOpenDialog(fileOpen.getParentPopup().getScene().getWindow());

}
2
spinnaker15136

あるいは、私のために働いたもの:単にnullを入れてください。

@FXML
private void onClick(ActionEvent event) {
    File file = fileChooser.showOpenDialog(null);
    if (file != null) {
       //TODO
    }
}
0
luke8800gts