domingo, 24 de outubro de 2010

JFileChooser, com algumas dicas fica melhor ainda.

Em algum momento você precisou, precisa ou precisará utilizar essa Classe, que contém os métodos necessários para"abrir" um arquivo.
Com ele, você pode exibir aquela janelinha legal do Sistema Operacional que permite ao usuário selecionar algum arquivo, para que ele seja "aberto" pelo seu sistema.
Mas não existe nada de complicado, muito pelo contrário, é muito simples fazer essa janelinha aparecer.

Crie uma classe chamada FileChooser, e copie o código abaixo para ela.

package br.teste;
            import javax.swing.JFileChooser;
            public class FileChooser {
                        public static void main(String[] args){
                               JFileChooser arquivo = new JFileChooser();
                               arquivo.showOpenDialog(null);
                        }
            }

Pode executar!
Viu que legal?
Mas o que acontece com o arquivo selecionado? Por enquanto nada! Seu código está apenas mandando a janela abrir, mas não está nem ao menos verificando se ela abriu!
Podemos contornar esse pequeno problema com o seguinte ajuste.

package br.teste;
            import javax.swing.JFileChooser;
            public class FileChooser {
                        public static void main(String[] args){
                              JFileChooser arquivo = new JFileChooser();
                              int retorno = arquivo.showOpenDialog(null);
                              if(retorno == JFileChooser.APPROVE_OPTION){
                                     //abriu!
                              }else{
                                      //não abriu
                              }
                     }
            }

A janelinha retorna um INTEIRO, dizendo se foi clicado no botão Abrir, no botão Cancelar, se deu Erro, ou qualquer outra coisa que aconteça, mas não nos interessa saber quais são esses inteiros, por que a própra classe temConstantes para esse tipo de situação.
O ajuste acima cria um inteiro para receber o retorno do JFileChooser, se o retorno for o botão "Abrir", representado pela constante APPROVE_OPTION, então faz alguma coisa, senão faz outra coisa.

Mas o que fazer?

O JFileChooser serve "apenas" para localizar um arquivo, mas abrir, deletar, copiar, etç, deve ser feito por você, utilizando algum outro código. O JFileChooser te ajuda informando o caminho do arquivo, e é isso que devemos pegar depois que o botão "Abrir" for selecionado.

O comando que faz essa magica é o getSelectedFile().getAbsolutePath(), que retorna uma String. Depois você decide o que faz com essa String.

O código atualizado.

            package br.teste;
            import javax.swing.JFileChooser;
            import javax.swing.JOptionPane;
            public class FileChooser {
                   public static void main(String[] args){
                       String caminhoArquivo = "";
                       JFileChooser arquivo = new JFileChooser();
                       int retorno = arquivo.showOpenDialog(null);
                       if(retorno == JFileChooser.APPROVE_OPTION){
                              caminhoArquivo = arquivo.getSelectedFile().getAbsolutePath();
                              JOptionPane.showMessageDialog(null, caminhoArquivo);
                        }else{
                              //não abriu
                        }
                  }
            }

Como pode ver, logo no inicio é criada uma String, para armazenar o path do arquivo, e se o botão "Abrir" for acionado, o caminho do arquivo que foi selecionado vai ser armazenado nessa variável.
Pronto, agora você sabe "abrir" um arquivo.

Quer saber como ler e manipular o arquivo depois de obter o caminho? (Em breve)

O JFileChooser possui mais algumas utilidades, e as veremos agora.

Filtro de extensões

É possível definir um filtro, para abrir somente arquivos *.xxx, deixando a extensão a seu critério, é claro.
Antes de abrir a janela de seleção, configure a variável do JFileChooser com o seguinte código.

        arquivo.setFileFilter(new javax.swing.filechooser.FileFilter(){
             //Filtro, converte as letras em minúsculas antes de comparar
             public boolean accept(File f){
                  return f.getName().toLowerCase().endsWith(".jpg") || f.isDirectory();
             }
             //Texto que será exibido para o usuário
             public String getDescription() {
                  return "Arquivos de imagem (.jpg)";
             }
        });

O primeiro método converte todas as letras em minúsculas e depois compara as extensões, exibindo somente as que forem iguais as definidas dentro dos parênteses de endsWith, no exemplo, estou criando o filtro para exibir somente arquivos com a extensão JPG.
O segundo método serve apenas para avisar ao usuário que só serão exibidos somente os arquivos desta extensão.
É possível definir vários filtros, para isso crie vários métodos setFileFilter.

Alterando o título da janela

Essa é mais fácil, se quiser alterar o título da janelinha, configure a variável do JFileChooser com o comandosetDialogTitle(""), antes de mandar abrir a janela.

            arquivo.setDialogTitle("Selecione uma imagem");

Configurar o diretorio/pasta inicial do JFileChooser

Isso é muito útil, evita que o usuário perca a paciência sempre que quiser abrir um arquivo, porque, por padrão, o JFileChooser abre sempre a pasta principal do usuário, configurada pelo sistema operacional, no meu caso é a pasta "Meus Documentos" do windows e "/home" do Linux.

O comando que configura o diretório inicial é o setCurrentDirectory() que recebe um objeto File, esse método deve ser utilizado exatamente da mesma maneira que os anteriores, antes de mandar abrir a janela.

Uma dica legal é, crie uma variável para armazenar o caminho do ultimo arquivo selecionado, e crie um objeto File utilizando esse caminho, desta forma o JFileChooser irá abrir sempre na ultima pasta utilizada!

String caminhoCompleto = arquivo.getSelectedFile().getAbsolutePath();
caminhoUltimoArquivo = caminhoCompleto.substring(0,caminhoCompleto.lastIndexOf("\\"));

Explicação: Na primeira linha, é coletado o path completo do arquivo selecionado, e isso inclui o nome do arquivo(c:\pasta\pasta\arquivo.jpg). Na segunda linha estou fazendo um SubString, pegando esse caminho completo da primeira letra até a ultima barra encontrada (c:\pasta\pasta\), desta forma conseguimos pegar somente a pasta do arquivo selecionado.

Este comando você coloca dentro daquele IF que verifica se o botão "Abrir" foi acionado, e a variávelcaminhoUltimoArquivo tem que estar acessível da proxima vez que o JFileChooser for chamado.

Antes de abrir a janela, você insere o código abaixo, verificando se a variável caminhoUltimoArquivo não está em branco ou nula, porque se for a primeira vez que o JFileChooser estiver sendo chamado, essa variável estará vazia, e você vai ser surpreendido com uma NullPointerException ou alguma de suas irmãs.

            File pathInicial = new File(caminhoUltimoArquivo);
            arquivo.setCurrentDirectory(pathInicial);

No exemplo que estou utilizando isso não irá funcionar, por que não possui um JFrame, Classe e nem ao menos um botão controlando a abertura do JFileChooser, então não existe uma classe "Pai" que eu possa guardar a variável caminhoUltimoArquivo, mas se você está precisando utilizar o JFileChooser, obviamente tem uma(s) janela(s) pai(s) para fazer esse controle.

Qualquer dúvida ou sugestão, pode postar aqui.

Boa sorte!

Nenhum comentário:

Postar um comentário