JFileChooser выбрать каталог, но показать файлы - PullRequest
17 голосов
/ 21 мая 2010

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

Ответы [ 7 ]

17 голосов
/ 21 мая 2010

Мое решение - это объединение ответов camickr и trashgod:

    final JFileChooser chooser = new JFileChooser() {
            public void approveSelection() {
                if (getSelectedFile().isFile()) {
                    return;
                } else
                    super.approveSelection();
            }
    };
    chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );
13 голосов
/ 21 мая 2010

См. setFileSelectionMode() in Как использовать средства выбора файлов :

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);
}
13 голосов
/ 21 мая 2010

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

JFileChooser chooser = new JFileChooser( new File(".") )
{
    public void approveSelection()
    {
        if (getSelectedFile().isFile())
        {
            // beep
            return;
        }
        else
            super.approveSelection();
    }
};
2 голосов
/ 02 мая 2013

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

Иногда пользователь просто щелкает файл в каталоге без причины (даже если он хочет выбрать каталог, а не файл).Если это произойдет, пользователь (вроде бы) застрянет в 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);
}

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

1 голос
/ 16 февраля 2015

Держите fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) и используйте:

File[] selectedFiles = fileChooser.getSelectedFile().listFiles();
1 голос
/ 21 мая 2010

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

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

0 голосов
/ 21 мая 2010

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

...