// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Adicionando um Seletor de Arquivos para uma Aplicação Java
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Adicionando um Seletor de Arquivos para uma Aplicação Java - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Adicionando um Seletor de Arquivos para uma Aplicação Java

_Contribuição de Petr Dvorak link:http://blogs.oracle.com/joshis/entry/a_quick_jfilechooser_demo[+(Dez 2009)+], mantido por Alyona Stashkova_

Este tutorial mostra como adicionar um seletor de arquivos na aplicação Java usando o componente  ``javax.swing.JFileChooser`` . É possível codificá-lo à mão, mas utilizar o GUI Builder do NetBeans é uma maneira inteligente que economizará trabalho. Como parte do exercício, você criará uma pequena aplicação Java que carrega o arquivo  ``.txt``  na Área de texto.

Você pode fazer download link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%252FJFileChooserDemo.zip[+do projeto resultante com um seletor de arquivos+]. 


image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.0 e mais recente"]


*Para concluir este tutorial, você precisa dos seguintes recursos e softwares.*

|===
|Software ou Recurso |Versão Necessária 

|link:http://netbeans.org/downloads/[+NetBeans IDE+] |Versão 7.0 ou uma versão mais recente 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java Development Kit+] (JDK) |Versão 6, 7 ou 8 
|===


== Criando a Aplicação

Primeiro, você cria uma nova Aplicação Java:

1. No menu principal, escolha Arquivo > Novo Projeto. Escolha a categoria Java e o tipo de projeto da Aplicação Java. Clique em Próximo.
2. Para Nome do Projeto, digite `JFileChooserDemo` e especifique o local do projeto.
3. Cancele a seleção da caixa de seleção Criar Classe Principal.

[.feature]
--
image::images/newproj-small.png[role="left", link="images/newproj.png"]
--



. Clique em Finalizar.


== Criando o Form da Aplicação

Nesta seção, você cria um contêiner  ``JFrame``  e adiciona uns poucos componentes ao mesmo.

*Para criar o form JFrame:*

1. Clique com o botão direito do mouse no nó Pacotes de Código-fonte e escolha Novo > Outro. Escola a categoria Forms Swing GUI e o tipo de arquivo JFrameForm. Clique em Próximo.
2. Para Nome de Classe, digite `JFileChooserDemo`.
3. Para Pacote, digite `jfilechooserdemo.resources`.

[.feature]
--
image::images/newjframeform-small.png[role="left", link="images/newjframeform.png"]
--



. Clique em Finalizar.


. Na janela Propriedades, insira `Aplicação de demonstração` para a propriedade Título e pressione Enter para confirmar.

*Para adicionar componentes ao form JFrame:*

1. Na Paleta, abra a categoria Menus Swing, selecione o componente Barra de Menus e arraste-o para o canto superior esquerdo do JFrame.

*Observação: * se não vir a Paleta, selecione Janela > Paleta do menu principal.

[.feature]
--
image::images/menubaradded-small.png[role="left", link="images/menubaradded.png"]
--



. Clique com o botão direito do mouse no item Editar do componente Barra de Menus e selecione Deletar no menu de contexto.


. Para adicionar um item de menu que permita abrir o FileChooser a partir da aplicação em execução, na categoria Menus Swing na Paleta, selecione um novo item de menu (JMenuItem1) e arraste-o para a Barra de Menus e solte-o no item Arquivo na Barra de Menus.

[.feature]
--
image::images/menuitemadded-small.png[role="left", link="images/menuitemadded.png"]
--

*Observação:* assegure-se de que a Barra de Menus esteja selecionada antes de arrastar outro item de menu para ela para que o último seja adicionado na barra de menus.



. Clique com o botão direito do mouse em jMenuItem1 na view Design e escolha Alterar Nome da Variável no menu de contexto. Renomeie o item como `Abrir` e clique em OK.


. Assegure-se de que o jMenuItem1 ainda esteja selecionado na view Design. Pressione a barra de Espaço para editar o texto do componente. Altere o texto para `Abrir` e pressione Enter para confirmar.


. Especifique o handler de ação para o item de menu Abrir. Clique com o botão direito do mouse no item do menu e escolha Eventos > Ação > Ação executada do menu de contexto. O GUI Builder alterna automaticamente para a view do Código-fonte e um novo método do handler de evento  ``OpenActionPerformed()``  é gerado. A janela do Navegador deveria se semelhante a esta:

