Desenvolvimento de aplicativos desktop em Java utilizando padrões de projeto

Page 1

Desenvolvimento de aplicativos desktop em Java utilizando padrões

Como criar as janelas GUIPrincipal e GUISobre Siga os passos deste tutorial para criar a interface MDI do aplicativo. Ao concluí-lo, esperamos que você seja capaz de: • • • •

Criar a janela principal de aplicativos MDI a partir do exemplo fornecido pela IDE NetBeans; Alterar o texto e o nome de menus e itens de menus; Adicionar e excluir menus e itens de menu; Tratar eventos lançados por itens de menu e botões.

Conteúdo • •

Criando o projeto Criando a janela principal (GUIPrincipal) o Criando o JFrame; o Configurando o JFrame; o Personalizando a barra de menus Criando a janela GUISobre o Criando o JInternalFrame; o Configurando o JInternalFrame; o Adicionando componentes Swing ao JInternalFrame; o Adicionando método que centraliza a janela em relação à janela principal; Tratando eventos de ação disparados por botões e itens de menu o Tratando o evento de ação do botão Fechar o Tratando o evento de ação do item de menu Sobre

Criando o projeto 1. Inicie o NetBeans. 2. Na janela Projetos, clique com o botão direito e, em seguida, clique em Novo projeto. O assistente Novo projeto inicia. 3. Em Categorias, selecione Java. Em Projetos, selecione Aplicativo Java. 4. Clique em Próximo. 5. Na caixa Nome do projeto, digite DukeClube. Em Criar classe principal, digite net.antoniopassos.dukeclube.Main.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

1


Desenvolvimento de aplicativos desktop em Java utilizando padrões

6. Clique em Finalizar. O projeto é criado e aparece na janela Projetos.

Criando a janela principal do aplicativo(GUIPrincipal) Criando o JFrame 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube, aponte para Novo no menu pop-up e, em seguida, clique em Outro. 2. Em Categorias, selecione Formulários GUI Swing. Em Tipos de arquivos, selecione Formulário exemplo de aplicativo MDI. 3. Clique em Próximo. 4. Em Nome da classe, digite GUIPrincipal. Em pacote, digite net.antoniopassos.dukeclube.visao.gui. 5. Clique em Finalizar. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

2


Desenvolvimento de aplicativos desktop em Java utilizando padrões

Configurando o JFrame 1. Na janela Inspetor, localizada no canto inferior esquerdo do NetBeans, clique com o botão direito em JFrame e, em seguida, clique em Propriedades. A janela Propriedades é exibida. 2. Na parte superior da janela, selecione Propriedades. 3. Em title, digite DukeClube. 4. Clique em Fechar. 5. No alto do editor, clique em Código-fonte para visualizar o código-fonte da janela GUIPrincipal.

6. Dentro do construtor, abaixo de initComponents , digite o seguinte: this.setExtendedState(JFrame.MAXIMIZED_BOTH);

O código do construtor fica, então, assim: ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

3


Desenvolvimento de aplicativos desktop em Java utilizando padrões

7. Clique no ícone de lâmpada ao lado de setExtendedState e, em seguida, clique em Adicionar import para javax.swing.JFrame.

Personalizando a barra de menus Alterando o texto de menus e de itens de menu 1. Clique em Projeto, no alto do editor, para alterar a visão da janela GUIPrincipal de Código-fonte para Projeto. 2. Dê um duplo clique sobre o menu File, digite Arquivo e tecle Enter. Prossiga alterando os textos dos menus e itens de menu conforme a tabela: De

Para

Open

Exportar sócios

Save

Exportar sócios/dependentes

Exit

Sair

Edit

Cadastro

Cut

Sócio

Copy

Dependente

Help

Ajuda

About

Sobre o DukeClube

Excluindo itens de menu 1. Clique no menu Arquivo e, em seguida, clique em Save As.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

4


Desenvolvimento de aplicativos desktop em Java utilizando padrões

2. Clique com o botão direito e, no menu pop-pup, clique em Excluir. Prossiga e exclua os itens de menu Paste e Delete do menu Cadastro e Contents do menu Ajuda.

Alterando o nome de menus e de itens de menu 1. Na janela Inspetor, clique com o botão direito sobre o menu fileMenu e, em seguida, clique em Alterar o nome da variável.

2. Digite menuArquivo e tecle Enter. Prossiga e altere os nomes dos menus e itens de menus conforme a tabela: De

Para

editMenu

menuCadastro

helpMenu

menuAjuda

openMenuItem

itemDeMenuExportarSocios

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

5


Desenvolvimento de aplicativos desktop em Java utilizando padrões saveMenuItem

itemDeMenuExportarSociosEDependentes

exitMenuItem

itemDeMenuSair

cutMenuItem

itemDeMenuCadSocio

copyMenuItem

itemDeMenuCadDependente

aboutMenuItem

itemDeMenuSobre

Após os menus e itens de menus terem sido renomeados, a janela Inspetor deve parecer-se com a seguinte.

Adicionando menu 1. Na janela Inspetor, clique com o botão direito em menuBar e, em seguida, clique em Adicionar menu. É criado um novo menu na barra de menus. 2. Arraste o novo menu para que fique entre os menus Cadastro e Ajuda. 3. Altere seu texto para Relatório e seu nome para menuRelatorio.

Adicionando itens aos menus 1. Clique com o botão direito sobre o menu menuRelatório, aponte para Adicionar da paleta e clique em Item de menu. É adicionado um item de menu ao menu menuRelatório. 2. Altere seu texto para Geral e seu nome para itemDeMenuRelGeral. 3. Clique novamente com o botão direito sobre o menu menuRelatório, aponte para Adicionar da paleta e clique em Menu. É adicionado um menu ao menu menuRelatorio. 4. Altere seu texto para Sócio e seu nome para menuRelSocio. 5. Clique sobre o menuRelSocio, aponte para Adicionar da paleta e clique em Item de menu. É adicionado um item de menu ao menu menuRelSocio. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

6


Desenvolvimento de aplicativos desktop em Java utilizando padrões 6. Altere seu texto para Titular e seu nome para itemDeMenuRelSocioTitular. 7. Adicione mais dois itens de menu ao menu menuRelSocio. Altere seus textos para Remido e Benemérito e seus nomes para itemDeMenuRelSocioRemido e itemDeMenuRelSocioBenemerito.

Adicionando separador 1. Clique com o botão direito sobre o menu Arquivo, aponte para Adicionar da paleta e clique em Separador. Um separador é adicionado após o item de menu Sair.

2. Na janela Inspetor, clique com o botão direito sobre o item de menu itemDeMenuSair e, em seguida, clique em Mover para baixo.

Criando a janela GUISobre Criando o JInternalFrame 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.visao.gui, aponte para Novo e, em seguida, clique em Outro. 2. Em Categorias, selecione Formulários GUI Swing e, em Tipos de arquivos, selecione Formulário JInternalFrame. 3. Clique em Próximo. 4. Em Nome da classe, digite GUISobre. 5. Clique em Finalizar.

Configurando o JInternalFrame 1. Na janela Inspetor, clique com o botão direito em JInternalFrame e, em seguida, clique em Propriedades. A janela Propriedades é exibida. 2. No alto da janela, selecione Propriedades . 3. Marque a caixa de seleção closable. 4. Em title, digite DukeClube - Sobre. 5. Clique em Fechar. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

7


Desenvolvimento de aplicativos desktop em Java utilizando padrões Adicionando componentes Swing 1. Arreste um rótulo (JLabel) da Paleta de componentes Swing, mude seu texto para DukeClube e seu nome para lNomeDoAplicativo.

Prossiga incluindo os demais componentes para que a janela GUISobre se pareça com o da figura.

Os componentes e respectivas propriedades são os seguintes: Componente swing

Nome

Texto

JLabel(Rótulo)

lVersaoDoAplicativo

Versão 1.0

JLabel

lAutorDoAplicativo

Autor

JLabel

lDescricaoDoAplicativo

Descrição

JLabel

lLicencaDoAplicativo

Licença

JTextField(Campo de texto)

tfAutor

Seu nome

JTextArea(Área de texto)

taDescricao

