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

时间:2010-12-13 23:24:30

标签: java swing jfilechooser

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

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

覆盖approveSeletion不起作用,因为BasicFileChooser中的Event Handler函数没有调用它。

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

由于

2 个答案:

答案 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