JFileChooser: невозможно выбрать рабочий стол, если выбран режим выбора «Файл и каталоги» - PullRequest
0 голосов
/ 14 декабря 2010

Я столкнулся с проблемой с JFileChooser и хотел посмотреть, есть ли обходной путь.

Если JFileChooser создан и setFileSelectionMode имеет значение FILES_AND_DIRECTORIES, когда пользователь нажимает кнопку быстрого вызова слева (в XP), например «Рабочий стол» или «Мои документы» или выпадающий на «Рабочий стол», поле не помещается в имя файла JTextPane.А при нажатии кнопки «Выбрать / Принять» ничего не происходит (потому что isDirectorySelected () по какой-то причине возвращает false).

Переопределение ApproveSeletion не работает, потому что функция обработчика событий в BasicFileChooser не вызывает его.

Как мне сделать так, чтобы рабочий стол можно было выбирать, не переходя к нему вручную, а нажав ярлык слева?

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

В Windows рабочий стол не поддерживается никаким файлом в файловой системе - это пространство имен оболочки.Так что на самом деле JFileChooser не может вернуться к вам.Да, я знаю, что есть папка, которая содержит рабочий стол для пользователя, но помните, что рабочий стол фактически отображается как составная часть рабочего стола пользователя и папки рабочего стола всех пользователей - плюс другие вещи, которые добавляются оболочкой, но не являются частьюлюбой папки (например, мусорное ведро).Поэтому возвращение объекта File, представляющего «рабочий стол», в значительной степени не является началом.

Длинно и коротко: спросите себя, зачем вам это нужно - есть вероятность, что вы окажетесь глубоко в нативномтерритория кода, связанная с PIDL пространства имен и всевозможными гадостями, в которые вы, возможно, не захотите попасть (для меня, жизнь, я не могу понять, почему M $ сделал этот материал настолько удивительно сложным в использовании) ...

Вот введение в пространства имен оболочки Windows, так что вы почувствуете, что с этим связано:

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

2 голосов
/ 14 декабря 2010

Нашел следующий код в BasicFileChooserUI:

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

Таким образом, похоже, что «специальные папки» намеренно игнорируются. Код находится в закрытом методе, поэтому было бы сложно создать собственный пользовательский интерфейс.

В качестве хака вы можете добавить 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 );
            }
        }
    }
}
...