Aplicativo-exemplo implementado passo a passo ao longo do curso "Desenvolvimento de aplicativos desktop com padrões" (http://ead.antoniopassos.net) com o propósito de demonstrar a utilização de

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

8


Desenvolvimento de aplicativos desktop em Java utilizando padrões padrões de projeto na construção de softwares orientados a objetos. JTextArea

taLicenca

Licença Pública da GNU (GNU General Public License), conforme publicada pela Free Software Foundation.

JButton(Botão)

bFechar

Fechar

Na janela propriedade dos componentes tfAutor, taDescricao e taLicenca, desmarque a caixa de seleção Editable.

Na janela propriedade dos componentes taDescricao e taLicenca, marque as seguintes caixas de seleção: lineWrap e wrapStyleWord.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

9


Desenvolvimento de aplicativos desktop em Java utilizando padrões

Reajuste o tamanho dos componentes se necessário.

Adicionando método que centraliza a janela GUISobre 1. No alto do editor, clique em Código-fonte para visualizar o código-fonte da janela GUISobre. 2. Após o construtor, insira o seguinte método: public void setPosicao() { Dimension d = this.getDesktopPane().getSize(); this.setLocation((d.width - this.getSize().width)/2, (d.height - this.getSize().height)/2); } 3. Clique no ícone de lâmpada ao lado de Dimension e, em seguida, clique em Adicionar import para

java.awt.Dimension.

Tratando eventos de botões e itens de menu Tratando o evento do botão bFechar 1. No alto do editor, clique em Projeto para alternar para a visão Projeto da GUISobre. 2. Clique com o botão direito sobre o botão bFechar, aponte para Action e, em seguida, clique em actionPerformed.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

10


Desenvolvimento de aplicativos desktop em Java utilizando padrões

3. Substitua o comentário do método exibido pela seguinte instrução: this.dispose();

Tratando o evento do item de menu itemDeMenuSobre 1. Acesse o código-fonte da GUIPrincipal. 2. Logo abaixo das declarações de variáveis, declare uma variável do tipo GUISobre: GUISobre guiSobre;

3. Volte à visão projeto da GUIPrincipal 4. Na janela Inspetor, clique com o botão direito sobre o item de menu itemDeMenuSobre, aponte para Eventos, aponte para Action e, em seguida, clique em actionPerformed. No corpo do método exibido, inclua as seguintes instruções: if (guiSobre == null){ guiSobre = new GUISobre(); }

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

11


Desenvolvimento de aplicativos desktop em Java utilizando padrões desktopPane.add(guiSobre); guiSobre.setVisible(true); guiSobre.setPosicao();

O método deve parecer-se com o seguinte:

5. Localize e apague o seguinte método da GUIPrincipal:

Escrevendo o corpo do método main da classe Main 1. Acesse o código-fonte da classe Main. 2. Substitua o comentário do método main pelas instruções abaixo: GUIPrincipal guiPrincipal = new GUIPrincipal(); guiPrincipal.setLocationRelativeTo(null); guiPrincipal.setVisible(true);

O método main de Main deve parecer-se com o seguinte:

3. Clique no ícone de lâmpada e, em seguida, clique em Adicionar import para net.antoniopassos.dukeclube.visao.gui.GUIPrincipal. Execute e teste o aplicativo.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

12


Desenvolvimento de aplicativos desktop em Java utilizando padrões Incluir sócio: Como mapear o projeto das camadas Modelo e Persistência para código Java Neste tutorial você vai aprender a codificar os componentes das camadas modelo e persistência do aplicativo que estamos desenvolvendo. No anterior, você executou o script para criar o banco de dados. Ao longo da criação dos pacotes, classes e interfaces das camadas, serão informados os patterns utilizados. Detalhes do código que mereçam maior atenção serão destacados.

Ao concluí-lo, esperamos que você seja capaz de: • • •

Mapear projeto para código; Identificar padrões em um projeto de aplicativo; Justificar a utilização de padrões.

Ao codificar um projeto, devemos fazê-lo dos componentes menos acoplados para os mais acoplados, ou seja, dos componentes que possuem menor dependência para os que possuem maior dependência. Analisando-se a arquitetura lógica vemos que a classe DukeClubeException não está acoplada a nenhum outro componente. Por esse motivo, iremos dar início a codificação por ela. Conteúdo •

Implementando a classe de exceção o Como criar o pacote excecao o Como criar a classe DukeClubeException Implementando as classes de domínio o Como criar os pacotes modelo e dominio o Como criar a classe Socio o Como criar a interface Contantes ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

13


Desenvolvimento de aplicativos desktop em Java utilizando padrões •

Implementando as classes de persistência o Como criar os pacotes IGateway e Gateway o Como criar a interface IGatewaySocio o Como criar a classe Parametros o Como criar a classe GerenciadorDeConexao o Como criar a classe GatewaySocio o Como criar a interface IFactoryGateway o Como criar a classe FactoryGateway Implementando a classe de controle o Como criar a classe ControleSocio

Implementando a classe de exceção Não convém que sejam propagadas as exceções de nível mais baixo como, por exemplo, ClassNotFoundException ou SQLException. Você deve projetar seu próprio tipo de exceção e, quando da ocorrência de exceção de baixo nível, empacotá-las na que criou, acrescentar informações e emiti-la para a camada superior. Na arquitetura lógica, vemos que foi prevista a exceção DukeClubeException localizada no pacote excecao. Como regra geral, as classes de exceção herdam de Exception e implementam dois construtores: um construtor default e um que aceita uma string descrevendo o motivo pelo qual foi lançada a exceção.

Como criar o pacote excecao 6. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube, aponte para Novo e, em seguida, clique em Pacote. É exibido o assistente para criar pacote. 7. Em nome do pacote, digite net.antoniopassos.dukeclube.excecao e clique em Finalizar.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

14


Desenvolvimento de aplicativos desktop em Java utilizando padrões Como criar a classe DukeClubeException 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.excecao, aponte para Novo e clique em Classe Java. É exibido o assistente para criar classe. 2. Em nome da classe, digite DukeClubeException e clique em Finalizar. A classe DukeClubeException é criada, e seu código-fonte é exibido. 3. Após o nome da classe, digite extends Exception; public class DukeClubeException extends Exception { }

4. Clique com o botão direito dentro da classe, no menu pop-up, clique em Inserir código e, em seguida, em Construtor. É aberta uma janela com várias opções de construtor.

5.

Marque a caixa de seleção do construtor Exception() e clique em Gerar.

É gerado o construtor default. 6. No corpo do construtor default, insira a seguinte instrução: super("Causa do erro: Desconhecida");

7. Repita o passo 4 acima;

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

15


Desenvolvimento de aplicativos desktop em Java utilizando padrões 8. Na janela Gerar construtor, selecione agora o construtor Exception(String message) e clique em Gerar. A classe DukeClubeException deve parecer-se com a seguinte:

Implementando as classes de domínio A classe Socio A classe Socio é um Modelo de Domínio. Ele é um POJO (Plain Old Java Objects) que modela o conceito de sócio. Os Modelos de Domínio ficam localizados no pacote domínio da camada de Modelo.

Como criar o pacote dominio 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube, aponte para Novo e, em seguida, clique em Pacote. É exibido o assistente para criar pacote. 2. Em nome do pacote, digite net.antoniopassos.dukeclube.modelo.dominio e clique em Finalizar.

Como criar a classe Socio ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

16


Desenvolvimento de aplicativos desktop em Java utilizando padrões 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.modelo.dominio, aponte para Novo e clique em Classe Java. É exibido o assistente para criar classe. 3. Em nome da classe, digite Socio e clique em Finalizar. A classe Socio é criada, e seu código-fonte é exibido. 4. Declare os seguintes campos de instância: Nome

Tipo

codigo

long

categoria

Int

nome

String

sexo

int

dataNascimento

java.util.Date

telefoneFixo

String

telefoneCelular

String

email

String

5. Clique com o botão direito abaixo da última variável de instância, no menu pop-up, clique em Inserir código e, em seguida, clique em Construtor. 6. Na janela Gerar construtor, clique em Gerar. É criado o construtor default. 9. Clique com o botão direito abaixo do construtor, aponte para Refatorar e clique em Encapsular campos.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

17


Desenvolvimento de aplicativos desktop em Java utilizando padrões 10. Na janela Encapsular campos, clique em Selecionar tudo e, em seguida, clique em Refatorar. São gerados os métodos de acesso (getters) e os métodos modificadores (setters). 11. Após o nome do método setNome, digite throws IllegalArgumentException; 12. No corpo do método setNome, antes da instrução this.nome = nome, inclua o seguinte: if (nome==null || nome.length()==0){ throw new IllegalArgumentException("O nome do sócio não foi informado!"); }

O método setNome deve parecer-se com o seguinte:

Implementando Constantes e Enums

Como criar o pacote constante 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.modelo.dominio, aponte para Novo e clique em Pacote Java; 2. Substitua newpackage por constante; 3. Clique em Finalizar.

Como criar a interface Constante 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.modelo.dominio.constante, aponte para Novo e clique em Interface Java. 2.

Em Nome da classe, digite Constante e clique em Finalizar;

A interface Constante é criada, e seu código-fonte é exibido. 4. Defina a seguinte constante: public static final byte NOVO = -1;

Como criar o Enum CategoriaDeSocio 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.modelo.dominio.constante, aponte para Novo e clique em Outro. 2. Em Categorias, selecione Java e, em Tipos de arquivos, selecione Enum Java. 3. Clique em Próximo. 4. Em Nome da Classe, digite CategoriaDeSocio e clique em Finalizar. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

18


Desenvolvimento de aplicativos desktop em Java utilizando padrões O enum é criado, e seu código-fonte é exibido. 5. No corpo do enum, digite, separado por vírgulas, Titular, Remido e Benemérito. O enum deve parecer-se com o seguinte:

Seguindo o exemplo, crie mais dois tipos Enum: Sexo e RelacaoDeParentesco. No corpo do enum Sexo, digite, separado por vírgula, Feminino e Masculino. No corpo de RelacaoDeParentesco, digite, também separado por vírgula, Cônjuge, Filho, Filha, Pai e Mãe. A hierarquia de pacotes, classes, interfaces e enums do aplicativo deve parecer-se com a seguinte:

Implementando a camada de persistência Gateway em inglês significa acesso, entrada, portão. Enquanto pattern, um gateway de tabela de dados é uma classe cuja interface pública constitui-se de métodos que realizam operações de persistência. Ou seja, um gateway de tabela de dados é uma classe em cujos métodos se encontram as instruções SQL para inserir, alterar, excluir e consultar registros de tabelas. No diagrama de pacotes que ilustra a arquitetura lógica, vê-se o pacote igateway que contém as interfaces. A implementação das interfaces ficam localizadas no pacote gateway.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

19


Desenvolvimento de aplicativos desktop em Java utilizando padrões

Uma interface é um tipo Java que declara um conjunto de métodos e respectivas assinaturas. Em uma interface, todos os métodos são abstratos e públicos e não há campos de instância. Usa-se interface para tornar o código mais geral e reutilizável e para reduzir o acoplamento entre classes. A interface IGatewaySocio especifica as operações essenciais que devem ser implementadas pelas classes que realizam seleções, inclusões, alterações e exclusões de objetos Socio.

Como criar os pacotes gateway e igateway 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube, aponte para Novo e clique em Pacote. É exibido o assistente para criar pacote. 2. Em Nome do pacote, digite net.antoniopassos.dukeclube.persistencia.gateway e clique em Finalizar. 3. Repita o passo 1 acima. 4. Em nome do pacote, digite agora net.antoniopassos.dukeclube.persistencia.igateway e clique em Finalizar.

Criando a interface IGatewaySocio 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.persistencia.igateway, aponte para Novo e clique em Interface Java. É exibido o assistente para criar interface. 2. Em Nome da classe, digite IGatewaySocio e clique em Finalizar. A interface é criada, e seu código-fonte é exibido. 3. Importe os seguintes pacotes: import java.util.List; import net.antoniopassos.dukeclube.modelo.dominio.Socio;

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

20


Desenvolvimento de aplicativos desktop em Java utilizando padrões 4. Defina os seguintes métodos: public public public public

abstract abstract abstract abstract

void void List List

gravarSocio(Socio socio) throws DukeClubeException; excluirSocio(Socio socio) throws DukeClubeException; pesquisar() throws DukeClubeException; pesquisar(String nome) throws DukeClubeException;

5. Clique no ícone de lâmpada que aparece na margem esquerda do editor de código-fonte e, em seguida, clique em Adicionar import para net.antoniopassos.dukeclube.excecao.DukeClubeException;

Como criar a classe ParametrosBD A classe ParametrosBD encapsula as informações necessárias para a conexão com o banco de dados. 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.persistencia.gateway, aponte para Novo e clique em Classe Java. É exibido o assistente para criar classe. 2. Em nome da classe, digite ParametrosBD e clique em Finalizar. A classe ParametrosBD é criada, e seu código-fonte é exibido. 3. Remova o modificador de controle de acesso public da declaração da classe para tornar seu acesso de pacote; 4. Abaixo do nome da classe, defina as seguintes constantes (altere os valores para aqueles correspondentes aos do seu banco de dados): static static static static

final final final final

String String String String

DRIVER = "org.h2.Driver"; URL = "jdbc:h2:tcp://localhost//db/dukeclube/dukeclube"; USER = "admin"; PASSWORD = "adminadmin";

Como criar a classe GerenciadorDeConexao A classe GerenciadorDeConexao implementa os métodos que gerenciam a conexão com o banco de dados. 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.persistencia.gateway, aponte para Novo e clique em Classe Java. É exibido o assistente para criar classe. 2. Em nome da classe, digite GerenciadorDeConexao e clique em Finalizar. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

21


Desenvolvimento de aplicativos desktop em Java utilizando padrões A classe GerenciadorDeConexao é criada, e seu código-fonte é exibido. 3. Remova o modificador de controle de acesso public da declaração da classe para tornar seu acesso de pacote. 4. Implemente os seguintes métodos: /** * Obtém uma conexão com o banco de dados * @return a conexão do banco de dados * @throws DukeClubeException */ static Connection getConexao() throws DukeClubeException { try { Class.forName(ParametrosBD.DRIVER); Connection con = DriverManager.getConnection(ParametrosBD.URL, ParametrosBD.USER, ParametrosBD.PASSWORD); return con; } catch (ClassNotFoundException exc) { String mensagem = "Não foi possível localizar o driver do banco de dados"; throw new DukeClubeException(mensagem); } catch (SQLException exc) { String mensagem = "Não foi possível conectar com o banco de dados"; throw new DukeClubeException(mensagem); } } /** * Fecha a conexão com o banco de dados * @param con a conexão a ser fechada * @throws DukeClubeException */ static void closeConexao(Connection con)throws DukeClubeException { closeConexao(con, null, null); } /** * Fecha a conexão com o banco de dados e o objeto PreparedStatement * @param con a conexão a ser fechada * @param stmt o objeto PreparedStatement a ser fechado * @throws DukeClubeException */ static void closeConexao(Connection con, PreparedStatement stmt)throws DukeClubeException { closeConexao(con, stmt, null); } /** * Fecha a conexão com o banco de dados e os objetos PreparedStatement e ResultSet * @param con a conexão a ser fechada * @param stmt o objeto PreparedStatement a ser fechado * @param rs o objeto ResultSet a ser fechado * @throws DukeClubeException */ static void closeConexao(Connection con, PreparedStatement stmt, ResultSet rs) throws DukeClubeException { try { if (rs != null){ rs.close(); } if (stmt != null){ stmt.close(); }

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

22


Desenvolvimento de aplicativos desktop em Java utilizando padrões

if (con != null){ con.close(); } } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível finalizar a conexão com banco de dados."); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } }

5. Pressione CTRL + SHIFT + I para consertar as importações.

6. Clique em Ok.

Como criar a classe GeradorDeChave 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.persistencia.gateway, aponte para Novo e clique em Classe Java. 2. Em Nome da classe, digite GeradorDeChave e clique em Finalizar. 3. Remova o modificador de controle de acesso public da declaração da classe para tornar seu acesso de pacote. 4. Declare as seguintes variáveis e constante: private private private private private

static final byte INCREMENTO = 1; Connection con; String tabela; long proximoCodigo; long maximoCodigo;

5. Implemente o seguinte construtor: public GeradorDeChave(String tabela) throws DukeClubeException { this.con = GerenciadorDeConexao.getConexao(); this.tabela = tabela; proximoCodigo = 0; maximoCodigo = 0; try {

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

23


Desenvolvimento de aplicativos desktop em Java utilizando padrões con.setAutoCommit(false); } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer ("Não foi possível desligar a confirmação automática"); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } }

6. Implemente os seguintes métodos: public synchronized long getProximoCodigo()throws DukeClubeException { if (proximoCodigo == maximoCodigo) { reservarCodigo(); } return proximoCodigo; } private void reservarCodigo() throws DukeClubeException { PreparedStatement stmt = null; ResultSet rs = null; long proximoCodigoNovo; String sql = "SELECT proximoCodigo FROM chaves WHERE tabela = ? FOR UPDATE"; try { stmt = con.prepareStatement(sql); stmt.setString(1, tabela); rs = stmt.executeQuery(); rs.next(); proximoCodigoNovo = rs.getLong("proximoCodigo"); } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível gerar o próximo código"); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } long maximoCodigoNovo = proximoCodigoNovo + INCREMENTO; stmt = null; rs = null; try { sql = "UPDATE chaves SET proximoCodigo = ? WHERE tabela = ?"; stmt = con.prepareStatement(sql); stmt.setLong(1, maximoCodigoNovo); stmt.setString(2, tabela); stmt.executeUpdate(); con.commit(); proximoCodigo = proximoCodigoNovo; maximoCodigo = maximoCodigoNovo; } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível gerar o código"); } finally { GerenciadorDeConexao.closeConexao(con, stmt, rs); } }

