Como faço para restringir o JFileChooser a um diretório?
-
09-06-2019 - |
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?
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:
- Clicar no botão "Home" tira o usuário das restrições
- DirectoryRestrictedFileSystemView não está acessível fora do pacote
- O ponto de partida não é raiz
- Anexar @Override a DirectoryRestrictedFileSystemView
public TFile getHomeDirectory()
{
return rootDirectories[0];
}
definir classe e construtor
public
Mudar
JFileChooser fileChooser = new JFileChooser(fsv);
emJFileChooser 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