【问题标题】:JFileChooser on Mac doesn't return FilesMac 上的 JFileChooser 不返回文件
【发布时间】:2018-10-23 14:47:02
【问题描述】:

我尝试使用JFileChooser 来获取File 数组,该数组可以包含 .png 或 .svg 数据类型的文件。除此之外,有时窗口没有打开,我没有得到结果。如果我想使用返回的数组,我会得到一个ArrayIndexOutOfBoundsException。所需的行为是打开一个 JFrame,您可以从 .svg 或 .png 数据类型中选择一个或多个文件。选择的文件,然后应该保存在数组文件中。

public class DataExplorer {

public static File[] start() {      

    FileFilter filter = new FileNameExtensionFilter("Images ", "png", "svg");
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.addChoosableFileFilter(filter);
    int returnVal = fileChooser.showOpenDialog(null);

    if (returnVal == JFileChooser.APPROVE_OPTION) {
        return fileChooser.getSelectedFiles();
    }

    else {
        System.out.println("Fail");
        return null;
    }
}
}

public static void main(String[] args) throws HeadlessException, Exception {        
    File[] file = start();
    System.out.println(file[0].getPath());

}

【问题讨论】:

  • 发布正确的minimal reproducible example 来说明问题。您不会显示如何调用该方法或如何显示该方法的结果。
  • 文件[] 文件 = DataExplorer.start(); System.out.println(file[0].getPath());
  • 1) 请不要将代码放在不易阅读的cmets中。而是edit 添加代码的问题。 2) 请务必阅读 @camickr 链接的文档,因为在该问题中添加单行代码仍不能使其成为 MCVE。 3) 确保在 EDT 上启动 GUI。 4) 投票结束。 (请尽快使用 MCVE 进行编辑。)
  • 解决方案很简单,我只是在等你发布一个合适的“MCVE”。我们应该能够复制/粘贴/编译和测试您发布的内容。所以你需要一个 main() 方法。应该为每个问题创建一个“MCVE”。
  • 现在这是一个“MCVE”。我知道我很挑剔,但是当您提出更复杂的问题时,“MCVE”会迫使您简化问题,并且大多数情况下您甚至会在发布之前找到答案。如果没有,那么您只需发布简单的代码,以便我们进行测试。

标签: java swing indexoutofboundsexception jfilechooser


【解决方案1】:
return fileChooser.getSelectedFiles();

查看getSelectedFiles() 方法的API?

它说:

如果文件选择器设置为允许多选,则返回所选文件的列表。

我没有看到您将文件选择器设置为允许多选的位置。

所以我猜如果您不允许多选,则数组未初始化。

你需要添加:

fileChooser.setMultiSelectionEnabled(true);

【讨论】:

  • 完美,非常感谢!它现在可以工作,但不幸的是有时框架无法打开。这里可能是什么问题?此外,该文件夹在单击时确实反应非常糟糕。有时我需要点击 10 次或更多次才能打开文件夹。我正在使用 OSX,这可能是个问题吗?提前致谢
  • @Tim,很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,以便人们知道问题已解决。
  • Sometimes I need to click 10 or more times before the folder opens - 这是一个不同的问题,应该在单独的帖子中提出。 I am using OSX , could that be a Problem? 可能是。所以这次“MCVE”需要一个虚拟框架,在框架中添加一个JButton和一个ActionListener来显示对话框。然后使用 OSX 的人可以复制和测试代码,看看他们是否有同样的问题。我使用的是 Windows 7,没有问题。如果您将框架传递给您的方法可能会更好,这样对话框可以与父框架一起显示,而不是使用 null。
【解决方案2】:

这是设置多选和获取文件的完整示例。

JFileChooser chooser = new JFileChooser();
chooser.setMultiSelectionEnabled(true);
chooser.showOpenDialog(frame or null);
File[] files = chooser.getSelectedFiles();

【讨论】:

  • 我不使用框架。我是否必须将一个框架交给 showOpenDialog() 框架?我现在将“null”上手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2021-07-26
  • 1970-01-01
  • 2022-01-23
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多