7. Pressione CTRL + SHIFT + I para corrigir as importações.

Como criar a classe SocioGateway A classe GatewaySocio implementa a interface IGatewaySocio. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

24


Desenvolvimento de aplicativos desktop em Java utilizando padrões 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.persistencia.gateway, aponte para Novo e clique em Classe Java. É exibido o assistente para criar classe. 1. Em Nome da classe, digite GatewaySocio e clique em Finalizar. A classe GatewaySocio é criada, e seu código-fonte é exibido. 2. Após o nome da classe, digite implements IGatewaySocio; 3. Clique no ícone de lâmpada que aparece na margem esquerda do editor de código-fonte e, em seguida, clique Adicionar import para net.antoniopassos.dukeclube.persistencia.igateway.IGatewaySocio;

4. Clique novamente no ícone de lâmpada e, em seguida, clique em Implementar todos os métodos abstratos.

5. Abaixo do nome da classe, defina as seguintes constantes (instruções SQL): private static final String SQL_INCLUIR = "INSERT INTO socio " + "(codigosocio, categoria, nome, sexo, datanascimento, telefonefixo, telefonecelular, email) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; private static final String SQL_ALTERAR = "UPDATE socio SET " + "categoria=?, nome=?, sexo = ?, datanascimento = ?, telefonefixo=?, telefonecelular=?, email=? " + "WHERE codigosocio = ?"; private static final String SQL_EXCLUIR = "DELETE FROM socio " + "WHERE codigosocio = ?"; private static final String SQL_PESQUISARTODOS = "SELECT * FROM socio";

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

25


Desenvolvimento de aplicativos desktop em Java utilizando padrões

private static final String SQL_PESQUISARPORNOME = "SELECT * FROM socio " + "WHERE nome = ?";

6. Exclua a seguinte instrução do corpo de todos os métodos. throw new UnsupportedOperationException("Not supported yet.");

7. Implemente o método incluirSocio como abaixo: private void incluirSocio(Socio socio) throws DukeClubeException { if (socio == null) { String mensagem = "Não foi informado o socio a cadastrar."; throw new DukeClubeException(mensagem); } Connection con = null; PreparedStatement stmt = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_INCLUIR); GeradorDeChave geradorDeChave = new GeradorDeChave("Socio"); long codigosocio = geradorDeChave.getProximoCodigo(); stmt.setLong(1, codigosocio); stmt.setInt(2, socio.getCategoria()); stmt.setString(3, socio.getNome()); stmt.setInt(4, socio.getSexo()); java.util.Date dataNascimento = socio.getDataNascimento(); stmt.setDate(5, new java.sql.Date(dataNascimento.getTime())); stmt.setString(6, socio.getTelefoneFixo()); stmt.setString(7, socio.getTelefoneCelular()); stmt.setString(8, socio.getEmail()); stmt.executeUpdate(); } catch (SQLException exc) { StringBuffer msg = new StringBuffer("Não foi possível incluir o sócio."); msg.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(msg.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt); } }

8. Implemente o método alterarSocio como abaixo: private void alterarSocio(Socio socio) throws DukeClubeException { if (socio == null) { String mensagem = "Não foi informado o socio a alterar"; throw new DukeClubeException(mensagem); } Connection con = null; PreparedStatement stmt = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_ALTERAR); stmt.setInt(1, socio.getCategoria()); stmt.setString(2, socio.getNome()); stmt.setInt(3, socio.getSexo()); java.util.Date dataNascimento = socio.getDataNascimento(); stmt.setDate(4, new java.sql.Date(dataNascimento.getTime())); stmt.setString(5, socio.getTelefoneFixo());

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

26


Desenvolvimento de aplicativos desktop em Java utilizando padrões stmt.setString(6, socio.getTelefoneCelular()); stmt.setString(7, socio.getEmail()); stmt.setLong(1, socio.getCodigo()); stmt.executeUpdate(); } catch (SQLException exc) { StringBuffer msg = new StringBuffer("Não foi possível atualizar os dados do sócio."); msg.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(msg.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt); } }

9. Preencha o corpo do método gravarSocio com as seguintes instruções: if (socio.getCodigo() == Constante.NOVO) { incluirSocio(socio); } else { alterarSocio(socio); }

10. Pressione CTRL + SHIFT + I para resolver as importações. 11. Preencha o corpo do método excluirSocio com as seguintes instruções: if (socio == null) { String mensagem = "Não foi informado o sócio a excluir."; throw new DukeClubeException(mensagem); } Connection con = null; PreparedStatement stmt = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_EXCLUIR); stmt.setLong(1, socio.getCodigo()); stmt.executeUpdate(); } catch (SQLException exc) { StringBuffer msg = new StringBuffer("Não foi possível excluir o sócio."); msg.append("\nMotivo:" + exc.getMessage()); throw new DukeClubeException(msg.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt); }

