Поведение JavaFX FileChooser несовместимо на комбинированных расширениях - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь использовать JavaFX FileChooser для сохранения файлов с комбинированными расширениями, например, .tar.gz с фильтром расширений *.tar.gz. Однако поведение средства выбора файлов для добавления расширения к имени файла отличается, независимо от того, набирается ли (одно и то же) имя файла пользователем или задается с помощью setInitialFileName. Это также очень загадочно. Минимальный рабочий пример приведен ниже. Можно наблюдать следующее поведение (где «none» означает нажать «Сохранить напрямую», а «retype» означает удалить и повторно ввести последний символ имени файла в окне выбора файлов перед сохранением). Это на Windows.

| initial     | shows up as | action | final name  |
|-------------|-------------|--------|-------------|
| test.tar    | test        | none   | test.tar    |
| test.tar    | test        | retype | test.tar.gz |
| test        | test.tar    | none   | test.tar.gz |
| test        | test.tar    | retype | test.tar    |
| test.tar.gz | test.tar    | none   | test.tar.gz |
| test.tar.gz | test.tar    | retype | test.tar    |

Есть ли логика c для такого поведения?

Вопрос: Как настроить FileChooser так, чтобы File, возвращаемый showSaveDialog, имел комбинированное расширение (например, .tar.gz) независимо от того, является ли содержимое ввода У текстового поля нет ни одного, ни одного, или обоих расширений?

Моя цель - обеспечить согласованное и предсказуемое имя файла с учетом выбранного фильтра расширений и, насколько это возможно, избегать изменения имени файла после закрытия селектора (поскольку это требует еще одной проверки существования файла). В документации FileChooser ничего об этом нет, а ближайший , который я нашел здесь , не освещает эту функцию.

Обновление:

Вкл. Windows, включение "Просмотр" Расширение »в проводнике файлов устраняет несоответствие, вызванное повторным вводом имени файла, но не неспособность виджета обрабатывать частичное расширение. Например, ввод test.tar в качестве имени файла отображается как test.tar (не test.tar.gz), а также сохранение сохраняется как test.tar , даже если выбранный фильтр расширения ограничен *.tar.gz.

Минимальный рабочий пример

public final class Test extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    public void start(Stage stage) {
        Button chooser = new Button("Chooser");
        chooser.setOnAction(e-> showChooser(stage));
        stage.setScene(new Scene(chooser));
        stage.show();
    }   

    static void showChooser(Stage stage) {
        FileChooser chooser = new FileChooser();
        chooser.getExtensionFilters().addAll(
            new ExtensionFilter("zipped tar files", "*.tar.gz"));
        chooser.setInitialFileName("test.tar"); // or "test" or "test.tar.gz"
        System.out.println(chooser.showSaveDialog(stage));
    }
}
...