Você está na página 1de 16

Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 1/16

LPII - Visualização de Operações de Cadastro em Listas

1 – Enriquecendo a JanelaCadastroAmigos no pacote interfaces

Acrescentar e configurar Label e ComboBox na JanelaCadastroAmigos. O ComboBox será


vinculado ao conjunto de amigos cadastrados. Será criado um array, de objetos da entidade Amigo,
na JanelaCadastrarAmigos para armazenar os amigos cadastrados. A configuração do ComboBox é
a seguinte:
 Código
◦ Nome da Variável : amigos_cadastradosComboBox
 Propriedades
◦ model
▪ selecionar : Código Personalizado
 preencher argumento de amigos_cadastradosComboBox.setModel ( )
◦ com : new DefaultComboBoxModel (amigos_cadastrados)

O ComboBox mostra, para cada amigo cadastrado, o string retornado pelo método toString da
entidade Amigo. Não faz sentido mostrar todas as informações do amigo em cada linha do
ComboBox. O mais adequado é mostrar somente uma visão (utilizando o linguajar de banco de
dados, para visualização somente da informação de interesse) contendo algumas informações que
sejam amigáveis para aparecer no ComboBox. Nesta aplicação, os dados nome e o apelido foram
escolhidos como sendo as informações mais amigáveis para serem visualizadas em cada linha do
ComboBox. Lembrando que o apelido não é um campo com preenchimento obrigatório (script SQL
no Tutorial 2), o método toString da entidade Amigo fica da seguinte forma:

Para inicializar somente os dados nome e apelido, na construção do objeto da entidade Amigo, é
criado um segundo construtor :

As alterações, na importação, dados e construtor da JanelaCadastrarAmigos, são as seguintes:

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 2/16

O método estático getVisões, da entidade Amigo, é ilustrado a seguir:

O tratador de eventos inserirAmigo, da JanelaCadastroAmigos, é composto por dois trechos de


código bem distintos:
 Trecho Inicial : obtenção das informações e execução da operação no BD
◦ no qual é construído um objeto da entidade Amigo, a partir das informações que usuário
preencheu no formulário de cadastro;
▪ na construção do objeto, qualquer campo obrigatório (not null no script sql) não
informado resulta em uma mensagem de erro, informando que algum atributo do
amigo não foi preenchido;
◦ e esse objeto é repassado ao método inserirAmigo do ControladorCadastroAmigos, que
decide sobre a viabilidade da operação de inserção e coordena a sua execução no BD;
▪ se a operação não for viável, o ControladorCadastroAmigos retorna uma mensagem
de erro, informando que já existe um amigo cadastrado com aquela chave;
▪ se a execução da operação no BD for não executada, o método estático da entidade
Amigo, chamado para executá-la, retorna uma mensagem de erro informando que
não foi possível inserir o amigo no BD;
 Trecho Final : informa ao usuário operação bem sucedida ou mensagem de erro
◦ no qual, após verificado que não foi gerada nenhuma mensagem de erro, é informado,
em uma janela auxiliar, que a operação de inserção foi bem sucedida;
◦ ou é informada a mensagem de erro em janela auxiliar.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 3/16

Com a utilização do ComboBox, para visualização dos amigos cadastrados, o trecho inicial não se
altera, pois não envolve nenhuma operação no ComboBox. O trecho final é alterado para que o
ocorra a inserção da visão do amigo (visualização somente dos atributos: nome e apelido) recém-
criado no ComboBox e à seleção da visão inserida no ComboBox:

Observe que com a utilização do ComboBox, a utilização janela auxiliar para informar inserão bem
sucedida não é mais necessária, dado que o novo amigo cadastrado é visualizado no ComboBox.

O método getVisão, da entidade Amigo, é ilustrado a seguir:

O tratador de eventos consultarAmigo, da JanelaCadastroAmigos, é composto por dois trechos de


código bem distintos:
 Trecho Inicial : informação da chave do amigo a ser consultado e busca do amigo no BD