12. Implemente o método criarSocio abaixo: private Socio criarSocio(ResultSet rs) throws DukeClubeException { Socio socio = new Socio(); try { socio.setCodigo(rs.getLong("codigosocio")); socio.setCategoria(rs.getByte("categoria")); socio.setNome(rs.getString("nome")); socio.setSexo(rs.getByte("sexo")); socio.setDataNascimento(rs.getDate("datanascimento")); socio.setTelefoneFixo(rs.getString("telefonefixo")); socio.setTelefoneCelular(rs.getString("telefonecelular")); socio.setEmail(rs.getString("email")); } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível obter os dados do sócio."); mensagem.append("\nMotivo: " + exc.getMessage());

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

27


Desenvolvimento de aplicativos desktop em Java utilizando padrões throw new DukeClubeException(mensagem.toString()); } return socio; }

13. Preencha o corpo do método pesquisarPorNome com as seguintes instruções: if (nome == null || nome.trim().equals("")) { return pesquisarTodos(); } Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_PESQUISARPORNOME); stmt.setString(1, "%" + nome + "%"); rs = stmt.executeQuery(); List socios = new ArrayList(); while (rs.next()) { Socio socio = criarSocio(rs); socios.add(socio); } return socios; } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível realizar a consulta."); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt, rs); }

14. Preencha o corpo do método pesquisarTodos com as seguintes instruções: Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_PESQUISARTODOS); rs = stmt.executeQuery(); List socios = new ArrayList(); while (rs.next()) { Socio socio = criarSocio(rs); socios.add(socio); } return socios; } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível realizar a consulta."); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt, rs); }

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

28


Desenvolvimento de aplicativos desktop em Java utilizando padrões A interface IFactoryGateway e sua implementação FactoryGateway Na interface IFactoryGateway estão métodos que retornam Gateway. O propósito é desacoplar a camada Modelo da camada Persistência. Com isso, pode-se facilmente mudar o banco de dados ou até mesmo substituir a persistência em banco de dados por arquivo XML sem ter que promover alterações nas camadas superiores.

Como criar a interface IFactoryGateway 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.persistencia.gateway aponte para Novo e clique em Interface Java; 2. Em Nome da classe, digite IFactoryGateway; 3. Apague .gateway em Pacote e clique em Finalizar. A interface é criada, e seu código-fonte é exibido. 4. Defina o seguinte método: public IGatewaySocio getGatewaySocio();

5. Importe os pacotes necessários.

Como criar a classe FactoryGateway 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.persistencia aponte para Novo e clique em Classe Java; 2. Em Nome da classe, digite FactoryGateway e clique em Finalizar. A classe é criada, e seu código-fonte é aberto. 3. Após o nome da classe, digite implements IFactoryGateway; ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

29


Desenvolvimento de aplicativos desktop em Java utilizando padrões 4. Clique no ícone de lâmpada e, em seguida, clique em Implementar todos os métodos abstratos; 5. Substitua a instrução throw new UnsupportedOperationException("Not supported yet.")

por return new GatewaySocio();

6. Importe os pacotes necessários.

Implementando a classe de controle Um Controlador tem por objetivo receber e tratar eventos do sistema. Com isso, aumenta-se a possibilidade de reutilização e de interfaces “plugáveis” ao evitar que lógica da aplicação seja tratada na camada Visão. Um Controlador é um tipo de Fachada, ou seja, um objeto frontal que funciona como ponto de entrada para os serviços de um subsistema, no caso, para os serviços da camada Persistência.

Como criar a classe ControleSocio 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.modelo.dominio, aponte para Novo e clique em Classe Java. 2. Em Nome da classe, digite ControleSocio. Em Pacote, digite net.antoniopassos.dukeclube.modelo.controle. 3. Clique em Finalizar. A classe ControleSocio é criada, e seu código-fonte é exibido. 4. Implemente os seguintes métodos: ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

30


Desenvolvimento de aplicativos desktop em Java utilizando padrões public void gravarSocio(Socio socio) throws DukeClubeException { IFactoryGateway factoryGateway = new FactoryGateway(); IGatewaySocio gatewaySocio = factoryGateway.getGatewaySocio(); gatewaySocio.gravarSocio(socio); } public void excluirSocio(Socio socio) throws DukeClubeException { IFactoryGateway factoryGateway = new FactoryGateway(); IGatewaySocio gatewaySocio = factoryGateway.getGatewaySocio(); gatewaySocio.excluirSocio(socio); } public List pesquisarTodos() throws DukeClubeException { IFactoryGateway factoryGateway = new FactoryGateway(); IGatewaySocio gatewaySocio = factoryGateway.getGatewaySocio(); return gatewaySocio.pesquisarTodos(); } public List pesquisarPorNome(String nome) throws DukeClubeException { IFactoryGateway factoryGateway = new FactoryGateway(); IGatewaySocio gatewaySocio = factoryGateway.getGatewaySocio(); return gatewaySocio.pesquisarPorNome(nome); }

5. Faça as importações necessárias. Os componentes do aplicativo até o momento são os seguintes:

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

31


Desenvolvimento de aplicativos desktop em Java utilizando padrões Incluir sócio: Como mapear o projeto da camada Visão para código Java Neste tutorial, você vai aprender a criar as janelas GUISocio e GUIDadosSocio que integram a camada Visão do aplicativo. Também aprenderá como criar classes que “ouvem” e tratam os eventos de ação gerados pelos seus botões.

Conteúdo •

Criando a janela GUIDadosSocio o Criando o JInternalFrame o Adicionando os componentes Swing o Implementando os métodos o Tratando os eventos de ação dos botões Criando a classe OuvinteDeGUIDadosSocio o Criando a classe o Implementando os métodos o Ajustando a classe GUISocios Criando a janela GUISocios o Criando o JInternalFrame o Adicionando componentes Swing o Implementando os métodos o Tratando os eventos de ação Tratando o evento de ação do item de menu Socio.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

32


Desenvolvimento de aplicativos desktop em Java utilizando padrões Criando a janela GUIDadosSocio

Criando o JInternalFrame 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.visao.gui, aponte para Novo e, em seguida, clique em Outro. 2. Em Categorias, selecione Formulários GUI Swing e, em Tipos de arquivos, Formulário JInternalFrame. 3. Clique em Próximo. 4. Em Nome da classe, digite GUIDadosSocio e clique em Finalizar. A janela GUIDadosSocio é criada e aberta no editor (visão projeto). 5. Na janela Inspetor, clique com o botão direito em JInternalFrame e, no menu pop-up, clique em Propriedades. A janela Propriedades é exibida. 6. No alto da janela, selecione Propriedades . 7. Marque a caixa de seleção closable. 8. Em title, digite DukeClube – Dados do sócio. 9. Em defaultCloseOperation, selecione HIDE. 10. Clique em Fechar.

Adicionando os componentes Swing 1. Adicione um painel e mude seu nome para pDadosSocio. 2. Na janela Propriedades do painel, clique no botão de reticências da propriedade border.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

33


Desenvolvimento de aplicativos desktop em Java utilizando padrões

É aberta a janela border. 3. Selecione Borda de título em Bordas disponívies.

4. Em Título, digite Dados do sócio e clique no botão OK. 5. Adicione ao painel um rótulo(JLabel), mude seu texto para Categoria e seu nome para lCategoria. 6. Adicione ao painel uma caixa de combinação (JComboBox) e mude seu nome para cbCategoria. 7. Na janela Propriedades de cbCategoria, clique no botão de reticências (...) da propriedade model.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

34


Desenvolvimento de aplicativos desktop em Java utilizando padrões

8. Apague todos os itens (Item 1, Item 2, Item 3 e Item 4) e digite Selecione... 9. Clique em OK. 10. Adicione ao painel um rótulo, mude seu texto para Nome e seu nome para lNome. 11. Adicione ao painel um campo de texto(JTextField), apague seu texto e mude seu nome para tfNome. 12. Adicione ao painel um rótulo, mude seu texto para Sexo e seu nome para lSexo. 13. Adicione um grupo de botões (ButtonGroup). 14. Na janela Inspetor, mude o nome do grupo de botões para bgSexo.

15. Adicione ao painel um botão de opção (JRadioButton), mude seu texto para Feminino e seu nome para rbFeminino. 16. Na janela Propriedades do botão de opção rbFeminino, selecione bgSexo para a propriedade buttonGroup.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

35


Desenvolvimento de aplicativos desktop em Java utilizando padrões

17. Adicione ao painel um botão de opção, mude seu texto para Masculino e seu nome para rbMasculino. 18. Na janela Propriedades do botão de opção rbMasculino, selecione bgSexo para a propriedade buttonGroup. 19. Adicione ao painel um rótulo, mude seu texto para Data de nascimento e seu nome para lDataNascimento. 20. Adicione ao painel um campo formatado (JFormattedTextField), apague seu texto e mude seu nome para tfDataNascimento. 21. Na janela Propriedades do campo formatado, clique no botão de reticências da propriedade formatterFactory.

22. Em Categoria, selecione máscara. Em Formatar, selecione personalizado. 23. Em Formato, digite ##/##/####. 24. Clique em OK. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

36


