组合扩展上的JavaFX FileChooser行为不一致
我正在尝试使用JavaFX保存具有组合扩展名的文件,例如,组合扩展上的JavaFX FileChooser行为不一致,java,javafx,javafx-8,filechooser,Java,Javafx,Javafx 8,Filechooser,我正在尝试使用JavaFX保存具有组合扩展名的文件,例如,.tar.gz带有扩展名过滤器*.tar.gz。但是,无论(相同)文件名是由用户键入的还是使用setInitialFileName设置的,用于将文件扩展名添加到文件名的文件选择器的行为都是不同的。这也很令人费解。下面是最简单的工作示例。可以观察到以下行为(其中“无”表示直接单击保存,“重新键入”表示在保存之前删除并重新键入文件选择器中文件名的最后一个字符)。这是在Windows上 | initial | shows up as |
.tar.gz
带有扩展名过滤器*.tar.gz
。但是,无论(相同)文件名是由用户键入的还是使用setInitialFileName
设置的,用于将文件扩展名添加到文件名的文件选择器的行为都是不同的。这也很令人费解。下面是最简单的工作示例。可以观察到以下行为(其中“无”表示直接单击保存,“重新键入”表示在保存之前删除并重新键入文件选择器中文件名的最后一个字符)。这是在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 |
这种行为有逻辑吗
问题:如何配置文件选择器,使showsavedilog
返回的文件具有组合扩展名(例如,.tar.gz
),而与输入文本字段的内容是否没有扩展名、一个扩展名或两个扩展名无关
我的目标是为选定的扩展名筛选器提供一致且可预测的文件名,并尽可能避免在选择器关闭后更改文件名(因为这需要另一个文件存在性检查)。FileChooser
文档对此没有任何说明,并且没有说明此功能
更新:
在Windows上,在文件资源管理器中启用“视图扩展名”可以消除因重新键入文件名而导致的差异,但不会消除小部件无法处理部分扩展名的问题。例如,输入test.tar
作为文件名显示为test.tar
(而不是test.tar.gz
),同样地,即使选定的扩展名筛选器限制为*.tar.gz
,也会保存为test.tar
最小工作示例
我相信这不是由JavaFX定义的,而是由Windows桌面/shell的“隐藏文件扩展名”选项定义的。我在记事本上观察到类似的行为。取消选中该选项会使程序表现出更可预测的行为。所以我倾向于说答案是,它在最终用户的控制之下。有趣。启用“查看扩展名”可以清除重新键入文件名时出现的奇怪差异,但不会清除小部件无法处理部分扩展名的问题。我认为扩展名筛选器不会自动将扩展名附加到文件名,而隐藏文件扩展名则不会激活。事实上,你所联系的问题似乎有一个解决这个问题的答案。我认为,如果Windows没有隐藏文件扩展名,那么每次键入的内容就是您得到的内容。当Windows隐藏文件扩展名时会发生什么,这是我一直无法精确定义的。我怀疑它从未被设计用来处理包含多个句点的扩展。不幸的是,它并没有那么简单。如果运行我的演示并键入“test”,那么如果选择了扩展过滤器,结果将是“test.tar.gz”。同样,如果您setInitialFileName(“test”)
它也会显示为“test.tar.gz”。我相信这不是由JavaFX定义的,而是由Windows desktop/shell的“隐藏文件扩展名”选项定义的。我在记事本上观察到类似的行为。取消选中该选项会使程序表现出更可预测的行为。所以我倾向于说答案是,它在最终用户的控制之下。有趣。启用“查看扩展名”可以清除重新键入文件名时出现的奇怪差异,但不会清除小部件无法处理部分扩展名的问题。我认为扩展名筛选器不会自动将扩展名附加到文件名,而隐藏文件扩展名则不会激活。事实上,你所联系的问题似乎有一个解决这个问题的答案。我认为,如果Windows没有隐藏文件扩展名,那么每次键入的内容就是您得到的内容。当Windows隐藏文件扩展名时会发生什么,这是我一直无法精确定义的。我怀疑它从未被设计用来处理包含多个句点的扩展。不幸的是,它并没有那么简单。如果运行我的演示并键入“test”,那么如果选择了扩展过滤器,结果将是“test.tar.gz”。同样,如果您setInitialFileName(“test”)
它也显示为“test.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));
}
}