image::images/openactionperformednavigator.png[]



. Para adicionar um item de menu para sair do FileChoser antes da aplicação ter sido criada, alterne de volta para o modo Design, na categoria Menu Swing na Paleta, selecione um item de menu (JMenuItem1) e arraste-o para a Barra de Menus abaixo do item de menu Abrir. Observe que o realce laranja indica onde o  ``JMenuItem1``  será colocado.

[.feature]
--
image::images/highlighting-small.png[role="left", link="images/highlighting.png"]
--



. Clique com o botão direito do mouse em  ``jMenuItem1``  na view Design e escolha Alterar Nome da Variável no menu de contexto. Renomeie o item como `Sair` e clique em OK.


. Assegure-se de que o  ``jMenuItem1``  ainda esteja selecionado na view Design. Pressione a barra de Espaço para editar o texto do componente. Altere o texto para  ``Sair``  e pressione Enter para confirmar.


. Especifique o handler de ação para o item de menu Sair. Clique com o botão direito do mouse no item do menu e escolha Eventos > Ação > Ação executada do menu de contexto. O GUI Builder alterna automaticamente para a view do Código-fonte e um novo método de handler de evento é gerado, denominado `ExitActionPerformed()`. O nó `ExitActionPerformed` aparece na janela do Navegador abaixo do nó `OpenActionPerformed()`.


. Para fazer com que o item de menu Sair funcione, você inclui o seguinte código-fonte no corpo do método `ExitActionPerformed`:

[source,java]
----

			 System.exit(0); 
----


. Volte para o modo Design. Na categoria Controles de Swing da Paleta, arraste uma Área de Texto ( ``JTextArea`` ) para o form, como mostrado na figura abaixo.

[.feature]
--
image::images/textareadded-small.png[role="left", link="images/textareadded.png"]
--



. Redimensione o componente adicionado para criar espaço para o texto exibido mais tarde pelo Seletor de Arquivos. Renomeie a variável para `textarea`. O form deve parecer com a tela a seguir:

[.feature]
--
image::images/jfilechooserdemoview_final-small.png[role="left", link="images/jfilechooserdemoview_final.png"]
--

Você precisa criar uma aplicação Java simples como base para este tutorial. Em seguida, o Seletor de Arquivos real é selecionado.


== Adicionando o Seletor de Arquivos

1. Escolha Janela > Navegação > Navegador para abrir a janela Inspetor se ela ainda não estiver aberta.
2. No Navegador, clique com o botão direito do mouse no nó  ``Outros Componentes`` . Escolha Adicionar da paleta > Janelas Swing > Seletor de Arquivos no menu de contexto

Como uma alternativa para o menu de contexto  ``Adicionar da Paleta`` , você também pode arrastar e soltar um componente  ``JFileChooser``  da categoria Janelas Swing da Paleta para a área branca do GUI Builder. Isso terá o mesmo resultado, mas é um pouco mais difícil porque a exibição do  ``JFileChooser``  é um pouco grande e você poderá acidentalmente inserir a janela em um dos painéis, o que não é o desejado.



. Um exame no Navegador confirma que um  ``JFileChooser``  foi adicionado ao form.


. Clique com o botão direito do mouse no nó  ``JFileChooser``  e renomeie a variável para `fileChooser`.

image::images/navigator_jframe.png[]

Você adicionou um Seletor de Arquivos. A seguir, você faz o ajuste fino do Seletor de Arquivos para exibir o título que deseja, adiciona um filtro de arquivo personalizado e integra o Seletor de Arquivos em sua aplicação.


== Configurando o Seletor de Arquivos


=== Implementando a Ação Abrir

1. Clique para selecionar o  ``JFileChooser``  na janela Inspetor e, a seguir, edite suas propriedades na caixa de diálogo Propriedades. Altere a propriedade  ``dialogTitle``  para `Esta é minha caixa de diálogo aberta `, pressione Enter e feche a caixa de diálogo Propriedades.
2. Clique no botão Código-fonte no GUI Builder para alternar para o modo Código-fonte. Para integrar o Seletor de Arquivos em sua aplicação, cole a seguinte snippet de código-fonte no método `OPenActionPerformed` existente.

[source,java]
----