Desenvolvimento de aplicativos desktop em Java utilizando padrões 25. Adicione ao painel um rótulo, mude seu texto para Telefone fixo e seu nome para lTelefoneFixo. 26. Adicione ao painel um campo formatado, apague seu texto e mude seu nome para tfTelefoneFixo. 27. Na janela Propriedades do campo formatado, clique no botão de reticências da propriedade formatterFactory. 28. Em Categoria, selecione máscara. Em Formatar, selecione personalizado. 29. Em Formato, digite (##) ####-####. 30. Clique em OK. 31. Adicione ao painel um rótulo, mude seu texto para Telefone celular e seu nome para lTelefoneCelular. 32. Adicione ao painel um campo formatado, apague seu texto e mude seu nome para tfTelefoneCelular. 33. Na janela Propriedades do campo formatado, clique no botão de reticências da propriedade formatterFactory. 34. Em Categoria, selecione máscara. Em Formatar, selecione personalizado. 35. Em Formato, digite (##) ####-####. 36. Clique em OK. 37. Adicione ao painel um rótulo, mude seu texto para E-mail e seu nome para lEmail. 38. Adicione ao painel um campo de texto, apague seu texto e mude seu nome para tfEmail. 39. Adicione sob o painel um botão, mude seu texto para Limpar e seu nome para bLimpar. 40. Adicione sob o painel um botão, mude seu texto para Gravar e seu nome para bGravarSocio.

Implementando os métodos 1. No alto do editor, clique em Código-fonte para visualizar o código-fonte da janela. 2. No construtor, abaixo de initComponents , insira o seguinte... for (CategoriaDeSocio categoria : CategoriaDeSocio.values()) { cbCategoria.addItem(categoria.name()); }

3. Adicione uma variável de instância Socio. Socio sócio;

4. Adicione os seguintes métodos: public Socio getSocio() throws DukeClubeException { int categoria = cbCategoria.getSelectedIndex(); if (categoria == 0) { throw new DukeClubeException("Não foi informada a categoria do sócio."); } else { socio.setCategoria(categoria - 1); } String nome = tfNome.getText();

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

37


Desenvolvimento de aplicativos desktop em Java utilizando padrões if (nome == null || nome.trim().equals("")){ tfNome.requestFocus(); throw new DukeClubeException("Não foi informado o nome do sócio."); } else { socio.setNome(nome); } if (rbFeminino.isSelected()) { socio.setSexo(Sexo.Feminino.ordinal()); } else if (rbMasculino.isSelected()){ socio.setSexo(Sexo.Masculino.ordinal()); } else { throw new DukeClubeException("Não foi informado o sexo do sócio."); } String strDataNascimento = tfDataNascimento.getText(); DateFormat df = DateFormat.getDateInstance(); try { java.util.Date dataNascimento = df.parse(strDataNascimento); socio.setDataNascimento(dataNascimento); } catch (ParseException ex) { tfDataNascimento.requestFocus(); String mensagem = "Não foi informada a data de nascimento ou ela é inválida."; throw new DukeClubeException(mensagem); } catch (DukeClubeException ex) { tfDataNascimento.requestFocus(); throw new DukeClubeException(ex.getMessage()); } socio.setTelefoneFixo(tfTelefoneFixo.getText()); socio.setTelefoneCelular(tfTelefoneCelular.getText()); socio.setEmail(tfEmail.getText()); return socio; } public void setSocio(Socio socio){ this.socio = socio; this.exibeDadosDoSocio(); } public void exibeDadosDoSocio() { limparCampos(); if (socio.getCodigo() != Constante.NOVO) { cbCategoria.setSelectedIndex(socio.getCategoria()); tfNome.setText(socio.getNome()); if (socio.getSexo() == Sexo.Feminino.ordinal()) { rbFeminino.setSelected(true); } if (socio.getSexo() == Sexo.Masculino.ordinal()) { rbMasculino.setSelected(true); } DateFormat df = DateFormat.getDateInstance(); java.util.Date dataNascimento = socio.getDataNascimento(); if (dataNascimento != null) { tfDataNascimento.setText(df.format(dataNascimento)); } tfTelefoneFixo.setText(socio.getTelefoneFixo()); tfTelefoneCelular.setText(socio.getTelefoneCelular()); tfEmail.setText(socio.getEmail());

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

38


Desenvolvimento de aplicativos desktop em Java utilizando padrões } } public void setPosicao() { Dimension d = this.getDesktopPane().getSize(); this.setLocation(15 + (d.width - this.getSize().width) / 5, 15 + (d.height this.getSize().height) / 5); } public void showMensagem(String mensagem, boolean isErro) { if (isErro) { JOptionPane.showMessageDialog(null, mensagem, "Mensagem de erro", JOptionPane.ERROR_MESSAGE); } else { JOptionPane.showMessageDialog(null, mensagem, "Mensagem de sucesso", JOptionPane.INFORMATION_MESSAGE); } } public void bGravarSocioAddActionListener(ActionListener ouvinte) { bGravarSocio.addActionListener(ouvinte); } public void limparCampos(){ cbCategoria.setSelectedIndex(0); tfNome.setText(null); tfDataNascimento.setText(null); tfTelefoneFixo.setText(null); tfTelefoneCelular.setText(null); tfEmail.setText(null); }

5. Corrija as importações.

Tratando os eventos de ação dos botões 1. No alto do editor, clique em Projeto. 2. Dê um duplo-clique sobre o botão Limpar. É criado o método bLimparActionPerformed. 3. No corpo do método bLimparActionPerformed, inclua a seguinte instrução. limparCampos();

Criando a classe OuvinteDeGUIDadosSocio

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

39


Desenvolvimento de aplicativos desktop em Java utilizando padrões

1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.visao.gui, aponte para Novo e clique em Classe Java. 2. Em Nome da classe, digite OuvinteDeGUIDadosSocio. Em pacote, substitua gui por ouvinte. 3. Clique em Finalizar. A classe é criada, e seu código-fonte aparece no editor. 4. Adicione uma variável de instância GUIDadosSocio. GUIDadosSocio guiDadosSocio;

5. Declare uma classe interna que implemente a interface ActionListener. class OuvinteGravarSocio implements ActionListener { public void actionPerformed(ActionEvent e) { Socio socio; try { socio = guiDadosSocio.getSocio(); ControleSocio controle = new ControleSocio(); controle.gravarSocio(socio); guiDadosSocio.showMensagem("Sócio gravado com sucesso!", false); guiDadosSocio.limparCampos(); } catch (DukeClubeException ex) { guiDadosSocio.showMensagem(ex.getMessage(), true); } } }

6. Adicione um construtor que receba como parâmetro um objeto GUIDadosSocio. public OuvinteDeGUIDadosSocio(GUIDadosSocio gui) { guiDadosSocio = gui; guiDadosSocio.bGravarSocioAddActionListener(new OuvinteGravarSocio()); }

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

40


Desenvolvimento de aplicativos desktop em Java utilizando padrões 7. Corrija as importações.

Criando a janela GUISocios

Criando o JInternalFrame 8. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.visao.gui, aponte para Novo e clique em Outro. 9. Em Categorias, selecione Formulários GUI Swing . Em Tipos de arquivos, selecione Formulário JInternalFrame. 10. Clique em Próximo. 11. Em Nome da classe, digite GUISocios e clique em Finalizar. A janela GUISocios é criada e aberta no editor (visão projeto). 12. Na janela Inspetor, clique com o botão direito em JInternalFrame e, no menu pop-up, clique em Propriedades. A janela Propriedades é exibida. 13. No alto da janela, selecione Propriedades . 14. Marque a caixa de seleção closable. 15. Em title, digite DukeClube - Sócios. 16. Clique em Fechar.

Adicionando os componentes Swing 1. Insira uma tabela (JTable) e mude seu nome para tSocios. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

41


Desenvolvimento de aplicativos desktop em Java utilizando padrões 2. Acima da tabela, insira um botão (JButton), mude seu texto para Novo sócio e seu nome para bNovoSocio. 3. Abaixo da tabela, insira um botão, mude seu texto para Ver dependentes e seu nome para bVerDependentes. 4. Insira um botão, mude seu texto para Alterar e seu nome para bAlterarSocio; 5. Insira um botão, mude seu texto para Excluir e seu nome para bExcluirSocio; 6. Insira um painel (JPanel) e mude seu nome para pPesquisarSocio; 7. Na janela Propriedades do painel, clique no botão de reticências da propriedade border. É aberta a janela border. 8. Em Bordas disponíveis, selecione Borda de título. 9. Em Título, digite Critério de pesquisa. 10. Clique no botão OK. 11. Dentro do painel, insira um rótulo (JLabel), mude seu texto para Nome e seu nome para lNome; 12. Dentro do painel, insira um campo de texto (JTextField), apague seu texto e mude seu nome para tfNome; 13. Dentro do painel, insira um botão, mude seu texto para Pesquisar e seu nome para bPesquisarSocio.

Implementando os métodos 1. No alto do editor, clique em Código-fonte para visualizar o código-fonte da janela. 2. Adicione uma variável de instância GUIDadosSocio. GUIDadosSocio guiDadosSocio;

3. Adicione o seguinte método: public void setPosicao() { Dimension d = this.getDesktopPane().getSize(); this.setLocation((d.width - this.getSize().width) / 6, (d.height this.getSize().height) / 6); }

4. Corrija as importações. 5. Adicione os seguintes métodos... public void exibirMensagem(String mensagem, String titulo, boolean isErro) { int tipo; if (isErro) { tipo = JOptionPane.ERROR_MESSAGE; } else { tipo = JOptionPane.INFORMATION_MESSAGE; } JOptionPane.showMessageDialog(null, mensagem, titulo, tipo); }

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

42


Desenvolvimento de aplicativos desktop em Java utilizando padrões

private void abrirGUIDadosSocio(Socio socio) { if (guiDadosSocio == null) { guiDadosSocio = new GUIDadosSocio(); OuvinteDeGUIDadosSocio ouvinte = new OuvinteDeGUIDadosSocio(guiDadosSocio); this.getParent().add(guiDadosSocio); guiDadosSocio.setPosicao(); } guiDadosSocio.setSocio(socio); guiDadosSocio.setVisible(true); try { guiDadosSocio.setSelected(true); } catch (PropertyVetoException ex) { exibirMensagem("Não foi possível selecionar a janela GUIDadosSocio", "DukeClube - Socios", true); } }

Tratando os eventos de ação 1. No alto do editor, clique em Projeto. 2. Dê um duplo-clique sobre o botão NovoSocio. É criado o método bNovoSocioActionPerformed. 3. No corpo do método bNovoSocioActionPerformed, inclua as seguintes instruções: Socio socio = new Socio(); socio.setCodigo(Constante.NOVO); this.abrirGUIDadosSocio(socio);

Tratando o evento de ação de itemDeMenuCadSocio da GUIPrincipal 1. Acesse o código-fonte da janela GUIPrincipal. 2. Declare uma variável de instância GUISocios. GUISocios guiSocios;

3. Na janela Inspetor, clique com o botão direito sobre o item de menu itemDeMenuCadSocio, aponte para Eventos, aponte para Action e clique em actionPerformed. É criado o método itemDeMenuCadSocioActionPerformed. 4. Em seu corpo, insira o seguinte… if (guiSocios == null) { guiSocios = new GUISocios(); } desktopPane.add(guiSocios); guiSocios.setVisible(true);

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

43


Desenvolvimento de aplicativos desktop em Java utilizando padrões guiSocios.setPosicao();

Consultar, alterar e excluir sócio: Alterações nos componentes existentes Neste tutorial você vai aprender a implementar as modificações necessárias nos componentes já codificados para que seja possível consultar, alterar e excluir sócios.

Conteúdo •

• •

Alterações na camada Persistência o Alterações na interface IGatewaySocio o Alterações na classe GatewaySocio Alterações na camada Modelo o Alterações na classe ControleSocio Alteração na camada Visão o Alterações na classe GUISocios o Alterações na classe GUIDadosSocios o Criando a classe OuvinteDeGUISocios o Alterações na classe GUIPrincipal

Implementando as alterações na camada Persistência

Alterações na interface IGatewaySocio 1. Substitua os métodos pesquisarTodos e pesquisarPorNome pelos seguintes: public abstract List pesquisar() throws DukeClubeException; public abstract List pesquisar(String nome) throws DukeClubeException;

Alterações na classe GatewaySocio ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

44


Desenvolvimento de aplicativos desktop em Java utilizando padrões 1. Substitua os métodos pesquisarTodos e pesquisarPorNome pelos seguintes. public List pesquisar() throws DukeClubeException { throw new UnsupportedOperationException("Not supported yet."); } public List pesquisar(String nome) throws DukeClubeException { throw new UnsupportedOperationException("Not supported yet."); }

2. Declare as seguintes constantes: private static final String SQL_EXCLUIR = "DELETE FROM socio " + "WHERE codigosocio = ?"; private static final String SQL_PESQUISARTODOS = "SELECT * FROM socio"; private static final String SQL_PESQUISARPORNOME = "SELECT * FROM socio " + "WHERE nome LIKE ?";

3. Exclua a seguinte instrução dos métodos pesquisar e excluirSocio. throw new UnsupportedOperationException("Not supported yet.");

4. Inclua no método excluirSocio as instruções abaixo. if (socio == null) { String mensagem = "Não foi informado o sócio a excluir."; throw new DukeClubeException(mensagem); } Connection con = null; PreparedStatement stmt = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_EXCLUIR); stmt.setLong(1, socio.getCodigo()); stmt.executeUpdate(); } catch (SQLException exc) { StringBuffer msg = new StringBuffer("Não foi possível excluir o sócio."); msg.append("\nMotivo:" + exc.getMessage()); throw new DukeClubeException(msg.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt); }

5. Implemente o método criarSocio. private Socio criarSocio(ResultSet rs) throws DukeClubeException { Socio socio = new Socio(); try { socio.setCodigo(rs.getLong("codigosocio")); socio.setCategoria(rs.getByte("categoria")); socio.setNome(rs.getString("nome")); socio.setSexo(rs.getByte("sexo")); socio.setDataNascimento(rs.getDate("datanascimento")); socio.setTelefoneFixo(rs.getString("telefonefixo")); socio.setTelefoneCelular(rs.getString("telefonecelular")); socio.setEmail(rs.getString("email")); } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível obter os dados do sócio."); mensagem.append("\nMotivo: " + exc.getMessage());

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

45


Desenvolvimento de aplicativos desktop em Java utilizando padrões throw new DukeClubeException(mensagem.toString()); } return socio; }

6. Inclua no método pesquisar() as seguintes instruções: Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_PESQUISARTODOS); rs = stmt.executeQuery(); List socios = new ArrayList(); while (rs.next()) { Socio socio = criarSocio(rs); socios.add(socio); } return socios; } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível realizar a consulta."); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt, rs); }

7. Inclua no método pesquisar(String nome) as seguintes instruções: if (nome == null || nome.trim().equals("")) { return pesquisar(); } Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_PESQUISARPORNOME); stmt.setString(1, "%" + nome + "%"); rs = stmt.executeQuery(); List socios = new ArrayList(); while (rs.next()) { Socio socio = criarSocio(rs); socios.add(socio); } return socios; } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível realizar a consulta."); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt, rs); }

8. No método alterarSocio, substitua ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

46


Desenvolvimento de aplicativos desktop em Java utilizando padrões stmt.setLong(1, socio.getCodigo());

por stmt.setLong(8, socio.getCodigo());

9. Corrija as importações.

Alterações na camada Modelo

Alterações na classe ControleSocio 1. Implemente os seguintes métodos: public void excluirSocio(Socio socio) throws DukeClubeException { IFactoryGateway factoryGateway = new FactoryGateway(); IGatewaySocio gatewaySocio = factoryGateway.getGatewaySocio(); gatewaySocio.excluirSocio(socio); } public List pesquisar() throws DukeClubeException { IFactoryGateway factoryGateway = new FactoryGateway(); IGatewaySocio gatewaySocio = factoryGateway.getGatewaySocio(); return gatewaySocio.pesquisar(); } public List pesquisar(String nome) throws DukeClubeException { IFactoryGateway factoryGateway = new FactoryGateway(); IGatewaySocio gatewaySocio = factoryGateway.getGatewaySocio(); return gatewaySocio.pesquisar(nome); }

2. Corrija as importações.

Alterações na camada Visão

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

47


Desenvolvimento de aplicativos desktop em Java utilizando padrões

Alterações na janela GUISocios 1. Clique com o botão direito sobre a tabela e, no menu pop-up, clique em Conteúdo da tabela. É aberta a caixa de diálogo Personalizador. 2. Selecione a aba Colunas.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

48


Desenvolvimento de aplicativos desktop em Java utilizando padrões 3. Altere o título das colunas para Nome, Telefone fixo, Telefone celular e E-mail. 4. Desmarque a caixa de seleção Permitir reordenar colunas com o método arrastar e soltar. 5. Selecione a aba Linhas. 6. Em Conta, substitua 4 (quatro) por 0 (zero). 7. Clique em Fechar. A janela deve parecer-se com a seguinte:

8. Visualize o código-fonte da janela. 9. Adicione uma variável de instância List. private List socios;

10. Inclua os seguintes métodos: public void exibirSocios(List socios) { this.socios = socios; DefaultTableModel model = (DefaultTableModel) tSocios.getModel(); this.removerLinhasDaTabela(model); Iterator resultado = socios.iterator(); while (resultado.hasNext()) { Socio socio = (Socio) resultado.next(); String nome = socio.getNome(); String telefoneFixo = socio.getTelefoneFixo(); String telefoneCelular = socio.getTelefoneCelular(); String email = socio.getEmail(); Object[] linha = {nome, telefoneFixo, telefoneCelular, email};

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

49


Desenvolvimento de aplicativos desktop em Java utilizando padrões model.addRow(linha); } } private void removerLinhasDaTabela(DefaultTableModel model){ while (model.getRowCount() > 0){ int ultimaLinha = model.getRowCount()-1; model.removeRow(ultimaLinha); } } public Socio getSocio() throws DukeClubeException { Socio socio = null; int linhaSelecionada = tSocios.getSelectedRow(); if (linhaSelecionada < 0) { throw new DukeClubeException("Não foi selecionado nenhum sócio"); } socio = (Socio) this.socios.get(linhaSelecionada); return socio; } public String getNome() { return tfNome.getText(); } public int pedirConfirmacao(String mensagem, String titulo, int tipo){ int resposta = JOptionPane.showConfirmDialog(null, mensagem, titulo, tipo); return resposta; } public void bExcluirSocioAddActionListener(ActionListener ouvinte) { bExcluirSocio.addActionListener(ouvinte); } public void bPesquisarSocioAddActionListener(ActionListener ouvinte) { bPesquisarSocio.addActionListener(ouvinte); }

11. Corrija as importações. 12. Volte à visão Projeto. 13. Dê um duplo clique sobre o botão Alterar. É criado o método bAlterarSocioActionPerformed. 14. Substitua o comentário pelas seguintes instruções: Socio socio = null; try { socio = this.getSocio(); this.abrirGUIDadosSocio(socio); } catch (DukeClubeException ex) { this.exibirMensagem(ex.getMessage(), "Mensagem de erro", true); }

Alterações na classe GUIDadosSocio 1. No método exibeDadosDoSocio, substitua cbCategoria.setSelectedIndex(socio.getCategoria() );

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

50


Desenvolvimento de aplicativos desktop em Java utilizando padrões por cbCategoria.setSelectedIndex(socio.getCategoria() + 1);

Criando a classe OuvinteDeGUISocios 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.visao.ouvinte, aponte para Novo e clique em Classe Java. 2. Em Nome da classe, digite OuvinteDeGUISocios e clique em Finalizar. 3. Declare uma variável de instância GUISocios. GUISocios guiSocios;

4. Implemente as seguintes classes internas: class OuvintePesquisarSocio implements ActionListener { public void actionPerformed(ActionEvent e) { try { ControleSocio controle = new ControleSocio(); String nome = guiSocios.getNome(); List socios = controle.pesquisar(nome); guiSocios.exibirSocios(socios); } catch (DukeClubeException ex) { guiSocios.exibirMensagem(ex.getMessage(), "Mensagem de erro", true); } } } class OuvinteExcluirSocio implements ActionListener { public void actionPerformed(ActionEvent e) { try { Socio socio = guiSocios.getSocio(); StringBuffer mensagem = new StringBuffer("Confirma a exclusão do sócio abaixo: "); mensagem.append("\nCódigo: " + socio.getCodigo()); mensagem.append("\nNome: " + socio.getNome()); int resposta = guiSocios.pedirConfirmacao(mensagem.toString(), "Exclusão de registro", JOptionPane.YES_NO_OPTION); if (resposta == JOptionPane.OK_OPTION) { ControleSocio controle = new ControleSocio(); controle.excluirSocio(socio); List socios = controle.pesquisar(); guiSocios.exibirSocios(socios); } } catch (DukeClubeException ex) { guiSocios.exibirMensagem(ex.getMessage(), "Mensagem de erro", true); } } }

5. Implemente um construtor que receba por parâmetro um objeto GUISocios. public OuvinteDeGUISocios(GUISocios gui) { guiSocios = gui; guiSocios.bExcluirSocioAddActionListener(new OuvinteExcluirSocio()); guiSocios.bPesquisarSocioAddActionListener(new OuvintePesquisarSocio()); }

6. Corrija as importações. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

51


