Я пытаюсь использовать 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));
}
}