Pergunta

Quero limitar meus usuários a um diretório e seus subdiretórios, mas o botão "Diretório pai" permite que eles naveguem para um diretório arbitrário.

Como devo fazer isso?

Foi útil?

Solução

Você provavelmente pode fazer isso definindo seu próprio FileSystemView.

Outras dicas

Caso alguém precise disso no futuro:

class DirectoryRestrictedFileSystemView extends FileSystemView
{
    private final File[] rootDirectories;

    DirectoryRestrictedFileSystemView(File rootDirectory)
    {
        this.rootDirectories = new File[] {rootDirectory};
    }

    DirectoryRestrictedFileSystemView(File[] rootDirectories)
    {
        this.rootDirectories = rootDirectories;
    }

    @Override
    public File createNewFolder(File containingDir) throws IOException
    {       
        throw new UnsupportedOperationException("Unable to create directory");
    }

    @Override
    public File[] getRoots()
    {
        return rootDirectories;
    }

    @Override
    public boolean isRoot(File file)
    {
        for (File root : rootDirectories) {
            if (root.equals(file)) {
                return true;
            }
        }
        return false;
    }
}

Obviamente, você precisará criar um método "createNewFolder" melhor, mas isso restringe o usuário a um ou mais diretórios.

E use assim:

FileSystemView fsv = new DirectoryRestrictedFileSystemView(new File("X:\\"));
JFileChooser fileChooser = new JFileChooser(fsv);

ou assim:

FileSystemView fsv = new DirectoryRestrictedFileSystemView( new File[] {
    new File("X:\\"),
    new File("Y:\\")
});
JFileChooser fileChooser = new JFileChooser(fsv);

A solução de Allain está quase completa.Três problemas estão abertos para solução:

  1. Clicar no botão "Home" tira o usuário das restrições
  2. DirectoryRestrictedFileSystemView não está acessível fora do pacote
  3. O ponto de partida não é raiz

  1. Anexar @Override a DirectoryRestrictedFileSystemView

public TFile getHomeDirectory() { return rootDirectories[0]; }

  1. definir classe e construtor public

  2. Mudar JFileChooser fileChooser = new JFileChooser(fsv); em JFileChooser fileChooser = new JFileChooser(fsv.getHomeDirectory(),fsv);

Eu o uso para restringir os usuários a permanecerem em um arquivo zip via TrueZips TFileChooser e com pequenas modificações no código acima, isso funciona perfeitamente.Muito obrigado.

Não há necessidade de ser tão complicado.Você pode facilmente definir o modo de seleção de um JFileChooser como este

JFileChooser fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fc.setMultiSelectionEnabled(false);

Você pode ler mais referências aqui Como usar seletores de arquivos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top