Desenvolvimento de aplicativos desktop em Java utilizando padrões Alterações na janela GUIPrincipal 1. Inclua no método itemDeMenuCadSocioActionPerformed a linha em destaque. private void itemDeMenuCadSocioActionPerformed(java.awt.event.ActionEvent evt) { if (guiSocios == null) { guiSocios = new GUISocios(); OuvinteDeGUISocios ouvinte = new OuvinteDeGUISocios(guiSocios); } desktopPane.add(guiSocios); guiSocios.setVisible(true); guiSocios.setPosicao(); }

2. Corrija as importações.

Manter dependente: Atualização dos componentes existentes Neste tutorial você vai aprender a implementar as modificações necessárias nos componentes já codificados para que seja possível incluir, alterar e excluir dependentes.

Conteúdo •

• •

Alterações na camada Modelo o Criando a classe Dependente o Alterações na classe Socio Alterações na camada Persistência o Alterações na classe GatewaySocio Alteração na camada Visão o Criando a classe GUIDependentes o Criando a classe OuvinteDeGUIDependentes o Alterações na classe GUISocios

Alterações na camada Modelo

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

52


Desenvolvimento de aplicativos desktop em Java utilizando padrões Como criar a classe Dependente 2. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.modelo.dominio, aponte para Novo e clique em Classe Java. É exibido o assistente para criar classe. 7. Em Nome da classe, digite Dependente e clique em Finalizar. A classe Dependente é criada, e seu código-fonte é exibido. 8. Declare os seguintes campos de instância:

Nome

Tipo

nome

String

sexo

int

dataNascimento

java.util.Date

parentesco

int

9. Clique com o botão direito abaixo da última variável de instância, no menu pop-up, clique em Inserir código e, em seguida, clique em Construtor. 10. Na janela Gerar construtor, clique em Gerar. É criado o construtor default. 11. Clique com o botão direito abaixo do construtor, aponte para Refatorar e clique em Encapsular campos. 12. Na janela Encapsular campos, clique em Selecionar tudo e, em seguida, clique em Refatorar. 13. São gerados os métodos de acesso (getters) e os métodos modificadores (setters).

Alterações na classe Socio 1. Declare a seguinte variável de instância: private List dependentes;

2. Implemente os seguintes métodos: public void adicionarDependente(Dependente dependente){ this.dependentes.add(dependente); } public void removerDependente(Dependente dependente){ this.dependentes.remove(dependente); } public void removerDependente(int indice){ this.dependentes.remove(indice); } public List getDependentes() { return Collections.unmodifiableList(dependentes); }

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

53


Desenvolvimento de aplicativos desktop em Java utilizando padrões 3. Adicione ao construtor a seguinte instrução: dependentes = new ArrayList();

4. Corrija as importações.

Implementando as alterações na camada Persistência

Alterações na classe GatewaySocio 10. Declare as seguintes constantes: private static final String SQL_EXCLUIRDEPENDENTES = "DELETE FROM dependente " + "WHERE codigosocio = ?"; private static final String SQL_INCLUIRDEPENDENTE = "INSERT INTO dependente " + "(codigodependente, nome, sexo, datanascimento, parentesco, codigosocio) " + "VALUES (?, ?, ?, ?, ?, ?)"; private static final String SQL_PESQUISARDEPENDENTES = "SELECT * FROM dependente " + "WHERE codigosocio = ?";

11. Implemente os seguintes métodos: public void atualizarDependentes(Socio socio) throws DukeClubeException{ this.excluirDependentes(socio); this.incluirDependentes(socio); } private void excluirDependentes(Socio socio) throws DukeClubeException { if (socio == null) { String mensagem = "Não foi informado o socio a alterar"; throw new DukeClubeException(mensagem); } Connection con = null; PreparedStatement stmt = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_EXCLUIRDEPENDENTES);

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

54


Desenvolvimento de aplicativos desktop em Java utilizando padrões stmt.setLong(1, socio.getCodigo()); stmt.executeUpdate(); } catch (SQLException exc) { StringBuffer msg = new StringBuffer("Não foi possível atualizar os dependentes do sócio."); msg.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(msg.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt); } } private void incluirDependentes(Socio socio) throws DukeClubeException { if (socio == null) { String mensagem = "Não foi informado o socio a alterar"; throw new DukeClubeException(mensagem); } Connection con = null; PreparedStatement stmt = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_INCLUIRDEPENDENTE); long codigo = 1; Iterator dependentes = socio.getDependentes().iterator(); while(dependentes.hasNext()){ Dependente dependente = (Dependente)dependentes.next(); stmt.setLong(1, codigo); stmt.setString(2, dependente.getNome()); stmt.setInt(3, dependente.getSexo()); java.util.Date dataNascimento = dependente.getDataNascimento(); stmt.setDate(4, new java.sql.Date(dataNascimento.getTime())); stmt.setInt(5, dependente.getParentesco()); stmt.setLong(6, socio.getCodigo()); stmt.executeUpdate(); codigo++; } } catch (SQLException exc) { StringBuffer msg = new StringBuffer("Não foi possível atualizar os dependentes do sócio."); msg.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(msg.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt); } }

12. No método alterarSocio, logo abaixo de stmt.executeUpdate, inclua a seguinte instrução: atualizarDependentes(socio);

13. Implemente os seguintes métodos: private void carregarDependentes(Socio socio) throws DukeClubeException{ Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { con = GerenciadorDeConexao.getConexao(); stmt = con.prepareStatement(SQL_PESQUISARDEPENDENTES); stmt.setLong(1, socio.getCodigo()); rs = stmt.executeQuery(); while (rs.next()) { Dependente dependente = criarDependente(rs); socio.adicionarDependente(dependente); } } catch (SQLException exc) {

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

55


Desenvolvimento de aplicativos desktop em Java utilizando padrões StringBuffer mensagem = new StringBuffer("Não foi possível realizar a consulta."); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } finally { GerenciadorDeConexao.closeConexao(con, stmt, rs); } } private Dependente criarDependente(ResultSet rs) throws DukeClubeException{ Dependente dependente = new Dependente(); try { dependente.setNome(rs.getString(2)); dependente.setSexo(rs.getInt(3)); dependente.setDataNascimento(rs.getDate(4)); dependente.setParentesco(rs.getInt(5)); } catch (SQLException exc) { StringBuffer mensagem = new StringBuffer("Não foi possível obter os dados do dependente."); mensagem.append("\nMotivo: " + exc.getMessage()); throw new DukeClubeException(mensagem.toString()); } return dependente; }

14. Em criarSocio, após socio.setEmail(rs.getString("email")), inclua a seguinte instrução: this.carregarDependentes(socio);

15. Corrija as importações.

Alterações na camada Visão

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

56


Desenvolvimento de aplicativos desktop em Java utilizando padrões Criando a classe GUIDependentes

Criando o JInternalFrame 11. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.visao.gui, aponte para Novo e, em seguida, clique em Outro. 12. Em Categorias, selecione Formulários GUI Swing e, em Tipos de arquivos, clique em Formulário JInternalFrame. 13. Clique em Próximo. 14. Em Nome da classe, digite GUIDependentes e clique em Finalizar. A janela GUIDependentes é criada, e seu código-fonte é exibido no editor. 15. Na janela Inspetor, clique com o botão direito em JInternalFrame e, no menu pop-up, clique em Propriedades. A janela Propriedades é exibida. 16. No alto da janela, selecione Propriedades . 17. Marque a caixa de seleção closable. 18. Em title, digite DukeClube – Dependentes. 19. Em defaultCloseOperation, selecione HIDE. 20. Clique em Fechar. Adicionando os componentes Swing 41. Adicione um rótulo, mude seu texto para Sócio e seu nome para lNomeSocio. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

57


Desenvolvimento de aplicativos desktop em Java utilizando padrões 42. Adicione um campo de texto, apague seu texto e mude seu nome para tfNomeSocio. 43. Na janela Propriedades do campo de texto tfNomeSocio, desmarque a caixa editable.

44. Adicione uma tabela e mude seu nome para tDependentes. 45. Clique com o botão direito sobre a tabela tDependentes e, no menu pop-up, clique em Conteúdo da tabela. É aberta a caixa de diálogo Personalizador. 46. Selecione a aba Colunas. 47. Altere o título das colunas para Nome, Sexo, Data de nascimento e Parentesco. 48. Desmarque a caixa de seleção Permitir reordenar colunas com o método arrastar e soltar. 49. Selecione a aba Linhas. 50. Em Conta, substitua 4 (quatro) por 0 (zero). 51. Clique em Fechar. 52. Abaixo da tabela, adicione um painel e mude seu nome para pDadosDependente. 53. Na janela Propriedades do painel, clique em border.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

58


Desenvolvimento de aplicativos desktop em Java utilizando padrões

É aberta a janela border. 54. Em Bordas disponíveis, selecione Borda de título. 55. Em Título, digite Dados do dependente e clique no botão OK. 56. Adicione ao painel um rótulo(JLabel), mude seu texto para Nome e seu nome para lNomeDependente. 57. Adicione ao painel um campo de texto(JTextField), apague seu texto e mude seu nome para tfNomeDependente. 58. Adicione ao painel um rótulo, mude seu texto para Sexo e seu nome para lSexo. 59. Adicione um grupo de botões (ButtonGroup). 60. Na janela Inspetor, mude o nome do grupo de botões para bgSexo. 61. Adicione ao painel um botão de opção (JRadioButton), mude seu texto para Feminino e seu nome para rbFeminino. 62. Na janela Propriedades do botão de opção rbFeminino, selecione bgSexo para a propriedade buttonGroup. 63. Adicione ao painel um botão de opção, mude seu texto para Masculino e seu nome para rbMasculino. 64. Na janela Propriedades do botão de opção rbMasculino, selecione bgSexo para a propriedade buttonGroup. 65. Adicione ao painel um rótulo, mude seu texto para Data de nascimento e seu nome para lDataNascimento. 66. Adicione ao painel um campo formatado (JFormattedTextField), apague seu texto e mude seu nome para tfDataNascimento. 67. Na janela Propriedades do campo formatado, clique no botão de reticências da propriedade formatterFactory. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

59


