Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões

1

Como gerar arquivos PDF
Neste tutorial, você vai aprender a gerar arquivos PDF a partir de aplicativos Java utilizando a biblioteca iText. Mais uma camada será introduzida ao desenho do nosso software: a camada base. Nessa camada, costumam ficar os serviços técnicos de mais baixo nível de um aplicativo, como, por exemplo, gerenciamento de servidores, de envio de e-mails, de registro e recuperação de logs, de E/S de rede e de geração de arquivos/relatórios.

Conteúdo
• Obtendo e adicionando a biblioteca iText o Como obter a biblioteca iText o Como adicionar a biblioteca iText ao projeto Implementando a camada Base o Como criar a classe GeradorDeCabecalhoRodape o Como criar a classe GeradorDeArquivoPDF o Como criar a interface IGeradorDeArquivoPDF o Como criar a classe FactoryDeServicos o Como criar a interface IFactoryDeServicos Implementando a camada Util o Como criar a classe ArquivoUtil Alteração na camada Modelo o Como criar a classe ControleArquivo Alteração na camada Visão o Como criar a classe GUIRelatorioDeSocio o Como criar a classe OuvinteDeGUIRelatorio o Alterações na classe GUIPrincipal

• • •

Obtendo e adicionando a biblioteca iText
Como obter a biblioteca iText
1. Acesse o endereço http://sourceforge.net/projects/itext/ e faça o download da versão mais recente do iText (A versão mais atual na data deste tutorial era a 5.0.2, arquivo iText-5.0.2.jar);

©2009 Antonio Passos | http://www.antoniopassos.com.br/ead | Todos os direitos reservados

Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões

2

2. Copie-a para o diretório lib do JDK que está usando, por exemplo, C:\Program Files\Java\jdk1.6.0_18\lib; 3. No NetBeans, clique no menu Ferramentas e, em seguida, em Bibliotecas; É aberto o Gerenciador de Bibliotecas. 4. Clique em Nova biblioteca. 5. Em Nome da biblioteca, digite iText e clique em OK. Entre as bibliotecas de classe, aparece agora iText.

6. Clique em Adicionar JAR/pasta. 7. Localize e selecione o arquivo jar do iText baixado e, em seguida, clique em Adicionar JAR/pasta. ©2009 Antonio Passos | http://www.antoniopassos.com.br/ead | Todos os direitos reservados

clique em Adicionar biblioteca. clique com o botão direito sobre Bibliotecas e.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 3 Como adicionar a biblioteca iText ao projeto 1. em seguida.antoniopassos. 2. Implementando a camada Base Como criar a classe GeradorDeCabecalhoRodape ©2009 Antonio Passos | http://www.br/ead | Todos os direitos reservados .com. No projeto. Selecione a biblioteca iText e clique em Adicionar biblioteca.

Clique com o botão direito sobre o pacote net.left()) / 6 + 30.top() + 10.impl.antoniopassos.net"))).addCell(new Phrase(new Chunk("Todos os direitos reservados"))). Implemente o método abaixo.antoniopassos.document.left()) / 2 + 78. Em pacote. 10.showTextAligned(cb.com.dukeclube. É exibido o assistente para criar classe. digite GeradorDeCabecalhoRodape. 8.ALIGN_CENTER. } Esse método configura o cabeçalho do relatório como sendo um parágrafo cujo texto é a string passada como argumento e o rodapé como uma tabela de 3 colunas.document.right() . 2.10. 0). rodape. acrescente . 1. (document. rodape = new PdfPTable(3). (document. ao lado do nome da classe. document. cb).addCell(new Phrase(new Chunk("http://ead.antoniopassos. cujas células exibem os créditos do DADP. Declare as seguintes variáveis: protected Paragraph cabecalho. 7. public GeradorDeCabecalhoRodape(String textoDoCabecalho) { cabecalho = new Paragraph(textoDoCabecalho).Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 1. rodape. Corrija as importações. Clique em Finalizar.br/ead | Todos os direitos reservados . 4. rodape. Corrija a importação. } Esse método é chamado assim que a página é concluída. aponte para Novo e clique em Classe Java. rodape. Implemente o método abaixo.addCell(new Phrase(new Chunk("Copyright © 2009 Antonio Passos"))). A classe GeradorDeRelatorios é criada. Para tanto. Faça a classe herdar de PdfPageEventHelper. cabecalho. e seu código-fonte é exibido. Corrija as importações. Document document) { PdfContentByte cb = writer. -1. Em Nome da classe. Corrija as importações.getDirectContent(). 3. document.base.arquivo.writeSelectedRows(0.setTotalWidth(580). 5. ©2009 Antonio Passos | http://www. Element.right() .bottom() . 4 6. ColumnText. 9. inclua extends PdfPageEventHelper. rodape. public void onEndPage(PdfWriter writer. protected PdfPTable rodape.

