0

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

如果创建了 JFileChooser 并且 setFileSelectionMode 为 FILES_AND_DIRECTORIES,则当用户单击左侧(在 XP 中)的快捷按钮(例如 Desktop 或 My Documents)或下拉到 Desktop 时,该字段不会放置在 File Name JTextPane 中。当单击“选择/接受”按钮时,什么也没有发生(因为 isDirectorySelected() 出于某种原因返回 false)。

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

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

谢谢

4

2 回答 2

2

在 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 );
            }
        }
    }
}
于 2010-12-14T01:23:38.717 回答
2

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

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

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

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

于 2010-12-14T04:23:57.253 回答