Я чувствую, что должен быть простой способ сделать это, но я не могу понять это. У меня есть JFileChooser, который позволяет пользователю выбирать каталоги. Я хочу показать все файлы в каталогах, чтобы дать пользователю некоторый контекст, но только каталоги должны быть приняты как выборы (возможно, кнопка Open была бы отключена, когда файл выбран). Существует ли простой способ сделать это?
Переопределить метод approveSelection(). Что-то вроде:
JFileChooser chooser = new JFileChooser( new File(".") )
{
public void approveSelection()
{
if (getSelectedFile().isFile())
{
// beep
return;
}
else
super.approveSelection();
}
};
См. setFileSelectionMode ()
в Как использовать средства выбора файлов :
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);
}
AFAIK JFileChooser отделяет фильтрацию файлов (то, что можно просматривать, очень настраиваемое) от фильтрации выбора (то, что можно выбрать).
Конфигурация фильтрации выбора намного более ограничена, но, AFAIK, вы можете разрешить выбор только каталогов или только файлов с помощью setFileSelectionMode ()
Я думаю, что лучшим решением будет просто позволить пользователю выбрать либо файл, либо каталог. И если пользователь выберет файл, просто использовать каталог, в котором находится этот файл.
Мое решение представляет собой слияние ответов camickr и trashgod:
final JFileChooser chooser = new JFileChooser() {
public void approveSelection() {
if (getSelectedFile().isFile()) {
return;
} else
super.approveSelection();
}
};
chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );