我遇到了JFileChooser的问题,想看看是否有解决方法。
如果创建了JFileChooser并且setFileSelectionMode是FILES_AND_DIRECTORIES,当用户单击左侧(在XP中)的快捷按钮(如桌面或我的文档)或下拉到桌面时,该字段不会放在文件名JTextPane中。当单击“选择/接受”按钮时,没有任何反应(因为isDirectorySelected()由于某种原因返回false)。
覆盖approveSeletion不起作用,因为BasicFileChooser中的Event Handler函数没有调用它。
我如何制作它以便可以选择桌面而无需手动导航到桌面,只需点击左侧的快捷方式即可?
由于
答案 0 :(得分:2)
在BasicFileChooserUI中找到以下代码:
if (fc.getFileSelectionMode() == JFileChooser.FILES_AND_DIRECTORIES
&& fc.getFileSystemView().isFileSystem(dir)) {
setFileName(dir.getAbsolutePath());
}
因此有意忽略“特殊文件夹”。代码是私有方法,因此很难创建自己的UI。
作为黑客,您可以将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 );
}
}
}
}
答案 1 :(得分:2)
在Windows中,桌面不受文件系统中任何文件的支持 - 它是一个shell命名空间。所以JFileChooser 可能没有任何东西可以返回给你。是的,我知道有一个包含用户桌面的文件夹 - 但请记住,桌面实际上显示为用户桌面和All Users桌面文件夹的组合 - 以及shell添加的其他内容但不包括任何文件夹(如垃圾桶)。所以返回一个代表'桌面'的File对象几乎不是一个启动器。
长短:问问自己为什么需要这样做 - 很可能你会深入到本机代码领域,处理命名空间PIDL和你可能不想进入的各种肮脏(对于我的生活,我无法理解为什么M $必须让这些东西变得非常难以使用)...
以下是Windows shell命名空间的介绍,以便您了解所涉及的内容:
http://msdn.microsoft.com/en-us/library/cc144090%28v=vs.85%29.aspx