JFileChooser, хотите заблокировать его в одном каталоге - PullRequest
3 голосов
/ 19 января 2012

У меня есть эта программа, в которую вы можете загружать файлы, и я хочу, чтобы JFileChooser был заблокирован в одной папке (каталоге), чтобы пользователь не мог просматривать что-либо еще. Он может выбирать файлы, например, из папки "C: \ Users \ Thomas \ Dropbox \ Prosjekt RMI \ SERVER \". Я пытался так искать, но ничего не нашел. Код у меня есть:

String getProperty = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(getProperty + "/Dropbox/Prosjekt RMI/SERVER/"); //opens in the directory "//C:/Users/Thomas/Dropbox/Project RMI/SERVER/"
int returnVal = chooser.showOpenDialog(parent);
if (returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: " + chooser.getSelectedFile().getName());

И это работает нормально, но теперь я могу перейти в папку Project RMI, но я не хочу, чтобы это делалось.

Заранее спасибо:)

Редактировать: Что я сделал с вашей помощью:

JFileChooser chooser = new JFileChooser(getProperty + "/Dropbox/Project RMI/SERVER/"); 
                chooser.setFileView(new FileView() {
                    @Override
                    public Boolean isTraversable(File f) {
                        return (f.isDirectory() && f.getName().equals("SERVER")); 
                    }
                });
                int returnVal = chooser.showOpenDialog(parent);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    System.out.println("You chose to open this file: "
                            + chooser.getSelectedFile().getName());
                }

Ответы [ 3 ]

5 голосов
/ 19 января 2012

Создайте пользовательский FileSystemView, используйте его в качестве аргумента для одного из JFileChooser конструкторов , который принимает FSV ..

4 голосов
/ 19 января 2012

Установите FileView и переопределите метод isTraversable, чтобы он возвращал значение true только для каталога, который должен видеть пользователь.

Вот пример:

String getProperty = System.getProperty("user.home");
final File dirToLock = new File(getProperty + "/Dropbox/Prosjekt RMI/SERVER/");
JFileChooser fc = new JFileChooser(dirToLock);
fc.setFileView(new FileView() {
    @Override
    public Boolean isTraversable(File f) {
         return dirToLock.equals(f);
    }
});
0 голосов
/ 18 марта 2015

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

private void disableNav(Container c) {
for (Component x : c.getComponents())
  if (x instanceof JComboBox)
    ((JComboBox)x).setEnabled(false);
  else if (x instanceof JButton) {
    String text = ((JButton)x).getText();
    if (text == null || text.isEmpty())
      ((JButton)x).setEnabled(false);
    }
  else if (x instanceof Container)
    disableNav((Container)x);
  }

Затем вызовите следующим образом:1004 *

JFileChooser fc = new JFileChooser(imgDir);
disableNav(fc);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "gif", "png");
fc.setFileFilter(filter);
...
...