JFileChooser:当选择模式为文件和目录时,无法选择桌面

我遇到了JFileChooser的问题,想看看是否有解决方法。

如果创建了JFileChooser并且setFileSelectionMode是FILES_AND_DIRECTORIES,当用户单击左侧(在XP中)的快捷按钮(如桌面或我的文档)或下拉到桌面时,该字段不会放在文件名JTextPane中。 当单击“选择/接受”按钮时,没有任何反应(因为isDirectorySelected()由于某种原因返回false)。

覆盖approveSeletion不起作用,因为BasicFileChooser中的事件处理程序函数不会调用它。

我如何制作它以便可以选择桌面而无需手动导航到桌面,而是单击左侧的快捷方式?

谢谢

在Windows中,桌面不受文件系统中任何文件的支持 – 它是一个shell命名空间。 所以JFileChooser确实没有任何东西可以归还给你。 是的,我知道有一个文件夹包含用户的桌面 – 但请记住,桌面实际上显示为用户桌面和All Users桌面文件夹的组合 – 以及shell添加的其他内容但不包括任何文件夹(如垃圾桶)。 因此,返回一个代表“桌面”的File对象几乎不是首发。

长和短:问问自己为什么需要这样做 – 很可能你会深入到本机代码领域,处理命名空间PIDL和你可能不想进入的各种肮脏(在生命中我,我不明白为什么M $必须使这些东西如此惊人地难以使用)…

这是Windows shell命名空间的介绍,因此您可以了解所涉及的内容:

http://msdn.microsoft.com/en-us/library/cc144090%28v=vs.85%29.aspx

在BasicFileChooserUI中找到以下代码:

if (fc.getFileSelectionMode() == JFileChooser.FILES_AND_DIRECTORIES && fc.getFileSystemView().isFileSystem(dir)) { setFileName(dir.getAbsolutePath()); } 

因此,故意忽略“特殊文件夹”。 代码是私有方法,因此很难创建自己的UI。

作为hack,您可以将PropertyChangeListener添加到文件选择器:

 public void propertyChange(final PropertyChangeEvent e) { String prop = e.getPropertyName(); if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) { JFileChooser fileChooser = (JFileChooser)e.getSource(); File currentDirectory = (File)e.getNewValue(); String directory = currentDirectory.toString(); if (directory.endsWith("Desktop") || directory.endsWith("My Documents")) { File selectedFile = fileChooser.getSelectedFile(); if (selectedFile == null || ! selectedFile.equals(currentDirectory)) { fileChooser.removePropertyChangeListener( this ); fileChooser.setSelectedFile( currentDirectory ); fileChooser.addPropertyChangeListener( this ); } } } }