◦ no qual é lida a chave do amigo (nome), no formulário de cadastro;
▪ se o campo da chave não foi informado, é gerada uma mensagem de erro,
informando que o nome do amigo não foi preenchido;
◦ e essa chave é repassada ao método buscarAmigo da entidade Amigo, que obtém o
amigo no BD;
▪ se a execução da operação no BD for não executada, o método estático da entidade
Amigo, chamado para executá-la, retorna um objeto nulo, resultando na geração de
uma mensagem de erro, informando que o amigo não está cadastrado no BD;
 Trecho Final : atualização dos campos do formulário ou mensagem de erro
◦ no qual, o formulário de cadastro é atualizado a partir dos atributos do objeto amigo;
◦ ou é informada a mensagem de erro em janela auxiliar.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 4/16

No tratador de eventos consultarAmigo da JanelaCadastroAmigos, o trecho final não é alterado,


pois a atualização do formulário ou informação da mensagem de erro não envolvem o ComboBox.
No entanto, o trecho inicial é alterado para selecionar no ComboBox o amigo que será consultado:

Observe que o método getSelectItem, utilizado para ler a visão do amigo selecionada no
ComboBox, é um método genérico e, portanto, retorna um objeto de tipo Object que precisa ser
convertido para um objeto da entidade Amigo.

O tratador de eventos removerAmigo, da JanelaCadastroAmigos, é composto por dois trechos de


código bem distintos:
 Trecho Inicial : informação da chave do amigo a ser removido e execução da operação no
BD
◦ no qual é lida a chave do amigo (nome), no formulário de cadastro;
▪ se o campo da chave não foi informado, é gerada uma mensagem de erro,
informando que o nome do amigo não foi preenchido;
◦ e essa chave é repassada ao método removerAmigo do ControladorCadastroAmigos, que
decide sobre a viabilidade da operação de remoção e coordena a sua execução no BD;
▪ se a operação não for viável, o ControladorCadastroAmigos retorna uma mensagem
de erro, informando que não existe um amigo cadastrado com aquela chave;
▪ se a execução da operação no BD for não executada, o método estático da entidade
Amigo, chamado para executá-la, retorna uma mensagem de erro informando que
não foi possível remover o amigo no BD;
 Trecho Final : atualização dos campos do formulário ou mensagem de erro
◦ no qual, após verificado que não foi gerada nenhuma mensagem de erro, é informado,
em uma janela auxiliar, que a operação de remoção foi bem sucedida;
◦ ou é informada a mensagem de erro em janela auxiliar.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 5/16

O trecho inicial do tratador de eventos removerAmigo, é alterado para selecionar no ComboBox o


amigo que será removido:

O trecho final do tratador de eventos removerAmigo, é alterado para remover a visão do amigo
recém-criado no ComboBox, e para selecionar a primeira visão (se existir),:

O tratador de eventos alterarAmigo, da JanelaCadastroAmigos, é composto por dois trechos de


código bem distintos:
 Trecho Inicial : obtenção das informações e execução da operação no BD
◦ no qual é construído um objeto da entidade Amigo, a partir das informações que usuário
preencheu no formulário de cadastro;
▪ na construção do objeto, qualquer campo obrigatório (com exceção do sequencial,
que é gerado automaticamente pelo BD) não informado resulta em uma mensagem
de erro, informando que algum atributo do amigo não foi preenchido;
◦ e esse objeto é repassado ao método alterarAmigo do ControladorCadastroAmigos, que
decide sobre a viabilidade da operação de alteração e coordena a sua execução no BD;
▪ se a operação não for viável, o ControladorCadastroAmigos retorna uma mensagem
de erro, informando que não existe um amigo cadastrado com aquela chave;
▪ se a execução da operação no BD for não executada, o método estático da entidade
Amigo, chamado para executá-la, retorna uma mensagem de erro informando que
não foi possível alterar o amigo no BD;
 Trecho Final : informa ao usuário operação bem sucedida ou mensagem de erro
