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();
我认为最好的解决方案是允许用户选择文件或目录。 如果用户选择文件,只需使用该文件所在的目录。