使用 JFileChooser 允许 Swing 用户指定输出位置

Using JFileChooser to allow Swing user to specify output location

我必须编写一个 Java 8 Swing 应用程序,该应用程序的一部分会生成一个输出文件(Excel 电子表格)。所以在 UI 的某个时候,用户将不得不:

  1. Select 他们文件系统上的一个目录,Excel 文件将写入其中;然后
  2. 输入 Excel 文件的名称(如果他们在文件名中指定“.xls”或“.xlsx”,应用程序将 output/write 该文件在各自的 XLS/XLSX 输出;如果他们省略文件扩展名,则默认为 XLSX)

我感兴趣的是这里的体面的 UX 解决方案是什么,以及它如何映射到 Swing 控件及其布局。

我知道我可以使用 JFileChooser 选择目录或特定文件,但我从未用它来 select 目录 输入 new(文件系统中尚不存在)文件名 + 扩展名。

关于我可以在这里提供的实用、优雅且 simple/easy 易于使用和理解的解决方案有什么想法吗?

您可以使用 Apache 的 FileNameUtils,或者使用子字符串和 indexOf 实现您自己的字符串操作扩展提取...我会给您第一种情况的示例。

按照建议使用默认的 JFileChooser 后,您可以只检查指定的文件名,因为 JFileChooser 将 return 一个 File 对象(如果未选择任何内容,则为 null,因此首先检查空值):

JFileChooser fileChooser = new JFileChooser();
File selectedFile = fileChooser.getSelectedFile();

if (selectedFile != null) {

    String givenExtension = FilenameUtils.getExtension(selectedFile.getName());

    boolean noExtension = "".equals(givenExtension);
    boolean xlsx = givenExtension.toLowerCase().contains("xlsx");
    boolean xls = givenExtension.toLowerCase().contains("xls");

    String newFileName = selectedFile.getName();

    if (noExtension) {
        newFileName += ".xlsx";
    } else if (!xlsx && !xls) {
        throw new Exception("Invalid name");
    }
}

如果您不想接受不同的大小写,请删除 toLowerCase()

这应该可以满足您的要求 ;)