Exemplo de aplicao Desktop com Netbeans
verdade que a maioria das aplicaes atuais soweb based. Esse tipo
de aplicao vem substintuindo as aplicaes desktop, pois tem diversas
vantagens como facilidade de atualizao, pblico alvo mais fcil de
ser atingido, compatibilidade com qualquer sistema operacional que
possua um browser e diversas outras.Entratanto, as aplicaes desktop
ainda tm seu espao no mercado. Por exemplo, aplicaes PDV (Ponto de
Venda) geralmente so feitas para rodar como uma aplicao desktop
principalmente pela necessidade de tempo de resposta curto. Outro
exemplo que pode ser citado a aplicao do governo para declarao de
imposto de renda. A verso atual dessa aplicao desktop.Nesse
tutorial ser apresentado como desenvolver uma aplicao desktop em
java utilizando os componentes swing atravs do IDE Netbeans. Para
evitar a complexidade de integrao com banco de dados e nao sair do
escopo, essa aplicao persiste os objetos em uma estrutura de dados
(Collection) declarada comostaticem uma classe que simula um banco
de dados.Alm disso, sero utilizados os componentesJInternalFrameem
conjunto com o componenteJDesktopPaneque permitem que janelas sejam
instanciadas em uma rea de trabalho interna da aplicao. Sem a
utilizao desses componentes (utilizando apenas JFrame) as janelas
ficam soltas como um programa independente.A aplicao completa pode
ser baixada no link apresentado ao final do artigo.Ferramentas
necessriasPara a criao da aplicao utilizado o IDE Netbeans 7.3 para
linux (https://netbeans.org/) com JDK 1.7
(http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html).
Entretanto, nada impede que seja utilizado Windows.O projetoComo
exemplo, vamos utilizar um projeto fictcio de um banco. O diagrama
de classes do projeto a ser criado demonstrado atravs daFigura 1.
No vamos demonstrar a criao do projeto por completo, pois as
atividades acabam se tornando muito repetitivas.
Figura 1 Diagrama de classes projeto bancoCriar projetoPara
iniciar a criao do projeto basta abrir o Netbeans e acessar a
opoFile / New Project, selecionar a opoJava / Java Applicatione
clicar sobre o botoNext. Aps isso, uma janela exibida na qual deve
ser digitado o Banco no campoProject Name e o diretrio onde se
deseja salvar (Project Location). Outra opo interessante nessa
janela a possibilidade de criar uma classe principal. Entretanto,
como no queremos criar uma classe principal, vamos desmarcar a
opoCreate Main Class. A janela para criao do projeto exibida
naFigura 2.
Figura 2 Criar projeto BancoAps a criao do projeto, vamos criar
os pacotesbr.com.banco.model,br.com.banco.viewebr.com.banco.util.
Para criar um pacote, clique com o boto direito sobreSource
Packagese selecione a opoNew / Java Package. No pacote model ficaro
as classes da parte do modelo da aplicao, ou seja, exatamente as
classes demonstradas naFigura 1. Em view ficaro as telas do sistema
e em util algumas classes que iro ajudar em tarefas como converso
de datas.Dessa forma, a estrutura da aplicao foi definida.
Obviamente, existem estruturas mais completas e complexas que essa.
Entretanto, a finalidade do tutorial no discutir sobre arquitetura
e sim apresentar uma aplicao desktop bsica.Criar classes de
domnioAs primeiras classes a serem criadas so as de domnio. Essas
classes so chamadas assim, pois representam o domnio da aplicao, no
caso o domnio bancrio. Vamos comear criando a classe Banco. Para
isso, clique com o boto direito sobre o pacote br.com.banco.model e
selecione a opoNew / JavaClass, digite o nome da classe emClass
Namee selecione a opoFinish. A seguir apresentado o cdigo referente
classe Banco. Note que o atributoprivate Collection
agencias;representa o relacionamento entre a classe Banco e a
classe
Agencia.?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package
br.com.banco.model;import java.util.Collection;public class Banco
{private Integer id;private Integer codigo;private String
nome;private String CNPJ;private Collection agencias;public Integer
getId() {return id;}public void setId(Integer id) {this.id =
id;}public Integer getCodigo() {return codigo;}public void
setCodigo(Integer codigo) {this.codigo = codigo;}public String
getNome() {return nome;}public void setNome(String nome) {this.nome
= nome;}public String getCNPJ() {return CNPJ;}public void
setCNPJ(String CNPJ) {this.CNPJ = CNPJ;}public Collection
getAgencias() {return agencias;}public void setAgencias(Collection
agencias) {this.agencias = agencias;}}
Assim como foi criado a classe Banco, as outras classes podem
ser criadas observando os atributos e relacionamentos do diagrama
de classes apresentado naFigura 1.Criar estrutura de dados para
simular BDComo mencionado anteriormente, nesse exemplo no ser
utilizado banco de dados para persistir os objetos. Entretanto, ser
utilizado uma estrutura de dados com a finalidade de simular um
banco de dados. Essa estrutura de dados simplesmente
umaCollectionque ser criada como uma atributo de classe (static) em
uma classe denominadaBd.O procedimento para criao da classeBd
semelhante ao procedimento de criao das outras classes. Entretanto,
essa classe deve ser criada dentro do pacotebr.com.banco.util.Aps
criar a classeBd, o seu contedo deve ser definido como demonstrado
a
seguir.?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162package
br.com.banco.util;import br.com.banco.model.Cidade;import
br.com.banco.model.ContaCorrente;import
br.com.banco.model.Endereco;import br.com.banco.model.Estado;import
br.com.banco.model.Poupanca;import
br.edu.faa.labii.banco.Agencia;import
br.edu.faa.labii.banco.Banco;import
br.edu.faa.labii.banco.Cliente;import java.util.ArrayList;import
java.util.Collection;public class Bd {private static Collection
clientesBD;private static Collection bancosBD;private static
Collection agenciasBD;private static Collection cidadesBD;private
static Collection contasCorrenteBD;private static Collection
enderecosBD;private static Collection estadosBD;private static
Collection poupancasBD;private static Integer nextIdAgencia =
0;private static Integer nextIdBanco = 0;private static Integer
nextIdCidade = 0;private static Integer nextIdCliente = 0;private
static Integer nextIdContaCorrente = 0;private static Integer
nextIdEndereco = 0;private static Integer nextIdEstado = 0;private
static Integer nextIdPoupanca = 0;public static Integer
getNextIdCliente(){nextIdCliente += 1;return nextIdCliente;}public
static Integer getNextIdBanco(){nextIdBanco += 1;return
nextIdBanco;}public static Integer getNextIdAgencia(){nextIdAgencia
+= 1;return nextIdAgencia;}public static Integer
getNextIdCidade(){nextIdCidade += 1;return nextIdCidade;}public
static Integer getNextIdContaCorre(){nextIdContaCorrente +=
1;return nextIdContaCorrente;}public static Integer
getNextIdEndereco(){nextIdEndereco += 1;return
nextIdEndereco;}public static Integer
getNextIdEstado(){nextIdEstado += 1;return nextIdEstado;}public
static Integer getNextIdPoupanca(){nextIdPoupanca += 1;return
nextIdPoupanca;}public static Collection getClientesBD() {if
(clientesBD == null){return clientesBD = new ArrayList();}return
clientesBD;}public static void setClientesBD(Collection
aClientesBD) {clientesBD = aClientesBD;}public static Collection
getAgenciasBD() {if (agenciasBD == null){return agenciasBD = new
ArrayList();}return agenciasBD;}public static void
setAgenciasBD(Collection aAgenciasBD) {agenciasBD =
aAgenciasBD;}public static Collection getBancosBD() {if (bancosBD
== null){bancosBD = new ArrayList();}return bancosBD;}public static
void setBancosBD(Collection aBancosBD) {bancosBD =
aBancosBD;}public static Collection getCidadesBD() {if (cidadesBD
== null){cidadesBD = new ArrayList();}return cidadesBD;}public
static void setCidadesBD(Collection aCidadesBD) {cidadesBD =
aCidadesBD;}public static Collection getContasCorrenteBD() {if
(contasCorrenteBD == null){contasCorrenteBD = new
ArrayList();}return contasCorrenteBD;}public static void
setContasCorrenteBD(Collection aContasCorrenteBD) {contasCorrenteBD
= aContasCorrenteBD;}public static Collection getEnderecosBD() {if
(enderecosBD == null){enderecosBD = new ArrayList();}return
enderecosBD;}public static void setEnderecosBD(Collection
aEnderecosBD) {enderecosBD = aEnderecosBD;}public static Collection
getEstadosBD() {if (estadosBD == null){estadosBD = new
ArrayList();}return estadosBD;}public static void
setEstadosBD(Collection aEstadosBD) {estadosBD = aEstadosBD;}public
static Collection getPoupancasBD() {if (poupancasBD ==
null){poupancasBD = new ArrayList();}return poupancasBD;}public
static void setPoupancasBD(Collection aPoupancasBD) {poupancasBD =
aPoupancasBD;}}
Note que cada um dos atributos da classeBd umaCollectionque vai
ser responsvel por armazenar uma classe de domnio. importante
observar tambm que os mtodosgetsforam alterados. Antes de retornar
o objeto verificado se est nulo, caso esteja ele inicializado como
umArrayList.Alm disso, a classeBdtambm apresenta atributos
referntes aoidde cada classe de domnio. Essesidsserviro, por
exemplo, para saber qual objeto foi selecionado em umJTable. O
atributoidde cada objeto desse sistema autoincremento, pois sempre
recebe o valor do mtodogetNextIdque retorna o prximoiddisponvel.Alm
da classeBd, a classeUtiltambm deve ser criada no
pacotebr.com.banco.util. O Cdigo dessa classe demonstrado a
seguir.?12345678910111213141516171819202122232425262728293031package
br.com.banco.util;import java.awt.Color;import
java.text.ParseException;import java.text.SimpleDateFormat;import
java.util.Date;import java.util.logging.Level;import
java.util.logging.Logger;public class Util {public static Color
cor;public static String dateToStr(Date data, String
formato){SimpleDateFormat sdf = new
SimpleDateFormat(formato);return sdf.format(data);}public static
Date strToDate(String date, String formato){SimpleDateFormat sdf =
new SimpleDateFormat(formato);try {return sdf.parse(date);} catch
(ParseException ex)
{Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null,
ex);}return null;}}
Criar janela principalA janela principal do sistema ser
umJFramee, assim como as outras janelas do sistema, deve ficar no
pacotebr.com.banco.view. Para cri-la clique com o boto direito
sobre o pacotebr.com.banco.viewe selecione a opoNew / Other. Na
janela que abrir selecioneSwing GUI Formse depoisJFrame Form.
Clique emNext, digiteJFPrincipalemClass Namee selecione a
opoFinish.Assim, o Netbeans mostra a janela criada possibilitando
editar suas propriedades e tambm inserir componentes.Pode se
observar que na parte direita da tela um conjunto de componentes
exibido. Esses componentes podem ser arrastados at a tela criada
como mostra aFigura 3.
Figura 3 Paleta de componentes SwingNossa tela ser composta
pelos componentesJMenuBar,JPanel,JLabeleJDesktopPane.O
componenteJMenuBarrepresenta o menu tradicional de aplicaes. atravs
desse menu que as outras telas da aplicao sero chamadas. OJPanel
apenas um container para organizar melhor os componentes na janela.
Dentro doJPanelser inserido umJLabel. Esse componente serve para
escrever um texto qualquer: um label. Alm desses componentes, deve
ser inserido umJDesktopPaneque ir ocupar maior parte da janela.
Esse componente tambm um container que permite que outras janelas
sejam instanciadas em seu interior. Ou seja, as janelas para
listagens e cadastros do sistemas sero todas instanciadas dentro
doJInternalFrame. Isso d uma roupagem bastante profissional aplicao
no deixando as janelas soltas como sistemas separados.AFigura
4demonstra como deve ficar a tela principal.
Figura 4 Tela PrincialComo adicionamos umJMenuBar, precisamos
adicionar Itens a este menu. A edio desse componente totalmente
visual. Para criar um item de menu basta clicar com o boto direito
sobre o componente e selecionar a opoAdd menu. Depois, com um duplo
clique sobre o menu criado possvel renome-lo.Para adicionar um item
ao menu criado, clique com o boto direito sobre ele e em seguida
selecione a opoAdd fromPalette / Menu Item. Para renomear o Item de
menu criado clique com o boto direito e selecione a opoEdit
Text.Alm disso, possvel definir tambm atalhos de acesso esses
menus. Para isso, clique duas vezes sobreshortcut,na janela que se
abrir posicione o mouse sobre o campoKey Strokee em seguida aperte
o atalho que deseja para o menu como se estivesse querendo
acess-lo. O Netbeans vai detectar as teclas que voc est
pressionando e ir gerar o atalho automaticamente. Depois, basta
pressionar o botoOk.
Criar janela de listagemComo exemplo de aplicao ser demonstrado
a criao do CRUD de clientes iniciando pela janela de listagem de
clientes.A janela de listagem, assim como todas as outras janelas
dessa aplicao sero do tipoJInternalFrame. Esse tipo de componente
pode ser instanciado dentro de umJDesktopPane.Portanto, clique com
o boto direito sobre o pacotebr.com.banco.viewe selecione a opoNew
/ Other, na janela que se abrir selecione a opoSwing GUI Forms /
JinternalFrameForm, clique emNext, digiteJIFListarClienteemClass
Namee clique emFinish.Aps isso, a janela exibida e possvel
adicionar os componentes. Essa janela tambm ter umJPanele
umJLabelque daro ttulo janela. Um componente do tipoJTabledeve ser
adicionado, esse componente deve ocupar a maior parte da janela.
Alm disso, na parte inferior devem ser adicionados
quatroJButtonsque ficaro dentro de umJPanelpara que a janela fique
melhor organizada.AFigura 5demonstra como essa janela criada.
Figura 5 Tela Listagem de ClientesUm detalhe na janela de
listagem de clientes que as colunas doJTableesto customizadas, ou
seja, esto mostrando exatamente os atributos da classe cliente.
Para customizar oJTableclique com o boto direito sobre ele e
selecione a opoTable Contents, selecione a abaColumnse inclua as
colunas necessrias. Note tambm que a colunaidno exibida para o
usurio. Isso porque ela est redimensionada com largura 0 (zero).
AFigura 6mostra a configurao das colunas da tabela.Alm das colunas
tambm possvel configurar as linhas da tabela. Em nossa aplicao
todas as linhas devem ser apagas para a tabela iniciar vazia.
Figura 6 Tela edio do JTable
Instanciar janela de listagemAgora que a janela de listagem de
clientes j est criada, possvel cham-la atravs do menu criado
anteriormente. Para isso, noJFPrincipalde um duplo clique no menu
referente listagem de clientes. Ao clicar duas vezes sobre o menu,
o Netbeans automaticamente cria o mtodo que ser executado quando o
usurio clicar sobre esse menu. O cdigo a seguir deve ser digitado
no mtodo.?12345private void
jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt)
{JIFListarCliente jIFListarCliente = new
JIFListarCliente(jDPPrincipal);jDPPrincipal.add(jIFListarCliente);jIFListarCliente.show();}
O que o cdigo anterior faz instanciar a janela de listagem de
clientes, adiciona essa janela noJDesktopPanee depois mostra a
janela atravs do mtodoshow().Repare que o construtor utilizado para
instanciar a janela de listagem no o construtor padro. Esse
construtor recebe como parmetro oJDesktopPane. Isso tem que ser
feito porque a janela de Cadastro ser instanciada a partir da
janela de Listagem e no da janela Principal. Assim, passando
oJDesktopPanecomo parmetro para janela de listagem, ela pode
enxergar esse componente e adicionar a janela de Cadastro. Em
outras palavras, a janela de Listagem nao teria acesso
aoJDesktopPane, pois esse est na janela Principal.Contudo, o mtodo
construtor da janela de listagem bem como o atributo que ir
armazenar oJDesktopPaneso demonstrado a seguir.?123456private
JDesktopPane jDPPrincipal;public JIFListarCliente(JDesktopPane
jDPPrincipal) {initComponents();this.jDPPrincipal =
jDPPrincipal;}
Criar janela de manuteno de clientesA janela de manuteno aquela
que possui os campos referentes ao cadastro de clientes e permite
aos usurios incluir novos clientes ou alterar clientes j
existentes. Para criar a janela de manuteno de clientes clique com
o boto direito sobre o pacotebr.com.banco.viewe selecione a opoNew
/ JInternalFrame Form.Renomeie a janela paraJIFManterClientee
clique emFinish.Aps criar a tela possvel adicionar os componentes.
AFigura 7demonstra como a tela deve ficar.Um detalhe importante que
para os campos que possuemmscara(data e CNPJ) foram utilizados
componente do tipoJFormattedTexte noJText.Os componentes do
tipoJFormattedTextpermitem a definio de uma mscara atravs da
propriedadeFormatterFactory.
Figura 7 Tela de Manuteno de Clientes