プロジェクト

全般

プロフィール

JavaFXとダイアログ

ファイル選択ダイアログ

JavaFXには、標準でFileChooserクラスが用意されています。
Oracle公式JavaFXドキュメント「Working with JavaFX UI Components」の28章 File Chooserに詳しい解説があります。

ファイルを選択

ダイアログにタイトルを付け、特定の拡張子のみを選択対象とする

FileChooser jarChooser = new FileChooser();
jarChooser.setTitle("JARファイルを選択してください");
jarChooser.getExtensionFilters().add(
    new FileChooser.ExtensionFilter("JAR", "*.jar")
);
File selected = jarChooser.showOpenDialog(primaryStage);
if (selected != null) {
    // ファイルが選択されたときの処理
}
  • 複数の拡張子を選択対象とするときは、addメソッドではなくaddAllメソッドで複数のExtensionFilterを指定します。
  • showOpenDialogの引数にトップレベルウィンドウ(stage)ではなくnullを指定すると、ファイル選択ダイアログがモーダルにならず、トップレベルウィンドウの背後に回ることも可能になります。(通常は好ましい振る舞いではありません)

ファイル選択ダイアログを開いたときに特定のディレクトリを表示したい

FileChooser#setInitialDirectory(File) メソッドを使います。

jarChooser.setInitialDirectory(System.getProperty("user.home"));

ファイル選択ダイアログを開いたときに、最後に開いたディレクトリを表示したい

FileChooserは、開いたディレクトリを覚えてはくれないので、アプリケーション側でディレクトリを覚えておき、FileChooserのinitialDirectoryPropertyにそのディレクトリをバインドします。

ビューモデルクラスに、ObjectProperty<File>型のlastOpenDirectoryPropertyを定義します。

class MyViewModel {
    ObjectProperty<File> lastOpenDirectoryProperty = new SimpleObjectProperty<>(new File(System.getProperty("user.dir")));
    :
    public ObjectProperty<File> lastOpenDirectoryProperty() { return lastOpenDirectoryProperty; }
}
  • 初期状態ではカレントディレクトリを開くよう初期値を指定しています

コントローラークラスの初期化処理でFileChooserのinitialDirectoryPropertyとビューモデルのlastOpenDirectoryPropertyをバインドします。

class MyViewController implements Initializable {
    FileChooser fileChooer;
    MyViewModel model = ...
    :
    public void initialize(URL location, ResourceBundle resources) {
        fileChooser = new FileChooser();
        fileChooser.initialDirectoryProperty().bindBidirection(model.lastOpenDirectoryProperty());
        :
    }
    :
}

コントローラークラスのファイル選択ダイアログを開く処理で、ファイルを開いたらそのディレクトリをビューモデルのlastOpenDirectoryPropertyにセットします。

       File selected = fileChooser.showOpenDialog(getStage());
        if (selected == null) {
            return;
        } else {
            model.lastOpenDirectoryProperty().set(selected.getParentFile());
        }