◦ no qual, após verificado que não foi gerada nenhuma mensagem de erro, é informado,
em uma janela auxiliar, que a operação de alteração foi bem sucedida;
◦ ou é informada a mensagem de erro em janela auxiliar.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 6/16

Para alterar dados do amigo, com exceção do atributo nome que é utilizado como chave no banco
de dados, a ação mais recomedável é consultar o amigo de interesse e alterar os atributos que se
deseja atualizar. No entanto, o usuário pode optar por simplesmente limpar todos os campos do
formulário e preencher o nome do amigo e os dados que deseja atualizar. Desta forma, na
implementação do tratador de eventos alterarAmigo, é assumido que usuário poderá informar o
nome do amigo, sem ter realizado previamente uma consulta. Caso o usuário tenha alterado o
campo apelido, será necessário alterar a sua visualização no ComboBox. Será necessário utilizar o
nome, informado pelo usuário, para identificar a visão correspondente no ComboBox e atualizar o
valor do campo apelido.

O trecho inicial do tratador de eventos alterarAmigo não se altera, pois não envolve nenhuma
operação no ComboBox. O trecho final é alterado, pois caso o apelido do amigo tenha sido alterado,
a visualização da visão no ComboBox precisará ser atualizada:

Observe que a simples alteração de um atributo da visão, não resulta na atualização automática da
sua visualização no ComboBox, como ocorre no caso de inserção ou remoção de uma visão. Neste
caso, é necessário solicitar a atualização com a utilização do método updateUI.

A implementação do método auxiliar getVisãoAlterada é a seguinte:

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 7/16

A inserção na JanelaCadastroAmigos é ilustrada a seguir:

A consulta na JanelaCadastroAmigos é ilustrada a seguir:

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 8/16

A alteração na JanelaCadastroAmigos (apelido e instagram) é ilustrada a seguir:

A remoção na JanelaCadastroAmigos é ilustrada a seguir:

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 9/16

2 - Construindo a JanelaCadastroFilmes no pacote interfaces

A seguir o enumerado e os atributos da entidade Filme:

A visão vai encorporar o sequencial e o título do filme. A seguir, o método toString da entidade
Filme:

O script sql utilizado para incorporar a tabela Filmes é ilustrado a seguir:

A coluna (e chave) Sequencial é criada automaticamente pelo banco de dados, como um número
inteiro positivo sequencial, iniciando com o valor 1. A cada novo registro criado, o valor do
sequencial recebe o valor do último sequencial criado incrementado de 1. Se um registro da tabela
for removido, o seu número sequencial não será reaproveitado na criação do próximo registro.

Na implementação da entidade Filme, vamos utilizar List para a visualização dos filmes cadastrados
e ComboBox para a seleção do gênero do filme.

Na seção 1, vimos que a o modelo do ComboBox é associado a:


 new DefaultComboBoxModel (amigos_cadastrados)

Diferentemente do ComboBox, o construtor de List não aceita nenhum argumento, e a vinculação


do List com as visões dos filmes armazenadas é realizada diretamente no modelo do List (conjunto
de visões de filmes associadas ao List) na construção do objeto da JanelaCadastroFilmes.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 10/16

A configuração do List para armazenar as visões dos filmes é a seguinte:


 Código
◦ Nome da Variável : filmes_cadastradosList
 Propriedades
◦ model
▪ selecionar : Código Personalizado
 preencher argumento de filmes_cadastradosList.setModel ( )
◦ com : new DefaultListModel ( )

A configuração do ComboBox para informar os valores do enumerado Gênero, definido na entidade


Filme (é necessário importar esse tipo: import entidade.Filme.Gênero), é a seguinte:
 Código
◦ Nome da Variável : gêneroComboBox
 Propriedades
◦ model
▪ selecionar : Código Personalizado
 preencher argumento de gêneroComboBox.setModel ( )
◦ com : new DefaultComboBoxModel (Gênero.values())

Na criação do objeto filme, não é necessário ler o atributo sequencial, dado que ele é criado
automaticamente pelo banco de dados. Por esse motivo o campo sequencialTextField da
JanelaCadastroFilme é assinalado com não editável, sendo preenchido somente por programa, após
o número do sequencial ter sido criado no banco de dados:
 Propriedades
◦ editable : não assinalar

A seguir, as referências e o construtor da JanelaCadastroFilmes:

A implementação do método getVisões na entidade Filme é semelhante ao método de mesmo nome


na entidade Amigo, considerando que a visão de filme incorpora o sequencial e o título do filme.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 11/16

O método limparCampos é implementado de forma semelhante para os campos TextField. Para o


campo gêneroComboBox, a implementação é da seguinte forma:
 gêneroComboBox.setSelectedIndex(-1)

Diferentemente do ComboBox, a atualização do componente nas operações de inserção e de


remoção é realizada no modelo do List, e não no componente gráfico.

Por não envolver a utilização do List, o trecho inicial do tratador de eventos inserirFilme, da
JanelaCadastroFilmes, é semelhante ao trecho inicial do tratador de eventos inserirAmigo da
JanelaCadastroAmigos. No entanto, no trecho final é necessário: (a) atualizar o modelo do List com
o filme recém-criado; (b) selecionar o visão inserida no List; e (c) informar o sequencial, recém-
criado no BD:

Em uma aplicação web, dois usuários podem executar de forma concorrente, em dois processos
paralelos, a mesma operação. No entanto, em uma aplicação desktop, as operações são executadas
sequencialmente por um único usuário. Portanto, para saber o número do sequencial que foi
atribuído a um filme recém-criado, basta ler o número do último sequencial criado no banco de
dados para a tabela Filmes. A seguir, a implementação do método estático últimoSequencial da
entidade Filme:

Observe, no script sql, que o atributo gênero é armazenado na tabela Filmes como um inteiro. O
valor que será armazenado na respectiva coluna da tabela, como resultado da execução dos métodos
estáticos inserirFilme e alterarFilme da entidade Filme, é o índice no enumerado Gênero obtido da
seguinte forma:
 int índice_gênero = filme.getGênero().ordinal()

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 12/16

Em contrapartida, no método estático buscarFilme da entidade Filme, chamado pelo tratador de


eventos consultarFilme, esse valor deve ser recuperado como um elemento do enumerado Gênero
(porque na entidade Filme esse atributo foi definido com o tipo enumerado Gênero), e não como um
inteiro. A obtenção do valor do enumerado, a partir do seu índice é implementada, no método
estático buscarFilme da entidade Filme, da seguinte forma:
 Gênero gênero = Gênero.values()[lista_resultados.getInt("Gênero")]

O método auxiliar obterFilmeInformado é semelhante ao método obterAmigoInformado, com duas


diferenças. A primeira diferença é que a chave do filme é um sequencial com valor inteiro e a chave
do amigo é um string. Portanto o string lido do sequencial precisa ser convertido para inteiro:

A segunda diferença é que a obtenção do valor do atributo gênero é implementada da seguinte


forma:

No caso da entidade Amigo, o nome é utilizado como chave no banco de dados. Para evitar a
criação de um amigo com os mesmos dados, basta verificar se o nome do amigo já existe no banco
de dados. No entanto, o sequencial, que é utilizado como chave do filme, é gerado automaticamente
pelo banco de dados. Desta forma, se o usuário preencher os mesmos dados de um filme já
existente, esse filme será criado novamente no banco com um novo sequencial. Obviamente o
método inserirFilme do ControladorCadastroFilmes deve ser implementado de forma a evitar essa
duplicidade:

Na implementação do método estático existeFilmeMesmosAtributos da entidade Filme, é contado o


total de sequenciais nos quais um filme tem os mesmos atributos. Se este total for zero, significa
que não existe nenhum filme com os mesmos atributos e, portanto, o novo filme pode ser criado.
Observe que este total nunca irá ultrapassar o valor 1, porque o método inserirFilme, do
ControladorCadastroFilmes, não permite que seja criado um filme com os mesmos atributos
utilizando um outro sequencial.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 13/16

As implementações dos métodos estáticos inserirFilme, alterarFilme e removerFilme, da entidade


Filme são semelhantes às implementações dos métodos equivalente implementados na entidade
Amigo. A única diferença é que o atributo gênero, conforme vimos anteriormente, é armazenado
como o índice do enumerado Gênero.

A implementação do tratador de eventos consultarFilmes, é semelhante à implementação do


tratador de eventos consultarAmigos, da JanelaCadastroAmigos, com as seguintes diferenças:
 a leitura do filme selecionado para consulta é baseada no List e não no ComboBox
◦ Filme visão = (Filme) filmes_cadastradosList.getSelectedValue()
 e a inclusão do assinalamento do valor do gênero no ComboBox
◦ gêneroComboBox.setSelectedItem(filme.getGênero())

A implementação do métodos estático buscarFilme na entidade Filme é semelhante à


implementação do método equivalente da entidade Amigo. A única diferença é que o atributo
gênero, conforme vimos anteriormente, é lido como um elemento do enumerado a partir do seu
índice, armazenado na base de dados.

O trecho inicial do tratador de eventos removerFilme, da JanelaCadastroFilmes, é semelhante ao


trecho inicial do tratador de eventos consultarFilme. O trecho final, relacionado com a atualiação da
remoção no List, é implementado da seguinte forma:

Para alterar os dados do filme, com exceção do atributo sequencial que é utilizado como chave no
banco de dados, a única alternativa disponível para o usuário é consultar o amigo de interesse e
alterar os atributos que se deseja atualizar. Esta restrição ocorre porque, diferentemente da
JanelaCadastroAmigos, na qual a chave (nome) é editável, o campo sequencialTextField não é
editável porque o sequencial é criado automaticamente pelo BD.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 14/16

O trecho inicial do tratador de eventos alterarFilme, da JanelaCadastroFilmes, é semelhante ao


trecho inicial do tratador de eventos inserirFilme. O trecho final, envolve a atualização da visão do
filme no List:

A inserção na JanelaCadastroFilmes é ilustrada a seguir:

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 15/16

A consulta na JanelaCadastroFilmes é ilustrada a seguir:

A alteração na JanelaCadastroFilmes (gênero) é ilustrada a seguir:

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD


Linguagem de Programação II - Tutorial 3 : Visualização de Operações de Cadastro em Listas - 16/16

A remoção na JanelaCadastroFilmes, e também a limpeza dos campos do formulário, é ilustrada a


seguir:

3 - Exercícios para Fixação dos Conceitos Aprendidos

Exercício 1
Atualize a aplicação desktop Biblioteca para cadastrar livros e consulentes em um banco de dados
relacional, utilizando interface gráfica. Utilize ComboBox para listar os consulentes cadastrados e
List para listar os livros cadastrados. Utilize ComboBox para seleção da área de conhecimento do
livro. Suponha:
a) JanelaCadastrarConsulentes, supondo que a entidade Livro tenha os seguintes atributos:
 String CPF, nome, email, telefone.
b) JanelaCadastrarLivros, supondo que a entidade Livro tenha os seguintes atributos:
 enum ÁreaConhecimento { agronomia, computação, direito, física, matemática, medicina,
nutrição, química };
 String título, autorPrincipal, anoPublicação, editora;
 int versão;

Exercício 2
Atualize a aplicação desktop de sua escolha, com mais uma janela de cadastro. Utilize ComboBox
para listar os itens cadastrados da primeira janela de cadastro e List para listar os itens cadastrados
da segunda. Utilize ComboBox para seleção da valores de enumerado em pelo menos uma das
janelas de cadastro.

Prof. Joinvile Batista Junior - Sistemas de Informação - FACET/UFGD

Você também pode gostar