private void OpenActionPerformed(java.awt.event.ActionEvent evt) {
    int returnVal = fileChooser.showOpenDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File file = fileChooser.getSelectedFile();
        try {
          // What to do with the file, e.g. display it in a TextArea
          textarea.read( new FileReader( file.getAbsolutePath() ), null );
        } catch (IOException ex) {
          System.out.println("problem accessing file"+file.getAbsolutePath());
        }
    } else {
        System.out.println("File access cancelled by user.");
    }
} 
----

*Observação: * Remova primeira e a última linha do snippet de código que duplicam os existentes no arquivo de código-fonte.



. Se o editor relata erros em seu código, clique com o botão direito do mouse em qualquer lugar no código e selecione Corrigir Importações ou pressione Ctrl+Shift+I. Na caixa de diálogo Corrigir Todas as Importações aceite os defaults para atualizar as instruções de importação e clique em OK.

Como é possível ver, o método  ``getSelectedFile()``  do Seletor de Arquivos é chamado para determinar em que arquivo o usuário clicou, para que você possa trabalhar com ele. Esse exemplo lê o conteúdo do arquivo e o exibe na Área de Texto.


=== Implementação de um Filtro de Arquivo

Agora você precisa adicionar um filtro personalizado que faz com que o Seletor de Arquivos somente exiba arquivos  ``*.txt`` .

1. Alterne para o modo Design e selecione o  ``fileChooser``  na janela Navegador.
2. Na janela Propriedades, clique no botão de reticências ("...") ao lado da propriedade  ``fileFilter`` .
3. Na caixa de diálogo Filtro de Arquivos, selecione Código Personalizado na caixa de combinação.

[.feature]
--
image::images/combobox-small.png[role="left", link="images/combobox.png"]
--



. Digite  ``new MyCustomFilter()``  no campo de texto. Clique em OK.


. Para fazer com que o código personalizado funcione, você escreve uma classe interna (ou externa)  ``MyCustomFilter``  que estende a classe  ``FileFilter`` . Copie e cole o seguinte snippet de código no código-fonte de sua classe abaixo das instruções de importação, para criar um classe interna que implementa o filtro.

[source,java]
----

    class MyCustomFilter extends javax.swing.filechooser.FileFilter {
        @Override
        public boolean accept(File file) {
            // Allow only directories, or files with ".txt" extension
            return file.isDirectory() || file.getAbsolutePath().endsWith(".txt");
        }
        @Override
        public String getDescription() {
            // This description will be displayed in the dialog,
            // hard-coded = ugly, should be done via I18N
            return "Text documents (*.txt)";
        }
    } 
----

*Observação:* para saber como implementar filtros de arquivo comutáveis, mais inteligentes, consulte o método link:http://java.sun.com/javase/7/docs/api/javax/swing/JFileChooser.html#addChoosableFileFilter%28javax.swing.filechooser.FileFilter%29[+addChoosableFileFilter+].


== Executando a Aplicação

1. Clique com o botão direito no projeto JFileChooserDemo e selecione Executar para iniciar o projeto de amostra.
2. Na caixa de diálogo Executar Projeto, selecione a classe principal `jfilechooserdemo.resources.JFileChooserDemo` e clique em OK.

image::images/run.png[]



. Na aplicação de Demonstração em execução, escolha Abrir no menu Arquivo para acionar a ação. O resultado deve ficar da seguinte forma:

[.feature]
--
image::images/result_jfilechooserdemo-small.png[role="left", link="images/result_jfilechooserdemo.png"]
--



. Para fechar a aplicação, selecione Sair no menu Arquivo.

Examine outras janelas e caixas de diálogo úteis do Swing como o Seletor de Cores ou o Painel de Opções na Paleta GUI.

link:/about/contact_form.html?to=3&subject=Feedback:%20Adding%20a%20FileChooser[+Enviar Feedback neste Tutorial+]



== Próximas Etapas

* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG920[+Implementando GUIs de Java+] em _Desenvolvendo Aplicações com o NetBeans IDE_
* link:gui-binding.html[+Vinculando Beans e Dados em uma Aplicação Java com o NetBeans IDE+]
* link:gui-automatic-i18n.html[+Internacionalizando um Form GUI com o NetBeans IDE+]
* link:http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html[+Tutorial Java Tutorial: como usar Seletores de Arquivos+]
