Подтвердить что ты не робот

JFileChooser выбирает каталог, но показывает файлы

Я чувствую, что должен быть простой способ сделать это, но я не могу понять это. У меня есть JFileChooser, который позволяет пользователю выбирать каталоги. Я хочу показать все файлы в каталогах, чтобы дать пользователю некоторый контекст, но только каталоги должны быть приняты как выбор (возможно, кнопка Open будет отключена при выборе файла). Есть ли простой способ сделать это?

4b9b3361

Ответ 1

Переопределить метод approveSelection(). Что-то вроде:

JFileChooser chooser = new JFileChooser( new File(".") )
{
    public void approveSelection()
    {
        if (getSelectedFile().isFile())
        {
            // beep
            return;
        }
        else
            super.approveSelection();
    }
};

Ответ 2

Мое решение - это слияние между ответами camickr и trashgod:

    final JFileChooser chooser = new JFileChooser() {
            public void approveSelection() {
                if (getSelectedFile().isFile()) {
                    return;
                } else
                    super.approveSelection();
            }
    };
    chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );

Ответ 3

См. setFileSelectionMode() в Как использовать File Choosers:

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)

Добавление: эффект можно увидеть, разделив строку 73 этого FileChooserDemo, но он, похоже, зависит от платформы.

Приложение: Если вы используете FILES_AND_DIRECTORIES, подумайте об изменении текста кнопки:

chooser.setApproveButtonText("Choose directory");

Поскольку эффект зависит от L & F, рассмотрите возможность использования DIRECTORIES_ONLY на платформах, которые уже соответствуют вашим требованиям пользовательского интерфейса:

if (System.getProperty("os.name").startsWith("Mac OS X")) {
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
} else {
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
}

Ответ 4

Решение переопределения approveSelection может раздражать некоторых пользователей.

Иногда пользователь просто нажимает на файл в каталоге без причины (даже если она хочет выбрать каталог, а не файл). Если это произойдет, пользователь будет (kind-a) застрял в JFileChooser, поскольку approveSelection завершится с ошибкой, даже если она отменит выбор файла. Чтобы избежать этого раздражения, это то, что я делаю:

JFileChooser fileChooser = new JFileChooser();

fileChooser.setFileSelectionMode(
        JFileChooser.FILES_AND_DIRECTORIES);

int option = fileChooser.showDialog(null,
        "Select Directory");

if (option == JFileChooser.APPROVE_OPTION) {
    File f = fileChooser.getSelectedFile();
    // if the user accidently click a file, then select the parent directory.
    if (!f.isDirectory()) {
        f = f.getParentFile();
    }
    System.out.println("Selected directory for import " + f);
}

Выбор каталога, даже если пользователь выбрал файл, дает мне лучшую удобство использования.

Ответ 5

AFAIK JFileChooser отделяет фильтрацию файлов (что можно просмотреть, очень настраивается) от фильтрации выбора (что можно выбрать).

Конфигурация фильтрации выбора гораздо более ограничена, но AFAIK вы можете разрешить выбирать только dirs или только файлы setFileSelectionMode()

Ответ 6

Сохраните fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) и используйте:

File[] selectedFiles = fileChooser.getSelectedFile().listFiles();

Ответ 7

Я думаю, что лучшее решение - это просто позволить пользователю выбрать либо файл, либо каталог. И если пользователь выбирает файл, просто используйте каталог, в котором находится этот файл.