dukeclube.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 5 Como criar a classe GeradorDeArquivoPDF 1. Implemente o seguinte construtor: public GeradorDeArquivoPDF(File arquivo) { this.antoniopassos. 5.arquivoPDF.base. digite GeradorDeArquivoPDF. Em Nome da classe. ©2009 Antonio Passos | http://www.configurarPropriedades().impl.antoniopassos. Clique com o botão direito sobre o pacote net.getAbsolutePath()). } 7. Clique em Finalizar.criarRelatorio(this. 3. aponte para Novo e clique em Classe Java.arquivoPDF = arquivo.com. Implemente o seguinte método: public void gerarRelatorioDeSocios(List socios) throws DukeClubeException { this. private File arquivoPDF. 4. Corrija as importações. this. Declare as seguintes variáveis: private Document relatorio.br/ead | Todos os direitos reservados .arquivo. 6. 2.

rotate()). this.2"). Implemente o seguinte método.addSubject("Relatório de sócios"). relatorio. relatorio. } catch (DocumentException ex) { StringBuffer mensagem = new StringBuffer("Não foi possível gerar o relatório.configurarCabecalhoDaTabela(tabelaDeSocios).append("\nMotivo: " + ex.toString()).addKeywords("DukeClube. } 6 Esse método chama os métodos implementados abaixo para gerar o relatório. mensagem. 9.close(). 72).addCreator("iText 5. relatorio. this. mensagem.A4.setPageEvent(new GeradorDeCabecalhoRodape("DukeClube .setMargins(72."). try { PdfWriter writer = PdfWriter. Antonio Passos"). } } Esse método cria o arquivo PDF. throw new DukeClubeException(mensagem. a orientação para paisagem e as margens para 72. writer. } catch (FileNotFoundException ex) { StringBuffer mensagem = new StringBuffer("Não foi possível gerar o relatório. Note como são configurados o tamanho da página para A4. DADP").0. "0").Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões PdfPTable tabelaDeSocios = this. relatorio.Relatório de Sócios").toString()). 72."). relatorio. 8.criarTabela().addAuthor("Prof.antoniopassos.getMessage()).addHeader("Expires".addTitle("DukeClube . relatorio.br/ead | Todos os direitos reservados . socios).setPageSize(PageSize.Relatório de Sócios")). iText. new FileOutputStream(arquivo)).getInstance(relatorio. Implemente o seguinte método: private void criarRelatorio(String arquivo) throws DukeClubeException { this.adicionarLinhas(tabelaDeSocios. relatorio.com. private void configurarPropriedades() { relatorio. } Esse método configura as propriedades do arquivo PDF. ©2009 Antonio Passos | http://www. 72.relatorio = new Document(). throw new DukeClubeException(mensagem.append("\nMotivo: " + ex.getMessage()). relatorio.

} Esse método cria a tabela. "Data de nascimento". Implemente o seguinte método. PdfPTable tabelaDeSocios = new PdfPTable(7). private void configurarCabecalhoDaTabela(PdfPTable tabela) { tabela. cujas linhas corresponderão aos registros dos sócios.setHeaderRows(1).relatorio. tabela.com.setGrayFill(0. 12. "Telefone celular"}.antoniopassos. for (String cabecalho : linhaDeCabecalho) { PdfPCell celulaDeCabecalho = new PdfPCell(new Paragraph(cabecalho)). "Sexo". return tabelaDeSocios. Implemente o seguinte método: private PdfPTable criarTabela() { this. Implemente o seguinte método: ©2009 Antonio Passos | http://www.addCell(celulaDeCabecalho). "Telefone fixo".Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 7 10. celulaDeCabecalho. "Categoria". String[] linhaDeCabecalho = new String[]{"Nome".setWidthPercentage(100). 11. "E-mail".br/ead | Todos os direitos reservados .7f).open(). tabelaDeSocios. } } Esse método configura o cabeçalho da tabela criada no passo anterior com os atributos dos sócios.

for (Sexo sexo : Sexo. Corrija as importações.append("\nMotivo: " + exc. } } tabela.com.getCategoria()) { tabela. } try { relatorio.getTelefoneCelular()).addCell(socio.getSexo()) { tabela. } } 8 Esse método adiciona linhas à tabela. digite IGeradorDeArquivoPDF em Nome da interface.").br/ead | Todos os direitos reservados .iterator().toString()). Date data = socio. tabela. for (CategoriaDeSocio categoria : CategoriaDeSocio. 2.getDataNascimento().values()) { if (sexo.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões private void adicionarLinhas(PdfPTable tabela.addCell(socio.addCell(sexo. while (iterator.addCell(categoria.ordinal() == socio.getNome()).toString()). aponte para Refatorar e clique em Extrair interface.addCell(socio. 1.hasNext()) { Socio socio = (Socio) iterator.ordinal() == socio. cada uma correspondendo a um registro de sócio. Na janela Extrair interface. } catch (DocumentException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível gerar o relatório. ©2009 Antonio Passos | http://www.getEmail()).values()) { if (categoria.getTelefoneFixo()).getMessage()). Como criar a interface IGeradorDeArquivoPDF 1. marque a caixa gerarRelatorioDeSocio e clique em Refatorar.toString()). throw new DukeClubeException(mensagem.next().addCell(socio.format(data)). } } SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy"). Clique com o botão direito sobre o pacote a classe GeradorDeArquivoPDF. tabela.antoniopassos. tabela.add(tabela). mensagem. List socios) throws DukeClubeException { Iterator iterator = socios.addCell(formatoData. tabela.

3.antoniopassos. Como criar a classe FactoryDeServicos 1. apague .antoniopassos. Na janela Mover classe que é aberta. em Para pacote.com. 2. apague .Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 9 A interface é criada. em Pacote. 3.impl e clique em Refatorar. Em Nome da classe. Implemente o seguinte método: public IGeradorDeArquivoPDF getGeradorDeRelatorios(File arquivo) { ©2009 Antonio Passos | http://www.dukeclube. Clique com o botão direito sobre o pacote net. Clique em Finalizar. aponte para Refatorar e clique em Mover.arquivo. aponte para Novo e clique em Classe Java. 4.br/ead | Todos os direitos reservados .base.arquivo. digite FactoryDeServicos e. Clique com o botão direito sobre a interface. 4.

lastIndexOf(". 2. Clique com o botão direito sobre o pacote net. } } 4.modelo.antoniopassos. File arquivo) throws DukeClubeException { IFactoryDeServicos fabricaDeServicos = new FactoryDeServicos(). String extensao) { int posicaoDoPonto = arquivo. Em Pacote. Corrija a importação. Corrija as importações.br/ead | Todos os direitos reservados .com. marque a caixa correspondente ao método getGeradorDeRelatorios e clique em Refatorar. digite ControleArquivo e clique em Finalizar. 2. aponte para Novo e clique em Classe Java.dukeclube.util e clique em Finalizar."). Como criar a interface IFactoryDeServicos 1. digite ArquivoUtil.getAbsolutePath(). if (posicaoDoPonto < 0) { return false. Clique com o botão direito sobre a classe FactoryDeServicos. Implementando a camada Util Como criar a classe ArquivoUtil 1. } String extensaoDoArquivo = arquivo.antoniopassos.substring(posicaoDoPonto). } 10 5. aponte para Refatorar e clique em Extrair interface. Na janela aberta.dukeclube.toLowerCase(). digite IFactoryDeServicos em Nome da interface. } else { return false.equals(extensao)) { return true. 2. 3.controle.getAbsolutePath(). if (extensaoDoArquivo. Em Nome da classe.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões return new GeradorDeArquivoPDF(arquivo). acrescente . aponte para Novo e clique em Nova classe. Implemente o seguinte método: public void gerarRelatorioDeSocios(List socios. ©2009 Antonio Passos | http://www. Implemente o seguinte método: public static boolean isExtensaoIgualA(File arquivo. Clique com o botão direito sobre o pacote net.antoniopassos. Alteração na camada Modelo Como criar a classe ControleArquivo 1. Em Nome da classe. 3.

com.gerarRelatorioDeSocios(socios). geradorDeRelatorios.Relatório de Sócios. Em Nome da classe.gui. 3. Clique em Finalizar. clique com o botão direito em JInternalFrame e. No alto da janela. Alterações na camada Visão Como criar a classe GUIRelatorioDeSocio 1. 2. Clique com o botão direito sobre o pacote net. Adicione um painel(JPanel) e mude seu nome para pCriteriosDePesquisa.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões IGeradorDeArquivoPDF geradorDeRelatorios = fabricaDeServicos. 10. 5. } 11 4.antoniopassos. selecione Propriedades . Corrija as importações.br/ead | Todos os direitos reservados .antoniopassos. clique em Propriedades. digite DukeClube . 4. no menu pop-up.visao. Clique em Fechar. 6. A janela GUIRelatorioDeSocio é criada e aberta no editor (visão projeto). Na janela Inspetor. 7. digite GUIRelatorioDeSocio. Em title.dukeclube. ©2009 Antonio Passos | http://www. A janela Propriedades é exibida. 8. 9. Marque a caixa de seleção closable. aponte para Novo e clique em Formulário JInternalFrame.getGeradorDeRelatorios(arquivo).

) de border. 15. Adicione um grupo de botões (ButtonGroup) e mude seu nome para bgCategoriasDeSocios. selecione Borda de linha e clique em Ok. 14. mude seu texto para Todos os sócios e seu nome para rbSociosTodos. 12 12. Em Bordas disponíveis.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 11..antoniopassos. clique no botão de reticências (. ©2009 Antonio Passos | http://www.br/ead | Todos os direitos reservados . 13.com. Em Propriedades.. Marque a caixa de seleção da propriedade selected. Adicione um botão de opção(JRadioButton) ao painel.

Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 13 16. selecione bgCategoriasDeSocio. mude seu texto para Titulares e seu nome para cbTitulares. 17.. mude seu texto para Apenas os sócios.antoniopassos.com.br/ead | Todos os direitos reservados . Adicione uma caixa de seleção (JCheckBox).. selecione bgCategoriasDeSocio. 20. 19. Para a propriedade buttonGroup. Para a propriedade buttonGroup. Em Propriedades. e seu nome para rbSociosEspecificos. ©2009 Antonio Passos | http://www. 18. Adicione outro botão de opção. desmarque a caixa enabled.

Adicione outra caixa de seleção (JCheckBox). 26.com. Em Propriedades. desmarque a caixa enabled. 25. Adicione mais uma caixa de seleção (JCheckBox). adicione um campo de texto(JTextField). mude seu texto para Beneméritos e seu nome para cbBenemeritos.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 14 21. 23. 22. adicione um rótulo. Em Propriedades. mude seu texto para Remidos e seu nome para cbRemidos. 24.antoniopassos. desmarque a caixa editable. mude seu texto para Arquivo . Sob o painel.PDF e seu nome lArquivoPDF. 27. desmarque a caixa enabled. ©2009 Antonio Passos | http://www. Em Propriedades.br/ead | Todos os direitos reservados . Sob o rótulo. apague seu texto e mude seu nome para tfArquivoPDF.

e seu nome para bSelecionar. Ao lado do campo de texto. adicione um botão (JButton). 31. 15 30. Em Propriedades.com. aponte para Janelas Swing e clique em Selecionador de arquivos (JFileChooser) . desmarque a caixa de seleção da propriedade enabled..antoniopassos. ©2009 Antonio Passos | http://www. adicione um separador(JSeparator). aponte para Adicionar da paleta. mude seu texto para Gerar relatório e seu nome para bGerarRelatorio.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 28. clique com o botão direito sobre Outros componentes.. 29.br/ead | Todos os direitos reservados . Sob o campo de texto e o botão. Sob o separador. Na janela Inspetor. mude seu texto para Selecionar. adicione um botão. 32.

this.height . Declare a seguinte variável de instância: private File arquivo. } public boolean isSelectedCbRemidos() { return cbRemidos. public boolean isSelectedRbSociosTodos() { return rbSociosTodos. 34.getSize(). } Esse método posiciona a janela no centro da janela principal. Mude o nome do selecionador de arquivos para fcSelecionadorDeArquivo. Implemente o método abaixo.addActionListener(ouvinte). 35.getSize().Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 16 33. Corrija a importação. public void bGerarRelatorioAddActionListener(ActionListener ouvinte) { bGerarRelatorio. 39. Corrija a importação.getSize(). 40.isSelected(). 38.width . } public boolean isSelectecRbSociosEspecificos() { return rbSociosEspecificos. Implemente os métodos abaixo.com. } public boolean isSelectedCbBenemeritos() { ©2009 Antonio Passos | http://www.this. } Esse método adiciona um ouvinte (listener) ao botão bGerarRelatorio.getDesktopPane(). Implemente o método abaixo.isSelected(). (d. } public boolean isSelectedCbTitulares() { return cbTitulares.height) / 2). this.setLocation((d. 37.br/ead | Todos os direitos reservados . Acesse o código-fonte.antoniopassos.isSelected(). public void setPosicao() { Dimension d = this. 36.isSelected().width) / 2.

51. } 17 Esses métodos retornam true se o botão de opção (ou caixa de seleção) correspondente estiver selecionado.setEnabled(false). Volte à visão Projeto. 47. cbRemidos. if (fcSelecionadorDeArquivo. Substitua o comentário do método exibido pelas instruções abaixo. 42. cbRemidos. Dê um duplo clique no botão de opção Todos os sócios. tfArquivoPDF.visao. cbTitulares.getAbsolutePath()).setText(arquivoPDF.setEnabled(true). 52.APPROVE_OPTION) { arquivoPDF = fcSelecionadorDeArquivo.setEnabled(true).setEnabled(false). Caso contrário.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões return cbBenemeritos. ©2009 Antonio Passos | http://www. 45.setEnabled(true). retorna false. digite OuvinteDeGUIRelatorioDeSocio. cbTitulares. } Essas instruções criam e exibem uma instância de JFileChooser com que o usuário selecionará o diretório e o nome do arquivo PDF a ser gerado. cbRemidos. } Esse método retorna o arquivo PDF informado pelo usuário. 43.br/ead | Todos os direitos reservados . fcSelecionadorDeArquivo = new JFileChooser().setSelected(false). Dê um duplo clique no botão Selecionar. Volte à visão Projeto. Substitua o comentário do método exibido pelas instruções abaixo.setSelected(false).dukeclube. 48. 44. Volte à visão Projeto. aponte para Novo e clique em Classe Java. 46.ouvinte.com. Corrija as importações. Em Nome da classe. 41. cbBenemeritos. Substitua o comentário do método exibido pelas instruções abaixo. Clique com o botão direito sobre o pacote net. cbTitulares. public File getArquivo() { return this.getSelectedFile().antoniopassos.setEnabled(false). Como criar a classe OuvinteDeGUIRelatorioDeSocio 1.isSelected(). bGerarRelatorio. cbBenemeritos. 49.setEnabled(true). Implemente o método abaixo.setSelected(false). 2. Dê um duplo clique no botão de opção Apenas os sócios. Corrija as importações.showSaveDialog(null) == JFileChooser.arquivoPDF.antoniopassos. 50. cbBenemeritos.

br/ead | Todos os direitos reservados . Corrija as importações.ordinal()).bGerarRelatorioAddActionListener(new OuvinteGerarRelatorio()).exibirMensagem(ex. Declare a seguinte variável: private GUIRelatorioDeSocio guiRelatorio. Implemente o seguinte construtor: public OuvinteDeGUIRelatorioDeSocio(GUIRelatorioDeSocio guiRelatorio) { this. ©2009 Antonio Passos | http://www.antoniopassos. this. Corrija a importação.size() > 0) { ControleArquivo controleArquivo = new ControleArquivo(). arquivo).getArquivo().isSelectecRbSociosEspecificos()) { if (guiRelatorio. } controleArquivo.adicionarCriterioDePesquisaIgualA("categoria". "DukeClube .getMessage().getAbsolutePath() + ".adicionarCriterioDePesquisaIgualA("categoria". Clique em Finalizar.ordinal()). } else { throw new DukeClubeException("Não há sócios cadastrados!!!").isExtensaoIgualA(arquivo. if (!ArquivoUtil.realizarPesquisa(). 6. 18 5. } if (guiRelatorio. } } try { List socios = controleSocio.ordinal()).pdf"). Implemente a seguinte classe interna: class OuvinteGerarRelatorio implements ActionListener { public void actionPerformed(ActionEvent e) { gerarRelatorioDeSocios(). ".Benemérito.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 3. CategoriaDeSocio. 4. 9. Declare a seguinte variável: private GUIRelatorioDeSocio guiRelatorioDeSocios.isSelectedCbTitulares()) { controleSocio. Implemente o seguinte método: private void gerarRelatorioDeSocios() { ControleSocio controleSocio = new ControleSocio().gerarRelatorioDeSocios(socios.isSelectedCbBenemeritos()) { controleSocio. } } 8. } Alterações na classe GUIPrincipal 1. } if (guiRelatorio. } } 7.guiRelatorio.Titular.com.Remido.Relatório". true). CategoriaDeSocio.pdf")) { arquivo = new File(arquivo. if (guiRelatorio.adicionarCriterioDePesquisaIgualA("categoria".isSelectedCbRemidos()) { controleSocio. if (socios. CategoriaDeSocio. File arquivo = guiRelatorio.guiRelatorio = guiRelatorio. } } catch (DukeClubeException ex) { GUIMensagem.

Execute o aplicativo.setVisible(true).setPosicao(). Levante o servidor de banco de dados H2. desktopPane. guiRelatorioDeSocios. "DukeClube . em seguida.toString(). clique em actionPerformed. No corpo do método exibido. clique com o botão direito sobre o item de menu itemDeMenuRelatorioDeSocio. 2. 3.com. } 19 4. É aberta a janela Relatório de Sócios. clique no item de menu Sócio.br/ead | Todos os direitos reservados . mensagem. Na janela Inspetor.exibirMensagem(mensagem. aponte para Action e.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 2.append("Não foi possível selecionar a janela Relatório de Sócio!"). Corrija a importação. } try { guiRelatorioDeSocios. GUIMensagem. ©2009 Antonio Passos | http://www.setSelected(true).antoniopassos. mensagem. OuvinteDeGUIRelatorioDeSocio ouvinte = new OuvinteDeGUIRelatorioDeSocio(guiRelatorioDeSocios). Testando o aplicativo 1. true). Clique no menu Relatório e.isVisible())) { guiRelatorioDeSocios = new GUIRelatorioDeSocio().getMessage()). guiRelatorioDeSocios. substitua o comentário pelas instruções: if ((guiRelatorioDeSocios == null) || (!guiRelatorioDeSocios. caso não o tenha feito ainda.append("\nMotivo: " + exc. em seguida. 3. aponte para Eventos. } catch (PropertyVetoException exc) { StringBuffer mensagem = new StringBuffer().add(guiRelatorioDeSocios).Relatório de Sócio".

clique no botão Gerar relatório.antoniopassos. O relatório de sócios é gerado. Clique no botão Selecionar. 20 6. 9.Desenvolvimento de Aplicativos Desktop em Java Utilizando Padrões 4. ©2009 Antonio Passos | http://www.br/ead | Todos os direitos reservados . É exibido o seletor de arquivos. Encerre o aplicativo. Prossiga a geração de relatórios. Acesse o diretório onde foi gerado o arquivo e abra-o com um leitor de PDF. Em seguida. C:\Temp). Selecione um diretório (Por exemplo. 5. mas agora selecionando categoria(s) específica(s) de sócio.DukeClube – Relatório de Sócios) e clique em Save. 7. dê um nome ao arquivo (Por exemplo.com. 8.