Desenvolvimento de aplicativos desktop em Java utilizando padrões 68. Em Categoria, selecione máscara, em Formatar, selecione personalizado e, em Formato, digite ##/##/####. 69. Clique em OK. 70. Adicione ao painel um rótulo, mude seu texto para Parentesco e seu nome para lParentesco. 71. Adicione ao painel uma caixa de combinação (JComboBox) e mude seu nome para cbParentesco. 72. Na janela Propriedades de cbParentesco, clique no botão de reticências (...) da propriedade model. 73. No diálogo model, apague todos os itens (Item 1, Item 2, Item 3 e Item 4) e digite Selecione... 74. Clique em OK. 75. Sob o painel, adicione os seguintes botões:

Texto

Nome

Incluir

bIncluirDependente

Alterar

bAlterarDependente

Excluir

bExcluirDependente

Gravar sócio

bGravarSocio

Implementando os métodos 6. Declare uma variável de instância do tipo Sócio. private Socio socio;

7. Implemente os seguintes métodos: public void setPosicao() { Dimension d = this.getDesktopPane().getSize(); this.setLocation(30 + (d.width - this.getSize().width) / 5, 30 + (d.height this.getSize().height) / 5); } public Socio getSocio() { return this.socio; } public void setSocio(Socio socio) { this.socio = socio; this.exibirNomeDoSocio(socio.getNome()); this.exibirDependentes(socio.getDependentes().iterator()); } private void exibirNomeDoSocio(String nome) { tfNomeSocio.setText(nome); } private void exibirDependentes(Iterator dependentes) { DefaultTableModel model = (DefaultTableModel) tDependentes.getModel(); this.removerLinhasDaTabela(model); while (dependentes.hasNext()) { Dependente dependente = (Dependente) dependentes.next(); String nome = dependente.getNome();

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

60


Desenvolvimento de aplicativos desktop em Java utilizando padrões String sexo = null; if (dependente.getSexo() == Sexo.Feminino.ordinal()) { sexo = Sexo.Feminino.name(); } if (dependente.getSexo() == Sexo.Masculino.ordinal()) { sexo = Sexo.Masculino.name(); } DateFormat df = DateFormat.getDateInstance(); String dataNascimento = null; if (dependente.getDataNascimento() != null) { dataNascimento = df.format(dependente.getDataNascimento()); } String relacaoDeParentesco = null; for (RelacaoDeParentesco parentesco : RelacaoDeParentesco.values()) { int posicao = parentesco.ordinal(); if (++posicao == dependente.getParentesco()) { relacaoDeParentesco = parentesco.name(); } } Object[] linha = {nome, sexo, dataNascimento, relacaoDeParentesco}; model.addRow(linha); } } private void removerLinhasDaTabela(DefaultTableModel model) { while (model.getRowCount() > 0) { int ultimaLinha = model.getRowCount() - 1; model.removeRow(ultimaLinha); } } public void bGravarSocioAddActionListener(ActionListener ouvinte) { bGravarSocio.addActionListener(ouvinte); } public void exibirMensagem(String mensagem, String titulo, boolean isErro) { int tipo; if (isErro) { tipo = JOptionPane.ERROR_MESSAGE; } else { tipo = JOptionPane.INFORMATION_MESSAGE; } JOptionPane.showMessageDialog(null, mensagem, titulo, tipo); } private void limparCampos() { tfNomeDependente.setText(null); rbFeminino.setSelected(false); rbMasculino.setSelected(false); tfDataNascimento.setText(null); tfNomeDependente.requestFocus(); } private Dependente criarDependente() throws DukeClubeException { Dependente novoDependente = new Dependente(); String nome = tfNomeDependente.getText(); if (nome.equals("") || nome.trim().equals("")){ throw new DukeClubeException("Não foi informado o nome do dependente!"); } else {

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

61


Desenvolvimento de aplicativos desktop em Java utilizando padrões novoDependente.setNome(nome); } if (rbFeminino.isSelected()) { novoDependente.setSexo(Sexo.Feminino.ordinal()); } else if (rbMasculino.isSelected()) { novoDependente.setSexo(Sexo.Masculino.ordinal()); } else { throw new DukeClubeException("Não foi informado o sexo do dependente!"); } DateFormat df = DateFormat.getDateInstance(); java.util.Date dataNascimento; try { dataNascimento = df.parse(tfDataNascimento.getText()); novoDependente.setDataNascimento(dataNascimento); } catch (ParseException ex) { throw new DukeClubeException("Não foi informada a data de nascimento do dependente ou ela é inválida!"); } int parentesco = cbParentesco.getSelectedIndex(); if (parentesco == 0) { throw new DukeClubeException("Não foi informado o parentesco do dependente"); } else { novoDependente.setParentesco(parentesco); } return novoDependente; }

8. Crie a seguinte classe interna: class OuvinteDaTabelaDependentes implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { int linha = tDependentes.getSelectedRow(); tfNomeDependente.setText((String) tDependentes.getValueAt(linha, 0)); String sexo = (String)tDependentes.getValueAt(linha, 1); if (sexo.equals(Sexo.Feminino.name())) { rbFeminino.setSelected(true); } if (sexo.equals(Sexo.Masculino.name())) { rbMasculino.setSelected(true); } tfDataNascimento.setText((String) tDependentes.getValueAt(linha, 2)); String relacaoDeParentesco = (String) tDependentes.getValueAt(linha, 3); for (RelacaoDeParentesco parentesco : RelacaoDeParentesco.values()) { if (relacaoDeParentesco.equals(parentesco.name())) { cbParentesco.setSelectedIndex(parentesco.ordinal()+1); } } } } }

9. Dê um duplo clique sobre o botão Incluir. É criado o método bIncluirDependenteActionPerformed. 10. Em seu interior, substitua o comentário pelas seguintes instruções: ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

62


Desenvolvimento de aplicativos desktop em Java utilizando padrões try { Dependente novoDependente = this.criarDependente(); socio.adicionarDependente(novoDependente); this.exibirDependentes(socio.getDependentes().iterator()); this.limparCampos(); } catch (DukeClubeException ex) { StringBuffer mensagem = new StringBuffer("Não foi possível adicionar o dependente"); mensagem.append("\nMotivo: " + ex.getMessage()); this.exibirMensagem(mensagem.toString(), "DukeClube - Dependentes", true); }

11. Dê um duplo clique sobre o botão Alterar. É criado o método bAlterarDependenteActionPerformed. 12. Em seu interior, substitua o comentário pelas seguintes instruções: int linhaSelecionada = tDependentes.getSelectedRow(); if (linhaSelecionada < 0) { this.exibirMensagem("Não foi selecionado nenhum dependente", "DukeClube Dependentes", true); } else { socio.removerDependente(linhaSelecionada); try { Dependente novoDependente = this.criarDependente(); socio.adicionarDependente(novoDependente); this.exibirDependentes(socio.getDependentes().iterator()); this.limparCampos(); } catch (DukeClubeException ex) { StringBuffer mensagem = new StringBuffer("Não foi alterar os dados do dependente"); mensagem.append("\nMotivo: " + ex.getMessage()); this.exibirMensagem(mensagem.toString(), "DukeClube - Dependentes", true); } }

13. Dê um duplo clique sobre o botão Excluir. É criado o método bExcluirSocioActionPerformed. 14. Em seu interior, substitua o comentário pelas seguintes instruções: int linhaSelecionada = tDependentes.getSelectedRow(); if (linhaSelecionada < 0) { this.exibirMensagem("Não foi selecionado nenhum dependente", "DukeClube Dependentes", true); } else { socio.removerDependente(linhaSelecionada); this.exibirDependentes(socio.getDependentes().iterator()); this.limparCampos(); }

15. No construtor, após initComponents, insira as seguintes instruções: for (RelacaoDeParentesco parentesco : RelacaoDeParentesco.values()) { cbParentesco.addItem(parentesco.name()); } tDependentes.getSelectionModel().addListSelectionListener(new OuvinteDaTabelaDependentes());

16. Corrija as importações. ©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

63


Desenvolvimento de aplicativos desktop em Java utilizando padrões Criando a classe OuvinteDeGUIDependentes 1. Clique com o botão direito sobre o pacote net.antoniopassos.dukeclube.visao.ouvinte, aponte para Novo e clique em Classe Java. 2. Em Nome da classe, digite OuvinteDeGUIDependentes e clique em Finalizar. A classe OuvinteDeGUIDependentes é criada, e seu código-fonte é exibido no editor. 3. Adicione uma variável de instância GUIDependentes. private GUIDependentes guiDependentes;

4. Adicione a classe interna abaixo: class OuvinteGravarSocio implements ActionListener { public void actionPerformed(ActionEvent e) { Socio socio = guiDependentes.getSocio(); ControleSocio controle = new ControleSocio(); try { controle.gravarSocio(socio); guiDependentes.exibirMensagem("Sócio gravado com sucesso!", "DukeClube Dependentes", false); } catch (DukeClubeException ex) { guiDependentes.exibirMensagem(ex.getMessage(), "DukeClube - Dependentes", true); } } }

5. Implemente o seguinte construtor: public OuvinteDeGUIDependentes(GUIDependentes guiDependentes) { this.guiDependentes = guiDependentes; guiDependentes.bGravarSocioAddActionListener(new OuvinteGravarSocio()); }

6. Corrija as importações.

Alterações na classe GUISocios 1. Declare uma variável de instância GUIDependentes. private GUIDependentes guiDependentes;

2. Implemente o seguinte método: private void abrirGUIDependentes(Socio socio) { if (guiDependentes == null) { guiDependentes = new GUIDependentes(); OuvinteDeGUIDependentes ouvinte = new OuvinteDeGUIDependentes(guiDependentes); this.getParent().add(guiDependentes); guiDependentes.setPosicao(); } guiDependentes.setSocio(socio); guiDependentes.setVisible(true); try { guiDependentes.setSelected(true); } catch (PropertyVetoException ex) { exibirMensagem("Não foi possível selecionar a janela GUIDependentes", "DukeClube - Socios", true);

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

64


Desenvolvimento de aplicativos desktop em Java utilizando padrões } }

3. Dê um duplo clique sobre o botão Ver dependentes. É criado o método bVerDependentesActionPerformed. 4. Substitua o comentário pelas instruções abaixo: Socio socio = null; try { socio = this.getSocio(); this.abrirGUIDependentes(socio); } catch (DukeClubeException ex) { this.exibirMensagem(ex.getMessage(), "Mensagem de erro", true); }

5. Corrija as importações.

©2009 Antonio Passos | http://ead.antoniopassos.net | Todos os direitos reservados

65


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.