JFileChooser选择目录但显示文件

我觉得应该有一个简单的方法来做到这一点,但我无法弄清楚。 我有一个允许用户选择目录的JFileChooser。 我想显示目录中的所有文件以向用户提供一些上下文,但是只应接受目录作为选择(可能在选择文件时禁用“打开”按钮)。 有这么简单的方法吗?

覆盖approveSelection()方法。 就像是:

JFileChooser chooser = new JFileChooser( new File(".") ) { public void approveSelection() { if (getSelectedFile().isFile()) { // beep return; } else super.approveSelection(); } }; 

我的解决方案是camickr和trashgod的答案之间的合并:

  final JFileChooser chooser = new JFileChooser() { public void approveSelection() { if (getSelectedFile().isFile()) { return; } else super.approveSelection(); } }; chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES ); 

请参阅如何使用文件选择器中的 setFileSelectionMode()

 setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) 

附录:通过取消注释此FileChooserDemo第73行可以看到效果,但它似乎与平台有关。

附录:如果使用FILES_AND_DIRECTORIES ,请考虑相应地更改按钮文本:

 chooser.setApproveButtonText("Choose directory"); 

由于效果取决于L&F,请考虑在已满足UI要求的平台上使用DIRECTORIES_ONLY

 if (System.getProperty("os.name").startsWith("Mac OS X")) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } else { chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); } 

对于某些用户来说,覆盖approveSelection的解决方案可能很烦人。

有时,用户只是无缘无故地点击目录中的文件(即使她想要选择目录而不是文件)。 如果发生这种情况,用户将(kind-a)卡在JFileChooser因为approveSelection将失败,即使她取消选择该文件。 为了避免这种烦恼,这就是我所做的:

 JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES); int option = fileChooser.showDialog(null, "Select Directory"); if (option == JFileChooser.APPROVE_OPTION) { File f = fileChooser.getSelectedFile(); // if the user accidently click a file, then select the parent directory. if (!f.isDirectory()) { f = f.getParentFile(); } System.out.println("Selected directory for import " + f); } 

选择目录,即使用户选择了文件,我认为也可以提高可用性。

AFAIK JFileChooser将文件过滤(可以查看,可配置的内容)与选择过滤(可以选择的内容)分开。

选择过滤的配置更加有限,但AFAIK可以选择仅允许使用setFileSelectionMode()选择目录或仅选择文件

保留fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)并使用:

 File[] selectedFiles = fileChooser.getSelectedFile().listFiles(); 

我认为最好的解决方案是允许用户选择文件或目录。 如果用户选择文件,只需使用该文件所在的目录。