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 tem Constantes 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 comando setDialogTitle(“”), 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ável caminhoUltimoArquivo 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!
** Atualizado **
1 – Conforme comentário do Augusto logo abaixo, para configurar o texto de cada elemento do FileChooser, é possível manipular um objeto UIManager.
2 – Imagem do JFileChooser com os labels em portugues.
Muito útil o tópico. Prático e direto. Valeu mesmo!!!
Ótimo artigo ! Parabéns !
Gostaria de saber se existe alguma forma de traduzir todos os textos do JFileChooser do inglês para o português.
Se sim, poderia postar um exemplo? Não os textos dos botões, mas sim as palavras “File”, “Directory”, etc…
Augusto, Olá!
Dá sim pra deixar essas informações em português brasileiro, mas não por meio de códigos. Para isso é necessário possuir o sistema operacional em portugues e uma JRE que suporte nosso idioma (a instalação full da jre vem com suporte a vários idiomas).
Atualizei o post com uma imagem do JFileChooser, em portugues, mas isso por que testei em um computador com JRE e Sistema Operacional em portugues.
Olá, “codeerror”,
Obrigado pelas dicas, mas como posso instalar ou configurar a JRE / JDK para português ??? (Se é que isso é possível…)
Tenho aqui instalados em Windows XP Professional SP3 em português:
C:\>java -version
java version “1.6.0_10″
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)
C:\>javac -version
javac 1.6.0_10
Existe algum parâmetro ou forma de “informar” o idioma desejado?
Agradeço sua compreensão e paciência…!!!
Abraços,
Augusto Cesar Nunes
Olá augusto, não tem parâmetro, basta baixar novamente a JRE no site da sun, ou no site do Java, que já vem em portugues, se você selecionar esse idioma.
Mas se você vai distribuir seu programa, vai ser um pouco dificil controlar a jre que seus usuários utilizarão, ao menos que você envie a jre junto com o programa.
A minha jre eu baixei nessa página.
Pesquisando na rede, encontrei a solução via código (segue abaixo um exemplo):
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.SwingUtilities;
public class FileChooser {
public static void main(String[] args)
{
String caminhoArquivo = “”;
JFileChooser arquivo = new JFileChooser();
UIManager.put(“FileChooser.openDialogTitleText”, “Abrir”);
UIManager.put(“FileChooser.lookInLabelText”, “Consultar em”);
UIManager.put(“FileChooser.openButtonText”, “Abrir”);
UIManager.put(“FileChooser.cancelButtonText”, “Cancelar”);
UIManager.put(“FileChooser.fileNameLabelText”, “Nome do Arquivo”);
UIManager.put(“FileChooser.filesOfTypeLabelText”, “Tipo de Arquivo”);
UIManager.put(“FileChooser.openButtonToolTipText”, “Abrir o Arquivo Selecionado”);
UIManager.put(“FileChooser.cancelButtonToolTipText”,”Cancelar”);
UIManager.put(“FileChooser.fileNameHeaderText”,”Nome”);
UIManager.put(“FileChooser.upFolderToolTipText”, “Subir um Nível”);
UIManager.put(“FileChooser.homeFolderToolTipText”,”Área de Trabalho”);
UIManager.put(“FileChooser.newFolderToolTipText”,”Criar Nova Pasta”);
UIManager.put(“FileChooser.listViewButtonToolTipText”,”Lista”);
UIManager.put(“FileChooser.newFolderButtonText”,”Criar Nova Pasta”);
UIManager.put(“FileChooser.renameFileButtonText”, “Renomear”);
UIManager.put(“FileChooser.deleteFileButtonText”, “Deletar”);
UIManager.put(“FileChooser.filterLabelText”, “Tipo”);
UIManager.put(“FileChooser.detailsViewButtonToolTipText”, “Detalhes”);
UIManager.put(“FileChooser.fileSizeHeaderText”,”Tamanho”);
UIManager.put(“FileChooser.fileDateHeaderText”, “Data de Modificação”);
UIManager.put(“FileChooser.acceptAllFileFilterText”, “Todos os Arquivos”);
SwingUtilities.updateComponentTreeUI(arquivo);
int retorno = arquivo.showOpenDialog(null);
if(retorno == JFileChooser.APPROVE_OPTION)
{
caminhoArquivo = arquivo.getSelectedFile().getAbsolutePath();
JOptionPane.showMessageDialog(null, caminhoArquivo);
} else
{
//não abriu
}
}
}
No site http://www.java2s.com/Tutorial/Java/02040__Swing/ é explicado com customizar o JOptionPane, e no http://www.java2s.com/Tutorial/Java/0240__Swing/CustomizingaJFileChooserLookandFeel.htm fala sobre o JFileChooser.
Se desejar, posso enviar a tabela com todos os parâmetros que podem ser modificados.
Augusto Cesar Nunes
Opa mto bom tutorial… mas me diz uma coisa, tem como, a hora que abre a janela de escolher onde salvar, já aparecer um nome pré-definido?
Vlw.
Olá Elison, existe essa possibilidade sim.
Basta setar um novo selectedFile antes de abrir a janela.
Ex.: fileChooser.setSelectedFile(new File(“teste.txt”));
Dessa forma, quando o usuário abrir a janela, estará escrito “teste.txt”, sem as aspas, claro.
Como você precisa salvar um arquivo, e não abrir, não esqueça de iniciar a janela com o comando fileCshooser.showSaveDialog();
Olá! Estou com um problema e gostaria de saber se esta ferramenta poderá auxiliar-me. O sistema em que eu dou manutenção abre diversos tipos de arquivos , de diversas extensões, por meio de links. Mas, usando o Internet Explorer e seleciono um arquivo de extensão “.ods”, aquela janela perguntando se eu gostaria de salvar, abrir ou cancelar, nao aparece; ao invés disso, o arquivo abre no próprio navegador de uma maneira totalmente desconfigurada. Também gostaria de saber se é possível alterar a extensão, pois arquivos com extensão “.xls” abrem normalmente. Sendo assim, se for possível fazer esta conversão de extensão, resolverei meu problema. Alguma dica amigo? Obrigado!
Olá Rudak, o JFileChooser serve apenas para desktops, para desenvolvimento web seria necessário verificar algum componente do framework que você está utilizando.
Uma outra dica é disponibilizar o arquivo compactado, dessa forma o navegador sempre exibe a caixa de opções “abrir ou salvar”.
“Uma outra dica é disponibilizar o arquivo compactado, dessa forma o navegador sempre exibe a caixa de opções “abrir ou salvar”.”
óóótima ideia!!!!!! Obrigadão! Vou testar amanhã! Qualquer coisa posto aki, ok?
eu precisei e atendeu com clareza e foi o último. naum precisei de outro.
Olá amigo!
Belo post, ajudou muito a começar a trabalhar com o FileChooser. Vi em outro tópico como inserir imagens em JLabel e agora gostaria de saber se tem como colocar no JLabel o .jpg ou .gif que o usuário escolher com o FileChooser. Digo, mandar o arquivo imagem escolhido na classe FileChooser para exibir em um JLabel em outra classe. Sabe como fazer isso?
Belo Site. Abraços!
Olá Rodrigo, bem vindo!
Da pra fazer isso sim. Primeiro você vai ter que criar o objeto “JLabel” em alguma classe ou objeto que você consiga alterar suas informações.
Depois manda o usuário escolher uma imagem no computador com o JFileChooser e seta o endereço da imagem (c:\\pasta\\imagem.jpg) no JLabel, mas isso só não vai fazer nada, após fazer isso você tem que mandar o java redesenhar o objeto, só vou ficar devendo nesse momento o comando, não consigo lembrar.
O filtro de extensões funcionou, porem pra funcionar tive que jogar tudo pra dentro do construtor da classe frame. Fica a dica.