Escolar Documentos
Profissional Documentos
Cultura Documentos
1a Edio
Furgeri, Srgio
Java 8 - ensino didtico : desenvolvimento e implementao de aplicaes / Srgio Furgeri. - So Paulo : rica,
2015. 320 p.
Bibliografia
ISBN 978-85-365-1569-4
O Autor e a Editora acreditam que todas as informaes aqui apresentadas esto corretas e podem ser utilizadas para qual-
quer fim legal. Entretanto, no existe qualquer garantia, explcita ou implcita, de que o uso de tais informaes conduzir
sempre ao resultado desejado. Os nomes de sites e empresas, porventura mencionados, foram utilizados apenas para ilustrar
os exemplos, no tendo vnculo nenhum com o livro, no garantindo a sua existncia nem divulgao. Eventuais erratas es-
taro disponveis para download no site da Editora rica.
Contedo adaptado ao Novo Acordo Ortogrfico da Lngua Portuguesa, em execuo desde 1o de janeiro de 2009.
A Ilustrao de capa e algumas imagens de miolo foram retiradas de <www.shutterstock.com>, empresa com a qual se man-
tm contrato ativo na data de publicao do livro. Outras foram obtidas da Coleo MasterClips/MasterPhotos da IMSI, 100
Rowland Way, 3rd floor Novato, CA 94945, USA, e do CorelDRAW X5 e X6, Corel Gallery e Corel Corporation Samples.
Copyright 2013 Editora rica, Corel Corporation e seus licenciadores. Todos os direitos reservados.
Todos os esforos foram feitos para creditar devidamente os detentores dos direitos das imagens utilizadas neste livro. Eventuais
omisses de crdito e copyright no so intencionais e sero devidamente solucionadas nas prximas edies, bastando que
seus proprietrios contatem os editores.
Software
ff Windows 7 ou superior;
ff Programa para descompactar arquivos em formato Zip, de preferncia o Winzip verso 8.0 ou
superior;
ff Browser (Internet Explorer 10 ou superior, Mozzila, FireFox, Google Chrome, Opera ou outro equi-
valente);
ff Ambiente de desenvolvimento JDK 8 ou superior;
ff Servidor Apache Tomcat, verso 8 ou superior;
ff MySQL Server 5.6 ou superior;
ff Eclipse Luna 4.4 ou superior;
ff NetBeans 8 ou superior.
Sobre o autor
Sua carreira na rea de informtica iniciou-se em 1983, quando comeou a programar na linguagem
Basic, utilizando o microcomputador TK-85. Desde ento vem se aperfeioando na rea, mais especifica-
mente em tecnologias voltadas programao de computadores.
Atuou vrios anos como analista de sistemas, desenvolvendo softwares comerciais em vrias lingua-
gens de programao. Trabalhou diversos anos como coordenador do curso tcnico em Informtica. Atua h
muitos anos como professor de ensino tcnico e superior em vrias disciplinas da rea de informtica, prin-
cipalmente em tecnologias voltadas Internet. Atualmente professor pleno da Fatec Indaiatuba e coor-
denador do curso de Anlise e Desenvolvimento de Sistemas. revisor de materiais tcnicos da rea de
computao e produz material instrucional para cursos de Ensino a Distncia (EaD).
mestre em Gerenciamento de Sistemas de Informao, formado pela PUC-Campinas, desde 1999.
tambm mestre em Cincia da Informao, formado pela PUC-Campinas, desde 2006. Atualmente douto-
rando em Engenharia Biomdica pela Universidade de Mogi das Cruzes (UMC-SP).
Autor de outras obras na rea de informtica:
ff Programao Orientada a Objetos Conceitos e Tcnicas, a ser publicado pela Editora rica em 2015.
ff Modelagem de Sistemas Orientados a Objetos Ensino Didtico, publicado pela Editora rica em 2013.
ff Java 7 Ensino Didtico, publicado pela Editora rica em 2010.
ff Java 6 Ensino Didtico, publicado pela Editora rica em 2008.
ff Redes Teoria e Prtica, publicado pela Editora Komedi em dezembro de 2007.
ff Hardware Montagem e Manuteno, publicado pela Editora Komedi em 2006.
ff Java 2 Ensino Didtico, publicado pela Editora rica em 2002.
ff Ensino Didtico da Linguagem XML, publicado pela Editora rica em julho de 2001.
ff Business to Business Aprenda a desenvolver aplicaes B2B com Java e XML, lanado pela
Editora rica em fevereiro de 2001.
Autor de obras em outras reas do conhecimento:
ff Bibliocincia uma reflexo bblica, cientfica e tecnolgica dos fatos atuais, lanado pela Editora
Selecta em setembro de 2007.
Autor de outros artigos relevantes:
ff Criao de um Data Mart e gerao de relatrios a partir do SQL Server Analysis Services 2008.
SQL Magazine, v. Ed. 99, p. 20-36, 2012.
ff Fragmentao no SQL Server 2005, revista SQL Magazine n 62 e 63.
ff OntoArt Ontologia em XML para descrio de artigos, revista Arquivstica.net, 2006.
ff O papel das linguagens de marcao para a Cincia da Informao, revista Transinformao, 2006.
ff MobCom: uma plataforma para consultas via dispositivos mveis, Web Mobile, 2006.
Aos meus filhos Lucas e Daniel e minha esposa Ivone, presentes de Deus para minha vida.
Agradecimentos
Primeiramente agradeo a Deus, no apenas por Ele me dar conhecimento e sade para redigir
mais um livro, mas por cuidar de mim todos os dias. A Ele toda a honra e toda a glria para sempre!
Ao pessoal da Editora rica pela confiana, por apoiar o autor nacional e dar-me a oportunidade
de desenvolver mais este trabalho.
A Simone, por ter me ajudado na edio do livro.
Agradeo tambm a voc, leitor, por ter escolhido este livro como objeto de estudo.
A palavra de Deus diz no livro de Salmos 1:3: Pois ser como a rvore plantada junto a ribeiros
de guas, a qual d o seu fruto no seu tempo; as suas folhas no cairo, e tudo quanto fizer prospe-
rar. Peo que voc leitor possa confiar nessa palavra!
Estude, vale a pena, sem dvida voc est no caminho certo.
10
11
ff Agora o livro conta com dois apndices. O Apndice A apresenta a utilizao bsica da ferramenta
NetBeans na criao de projetos em Java, juntamente com o banco de dados MySQL. O Apndice
B apresenta a utilizao do Eclipse na criao de projetos em Java e a gerao de grficos a partir
do banco de dados MySQL. Ambos tm o objetivo de introduzir ao leitor as principais ferramentas
de desenvolvimento Java.
ff Os exemplos do livro no so mais executados pelo prompt, todos so desenvolvidos e executados
pela ferramenta NetBeans (e podem ser igualmente executados pelo Eclipse).
ff No Captulo 3 foi includa a estrutura do if resumido.
ff A verso 8 do Java trouxe diversas novidades na manipulao de data e hora. O Captulo 10 apre-
senta classes como LocalDate, Period, Instant, ZonedDateTime entre outras.
ff No Captulo 11, alm da manipulao de arquivos, adiciona uma viso geral sobre a manipulao
de diretrios.
ff O Captulo 13 foi totalmente modificado. Agora o foco a introduo e a criao de pginas em
JSP (Java Server Pages) que funcionam no ambiente da Internet. At a verso 7 do livro, nosso foco
era o uso de applets, no entanto, a verso 8 adicionou diversas restries de segurana e seria re-
lativamente complexo para os leitores conseguirem executar os exemplos. Na poca, diversos sites
da Internet que disponibilizavam applets no estavam executando no Java 8 em funo dessas no-
vas restries. Dessa forma, decidimos alterar o foco do captulo.
ff No site da Editora rica voc encontra um material de apoio contendo a soluo de exerccios se-
melhantes aos propostos no livro.
Apesar de esta obra ser uma atualizao da verso 7, ou seja, ser voltada verso 8 do Java, o leitor
no pode esperar que contemplemos todas as novidades da verso 8. A maioria das novidades do Java 8
no contempla funcionalidades bsicas, est mais focada em recursos para profissionais que j pos-
suem certa experincia e domnio da linguagem. Por esse motivo, adaptamos a obra dentro do objetivo
do livro, isto , fornecer os recursos bsicos existentes na verso 8 da linguagem Java.
12
1
Java 8 Linguagem e Plataforma
13
foi usado nos antigos celulares, pagers, PDAs e, mais recentemente, nos Smartphones, uma vez que o
Android foi elaborado a partir da linguagem Java e possui a mesma sintaxe.
Diversas verses da ferramenta surgiram. Atualmente, o principal kit de desenvolvimento em
Java est na verso 8, cuja empresa proprietria desde abril de 2009 a Oracle (anteriormente per-
tencia empresa Sun). O nmero 8 (presente em Java 8) se refere ao nmero da verso do Kit de
Desenvolvimento em Java (JDK).
Como o leitor pode observar, a linguagem est evoluindo, tornando o processo de aprendizado e
atualizao uma tarefa relativamente difcil, pois toda semana surge algo novo sobre Java. Seja bem-
-vindo ao mundo Java!
14
15
para suportar tecnologias avanadas de comunicao, como protocolos TCP/IP (Transport Control
Protocol/Internet Protocol), HTTP, FTP (File Transfer Protocol), entre outros.
Diversas outras caractersticas poderiam ser citadas, tais como robustez, segurana, alto desempe-
nho etc. Entretanto, conforme j declarado, esse no o objetivo.
Cdigo-Fonte
Classe.java
Compilador
Ajustar
Cdigo-Fonte
S
Erros?
N Classe.class
Interpretador
ByteCodes
Execuo
16
17
ser utilizadas gratuitamente. O Apndice A apresenta uma breve introduo ao uso do NetBeans, e o
Apndice B, uma introduo ao Eclipse. Este livro no aborda em profundidade nenhuma ferramenta
de desenvolvimento, pois o foco est no kit de desenvolvimento JDK e na linguagem Java em si, no no
uso de uma ferramenta. Apesar disso, alertamos para o seguinte fato: num ambiente real de desenvol-
vimento de sistemas em Java essencial a utilizao de uma ferramenta de desenvolvimento, por isso
importante o leitor considerar o uso de uma das ferramentas citadas.
O livro procura direcionar o leitor a preocupar-se em entender os aspectos da linguagem e no
detalhes operacionais de uma ferramenta, tornando o aprendizado mais simples. Mesmo assim,
conforme j citado, o leitor deve aprimorar seus conhecimentos usando alguma ferramenta de de-
senvolvimento.
Observao
Existem diversas ferramentas presentes no JDK da Oracle (veja os arquivos existentes na pasta bin da
instalao do Java). Entre elas citamos o compilador (javac), o interpretador (java) e o visualizador de
applets (appletviewer). No entanto, este livro no considera a utilizao dessas ferramentas. Por ques-
tes de produtividade, indicado utilizar um ambiente visual de desenvolvimento, como, por exemplo,
as IDEs NetBeans e Eclipse. Esperamos que o leitor escolha uma das ferramentas e digite os exemplos
constantes no livro a partir de uma delas.
18
19
20
Observao
Ao usar o JDK a partir da janela de prompt (janela do antigo sistema operacional DOS) seria necessrio
realizar a configurao das variveis de ambiente. Como no livro consideramos que o leitor estar usan-
do uma ferramenta de desenvolvimento como NetBeans ou Eclipse, esse processo desnecessrio. Mes-
mo assim, caso voc precise configurar as variveis de ambiente, poder consultar um material adicional
no site da Editora rica que demonstra como configurar as variveis (considerando-se algumas verses
do sistema operacional Windows).
Figura 1.8 Projeto na IDE NetBeans. Figura 1.9 Projeto na IDE Eclipse.
Para testar nosso exemplo utilizando a IDE NetBeans, siga os passos da Seo 1.7.1. Caso utilize o
Eclipse, siga para os passos da Seo 1.7.2.
2. O prximo passo criar um pacote para armazenar nossa classe Livro. Selecione o projeto java8 como
mostra a Figura 1.10, pressione o boto direito do mouse sobre ele, selecione Novo Pacote Java...
Em Nome do Pacote digite cap01 e pressione o boto Finalizar. Ser adicionado um pacote chama-
do cap01 a nosso projeto java8. Em seguida vamos criar a classe Livro e adicion-la ao pacote cap01.
21
Para isso, pressione o boto direito do mouse sobre o pacote cap01, selecione Novo Classe Java...
Em Nome da Classe digite Livro e pressione o boto Finalizar. Ao criar a classe Livro, surgir um cdigo
gerado automaticamente, veja a Figura 1.11. Observe que existem diversos comentrios (linhas 1 a 5 e
7 a 10) gerados pela ferramenta, eles no so importantes nesse momento e podem ser excludos.
Para executar nossa classe Livro, pressione o boto direito do mouse sobre ela e escolha Executar
arquivo (o atalho Shift+F6 tambm pode ser usado para executar uma classe). Se tudo estiver correto,
aparecer na janela Sada o resultado apresentado na Figura 1.12.
22
Figura 1.15 A classe Livro criada na IDE Eclipse. Figura 1.16 Sada da execuo da classe Livro no Eclipse.
Observao
Um dos maiores problemas de programar em Java, algo que tira o sono dos programadores, refere-se
sensibilidade maiscula/minscula das palavras usadas. Os desenvolvedores em Java nomeiam as clas-
ses seguindo a conveno Camel Case, uma maneira padronizada de escrever palavras compostas. Por
exemplo, o nome de uma classe sempre inicia com letra maiscula (no Exemplo 1.1, String e System).
Caso o nome da classe possua mais de uma palavra, cada palavra iniciada em maiscula (exemplos:
ImprimeTexto, GravaArquivoEmDisco.
A primeira linha da classe contm o nome do pacote, no caso cap01. O uso de pacotes fortemente
recomendado, mas o que isso?
Conforme citado anteriormente, um pacote (package) em Java um diretrio (pasta) em que est
armazenado um conjunto de classes, em nosso exemplo inicial apenas uma classe. Geralmente as classes
23
de mesma afinidade, ou mesmo propsito, so armazenadas num mesmo local. Alguns exemplos de pa-
cote do prprio Java so: awt, beans, io, lang, math, net, rmi etc. Na realidade, todas as classes perten-
cem a algum pacote. Quando o pacote no especificado, a classe passa a pertencer ao pacote default,
isto , a prpria pasta na qual a classe foi salva. Como j afirmamos, criar uma classe sem um pacote
no uma prtica recomendada, por isso todas as classes que criarmos no livro estaro associadas a
um pacote. Para cada captulo ser definido um pacote cujo nome far referncia ao prprio captulo
(cap01, cap02, cap03 etc.).
Por conveno, o nome de um pacote sempre deve ser em letras minsculas (isso permite diferen-
ciar do nome de classes), podendo ser separados por ponto final (.). indicado tambm que os pacotes
tenham o nome reverso ao site a partir do qual eles se encontram armazenados. Por exemplo, se um pa-
cote chamado meupacote se localiza no site http://www.pacotes.com.br, ento o endereo completo
do pacote deve ser br.com.pacotes.meupacote.
Um pacote definido a partir da palavra reservada package, inserida na primeira linha de uma
classe, seguindo a sintaxe package nome-do-pacote;. Observe que essa mesma sintaxe foi usada em
nosso Exemplo 1 da classe Livro. No captulo referente orientao a objetos apresentaremos outros
detalhes a respeito do uso de pacotes.
A linha do mtodo principal possui o formato public static void main(String[ ] args). Todas as classes
executveis precisam ter essa linha. A nica coisa que pode ser alterada na linha a varivel args que
pode receber outro nome de acordo com o desejo do programador. A seguir, feita uma anlise um
pouco mais detalhada dessa linha. Mesmo que alguns termos paream estranhos, o leitor no deve se
preocupar, pois a sequncia de aprendizado durante os prximos captulos traz mais clareza.
public
um qualificador usado em diversos identificadores em Java (classes, atributos, mtodos), e no
exemplo foi usado antes do mtodo main. Quando o qualificador public colocado antes da palavra
reservada class, como em nosso caso public class Livro, significa que essa classe ser visvel a outras
classes (outras classes podem utilizar a classe Livro). O mesmo ocorre com o mtodo main, que por
ser pblico pode ser utilizado por outras classes; ele ser visvel a outras classes. Isso til quando
uma classe necessita utilizar alguma funcionalidade de outra, caracterstica muito comum na linguagem
Java. As questes de visibilidade so tratadas mais frente no captulo sobre orientao a objetos.
static
Trata-se de um qualificador que indica que o mtodo pertence classe (ele esttico classe que
o definiu). Ainda muito cedo para que o leitor possa compreender o funcionamento do qualificador
static. Voltaremos ao assunto no captulo referente orientao a objetos.
void
o valor de retorno do mtodo. Quando no h nenhum valor a ser retornado por quem chamou o
mtodo, ele retorna void, uma espcie de valor vazio. Este livro apresenta um captulo voltado aos m-
todos, item muito importante para o aprendizado de Java. Vamos demonstrar que os mtodos podem
retornar valores, isto , processar alguma informao e retornar um valor de resultado. Quando um
mtodo retorna um resultado, ele no possui o qualificador void, conforme ser mostrado.
main
Esse o nome do mtodo que indica o ponto inicial da execuo da classe. o mtodo principal,
em que todas as variveis, argumentos e instrues so interpretados e processados para a execuo
do programa (da classe). Por conveno, uma classe que contm o mtodo main considerada uma
aplicao, um programa que pode ser executado. Em um sistema real existem muitas classes, centenas,
24
milhares talvez; no entanto, apenas uma classe normalmente possui o mtodo main. Assim, a classe que
contm o mtodo main ser o ponto de partida para a execuo do sistema.
(String[ ] args)
o argumento do mtodo principal (main); trata-se de um vetor de strings responsvel por receber
valores que podem ser processados internamente classe. Imagine que uma classe qualquer possa re-
ceber uma frase e mostr-la na tela pausadamente, letra a letra. Essa frase seria passada ao vetor args,
ou seja, args a porta de entrada a partir da qual a classe pode se comunicar com o mundo externo,
isto , com outras classes. Mais adiante so demonstrados diversos exemplos que recebem argumen-
tos. Outra variao existente nessa sintaxe inverter a posio dos colchetes ([ ]) que aparecem do
lado direito da palavra String. Poderia ser usado o formato String args[ ], cujo resultado obtido seria o
mesmo, isto , trata-se da declarao de um vetor de strings.
{ ... }
Abre-chaves e fecha-chaves delimitam um bloco de cdigo semelhante ao BEGIN e END de ou-
tras linguagens, como Pascal. No Exemplo 1.1 a classe Livro envolve todas as instrues da classe, inclu-
sive o mtodo main. Esse exemplo possui apenas o mtodo main, entretanto uma classe pode envolver
diversos mtodos.
Material de apoio
Voc sabia que a linguagem Java pode ser usada sem nenhum tipo de ferramenta de desenvolvimento?
Apenas com um editor de textos, como o bloco de notas, possvel digitar e salvar o cdigo-fonte. Depois
disso, possvel compilar o arquivo usando o aplicativo javac e executar a classe utilizando o aplicativo
java. O compilador (javac) e o interpretador (java) esto armazenados na pasta bin da instalao do Java.
O endereo seguinte contm um tutorial que mostra como possvel realizar esse processo:
<http://editoraerica.com.br/>.
25
Neste ponto o leitor j possui os conhecimentos bsicos da linguagem Java, reconhecendo a sua impor-
tncia, seu impacto e crescimento por meio da Internet, suas principais caractersticas e vantagens de
utilizao. O prximo captulo aborda o incio do aprendizado em Java, considerando que o leitor novato
no assunto, ou seja, so fornecidos os subsdios necessrios para o aprendizado inicial da linguagem Java.
26
2
Aspectos Fundamentais de Java
27
Considere que seja necessrio armazenar na memria do computador os seguintes dados de uma
pessoa: nome, sexo e idade. O nome contm uma sequncia de caracteres, o sexo contm uma nica
letra (M ou F) e a idade, um valor numrico. Note que cada informao a ser armazenada exige uma
embalagem diferente: o sexo, apenas uma letra (uma embalagem pequena), o nome, uma sequncia
de letras (uma embalagem maior), enquanto a idade deve manter um valor numrico inteiro (uma em-
balagem de tipo diferente). Para armazenar esses dados, um programa deve definir variveis, isto ,
identificadores de um determinado tipo de dado.
Resumindo, antes de utilizar variveis (a embalagem) necessrio definir que tipo de dado elas
vo armazenar. Caso seja necessrio armazenar a quantidade em estoque de um determinado produto,
pode-se declarar uma varivel do tipo inteira, ou para armazenar valores monetrios possvel declarar
uma varivel do tipo double e assim por diante. Os tipos de dados em Java so portveis entre todas as
plataformas de computadores que suportam essa linguagem. Mais detalhes sobre variveis so forne-
cidos na prxima seo.
Na maioria das linguagens, quando um tipo de dado utilizado, por exemplo, um tipo inteiro, pode
ser que para uma determinada plataforma esse nmero seja armazenado com 16 bits e em outra com
32 bits. Em Java isso no ocorre, uma vez que um tipo de dado ter sempre a mesma dimenso, indepen-
dentemente da plataforma utilizada. Esse e muitos outros recursos de portabilidade de Java permitem
que os programadores escrevam programas sem conhecer a plataforma de computador em que eles
sero executados.
A Tabela 2.1 demonstra os tipos de dados, considerados os tipos primitivos da linguagem, utilizados
na criao de variveis.
Tabela 2.1 Os tipos primitivos em Java
Quando os recursos de hardware da mquina eram mais limitados, existia a preocupao de re-
duzir ao mximo a quantidade de memria utilizada por um programa; no que isso no ocorra hoje,
mas antigamente era prioritrio. Analisando a Tabela 2.1, um programador chegaria concluso de que
para armazenar a idade de uma pessoa deveria ser utilizado o tipo byte, pois possui uma faixa de valo-
res suficiente para armazenar a idade que uma pessoa normal pode atingir, dispensando outros tipos
numricos que ocupariam mais espao na memria.
28
no podem utilizar as palavras reservadas da linguagem Java, assim como ocorre com outras linguagens
de programao. A relao de palavras reservadas do Java apresentada na Tabela 2.2.
Tabela 2.2 Palavras reservadas em Java
Observao
As palavras reservadas em Java referem-se a nomes de instrues utilizadas na linguagem que no po-
dem ser usadas como nomes de identificadores (variveis, objetos etc.). O nmero de palavras reserva-
das aumentou em decorrncia das diferentes verses do Java.
A linguagem Java exige que todos os identificadores tenham um tipo de dado definido antes de
serem utilizados no programa, ou seja, eles devem ser obrigatoriamente declarados, independente-
mente do ponto do programa, seja no incio, no meio ou no final, desde que antes de sua utilizao no
programa. Essa caracterstica difere da maioria das linguagens de programao. Pascal, por exemplo,
possui uma rea exclusiva para a declarao das variveis.
29
ff Quando o nome da varivel tiver mais de uma palavra, a primeira letra, da segunda palavra em
diante, deve ser maiscula. Todos os outros caracteres devem ser minsculos.
Exemplos de nomes de variveis: a, a1, $preco, nome, valorVenda, codigoFornecedor.
O Exemplo 2.1 apresenta uma classe que utiliza todos os tipos de dados primitivos.
As variveis devem ser definidas antes de serem utilizadas, sendo possvel inicializ-las com um va-
lor no momento de sua declarao, conforme mostra o Exemplo 2.1. As variveis do mesmo tipo podem
ser declaradas na mesma linha desde que separadas por vrgula (no exemplo, int na linha 8). Quando for
necessrio definir uma nova varivel com um tipo de dado diferente, por conveno se utiliza uma nova
linha (no caso, long na linha 9).
As linhas 12 a 14 imprimem algumas mensagens (tudo o que estiver envolvido por aspas duplas) e
o contedo das variveis (para imprimir o contedo de uma varivel basta utilizar seu nome sem o uso
das aspas). Observe que o caractere mais (+) usado para concatenar (juntar) diferentes contedos. Em
nosso exemplo, o contedo texto concatenado com o contedo das variveis, imprimindo uma frase
nica para cada linha. Voc pode ver o resultado da execuo na Figura 2.2.
Outro ponto a ser observado no Exemplo 2.1 se refere utilizao do mtodo println da classe
System. Conforme pode ser visualizado na Figura 2.2, para cada mtodo println usado ocorre uma
mudana de linha na tela. Essa caracterstica controlada pelas letras ln inseridas no final do mtodo
println, isto , o mtodo imprime o que est entre parnteses e em seguida imprime um final de linha.
A prxima informao a ser impressa aparece na outra linha. Caso seja necessrio imprimir diversos
valores na mesma linha, alm de utilizar o operador de concatenao, pode-se utilizar o mtodo println
sem o ln no final da seguinte forma: System.out.print (Dados a serem impressos).
Para finalizar nossa anlise do Exemplo 2.1, observe a utilizao do ponto e vrgula (;) no final da
maioria das linhas de cdigo (linhas contendo instrues). Essa outra obrigatoriedade da linguagem,
porm nem todas as linhas necessitam do encerramento com ponto e vrgula. Somente a prtica do
dia a dia far com que o leitor ganhe experincia nesse aspecto. aconselhvel que, medida que os
exemplos forem apresentados, o leitor procure prestar ateno nas linhas que no necessitam de en-
cerramento.
Para testar a execuo do Exemplo 2.1, faa o seguinte:
1. Crie um novo pacote chamado cap02 no projeto java8 (o projeto criado no Captulo 1).
2. Salve a classe TiposPrimitivos dentro do pacote cap02.
3. Selecione e execute a classe TiposPrimitivos (Shift + F6 no NetBeans ou F11 no Eclipse).
A Figura 2.1 apresenta a estrutura do projeto com a classe TiposPrimitivos e a Figura 2.2 apresenta
o resultado da execuo do Exemplo 2.1.
30
Figura 2.1 A classe TiposPrimitivos. Figura 2.2 Tela de execuo do Exemplo 2.1.
Caso um segundo valor seja atribudo a uma varivel final no decorrer da classe, o compilador gera
uma mensagem de erro. No obrigatrio inicializar o contedo de uma varivel final no momento de
sua declarao. possvel realizar esses dois processos em locais distintos, conforme apresentado em
seguida.
2.3 Comentrios
Os comentrios so linhas adicionadas ao programa que servem para facilitar seu entendimento
por parte do programador, ou ainda por uma outra pessoa que o consulte. Essas linhas no afetam o
programa em si, pois no so consideradas parte do cdigo. O Java aceita trs tipos de comentrio: de
uma linha, de mltiplas linhas e de documentao.
Para inserir comentrios de linha nica utilizam-se // (duas barras) em qualquer local do programa
e tudo o que estiver escrito depois desse sinal e na mesma linha ser considerado um comentrio.
Para inserir comentrios que envolvam vrias linhas, utiliza-se /* (barra asterisco) para demarcar o
incio e */ (asterisco barra) para o final, ou seja, tudo o que estiver entre esses dois sinais ser conside-
rado comentrio.
O terceiro tipo semelhante ao comentrio de mltiplas linhas, entretanto tem o propsito de pos-
sibilitar a documentao do programa por meio de um utilitrio (javadoc) fornecido pela Oracle junto
com o JDK. Esse tipo de comentrio inicia-se com /** e encerrado com */.
O Exemplo 2.2 demonstra a utilizao desses trs tipos de comentrios.
31
Figura 2.3 A classe Comentarios. Figura 2.4 Tela de execuo do Exemplo 2.2.
2.4 Operadores
A linguagem Java oferece um amplo conjunto de operadores destinados realizao de operaes
aritmticas, lgicas e relacionais, com a possibilidade de formar expresses de qualquer tipo. Alm dos
operadores matemticos (aritmticos), existem tambm operadores lgicos e relacionais, conforme
abordado em seguida.
32
Entre os operadores presentes na Tabela 2.3, talvez os de decremento (--) e incremento (++) cau-
sem alguma dvida, principalmente para os programadores iniciantes, sobretudo aqueles que no
conhecem a linguagem C, uma vez que esses operadores no so comuns na maioria das linguagens.
Entretanto, sua utilizao extremamente simples. Como o prprio nome diz, o operador de incre-
mento incrementa (aumenta) o valor de uma varivel qualquer em um, ou seja, supondo que uma vari-
vel chamada idade possua o contedo 10, ao receber o operador de incremento (idade++), seu con-
tedo passa a ser 11 (10+1). O mesmo vale para o operador de decremento, logicamente reduzindo
em um o contedo da varivel.
O Exemplo 2.3 mostra uma classe em Java com a utilizao de alguns operadores. Os coment-
rios aparecem com barras duplas (//) junto ao cdigo da prpria classe. Conforme j citamos, para
imprimir diversas variveis na tela uma ao lado da outra, utilizado o operador de concatenao (+),
ao contrrio de outras linguagens que utilizam a vrgula (,) como separador. Na linha 8, por exemplo, a
sequncia (X = + x) indica que o trecho entre aspas ser enviado para a tela concatenado com (+) o
contedo da varivel x. Para enviar uma frase qualquer para a tela, necessrio coloc-la entre aspas;
j para enviar o contedo de uma varivel, as aspas no devem ser utilizadas.
Figura 2.5 A classe OperadoresAritmeticos. Figura 2.6 Tela de execuo do Exemplo 2.3.
33
Existem ainda dois tipos de operadores que podem ser usados como se fossem operadores relacionais:
& e |. Eles so bitwise e operam com a lgica binria como bits. Java possui diversos operadores bitwise, no
abordados no livro por serem menos usados.
34
O Exemplo 2.4 apresenta a classe ConversaoTipos que realiza algumas converses presentes na
Tabela 2.7.
35
ff Linha 11: apresenta em tela a concatenao dos valores das variveis s2, w e z. Se todas as variveis
fossem numricas, o operador + realizaria a soma de todos os valores. No entanto, como s2 uma
String, qualquer tipo primitivo somado (concatenado) com String ser transformado em tipo String.
Por isso o resultado em tela 101010 e no 30 (como seria se as variveis fossem numricas).
Para testar a execuo do Exemplo 2.4, faa o seguinte:
1. Salve a classe ConversaoDeTipos dentro do pacote cap02.
2. Selecione e execute a classe ConversaoDeTipos.
A Figura 2.7 apresenta a estrutura do projeto com a classe ConversaoDeTipos e a Figura 2.8 apre-
senta o resultado da execuo do Exemplo 2.4.
Figura 2.7 A classe ConversaoDeTipos. Figura 2.8 Tela de execuo do Exemplo 2.4.
36
ff Linha 2: contm uma diretiva de compilao, isto , um apontamento para uma classe externa
que ser usada durante o processo de compilao. A declarao import indica que determinado
pacote de classes deve ser carregado no momento da compilao. Isso necessrio quando uma
classe precisa utilizar recursos j definidos em outras classes. O exemplo utiliza o pacote java.io
que contm uma srie de classes especializadas em entrada e sada de dados. usada a classe
DataInputStream que pertence ao pacote java.io. Entenda o pacote como um grupo de classes de
mesmo tipo armazenadas em uma pasta qualquer. O asterisco presente em import java.io.* indica
que devem ser carregadas todas as classes do pacote java.io. Uma alternativa realizar a decla-
rao da seguinte forma: import java.io.DataInputStream, indicando que ser utilizada apenas a
classe DataInputStream.
Observao
A linguagem Java possui um pacote de classes padro carregado toda vez que uma classe compilada. Tra-
ta-se do pacote java.lang. Se esse pacote default no fosse carregado automaticamente, mesmo para en-
viar qualquer informao na tela por meio de System.out.println, seria necessrio declarar explicitamente
a diretiva. No caso da classe System, seria necessria a seguinte declarao: import java.lang.System.
No programa, * no gera overhead (sobrecarga) e normalmente utilizado para reduzir o tamanho do c-
digo. A utilizao do * pode gerar certa confuso, uma vez que ele deve ser usado apenas para identificar
um grupo de classes e no um grupo de pacotes. Por exemplo, suponha que um programa utiliza os pacotes
java.util.* (o asterisco indica todas as classes do pacote util) e java.net.* (o asterisco indica todas as classes
do pacote net). No possvel utilizar java.* achando que os dois pacotes (util e net) sero incorporados ao
programa. O estudo mais detalhado de pacotes e da declarao import realizado no Captulo 7.
ff Linha 7: declara um objeto chamado dado a partir da classe DataInputStream. No se preocupe com
isso ainda. Em outro captulo so detalhados a criao e o funcionamento de classes e objetos. No
momento, entenda DataInputStream como uma classe que possibilita a entrada de dados via teclado.
ff Linha 8: contm o bloco try (tente). Bloco um trecho de cdigo delimitado por abre e fecha cha-
ves. O bloco try sempre atua em conjunto com um ou vrios blocos catch. No exemplo o bloco try
formado pelo conjunto de todas as instrues localizadas entre as linhas 8 e 23. O Captulo 3
detalha a utilizao das instrues try-catch. Por enquanto, entenda que o interpretador Java
tentar executar o bloco try e se algum erro ocorrer a execuo do programa ser desviada para
um dos blocos catch, dependendo do erro gerado na aplicao. Neste exemplo podem ocorrer
um erro de entrada de dados pelo teclado (IOException) e um erro na converso de String em float
(NumberFormatException).
ff Linha 10: o objeto dado recebe o que foi digitado pelo usurio por meio da linha new
DataInputStream(System.in). Essa linha pode gerar algum tipo de erro, uma vez que manipula
troca de dados entre um perifrico (teclado) e a memria. Caso ocorra algum erro, a execuo do
programa ser desviada para a linha 23, que trata de erros de entrada e sada de dados.
ff Linha 11: a varivel s recebe o contedo texto do objeto dado. Essa linha contm o mtodo
readLine() da classe DataInputStream responsvel por ler uma linha de texto que foi digitada pelo
usurio e atribu-la varivel s. Observa-se que esse mtodo foi descontinuado pela Oracle. Por
esse motivo o mtodo aparece riscado (um mtodo deprecated), isto , trata-se de um mtodo ob-
soleto. Apesar disso, o mtodo funciona e a classe pode ser executada normalmente. Utilizamos
o mtodo readLine da classe DataInputStream para que o leitor possa identificar o significado de
deprecated. A prpria Oracle recomenda que seja utilizado o mtodo readLine, porm da classe
BufferedReader, conforme apresenta o Exemplo 2.6.
ff Linha 12: o contedo da varivel s convertido em uma varivel numrica do tipo float por meio
de Float.parseFloat (voc pode ler essa instruo como: mtodo parseFloat da classe Float). Essa
converso pode gerar um erro, caso o usurio tenha digitado um contedo diferente de nmero.
Caso ocorra algum erro, a execuo do programa desviada para a linha 25, que trata de erros de
converso de tipos.
37
Figura 2.9 A classe EntradaComDataInputStream. Figura 2.10 Tela de execuo do Exemplo 2.5.
38
A classe Scanner possui mtodos especficos para leitura de diferentes tipos de dados. Observe
nas linhas 10 e 14 o uso do mtodo nextFloat que permite ler um valor do tipo float diretamente, sem
a necessidade de converso. Exemplos de alguns mtodos similares para leitura de valores numricos
so: nextByte, nextShort, nextInt, nextLong, NextDouble, entre outros.
Apesar de os Exemplos 2.5, 2.6 e 2.7 funcionarem perfeitamente, seu uso se limita janela de con-
sole. A experincia nos mostra que os leitores e alunos preferem solicitar dados no modo grfico, pois
este muito mais agradvel do que o modo texto. A seo seguinte apresenta a entrada de dados du-
rante a execuo de uma aplicao em Java por meio da classe JOptionPane.
39
Da mesma forma que os exemplos anteriores, a classe do Exemplo 2.8 solicita dois valores ao usu-
rio (comprimento e largura) e apresenta a rea e o permetro, tudo realizado em caixas de mensagem
grficas (janelas) similares da Figura 2.12.
Funcionalidades diferentes do Exemplo 2.8 em relao aos exemplos anteriores:
ff Linha 2: contm a declarao import referente importao da classe JOptionPane. Diferentemente
do Exemplo 2.5, em que foi definida a importao de todas as classes do pacote (uso do *), neste
exemplo optou-se pela importao de uma nica classe, no caso a JOptionPane.
ff Linhas 8 e 11: utilizam o mtodo showInputDialog da classe JOptionPane, responsvel por abrir
a caixa de dilogo e permitir a digitao do valor do comprimento e da largura. O valor digitado
armazenado em uma varivel do tipo String chamada aux. Como JOptionPane retorna um valor
do tipo texto (mesmo que seja digitado um valor numrico), ele precisa ser convertido em nmero
por meio de Float.parseFloat (linhas 9 e 12).
ff Linha 16: contm a utilizao do mtodo showMessageDialog da classe JOptionPane responsvel
por abrir a caixa de dilogo e apresentar o valor da rea e do permetro. Observe a diferena en-
tre os mtodos showInputDialog e showMessageDialog. Enquanto o primeiro permite a digitao
de um valor, o outro apenas apresenta um valor na caixa.
ff Linha 21: utiliza System.exit(0), responsvel por encerrar a aplicao.
Para testar a execuo do Exemplo 2.8, faa o seguinte:
1. Salve a classe EntradaComJOptionPane dentro do pacote cap02.
2. Selecione e execute a classe EntradaComJOptionPane.
A Figura 2.11 apresenta a estrutura do projeto com a classe EntradaComJOptionPane e a Figura
2.12 apresenta o resultado da execuo do Exemplo 2.8.
Figura 2.11 A classe EntradaComJOptionPane. Figura 2.12 Telas de execuo do Exemplo 2.8.
1. Usando a classe BufferedReader para entrada de dados, crie uma classe que receba o valor de um
produto e a porcentagem de desconto, calcule e mostre o valor do desconto e o valor do produto
com o desconto. Observao: o valor do desconto calculado por meio da frmula: valor do des-
conto = valor do produto * percentual de desconto / 100.
2. Usando a classe Scanner para entrada de dados, faa uma classe que receba dois valores inteiros.
O primeiro valor corresponde quantidade de pontos do lder do campeonato brasileiro de fu-
tebol. O segundo valor corresponde quantidade de pontos do time lanterna. Considerando que
40
cada vitria vale 3 pontos, elabore uma classe que calcule o nmero de vitrias necessrias para
que o time lanterna alcance (ou ultrapasse) o lder. Por exemplo, supondo que as quantidades de
ponto fornecidas sejam 40 e 22, ento o nmero de vitrias apresentada na sada dever ser 6,
pois (40-22) / 3 = 6.
3. O Imposto sobre a Transmisso de Bens Mveis (ITBI) aplicado sobre o valor de um imvel a
ser negociado. A base de clculo do ITBI (o valor a ser considerado no clculo) ser o maior va-
lor entre o valor de transao (o valor negociado) e o valor venal de referncia (fornecido pela
Prefeitura). Com base nisso, elabore uma classe que receba o valor da transao, o valor venal e
o percentual de imposto. Aps isso, encontre o maior valor e aplique o percentual sobre ele. Ao
final, apresente o valor do imposto a ser pago. Observao: o valor do imposto a ser pago calcula-
do por meio da frmula: valor do imposto = maior valor * percentual / 100. Para entrada e sada
de dados utilize a classe JOptionPane.
4. Usando a classe JOptionPane para entrada de dados, elabore uma classe que receba a nota de
duas provas e de um trabalho. Calcule e mostre a mdia e o resultado final (aprovado ou reprova-
do). Para calcular a mdia utilize a frmula seguinte: mdia = (nota da prova 1 + nota da prova 2 +
nota do trabalho) / 3. Considere que a mdia mnima para aprovao 6.
5. Considere a seguinte informao a respeito do clculo da aposentadoria. Para se aposentar por ida-
de, as mulheres precisam ter atingido 60 anos de idade e os homens, 65. J na aposentadoria por
tempo de contribuio, o tempo mnimo exigido de 30 anos para as mulheres e de 35 anos para os
homens. Com base nessas informaes, elabore uma classe que receba a idade de uma pessoa, seu
sexo e a quantidade de anos de contribuio. A seguir, calcule a quantidade de anos que falta de con-
tribuio para se aposentar, ou ento emita a mensagem: voc j tem o direito a aposentadoria.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.
Este captulo demonstrou os aspectos fundamentais da linguagem Java de forma bem simples,
abordando os tipos de dados primitivos da linguagem, a declarao de variveis, operadores e o uso do
teclado para a entrada de dados. importante que o leitor resolva todos os exerccios propostos, pois
eles foram elaborados e direcionados para facilitar o progresso nos estudos do captulo seguinte. O pr-
ximo passo trata dos comandos condicionais e estruturas de controle em Java.
41
3
Estruturas Condicionais,
de Exceo e Repetio
42
if (<Condio>) {
<Instrues para condio verdadeira>
} else {
<Instrues para condio falsa>
}
A Figura 3.1 traz uma representao grfica para ajudar o leitor a entender o funcionamento dessa
estrutura. Cada losango pode ser considerado uma instruo if que contm uma expresso lgica (con-
dio). Veja que dependendo do resultado da condio (verdadeira ou falsa) ser executado um bloco
diferente (1 ou 2) de instrues. importante entender tambm que toda estrutura if possui um incio
e um final, nos quais os dois caminhos se encerram.
Incio
[verdadeira] [falsa]
condio
bloco 1 bloco 2
Fim
Assim como a maioria das instrues em Java, o conjunto if-else deve ser utilizado com minscu-
las e, caso haja apenas uma instruo a ser executada, tanto no if como no else, o uso das chaves
desnecessrio. Lembre-se de que as chaves so utilizadas quando um bloco de instrues precisa ser
executado, isto , mais do que uma instruo.
A estrutura if-else apresentada no a nica vlida, pois existem outras maneiras diferentes de se
criar essa estrutura: if sem o else, if com o else e if com o else aninhado. Compare as representaes
grficas dessas variaes na Figura 3.2.
if sem else
Incio Incio
Fim Fim
Incio
43
[verdadeira] [falsa]
condio
ERJ_Java_8.indb 43 31/03/2015 16:40:52
Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes
if com else
[verdadeira] [verdadeira]
[falsa] [falsa]
[verdadeira] [verdadeira]
[falsa] [falsa]
condio condio condio condio
Incio Incio
[verdadeira] [verdadeira]
[falsa] [falsa]
bloco 1 bloco 1 condio condio
[verdadeira] [verdadeira]
[falsa] [falsa]
bloco 2 bloco 2 condio condio
Fim Fim
44
45
ff Linhas 13 a 15: a instruo if verifica se o contedo da varivel resp igual a Masculino e mostra
a mensagem de Voc homem.
ff Linhas 16 a 18: a instruo if verifica se o contedo da varivel resp igual a Feminino e mostra
a mensagem de Voc mulher.
ff Linha 19: encerra a aplicao.
A Figura 3.3 ilustra a execuo do Exemplo 3.1.
O Exemplo 3.2 mostra um uso prtico do if-else para validar a entrada do usurio. So realizadas
trs validaes: em primeiro lugar, verifica se o usurio realmente entrou com um valor na caixa de di-
logo, depois verifica se o valor digitado numrico, logo a seguir verifica se esse valor est entre 1 e 12
(a faixa de valores possveis, uma vez que um ms deve assumir apenas valores entre 1 e 12).
Exemplo 3.2 Listagem da classe IfComElse
46
mensagem negativa (linha 12). Observe que no interior dos parnteses da instruo if existem
duas comparaes unidas pelo operador lgico e (&&).
ff Dessa forma, quando o usurio fornecer um valor inteiro entre 1 e 12 aparecer a mensagem in-
dicando que o ms vlido, caso contrrio aparecer a mensagem indicando que o ms invlido.
A Figura 3.4 ilustra a execuo do Exemplo 3.2.
O Exemplo 3.3 mostra como possvel criar uma estrutura em que cada instruo else realiza a
abertura de um novo if. Ao analisar essa estrutura, podemos notar que existe um (ou mais) if dentro de
um else.
Exemplo 3.3 Listagem da classe IfComElseAninhado
47
switch (<expresso>){
case 1: instrues; break;
case 2: instrues; break;
case 3: instrues; break;
default: instrues;
}
Na primeira linha do switch avaliado o resultado da expresso, que comparado nas diretivas
case, executando o bloco de instrues quando a expresso coincidir com o valor colocado ao lado di-
reito do case. Em outras palavras, supondo que o valor da expresso seja igual a 2, sero executadas as
instrues localizadas entre case 2: e break. A cada case o programa compara o valor da expresso
com o valor colocado no case. Caso os valores sejam iguais, todas as instrues so executadas at que
se encontre uma instruo break, que encerra o switch e faz a execuo do programa desviar para o
48
ponto aps a chave de encerramento do switch. O programa percorre todas as diretivas case at que
uma delas seja igual expresso inserida no switch. Caso nenhuma diretiva case possua o valor corres-
pondente da expresso, sero executadas as instrues localizadas na diretiva default que opcional.
Veja a representao grfica da estrutura do switch-case na Figura 3.5.
Incio
<Expresso>
[verdadeira]
condio Instrues
[falsa]
[verdadeira]
condio Instrues
[falsa]
[verdadeira]
condio Instrues
[falsa]
Fim
O Exemplo 3.5 demonstra de forma clara a utilizao da estrutura switch-case, simulando os meses
do ano, em que o usurio entra com um nmero e o programa retorna o ms correspondente por extenso.
Funcionalidades comentadas do Exemplo 3.5:
ff Linha 6: verifica se o usurio pressionou a tecla Cancel. Como voc j sabe, se o usurio pressionar
esse boto a varivel mes receber o valor null.
ff Linha 7: switch (mes) significa: procure nas instrues case envolvidas pelas chaves se existe o
contedo armazenado na varivel mes.
ff Observe que toda linha do case necessita da instruo break em seu final. Essa instruo faz com
que a execuo da classe seja transferida para o final da estrutura switch (no caso a linha 21).
ff Caso nenhuma condio seja satisfeita, isto , se o usurio entrou com um nmero diferente de 1
a 12, ento a instruo default executada (linha 18).
Observao
Uma questo importante para esse exemplo se refere ao uso do tipo String associado ao switch. Essa
funcionalidade tornou-se possvel apenas a partir da verso 7 do Java. Isso significa que caso o Exemplo
3.4 seja executado numa verso inferior ocorrer erro de compilao, pois a estrutura no ser reconhe-
cida. Para tornar o exemplo compatvel com a verso 6 ou inferiores, o contedo da varivel mes deve ser
convertido para um tipo inteiro e armazenado em uma outra varivel que ser inserida no switch.
49
50
try{
<conjunto de instrues>
} catch (Nome da exceo){
<tratamento do erro 1>
} catch (Nome da exceo){
<tratamento do erro 2>
} catch (Nome da exceo){
<tratamento do erro n>
} finally{
<conjunto de instrues>
}
51
52
ff Linha 17: realiza o tratamento da exceo NumberFormatException que ocorre quando um erro
de converso de formatos numricos ocorre (esse erro pode ocorrer nas linhas 7 ou 9). Essa exce-
o j conhecida pelo leitor.
ff Linhas 15 a 16, 18 a 19 e 21 a 22: mostram as mensagens de erro pelo mtodo showMessage-
Dialog da classe JOptionPane. Observe que foram adicionados dois novos argumentos ao mto-
do showMessageDialog: Erro, referente ao ttulo da Janela, e JOptionPane.ERROR_MESSAGE,
referente ao cone de erro (um X em vermelho) localizado no canto esquerdo da caixa de dilogo.
A Figura 3.7 apresenta os trs tipos de erro que podem ocorrer, dependendo dos argumentos for-
necidos durante a execuo do programa.
Para que o leitor possa verificar o funcionamento do finally, modifique o trecho final do Exem-
plo 3.6, inserindo o trecho conforme a listagem seguinte.
Exemplo 3.6 final Acrescentando o bloco finally
Ao executar o exemplo, agora com o uso do finally, a linha 23 sempre ser executada, isto , emi-
tida a mensagem Final da execuo, independentemente de existirem ou no erros durante o processo
de execuo.
Uma forma diferente de utilizar o controle das excees (funcionalidade inserida a partir do Java 7)
inserir mais de uma exceo num nico catch. Com isso, as linhas 14 e 17 do Exemplo 3.6 poderiam
ser tratadas no mesmo catch:
Observe o uso do caractere pipe (|) que funciona como o operador lgico OU (OR), isto , se ocorrer
a primeira exceo OU a segunda, execute o bloco referente ao tratamento de erro. Obviamente, nesse
caso, os dois erros seriam tratados no mesmo bloco.
53
Antes de executar o Exemplo 3.7 voc precisa criar uma pasta na unidade C de sua mquina. Para
isso, selecione a unidade C (ou disco C) e crie uma pasta com o nome temp.
Exemplo 3.7 Listagem da classe UsoDoThrows
54
Observao
Na verdade, ao usar a clusula throws, o erro no descartado e sim postergado. No momento fica difcil
explicar esse conceito, uma vez que necessrio primeiro estudar a criao de mtodos. Para tentar ilus-
trar esse caso, suponha que outra classe tivesse chamado o mtodo main da classe do Exemplo 3.7. Essa
outra classe deveria fazer o tratamento do erro IOException destacado na clusula throws, isto , como
ele foi postergado pelo Exemplo 3.7, ele deveria ser tratado na outra classe.
55
56
que um certo bloco seja executado repetidamente at que uma condio especfica ocorra. A repetio
uma das estruturas mais usadas em programao, possibilitando a criao de contadores, temporizado-
res, rotinas para classificao, obteno e recuperao de dados. A criao de laos de repetio em Java
feita a partir das estruturas for, while e do-while.
57
Essa sintaxe pode ser interpretada como: inicialize a varivel cont com zero e repita o conjunto de
instrues enquanto o valor de cont for menor que 10. Cada vez que o conjunto de instrues execu-
tado, o valor do cont incrementado (cont++). Observe que a varivel cont pode ser declarada e inicia-
lizada na prpria estrutura do for. Quando isso ocorre, a varivel passa a ter escopo local ao for, isto ,
seu valor reconhecido apenas dentro da estrutura em que foi declarada (entre as chaves de abertura
e encerramento). Aps o encerramento do lao, a varivel perde sua referncia e no pode mais ser
usada, salvo se declarada novamente. Se voc desejar usar o valor de uma varivel aps o encerramento
do lao, basta declar-la antes de iniciar o lao, isto , antes da linha que define o for.
Outros exemplos de laos de repetio usando for:
ff for (double x=5; x<=10; x=x+0.5) faz o valor de x variar de 5 at 10 com passo de 0.5, ou
seja, 5.0 - 5.5 - 6.0 - 6.5 - ................. 9.5 - 10.0.
ff for (int x=10; x>=0; x=x-2) faz o valor de x variar de 10 at 0 com passo de -2, ou seja,
10 - 8 - 6 - 4 - 2 - 0.
ff for (int x=a; x<=b; x++) faz o valor de x variar de a at b com passo de 1.
O Exemplo 3.10 mostra uma forma de uso bem simples da estrutura for para fazer uma contagem
progressiva de 0 at 9.
Exemplo 3.10 Listagem da classe ContadorProgressivoFor
58
while (<condio>){
<conjunto de instrues>
}
59
do{
<conjunto de instrues>
}
while (<condio>);
A utilizao da estrutura while ou do-while fica a critrio do desenvolvedor, pois com as duas for-
mas possvel chegar a resultados semelhantes. A Figura 3.14 apresenta a representao grfica da
estrutura do-while. Compare-a com a estrutura while da Figura 3.11.
Incio
Inicializao da varivel
Instrues
Incremento/decremento
[verdadeira] [falsa]
Condio
Fim
60
ff Linhas 15 at 18: contm o lao do-while. Como j dito, o do-while executa o bloco de instrues
pelo menos uma vez e depois verifica a condio de sua expresso. No caso, o valor da varivel
contador varia de zero at o valor que o usurio forneceu inicialmente, armazenado na vari-
vel limite, portanto a contagem ser progressiva.
Exemplo 3.12 Listagem da classe ContadorWhile
1. Usando JOptionPane, elabore uma classe que receba o nome de um produto e o seu valor. O des-
conto deve ser calculado de acordo com o valor fornecido conforme a Tabela 3.1. Utilizando a estru-
tura if-else, apresente em tela o nome do produto, valor original do produto e o novo valor depois de
ser realizado o desconto. Caso o valor digitado seja menor que zero, deve ser emitida uma mensa-
gem de aviso. A Figura 3.16 ilustra a execuo do Exerccio 3.1.
Tabela 3.1
61
3. Faa uma classe que solicite login e senha, simulando o acesso a um sistema. Considere que os
contedos de login e senha originais so iguais a java8. O usurio dever fornecer login e senha
e voc ir compar-los com os contedos originais. O usurio tem trs chances para digitar corre-
tamente os dados de login e senha. Para cada tentativa incorreta deve aparecer uma mensagem
alertando o erro e apresentando a quantidade de tentativas que ainda restam. Veja um exemplo
de execuo na Figura 3.18, em que o usurio j digitou o login e senha incorretos por duas vezes,
restando apenas uma ltima chance.
4. Faa uma classe que apresente em tela a tabuada de qualquer nmero. O usurio fornece o n-
mero desejado e a classe apresenta a relao de todos os clculos de 1 a 10. Veja um exemplo de
execuo na Figura 3.19.
62
5. Elabore uma classe que apresente uma espcie de menu usando JOptionPane. Para cada opo
escolhida, execute um dos exerccios anteriores. Veja a Tabela 3.2 e um exemplo de execuo na
Figura 3.20.
Tabela 3.2
Entrada Operao
1 Exerccio 1
2 Exerccio 2
3 Exerccio 3
4 Exerccio 4
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.
63
4
Operaes Matemticas e de String
Os mtodos da classe Math so estticos (vistos mais frente) e por isso seguem a notao
Classe.nome do mtodo. No necessrio importar a classe Math em um programa para poder
utilizar seus recursos, pois ela j faz parte do pacote java.lang, disponvel com o Java. Alm disso,
a classe Math faz a definio de duas constantes matemticas, sendo Math.PI o valor de pi
(p = 3.14159265358979323846) e Math.E que se refere ao valor da base para logaritmos naturais
(2.7182818284590452354). A seguir, so apresentados os mtodos mais comuns da classe Math.
Math.ceil(<valor>)
64
O Exemplo 4.1 demonstra a utilizao do mtodo ceil da classe Math, que chamado para realizar
o arredondamento da varivel qtdeOnibus (linha 10), nesse caso um nmero do tipo float. Na linha 5, a
classe define a quantidade mxima de passageiros por nibus por meio da constante LOTACAO_ONIBUS,
na linha 6 solicita que o usurio fornea o nmero de passageiros que faro a viagem e na linha 7 faz o
clculo da quantidade de nibus necessrios. Na grande maioria das vezes, esse clculo retornar um va-
lor decimal, no inteiro. Por exemplo, para nmero de passageiros igual a 25, o valor calculado ser 0.5.
No entanto, a quantidade de nibus necessria sempre dever ser um valor inteiro, pois no existe 0.5
nibus. Esse valor precisa ser arredondado para cima, no caso para 1. Isso acontecer todas as vezes em
que o valor calculado no for inteiro. Quando o valor calculado gerar um nmero inteiro, o valor no ser
alterado pelo mtodo ceil. Por exemplo, se voc fornecer o nmero de passageiros igual a 50 (ou mltiplos
dele), o valor calculado ser 1 e o retorno do mtodo ceil ser 1 tambm, ou seja, o valor no precisa ser
arredondado porque j um valor inteiro. A Figura 4.1 exibe a tela de resultados do Exemplo 4.1.
Exemplo 4.1 Utilizao da classe ArredondamentoParaCima
Math.floor(<valor>)
O Exemplo 4.2 apresenta o exemplo de um professor exigente. A nota da prova que o aluno tirou
ser arredondada para baixo. Na linha 5 o usurio digita o valor da nota que convertido para um tipo
float e na linha 7 esse valor arredondado para baixo por meio do mtodo floor. A Figura 4.2 exibe a tela
de resultados do Exemplo 4.2.
65
Como pode ser visto na Tabela 4.1, o mtodo round pode ser usado para arredondar um n-
mero para seu inteiro anterior ou posterior. O mtodo max recebe dois valores numricos e retorna
o maior deles. Esses valores podem ser tipo double, float, int ou long. Caso seja necessrio encontrar o
maior dentre trs valores, o retorno de um mtodo max pode ser usado como entrada para o ou-
tro. No exemplo seguinte, o maior valor do trecho em destaque comparado com o valor 10. Dessa
forma, possvel encontrar o maior entre trs valores.
int maior = Math.max(10, Math.max(5,12));
Exemplo 4.3 Listagem da classe DiversosMetodos
66
(int)(Math.random() * 100)
Com isso seriam gerados nmeros inteiros entre 0 e 99, atendendo plenamente necessidade ex-
posta. O Exemplo 4.4 demonstra o uso do mtodo random para simular a gerao de uma senha de dez
dgitos e de quatro cartes de loteria com seis nmeros cada.
Exemplo 4.4 Listagem da classe UsaRandom
67
Caractere Significado
Imprime o dgito normalmente, ou, caso ele no exista, coloca 0 em seu lugar.
0 Exemplo: sejam as variveis int x=4, y=32 e z=154, ao usar o pattern 000, o resultado im-
presso na tela seria x 004, y 032 e z 154.
Imprime o dgito normalmente, desprezando os zeros esquerda do nmero.
# Exemplo: sejam as variveis double x=0.4 e y=01.34, ao usar o pattern ##.##,
o resultado impresso na tela seria x .4, y 1.34.
. Separador decimal ou separador decimal monetrio (depende do sistema usado).
- Sinal de nmero negativo.
68
69
da mquina e ficam armazenados como configuraes locais. O separador de decimais, por exemplo,
pode ser um ponto (.) ou uma vrgula (,), dependendo da regio.
A classe Locale permite identificar certas propriedades da mquina em que o software execu-
tado. Dessa forma, torna-se possvel utilizar os recursos do Java, configurando determinados formatos
de maneira automtica. Observe o Exemplo 4.6.
Exemplo 4.6 Listagem da classe ConfiguracoesRegionais
70
<Nome da string>.<nome-do-metodo>(<argumentos>)
<Nome da string>.length()
O mtodo length muito utilizado para ler os caracteres de uma varivel do tipo String do incio ao
fim. Isso torna possvel realizar a busca de caracteres ou palavras.
O Exemplo 4.7 usa o mtodo length para apresentar o tamanho de uma varivel do tipo String.
Exemplo 4.7 Listagem da classe TamanhoDaFrase
A linha 5 contm a declarao da string frase. Conforme citado anteriormente, na realidade frase
no uma varivel e sim um objeto, pois uma varivel no pode conter mtodos atrelados a ela; objetos
podem. A linha 6 contm a utilizao de length por meio de frase.length(), isto , retorna o nmero de
caracteres armazenado na varivel frase digitada pelo usurio.
Em vez de empregar frase.length() poderia ser utilizada uma forma literal, como, por exemplo,
tamanho=Aprendendo Java.length(). O resultado seria o mesmo, isto , a quantidade de letras da
frase. A Figura 4.7 mostra o resultado obtido ao executar o Exemplo 4.7:
71
<Nome da string>.charAt(<ndice>)
O Exemplo 4.8 mostra o uso do mtodo charAt. Nele, o usurio fornece uma palavra com pelo menos
quatro caracteres e o exemplo apresenta os primeiros quatro caracteres, os restantes so desconsiderados.
Veja na Figura 4.8 os resultados desse exemplo. Considerando a digitao da palavra casamento,
os caracteres apresentados sero casa, referentes aos ndices 0 a 3. Lembre-se de que, em Java, o pri-
meiro valor do ndice de uma string 0, o segundo 1 e assim sucessivamente. Veja isso nas linhas 8 a
11 do cdigo da classe CaracteresDaPalavra.
Dessa forma, com o mtodo charAt podemos ler o contedo de uma string, caractere a caractere. O
prximo exemplo mostra como realizar esse processo, lendo os caracteres de duas formas: da esquerda
para a direita e da direita para a esquerda (efeito espelho). Observe a listagem do Exemplo 4.9.
Exemplo 4.9 Listagem da classe MostrarLetras
72
ff Linhas 12 a 16: contm um lao de repetio que faz o valor da varivel i variar do ltimo carac-
tere da string (definido por seu comprimento menos 1) at o primeiro caractere (ndice 0), decres-
cendo de 1 em 1. Dessa forma, ser possvel percorrer todos os ndices da string, independente-
mente de seu tamanho, de trs para a frente, criando um efeito espelho.
Dessa forma, o mtodo charAt pode ser usado sempre que for necessrio ler o caractere de um
ndice da string. Outros exemplos prticos de uso do mtodo charAt podem ser: percorrer um texto
para verificar quantas vogais, consoantes ou outros caracteres existem; retirar os caracteres brancos
(espaos em branco) existentes em uma frase (isso pode ser feito tambm com o mtodo replace, como
voc ver mais frente neste captulo), entre outros.
O Exemplo 4.10 demonstra o uso dos mtodos toUpperCase e toLowerCase e dispensa maiores
detalhes, dada a simplicidade dessas duas funes. A nica observao se refere ao fato de que esses
mtodos no alteram o valor original da string. Mesmo aplicando os mtodos das linhas 8 e 9, o conte-
do das variveis permanece o mesmo, isto , a transformao ocorre apenas com fins de impresso
em tela. Se for necessrio alterar o contedo de uma varivel string, substituindo seu valor original
pelo transformado, a prpria varivel deve receber o valor de sua transformao, por exemplo, frase
= frase.toLowerCase().
A Figura 4.9 destaca os resultados obtidos com a execuo do Exemplo 4.10.
Outro mtodo relacionado a caixa alta e baixa equalsIgnoreCase. Esse mtodo permite comparar
valores desconsiderando se as letras so ou no maisculas. Suponha que seja necessrio comparar uma
string que receba uma resposta do usurio contendo, por exemplo, o texto sim. Uma maneira fcil de
fazer isso, sem se preocupar com maisculas e minsculas, :
if(reposta.equalsIgnoreCase(sim)) { // bloco de instrues }
Supondo que a varivel resposta seja do tipo String, o resultado da comparao ser verdadeiro se
ela contiver qualquer um dos seguintes contedos: sim, siM, sIm, SIM, sIM, SiM.
73
O primeiro argumento especifica o ndice a partir do qual se inicia a cpia dos caracteres (da mesma
forma que charAt, o ndice inicia-se em 0). O segundo argumento opcional e especifica o ndice final,
em que termina a cpia dos caracteres. Entretanto, o ndice final deve especificar um ndice alm do
ltimo caractere. Para facilitar entendimento, considere a varivel frase com o seguinte contedo:
Frase L I N G U A G E M J A V A
ndice 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Cada caractere de uma varivel string indexado a partir do 0 (zero). Vamos apresentar alguns
exemplos:
1. String x = frase.substring(10) x recebe o contedo JAVA, pois ao passar apenas o pri-
meiro argumento para o mtodo substring ele retorna da posio informada (no caso 10, a posi-
o da letra J) at o ltimo caractere da string.
2. String x = frase.substring(3) x recebe o contedo GUAGEM JAVA, isto , do caractere
de ndice 3 at o ltimo caractere da string frase.
3. String x = frase.substring(3,9) x recebe o contedo GUAGEM, isto , do caractere de
ndice 3 at o caractere de ndice 8.
4. String x = frase.substring(0,1) x recebe o contedo L, isto , do caractere de ndice 0
at o caractere de ndice 0.
5. String x = frase.substring(10,14) x recebe o contedo JAVA, isto , do caractere de
ndice 10 at o caractere de ndice 13.
Se os ndices especificados estiverem fora dos limites da string, nesse caso gerado o erro
StringIndexOutOfBoundsException. No exemplo, se voc usar frase.substring(10,20), ocorre o erro ci-
tado, uma vez que no existe ndice 20. O Exemplo 4.11 apresenta o uso do mtodo substring.
Exemplo 4.11 Listagem da classe PedacosDaFrase
74
<Nome da string>.trim()
A varivel frase armazena uma string com espaos em branco no incio e no final. Quando no
utilizado o mtodo trim, os espaos permanecem na string; em contrapartida, ao usar trim, os espaos
desaparecem. O mtodo frase.trim() no retirou realmente os espaos em branco da varivel, ou seja,
apenas foi mostrado na tela um trim da varivel, que consequentemente a exibe sem os espaos em
branco, mas a varivel em si ainda continua com os espaos no seu incio e no seu final. Para que real-
mente os espaos sejam retirados, necessrio que o resultado de trim seja atribudo prpria vari-
vel, como a seguinte instruo: frase=frase.trim(). Isso tornaria a varivel livre dos espaos em branco.
A Figura 4.11 exibe os resultados obtidos com a execuo do Exemplo 4.12:
75
No Exemplo 4.13, a linha 5 declara uma String chamada frase que recebe uma frase fornecida pelo
usurio. A linha 6 responsvel por apresentar a frase digitada. As linhas 7 e 8 substituem um caractere
por outro ( por e a por u). Da mesma forma que trim, o mtodo replace no altera o contedo
da varivel. Para fazer com que uma varivel receba o resultado de uma troca de caracteres, faa o
seguinte: String <varivel>=<String>.replace(<caracteres a serem substitudos>, <substituio>). Veja
os resultados obtidos no Exemplo 4.13 por meio da Figura 4.12:
Para facilitar o entendimento, o Exemplo 4.14 demonstra a converso de vrios tipos numricos
com o uso do mtodo valueOf.
No Exemplo 4.14 todas as variveis numricas (a, b, c, d) declaradas nas linhas 5 a 8 so convertidas
e acumuladas em uma varivel String (x) nas linhas 9 e 10. Essa mesma funcionalidade pode ser obtida
sem o uso do mtodo valueOf, isto , por meio da concatenao das variveis com o operador de conca-
tenao (+), conforme demonstrado a seguir:
String x = a + + b + + c + + d;
76
se inicia a substring localizada. Caso haja insucesso na busca, isto , caso o caractere ou substring no
tenha sido encontrado, retornado o valor inteiro -1. De qualquer modo, o retorno de indexOf sempre
ser um nmero inteiro (o valor do ndice, ou -1). A sintaxe geral para utilizao do mtodo indexOf :
Existem vrias maneiras de utilizar o mtodo indexOf, conforme indica o Exemplo 4.15.
Exemplo 4.15 Listagem da classe BuscaLetraNaFrase
No Exemplo 4.15, a linha 5 contm o texto que ser usado nas pesquisas. A linha 6 armazena a letra
a na varivel caractere. A letra a ser buscada no texto armazenado na varivel frase. As formas de
busca so as seguintes:
ff Linha 8: busca o caractere a no texto e retorna o ndice referente sua primeira ocorrncia. No
caso, retorna o ndice 7.
ff Linha 9: busca o caractere a no texto a partir do ndice 10 e retorna o ndice referente sua pri-
meira ocorrncia. No caso, retorna o ndice 25. Na realidade, a primeira ocorrncia do caractere
a seria na posio 7, entretanto foi solicitado que a busca iniciasse na posio 10.
ff Linha 10: busca a substring Ensino no texto e retorna o ndice referente sua primeira ocorrn-
cia. No caso, retorna o ndice 15.
ff Linha 11: busca a substring Java no texto a partir da posio 15
e retorna o ndice referente sua primeira ocorrncia. Como no
existe a palavra Java aps a posio 15, retornado o valor -1
(busca sem sucesso). O mesmo princpio aplicado quando voc
procura uma palavra em um editor de textos e ele no a encontra.
A Figura 4.14 mostra os resultados obtidos com a execuo do Figura 4.14 Tela de execuo
Exemplo 4.15: do Exemplo 4.15.
77
5. Elabore uma classe que receba uma frase e verifique se essa frase possui palavras imprprias. As
palavras imprprias so: sexo e sexual. Caso encontre uma dessas palavras, emita em tela a men-
sagem contedo imprprio, caso contrrio contedo liberado, conforme a Figura 4.19.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.
Este captulo abordou as principais funes matemticas e de string utilizadas em Java, alm de outras
classes importantes como DecimalFormat e Locale. O prximo captulo aborda a criao e a manipula-
o de arrays e alguns exemplos prticos de sua utilizao.
78
5
Utilizao de Arrays
5.1 Definio
Suponha que seja necessrio armazenar e manipular dezenas de nomes de pessoas num pro-
grama de computador. De acordo com o que estudamos at aqui, seriam necessrias dezenas
de variveis, cada uma armazenando um nome diferente, como, por exemplo, nome1=Lucas,
nome2=Daniel e assim por diante. Em vez disso, possvel a declarao de apenas uma varivel
indexada, chamada array. Em outras palavras, podemos definir uma varivel cujos elementos so
referenciados por um ndice no seguinte formato: nome[0]=Lucas, nome[1]=Daniel etc. O n-
mero entre colchetes se refere ao ndice que diferencia os contedos da varivel. Talvez o leitor
no tenha notado, mas estamos usando um array desde o primeiro exemplo em Java, pois String[]
args nada mais do que um array de elementos do tipo String. Os arrays podem ser unidimensio-
nais (com uma nica dimenso, conhecido como vetor) ou bidimensionais (com duas dimenses,
conhecido por matriz). A Figura 5.1 ilustra exemplos de arrays unidimensional e bidimensional.
Array bidimensional
0 1 2 3
Array unidimensional 0
1
0 1 2 3 4
2
79
Observe que, em Java, o primeiro elemento do array sempre possui ndice 0 (zero). Maiores deta-
lhes so apresentados nas sees que se seguem.
O Exemplo 5.1 demonstra a utilizao de um array unidimensional para armazenar dez nmeros
aleatrios (entre 0 e 999) gerados com random, mtodo estudado no captulo anterior. A Figura 5.2
exibe a tela de resultados do Exemplo 5.1.
80
ff Linha 6: declara um objeto chamado df a partir da classe DecimalFormat que ser usado para for-
matar o valor numrico que ser apresentado em tela.
ff Linha 7: aplica a formatao padro que ser usada pelo objeto df, ou seja, a formatao que ser
aplicada ao valor numrico gerado.
ff Linha 8: contm um lao de repetio com a instruo for que faz com que as linhas 9 e 10 sejam
executadas vrias vezes, dependendo da quantidade de elementos do array inteiro, declarado na
linha 5. O mtodo retorna a quantidade de elementos do array, no caso 10, mas poderia ser outro
valor. Em nosso caso, a repetio ocorrer dez vezes. O valor da varivel i inicia em zero e in-
crementado em 1 at o limite estabelecido pelo lao.
ff Linha 9: armazena no array inteiro um valor gerado aleatoriamente por meio do mtodo random. A
cada ciclo de execuo do lao o nmero gerado armazenado num elemento diferente do array. Na
primeira vez o nmero armazenado em inteiro[0], na segunda em inteiro[1] e assim sucessivamente.
ff Linha 10: imprime em tela o nmero gerado que foi armazenado no elemento do array.
Os arrays podem ser criados e inicializados de outra maneira. Em vez de usar o operador new para
criar um array, possvel definir os elementos do array entre chaves e separados por vrgula. Esses ele-
mentos devem ser do mesmo tipo da varivel definida como array. A sintaxe :
O Exemplo 5.2 demonstra a utilizao de diversos arrays, inicializados de acordo com a sintaxe
anterior. O resultado da execuo desse exemplo apresentado na Figura 5.3.
Exemplo 5.2 Listagem da classe ArrayOrdena
81
O Exemplo 5.3 demonstra o uso de um array bidimensional para armazenar os seis nmeros da
Tabela 5.1. Considere que essa tabela representa 9 pixels de uma imagem na tela. Os valores das clulas
correspondem a tons de cinza.
Tabela 5.1 Forma de armazenamento no array
0 1 2
0 120 232 201
1 129 111 187
2 128 247 123
82
ff Linha 9: contm um lao de repetio com a instruo for, responsvel por percorrer todas as
colunas de cada linha. O mtodo length, nesse caso, retorna a quantidade de colunas existentes
para cada linha do array. Como todas as linhas possuem a mesma quantidade de colunas, o valor
retornado sempre ser 3, mas isso pode ser diferente, visto que possvel armazenar quantidades
diferentes de colunas por linha.
A Figura 5.3 exibe a tela de resultados do Exemplo 5.4.
O exemplo seguinte demonstra o uso de um array de trs dimenses para criar duas matrizes. As
duas matrizes possuem seis nmeros cada. Ao final, imprimem-se em tela a soma dos nmeros mpares
(armazenados na matriz 1) e tambm a soma dos nmeros pares (armazenados na matriz 2).
Exemplo 5.4 Listagem da classe ArrayDuasMatrizes
83
ff Linha 19: verifica se a matriz a ser considerada a dos nmeros pares (matriz==1). Se verdadeiro,
executa a linha 20 acumulando o valor na varivel somaPares; caso contrrio (se matriz==0), exe-
cuta a linha 22 acumulando o valor na varivel somaImpares.
84
Vamos ilustrar o que estamos querendo dizer com um exemplo. Considere que o array seguinte
contm 10 elementos (0 a 9), cujos valores no esto ordenados.
5 3 6 2 1 4 8 0 9 7
Para pesquisar, por exemplo, se existe o valor 7, seria necessrio percorrer todos os elementos, um
a um, como realizado no exemplo anterior. Seriam necessrias dez comparaes at que o valor fosse
encontrado no array.
Na busca binria, antes de iniciar o processo de busca, os valores do vetor so ordenados. Considere
que os valores do array seguinte esto ordenados de forma crescente.
0 1 2 3 4 5 6 7 8 9
Para executar a busca binria com o vetor previamente ordenado, a lgica usada no algoritmo
realizar sucessivas divises (em duas partes) do array at encontrar o valor a ser pesquisado. Em nosso
exemplo, a diviso seria a seguinte: encontre o ponto central do array e compare-o com o valor pesqui-
sado. O centro de nosso array contm o valor 4:
0 1 2 3 4 5 6 7 8 9
Como o valor 4 inferior a 7 (o valor pesquisado) e o array est ordenado, ento o valor pesquisado
est direita do valor 4. Em funo disso, o lado direito do array ser novamente dividido em duas partes:
0 1 2 3 4 5 6 7 8 9
Nessa segunda fase, o valor 7 pesquisado comparado com o valor 7 presente no array e o valor
encontrado (j que 7 igual a 7). Observe que foram necessrias apenas duas comparaes para lo-
calizar o valor desejado (em vez de 10 do primeiro exemplo). Usando essa tcnica da diviso do array
em duas partes, para qualquer valor a ser pesquisado num array de 10 elementos, o nmero mximo de
comparaes ser 4. Quanto maior o tamanho do array, maiores sero os benefcios da busca binria. O
Exemplo 5.6 apresenta um exemplo de utilizao dos dois tipos de pesquisa citados.
Exemplo 5.6 Listagem da classe ArrayBuscaBinaria
85
ff Linhas 6 a 8: contm um lao de repetio responsvel por gerar 10000 nmeros randmicos en-
tre 0 e 999 (random() * 1000 na linha 8), valores que sero armazenados no array n. No existe
nenhum controle sobre os valores gerados, pois pode ser que o mesmo nmero seja gerado mais
de uma vez.
ff Linha 10: define uma varivel inteira chamada valor que recebe um valor fornecido pelo usurio e
que ser pesquisado no array.
ff Linha 11: define uma varivel String chamada r, com o contedo valor no encontrado. Caso o
valor seja localizado no array, o contedo dessa varivel ser alterado (linha 14).
ff Linha 12: inicia o lao for responsvel por percorrer todos os ndices do array n.
ff Linha 13: verifica se o valor pesquisado igual ao elemento atual do array. Caso verdadeiro, alte-
ra o contedo da varivel r (linha 14) adicionando o valor do ndice (i) em que o valor foi encontra-
do. Alm disso, encerra o lao (linha 15) por meio de break.
ff Linha 18: imprime o texto da varivel r contendo o resultado da busca.
ff Linha 20: ordena o array n em ordem crescente pelo mtodo sort da classe Arrays. Como j disse-
mos, esse um pr-requisito da busca binria.
ff Linha 21: realiza a busca do contedo armazenado na varivel valor, fornecido pelo usurio, no
array n por meio do mtodo binarySearch da classe Arrays. O resultado dessa busca guardado
na varivel inteira pos, isto , o resultado o nmero da posio (do ndice) em que o valor foi en-
contrado, ou um valor negativo, caso o valor no exista no array. importante dizer que a posi-
o retornada no necessariamente a primeira na qual exista o valor pesquisado. Suponha que
o valor fornecido pelo usurio exista nas seguintes posies do array n: 1200, 1201, 1202 e 1203,
qualquer uma dessas posies pode ser retornada.
ff Um ponto a ser observado que no primeiro bloco de pesquisa (linhas 12 a 18) a posio (o ndi-
ce) em que o valor for encontrado pode ser completamente diferente do segundo bloco usando a
pesquisa binria (linhas 20 a 22), visto que, nesse ltimo, os elementos foram reordenados e repo-
sicionados no array.
A Figura 5.6 apresenta um exemplo de execuo do Exemplo 5.6.
1. Elabore uma classe que receba 5 notas de alunos por meio de showInputDialog, armazene essas
notas em um array de cinco elementos, apresente em tela as cinco notas em ordem decrescente
(da maior para a menor) e a mdia aritmtica das notas.
2. Crie uma classe que armazene os 12 meses do ano em um array. A seguir, gere um valor rand-
mico entre 0 e 11 e apresente o ms correspondente ao valor sorteado. Considere que o valor 0
corresponde ao ms de janeiro e o valor 11, ao ms de dezembro.
3. Uma imagem formada por pixels. Considere uma imagem com dimenso de 40 x 40 e faa uma
classe que contenha um array bidimensional com essas dimenses. A seguir, para cada posio
desse array bidimensional armazene um valor aleatrio entre 0 e 255 (esses valores correspon-
dem s tonalidades aplicadas sobre a imagem). Apresente em tela os 1600 valores gerados.
86
4. Faa uma classe contendo dois arrays do tipo inteiro, um chamado par e outro chamado mpar.
Cada array deve conter 10 elementos. A seguir, faa um lao de repetio com 10 iteraes e que
contenha internamente a gerao randmica de nmeros entre 1 e 20. Se o valor gerado for par,
armazene no array chamado par, caso contrrio, no array chamado impar. Ao final, apresente o
contedo de cada um dos arrays.
5. Usando um array unidimensional de 10 elementos do tipo String, faa uma classe que simule a ocu-
pao de um estacionamento de veculos. Considere que a posio do array corresponde ao n-
mero da vaga e para cada vaga armazenada a placa do veculo que est estacionado. Sua classe
deve conter um lao de repetio simulando um menu que controle a entrada e a sada dos ve-
culos com as opes: 1-Entrada, 2-Sada e 3-Listar situao atual e 4-Encerrar o programa. Se o
usurio escolher 1, solicite o nmero da vaga e a placa do veculo; se escolher 2, solicite o nmero
da vaga que ser liberada e armazene o valor branco na posio correspondente ao array; se es-
colher 3, liste a situao atual apresentando em tela todos os elementos do array; quando for 4,
encerre o lao e o programa.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no seguinte endereo:
<http://editoraerica.com.br/>.
Este captulo apresentou uma pequena introduo utilizao de arrays, uma tcnica que facilita o
desenvolvimento de sistemas, reduzindo o tamanho do cdigo. No entanto, o leitor deve ter cin-
cia de que existem outras estruturas mais complexas para tratamento de dados no abordadas na
obra. Trata-se das colees (Collections), cujo tratamento foge ao escopo do livro, mas que so estruturas
muito utilizadas em Java.
O prximo captulo apresenta a criao de mtodos e a troca de mensagens entre eles. De forma geral,
fornece os subsdios necessrios para que voc mesmo possa criar seus mtodos, compreendendo os
conceitos de modularidade e reaproveitamento de cdigo.
87
6
Criao de Mtodos em Java
At este ponto do livro, em todos os exemplos apresentados sempre foi declarado o mtodo
main, obrigatrio em todas as classes executveis. Tambm j utilizamos diversos mtodos nos ca-
ptulos anteriores (matemticos, de strings etc.). Este captulo apresenta os conceitos bsicos para
a elaborao e utilizao de mtodos. Espera-se que o leitor adquira conhecimentos suficientes
para criar seus prprios mtodos.
Mtodos so trechos de cdigo que permitem modularizar um sistema, isto , so pequenos
blocos que, juntos, compem um sistema maior. Os mtodos recebem um determinado nome e
podem ser chamados vrias vezes durante a execuo de uma classe, ou seja, uma sub-rotina
que pode ser invocada toda vez que sua funcionalidade for necessria em um trecho da classe ou
ainda a partir de uma outra classe. Os principais motivos que levam a utilizar mtodos se refe-
rem reduo do tamanho total de cdigo de um sistema, melhoria da modularizao do sistema
(cada trecho de cdigo realiza uma tarefa) e facilitao e agilizao do processo de manuteno.
Considere o mtodo um programa autossuficiente que possui internamente todas as definies
necessrias para seu funcionamento, no entanto ele compe um sistema maior do qual membro.
O mtodo pode ser comparado ao setor de uma empresa especializado numa determinada tarefa.
Para ilustrar esses conceitos, imagine um grande sistema (envolvendo muitas classes em Java)
em que existe a necessidade de verificar se uma data vlida. Imagine ainda que em diversas aplica-
es isso deve ser realizado, isto , a mesma validao de data deve ser feita em diversas classes. Um
88
programador pouco experiente talvez repita o mesmo trecho de programa em vrias classes no sistema.
Isso no bom, pois, alm de o cdigo dos programas ficar maior, pode ser preciso alterar algo na rotina. Por
exemplo, a data era considerada com dois dgitos para o ano e depois foi necessrio trat-la para ser aceita
com quatro dgitos. preciso alterar todas as classes que utilizam essa validao.
Suponha que em 15 classes diferentes, com diversos mtodos distintos em cada uma, essa rotina
fosse utilizada. Seria necessrio alterar e compilar as 15 classes novamente. Por outro lado, se essa
rotina de validao estivesse armazenada na forma de mtodo em uma classe, todas as outras classes
poderiam usar (importar) esse mtodo. E melhor ainda, caso alteraes no mtodo fossem necessrias,
apenas ele seria alterado e todas as classes que o utilizam seriam atualizadas automaticamente. Caso
esse exemplo no tenha sido muito bem compreendido, no se preocupe, pois os exemplos seguintes
vo tornar os conceitos mais claros.
Um mtodo pode invocar outro mtodo, isto , durante a execuo do mtodo1 pode ser necess-
ria a execuo do mtodo2 que pode invocar o mtodo3 e assim por diante. Todo mtodo possui uma
declarao e um corpo, cuja estrutura simplificada formada por:
em que:
ff Qualificador: conhecido tambm pelo nome de modificador, define a visibilidade do mtodo. A
Oracle o define como nvel de acesso (accessLevel) do mtodo. Trata-se de uma forma de especi-
ficar se o mtodo visvel apenas prpria classe em que est declarado ou pode ser visualizado
(e utilizado) por classes externas. O qualificador do mtodo pode ser do tipo:
public: o mtodo visvel por qualquer classe. o qualificador mais aberto no sentido de que qual-
quer classe pode usar esse mtodo.
private: o mtodo visvel apenas pela prpria classe. o qualificador mais restritivo.
protected: o mtodo visvel pela prpria classe, por suas subclasses e pelas classes do mesmo
pacote.
Vamos estudar o funcionamento desses qualificadores e outros conceitos anteriores no decorrer
deste captulo e do Captulo 7, referente orientao a objetos. Existem ainda outros qualificado-
res menos usados no citados no livro.
ff Tipo-de-retorno: refere-se ao tipo de dado retornado pelo mtodo. Mtodos que no retornam
valores devem possuir nesse parmetro a palavra void. Sempre que void for usada em uma decla-
rao de mtodo, nenhum valor retornado aps sua execuo, isto , o mtodo atua como uma
procedure de outras linguagens de programao. Um mtodo pode ter como retorno qualquer
tipo primitivo (int, float, double etc.), um array ou ainda um objeto qualquer.
ff Nome-do-mtodo: pode ser qualquer palavra ou frase, desde que iniciada por uma letra. Se o nome
for uma frase, no podem existir espaos em branco entre as palavras. Como padro da linguagem
Java, o nome de um mtodo sempre inicia com uma palavra com letras minsculas. Se outras pala-
vras forem necessrias, elas devem iniciar com maisculas. So exemplos de nomes de mtodos de
acordo com o padro da linguagem: imprimir, imprimirFrase, gravarArquivoTexto. importante dar
aos mtodos nomes sugestivos, ou seja, que identificam facilmente a tarefa executada por eles.
ff Lista-de-parmetros: trata-se de uma lista de variveis opcionais, que podem ser recebidas pelo
mtodo para tratamento interno. Quando um mtodo invocado (chamado), ele pode receber
valores de quem o chamou. Esses valores podem ser manipulados internamente e devolvidos ao
89
emissor da solicitao. Esse processo pode ser comparado ao de uma fabricao industrial: entra
matria-prima (os valores passados ao mtodo) e sai um produto acabado (o retorno do mtodo).
A Figura 6.1 apresenta uma analogia entre mtodos com e sem retorno. Observe que, ao chamar
um mtodo, uma classe pode passar diversos valores (parmetros) que so recebidos pelo mto-
do para processamento. O mtodo da parte de cima da figura (com retorno) realiza o processa-
mento e devolve um resultado para quem o chamou; j o mtodo da parte de baixo (sem retorno)
apenas processa os valores de entrada e realiza alguma tarefa interna. Um mesmo mtodo pode
receber diferentes tipos de variveis, desde primitivos at objetos complexos. Os valores recebi-
dos por um mtodo podem tambm ser chamados de argumentos, como demonstra a Figura 6.1.
Processamento interno
Valores de entrada
(argumentos)
Processamento interno
ff Cdigos do corpo: trata-se dos cdigos implementados em Java que realizam os processos inter-
nos e retornam os valores desejados, isto , constituem o programa do mtodo.
O nome do mtodo e a lista de parmetros formam a assinatura do mtodo, algo que o identifica
de maneira nica. Toda vez que um mtodo for invocado (chamado), a assinatura deve ser obedecida,
uma maneira que torna possvel identificar um mtodo em relao aos demais. Se a assinatura for dife-
rente, ou seja, se qualquer um dos componentes no coincidir com a declarao, o mtodo no pode ser
utilizado. Voltaremos a falar da assinatura medida que os exemplos forem analisados. Existem ainda
outros aspectos referentes declarao de mtodos que sero citados em momento oportuno, como,
por exemplo, o uso da palavra static.
Uma classe pode possuir diversos mtodos, que podem ser invocados (chamados) a partir da pr-
pria classe ou a partir de outras classes. A Figura 6.2 ilustra essa caracterstica.
90
Classe A Classe B
Mtodo 1
Mtodo 2
Mtodo 3
Mtodo n
Para ilustrar um mtodo sem retorno, observe a parte inferior da Figura 6.1 novamente. Um m-
todo desse tipo pode receber valores, executar procedimentos internos, mas no dar nenhum retorno
para quem o chamou. Considere que um chefe (A) pea para um subordinado (B) executar uma tarefa.
O subordinado executa a tarefa com os dados fornecidos (dependendo do caso, pode ser que nenhum
dado seja enviado), mas no d nenhum retorno ao chefe. O chefe apenas confia que o subordinado vai
executar a tarefa. A e B podem estar localizados na mesma classe ou em classes diferentes.
O Exemplo 6.1 mostra uma classe que contm o mtodo main e mais seis mtodos que no retor-
nam nenhum valor. Note que todos os mtodos possuem a declarao void.
Os aspectos comentados do Exemplo 6.1 so:
ff O exemplo segue a forma convencional, isto , ao ser executado, invocado automaticamente o
mtodo main. muito comum em Java um mtodo chamar o outro. Neste caso o mtodo main vai
chamar os outros seis mtodos presentes na classe. Quando isso ocorre, a execuo do mtodo
suspensa e inicia-se a execuo do outro mtodo. Ao finalizar a execuo do mtodo chamado,
a execuo do programa retorna na linha imediatamente posterior linha do mtodo que realizou a
chamada. Veja um exemplo no prximo tpico.
91
ff Linha 4: invoca o mtodo imprimir presente na linha 11, ou seja, a execuo de main ser suspen-
sa e o programa pula para a linha 11. O mtodo imprimir imprime a mensagem da linha 12 e re-
torna linha 5, linha imediatamente posterior linha 4 que chamou o mtodo. Veja que o mtodo
imprimir no recebe nenhum valor. Se algum valor fosse recebido, existiria pelo menos uma va-
rivel declarada dentro dos parnteses. Nesse caso, dizemos que o mtodo imprimir no possui
nenhum parmetro para recebimento de dados. Ele no muito til, pois toda vez que chamado
imprime a mesma mensagem em tela. Um mtodo desse tipo seria til, por exemplo, para imprimir
o cabealho de um relatrio com muitas pginas, ou seja, a cada incio de pgina o mtodo seria
chamado e imprimiria a mesma mensagem.
ff Linha 5: invoca o mtodo imprimirTexto presente na linha 14, o qual recebe uma frase e a imprime
em tela na linha 15. Veja que o mtodo imprimirTexto recebe um valor do tipo String por meio da
varivel texto declarada entre parnteses. Dizemos que esse mtodo possui um parmetro do tipo
String para recebimento de dados, no caso um texto qualquer. Esse mtodo melhor do que o an-
terior, visto que pode imprimir uma mensagem diferente na tela, dependendo do dado de entrada.
ff Linha 6: invoca o mtodo mostrarQuadrado presente na linha 20, o qual recebe um nmero e
atravs do mtodo pow da classe Math calcula o quadrado desse nmero e o imprime em tela na
linha 21. Veja que o mtodo quadrado recebe um valor do tipo int por meio da varivel valor de-
clarada entre parnteses. Dizemos que esse mtodo possui um parmetro do tipo int para recebi-
mento de dados, no caso um nmero inteiro qualquer.
ff Linha 7: invoca o mtodo somar presente na linha 17, o qual recebe dois nmeros, efetua a soma
deles e imprime em tela (linha 18). Esse mtodo recebe dois valores do tipo int por meio das vari-
veis a e b declaradas dentro dos parnteses. Dizemos que esse mtodo possui dois parmetros
do tipo int para recebimento de dados, no caso dois nmeros inteiros.
ff Linha 8: invoca o mtodo mostrarMaior presente na linha 23, o qual recebe trs nmeros e atra-
vs do mtodo max da classe Math verifica o maior valor entre dois nmeros (a e b). Aps a obten-
o do primeiro resultado, verifica o maior valor encontrado (a ou b) com c. Em seguida imprime o
resultado em tela na linha 24. Veja que o mtodo mostrarMaior recebe trs valores do tipo int por
92
meio das variveis a, b e c declaradas dentro dos parnteses. Dizemos que esse mtodo possui
trs parmetros do tipo int para recebimento de dados, no caso trs nmeros inteiros.
ff Linha 9: invoca o mtodo mostrarSexoPorExtenso presente na linha 26, o qual recebe uma letra
e atravs da estrutura if-else permite a seleo entre trs caminhos distintos (se a letra recebida
for F, M ou outra qualquer) e de acordo com o resultado imprime em tela uma das trs sadas do
mtodo (linhas 28, 30 e 32). Veja que o mtodo mostrarSexoPorExtenso recebe um valor do tipo
char por meio da varivel sexo declarada dentro dos parnteses. Dizemos que esse mtodo pos-
sui um parmetro do tipo char para recebimento de dados, no caso um caractere qualquer. Esse
mtodo funciona apenas se a letra enviada estiver em maisculas, mas voc pode tentar alter-lo
para funcionar tambm com letras minsculas. Basta adicionar o operador lgico ou da seguinte
forma: if (sexo==M || sexo=m). O mesmo pode ser feito para o sexo feminino.
ff Ao encerrar a execuo da linha 9, o programa finalizado.
Outros comentrios importantes a respeito de mtodos:
1. A chamada de um mtodo deve corresponder exatamente sua declarao, ou melhor, sua
assinatura. Quando invocado, o mtodo deve possuir o mesmo nome e o mesmo nmero de pa-
rmetros. Observe a assinatura do mtodo imprimir (linha 11). Ele possui o nome imprimir e no
recebe nenhum tipo de parmetro (nada dentro dos parnteses). Agora observe a invocao des-
se mtodo na linha 4. Veja que nenhum valor est sendo enviado entre parnteses. Se voc tentar
executar o mtodo imprimir passando algum valor como, por exemplo, imprimir (ola), ocorrer
erro de compilao, visto que no existe nenhum parmetro declarado para esse mtodo. Analise
o Exemplo 6.1 e verifique que toda vez que um mtodo invocado, sua assinatura respeitada.
Caso isso no ocorra, o compilador registra um erro.
2. Conforme descrito anteriormente, quando declarada a palavra reservada void, significa que no
existe um valor de retorno. O resultado dos mtodos apresentados no atribudo a nenhuma va-
rivel, pois eles no tm retorno. Os mtodos foram declarados como pblicos (public), como j dis-
cutido, o que possibilita que eles sejam utilizados externamente classe em que foram declarados.
3. Note que a ordem em que os mtodos da classe so declarados no influencia em nada a sequn-
cia de execuo. O primeiro mtodo definido no exemplo imprimir (linha 11), mas nada mudaria
se ele fosse o ltimo a ser declarado, no lugar de mostrarSexoPorExtenso (linha 26).
4. Outro aspecto a ser considerado o uso da palavra static em todas as declaraes dos mtodos
do Exemplo 6.1. O uso de static mais explorado no prximo captulo; por enquanto apenas en-
tenda que isso permite acessar os mtodos a partir de outras classes, conforme veremos no
Exemplo 6.2.
5. Apesar de no ser obrigatrio, procure nomear mtodos com verbos que indicam a ao a ser exe-
cutada. Veja que todos os mtodos exemplificados se iniciam com um verbo no infinitivo.
6. Um mtodo pode receber vrios parmetros do mesmo tipo ou no. Como exemplo, veja as decla-
raes a seguir:
public static void imprimirVariasVezes (String frase, int quantidade) informa que o mtodo
recebe um parmetro do tipo String (frase) e um parmetro do tipo inteiro (quantidade). Suponha
que internamente o mtodo imprima a frase vrias vezes na tela, dependendo do valor da varivel
quantidade.
public static void mostrarEmTela(double arg1, int arg2, float arg3, String arg4) informa que
o mtodo recebe um parmetro do tipo double (arg1), um parmetro do tipo inteiro (arg2), um
parmetro do tipo float (arg3) e um parmetro do tipo String (arg4).
93
Essa estrutura praticamente a mesma dos mtodos sem retorno, com a diferena de que o re-
torno realizado por meio da instruo return, ao final do cdigo do corpo. Aps o return deve ser
colocado o contedo a ser retornado, tipicamente uma varivel ou uma frmula. O uso dos parnteses
aps a instruo return opcional.
Por exemplo:
A especificao desse mtodo declara que ele receber dois parmetros inteiros (int x, int y) e re-
tornar um nmero tambm do tipo inteiro (int), no caso a multiplicao entre os dois valores. Esse
valor retornado pela instruo return x * y. Os valores recebidos e retornados no precisam ser ne-
cessariamente do mesmo tipo, conforme aparece neste exemplo. Podem existir mtodos que recebem
nmeros e retornam uma String, recebem inteiros e retornam nmeros com ponto flutuante, ou qual-
quer outra combinao.
Exemplo 6.2 A classe MetodosComRetorno
94
Observao
O conceito de assinatura do mtodo muito importante. Sempre preste ateno declarao feita ao
mtodo para poder invoc-lo. Se o mtodo possui vrios parmetros de entrada, como os apresentados
nos Exemplos 6.1 e 6.2, o nmero de parmetros (e o tipo deles) deve coincidir com a declarao.
6.3 Recursividade
Os programas so geralmente estruturados com mtodos que chamam uns aos outros, o que faci-
lita a resoluo de muitos problemas, alm de reduzir consideravelmente o tamanho do cdigo. A re-
cursividade ocorre quando um mtodo chama a si prprio, direta ou indiretamente, por meio de outro
mtodo. Para entender corretamente o funcionamento desse tipo de mtodo, necessria muita de-
dicao por parte dos desenvolvedores, pois sua utilizao pode ser extremamente complexa. Devido
a essa dificuldade, este livro apenas cita esse aspecto com um pequeno exemplo. Seu estudo aprofun-
dado foge dos objetivos do livro.
95
O Exemplo 6.3 mostra uma recursividade gerada para imprimir o fatorial dos nmeros inteiros de 0 a
10. Conforme citado, seu funcionamento no detalhado, uma vez que no faz parte do propsito do livro.
No Exemplo 6.3 a linha 12 contm uma chamada ao prprio mtodo calcularFatorial, isto , ele
chama a si mesmo. Cada vez que o mtodo chamado, o valor da varivel num diminudo em 1. O
resultado da execuo desse exemplo aparece na figura ao lado direito do cdigo.
6.4 Sobrecarga
A linguagem Java permite que vrios mtodos sejam definidos com o mesmo nome, desde que eles te-
nham uma assinatura diferente, ou seja, essas diferenas podem ser com base no nmero, nos tipos ou na
ordem de parmetros recebidos. Quando um mtodo sobrecarregado chamado, o compilador avalia e se-
leciona o mtodo mais adequado situao, examinando a assinatura correspondente, portanto os mtodos
sobrecarregados so utilizados para a realizao de tarefas semelhantes sobre tipos de dados diferentes.
Sem se dar conta disso, o leitor j utilizou a sobrecarga vrias vezes. Considere System.out.println().
O mtodo println pode receber diversos dados como parmetro, isto , ora pode-se enviar um dado inteiro
para ser impresso, ora pode ser enviado um tipo double, ou ainda String. Isso foge s regras de definio dos
mtodos, uma vez que ele deve receber o mesmo tipo de dado declarado. Sendo assim, como o mtodo prin-
tln() pode receber dados de tipos diferentes? Isso possvel por meio da sobrecarga de mtodos.
O Exemplo 6.4 demonstra um mtodo de nome calcularArea declarado trs vezes.
Exemplo 6.4 A classe AreaComSobrecarga
96
so enviados dois valores, executado o mtodo da linha 11, e quando so enviados trs valores,
executado o mtodo da linha 14. O fato de todos os valores enviados serem nmeros inteiros
pura coincidncia, pois qualquer tipo de dado pode ser declarado.
ff As linhas 8, 11 e 14 declaram mtodos com o mesmo nome (calcularArea), mesmo retorno (dou-
ble), no entanto com quantidades de parmetros do tipo int diferentes (1, 2 e 3). Isso caracteriza o
uso de sobrecarga.
ff Ao executar o exemplo, voc v em tela trs clculos de rea diferentes, cada um deles retornado
por um mtodo diferente.
Observao
Para que a invocao de um mtodo de outra classe seja possvel, necessrio que a classe utilizada es-
teja no mesmo diretrio (mesmo pacote) da classe que contm o mtodo. Caso a classe esteja localizada
numa pasta diferente, torna-se necessrio o uso da diretiva import.
O Exemplo 6.5 mostra o uso de mtodos de outras classes j desenvolvidas em exemplos anteriores
deste captulo (Exemplos 6.1 e 6.2) para imprimir um texto, somar duas variveis, mostrar o dia da semana
por extenso e a quantidade de caracteres a presente em uma palavra. Observe como possvel utilizar
as classes de outros exemplos para criar um aplicativo, economizando linhas de cdigo e ganhando tempo.
No Exemplo 6.5, nas linhas 4 e 5 so invocados os mtodos imprimirTexto() e somar() da classe
MetodosSemRetorno. Nas linhas 6 e 7 so invocados os mtodos mostrarDiaPorExtenso() e contarLe-
trasA() definidos na classe MetodosComRetorno. Cada um desses mtodos chamado primeiramente
pelo nome da classe em que se situa e em seguida pelo nome do mtodo. Voltamos a frisar que a utiliza-
o de um mtodo de outra classe, sem a criao de um objeto, s possvel pelo fato de o mtodo ter
sido declarado como static. A criao de objetos estudada no prximo captulo.
Exemplo 6.5 Listagem da classe UsaMetodos
Vale a pena ressaltar que esse recurso de reaproveitamento de cdigo no exclusivo da lingua-
gem Java, pois outras linguagens de programao tambm possuem recursos semelhantes.
O prximo exemplo traz a classe EntradaDeDadosComMetodos, em que existem vrios mtodos
especficos para permitir que o usurio fornea entrada de dados. Eles podem ser chamados por outras
classes quantas vezes forem necessrias. Os mtodos do Exemplo 6.6 so os seguintes:
97
98
Os cdigos usados no Exemplo 6.6 j apareceram em outros exemplos, por isso no h necessidade
de coment-los novamente. Vamos descrever apenas a funo de cada um dos mtodos implementados
e o que no tiver sido usado em outros exemplos:
ff Linha 4: contm a declarao da varivel aux do tipo static. Isso se deve ao fato de que essa vari-
vel foi declarada para ser usada por todos os mtodos (escopo global) os quais so tambm do
tipo static. Uma varivel no esttica no pode ser usada dentro de um mtodo esttico se foi
declarada fora dele. Se a varivel aux fosse declarada dentro dos mtodos, no seria necessrio
defini-la como static, no entanto ela teria de ser declarada em todos os mtodos.
ff Linha 5: lerNumeroInt possibilita a leitura de um nmero do tipo inteiro dentro de um valor
mnimo e um mximo, definidos no momento em que o mtodo chamado. Enquanto o usurio
no fornecer um valor vlido, o mtodo continuar solicitando um valor. Esse mtodo recebe tam-
bm a mensagem que ser exibida ao usurio na caixa de mensagem.
ff Linha 22: lerNumeroFloat possibilita a leitura de um nmero do tipo float dentro de um valor
mnimo e um mximo, definidos no momento em que o mtodo chamado. Enquanto o usurio
no fornecer um valor vlido, o mtodo continuar solicitando um valor. Esse mtodo recebe tam-
bm a mensagem que ser exibida ao usurio na caixa de mensagem.
ff Linha 39: lerNumeroDouble possibilita a leitura de um nmero do tipo double dentro de um
valor mnimo e um mximo, definidos no momento em que o mtodo chamado. Da mesma forma
que os mtodos anteriores, enquanto o usurio no fornecer um valor vlido, o mtodo continua-
r solicitando um valor. Esse mtodo recebe tambm a mensagem que ser exibida ao usurio na
caixa de mensagem.
ff Linha 56: lerString possibilita a leitura de um texto qualquer. No realiza nenhum tipo de vali-
dao. Esse mtodo recebe tambm a mensagem que ser exibida ao usurio na caixa de mensagem.
ff Linha 60: selecionarOpcao possibilita a seleo de uma opo retornando uma varivel char
(S ou N). Ao chamar o mtodo, deve ser enviado o texto que aparecer para o usurio na caixa
de mensagem.
Apesar de a classe EntradaDeDadosComMetodos possuir vrios mtodos, ela no executvel, pois
no possui o mtodo main, ela s executada a partir de outras classes. O Exemplo 6.7 utiliza os mtodos
da classe EntradaDeDadosComMetodos. As chamadas aos mtodos esto localizadas nas linhas 5 a 9.
Exemplo 6.7 A classe ChamaMetodos
99
O Exemplo 6.9 apresenta uma classe que utiliza os mtodos do Exemplo 6.8.
Exemplo 6.9 A classe UsaMetodosComArray
100
ff Linhas 8 a 12: essas linhas contm o cdigo necessrio para inicializar um array do tipo String (li-
nha 8) que ser enviado ao mtodo ordenarPalavras (linha 9). O retorno desse mtodo armaze-
nado no array retorno, e na linha 11 os elementos do array (j ordenado) so impressos em tela
por meio do lao de repetio iniciado na linha 10.
Neste ponto deve ter ficado claro que possvel criar um sistema a partir de pedaos menores,
agrupando todos eles, os quais se referem aos mtodos. Essa metodologia de desenvolvimento co-
nhecida como modularidade, isto , um sistema construdo a partir de pequenos mdulos, os mtodos.
1. Faa uma classe chamada Mes que possua um mtodo chamado getMesPorExtenso que recebe
um nmero inteiro, referente ao ms do ano, um cdigo referente ao idioma (1 para portugus e 2
para ingls) e retorne o ms por extenso. A tabela a seguir ilustra alguns exemplos. Faa tambm
outra classe para testar o mtodo.
2. Crie uma classe chamada Contagem que contenha quatro mtodos com o nome contar utilizan-
do o conceito da sobrecarga. A assinatura e funo de cada mtodo aparecem descritas na tabela
a seguir. Faa tambm outra classe para testar o mtodo.
Assinatura Funo
contar() Apresenta em tela a contagem dos nmeros de 1 a 10.
Apresenta em tela a contagem dos nmeros de 1 at o valor definido
contar (int fim)
pela varivel fim.
Apresenta em tela a contagem dos nmeros com valor inicial definido
contar (int inicio, int fim)
pela varivel inicio at o valor definido pela varivel fim.
Apresenta em tela a contagem dos nmeros com valor inicial definido
pela varivel inicio at o valor definido pela varivel fim. O parmetro
contar (int inicio, int fim, int pausa)
pausa define a pausa (em segundos) que deve ser dada a cada valor
impresso em tela.
3. Crie uma classe chamada Data que contenha os mtodos getDia, getMes e getAno. Esses mto-
dos recebem uma data em formato texto no padro dd/mm/aaaa e retornam um nmero inteiro
correspondente ao dia, ms e ano existentes na data fornecida. Caso a data enviada esteja fora do
padro, os mtodos, deve retornar o valor zero. Faa tambm outra classe para testar o mtodo.
101
4. Crie uma classe chamada Senha que contenha um mtodo chamado gerar que retorna uma senha
contendo oito caracteres numricos. Faa tambm outra classe para testar o mtodo.
5. Elabore uma classe chamada MeusArrays contendo dois mtodos que realizam operaes com
arrays, conforme a descrio a seguir. Faa tambm outra classe para testar os mtodos:
a. um mtodo que recebe dois arrays de inteiros e um nmero inteiro. Pesquise se esse nmero
inteiro existe nos dois arrays e de um retorno conforme a descrio seguinte: se o nmero no
for encontrado em nenhum dos arrays, retorne 0; caso encontre em um dos arrays, retorne 1; e
caso seja localizado nos dois arrays, retorne 2.
b. um mtodo que recebe um valor inteiro (n) e retorna um array contendo n elementos inteiros
gerados randomicamente. Os valores gerados devem estar entre 0 e 1000.
Este captulo abordou os principais tipos de mtodo existentes em Java, desde os que retornam at os
que no retornam valores, a sobrecarga, o acesso a mtodos externos e a recursividade. A maneira mais
usual de reaproveitamento de cdigo dos mtodos a criao de objetos, tpico descrito no Captulo 7.
102
7
Orientao a Objetos
103
qualquer, como uma conta bancria, por exemplo, reconhecemos seu nmero, cliente, saldo, enfim, suas
diversas propriedades. Outros objetos possuem diferentes propriedades. Associado s propriedades
do objeto existe outro fator: as aes que podem ser realizadas com ele. Voltando ao exemplo da conta
bancria, ela pode estar bloqueada ou desbloqueada. Existe um procedimento para consultar, deposi-
tar e sacar. A programao orientada a objetos procura modelar, internamente no computador, a reali-
dade dos objetos.
Apesar de existirem diferentes tipos de objetos, eles compartilham duas caractersticas princi-
pais: todos possuem um estado (conjunto de propriedades do objeto) e um comportamento (as aes
possveis sobre o objeto). No caso da conta bancria, o estado poderia ser o conjunto de propriedades
numero, cliente, saldo etc.; j o comportamento poderia ser composto por consultar, depositar,
sacar etc. Voltando ao estado, um objeto conta bancria pode ter um atributo chamado status que
assuma um dos valores seguintes: bloqueada, desbloqueada etc. Em cada etapa da vida de um objeto,
ele pode assumir um estado diferente.
Para armazenar o estado, um objeto de software utiliza uma ou diversas variveis. J o comporta-
mento do objeto definido pelo conjunto de mtodos que ele possui. Considere a Figura 7.1 que simula
o objeto conta bancria.
consultar
numero
Atributos cliente Mtodos
(estado) (comportamentos)
saldo
sacar
depositar
A representao do objeto conta bancaria da Figura 7.1 contm o estado formado pelas variveis
numero, cliente e saldo. Em OO essas variveis recebem o nome de atributos. J o comportamento
est representado pelos mtodos depositar, sacar e consultar. Esses trs mtodos poderiam atuar
sobre a varivel saldo para aumentar (depositar), diminuir (sacar) ou simplesmente verificar seu valor
(consultar). Na prtica, podem existir outros mtodos para manipular os valores das outras variveis
tambm. Mais frente voltaremos a falar dessa representao da Figura 7.1.
104
tambm assim, pois uma vez definidas todas as partes que compem uma classe, isto , seus atributos
(estado) e mtodos (comportamento), possvel criar objetos que recebero suas caractersticas. No en-
tanto, apesar de todos os objetos serem criados a partir de uma mesma classe, eles podem manter conte-
dos individuais em suas variveis, como, por exemplo, a cor da lataria, a potncia do motor etc.
Conforme apresentado, para definir uma classe usada a palavra reservada class seguida do nome
da classe, mais o par de chaves, como a declarao a seguir:
O qualificador da classe indica como a classe (ou outro identificador) pode ser usada por outras clas-
ses, isto , define sua visibilidade. Existem diversos tipos de qualificador, entre os quais sero citados no
momento public e private. O qualificador public indica que o contedo da classe pode ser usado livre-
mente por outras classes do mesmo pacote ou de outro pacote, isto , a classe ser visvel a todas as clas-
ses, estejam elas no mesmo pacote ou no. Na prtica, pacote um diretrio; sendo assim, quando usado
public, uma classe pode ser usada por classes armazenadas em outros diretrios. Quando uma classe
criada como public, o arquivo Java deve possuir o mesmo nome da classe, observando o uso da caixa
(maisculas/minsculas) tanto para o nome da classe como para o nome do arquivo.
O qualificador private indica que o contedo da classe privado e pode ser usado apenas por clas-
ses do mesmo pacote, isto , ela ser visvel apenas para as classes localizadas no mesmo diretrio. Em
breve criaremos pacotes para praticar o uso desses qualificadores. importante ressaltar que a visi-
bilidade existe no apenas para classes, mas para diversos outros identificadores da linguagem como
objetos, atributos e mtodos.
Conforme j citado, o nome da classe deve se iniciar com letra maiscula, uma forma de diferenciar
da declarao os demais identificadores (objetos, variveis, mtodos etc.). Alm disso, toda palavra pre-
sente no nome da classe deve se iniciar em maiscula. Exemplos: Menu, MenuPrincipal, NumberFormat
Exception.
Com base no exposto at o momento, podemos criar a estrutura de uma classe da seguinte maneira:
declarao do mtodo1
{ ... }
declarao do mtodo2
{ ... }
declarao do mtodoN
{ ... }
}
Uma classe envolve, atravs de suas chaves, todas as variveis e mtodos que a compem. Vamos
apresentar uma classe para simular um objeto do mundo real. Considere um televisor. Existem muitos
modelos e formatos para um televisor. Apesar de a OO permitir que a realidade seja simulada em am-
biente computacional, no sensato (nem necessrio) criar uma classe contendo todas as caracters-
ticas possveis de uma Televisor. necessrio apenas definir quais atributos e mtodos so essenciais
para o sistema no qual o objeto do tipo Televisor ser usado.
A Figura 7.2 mostra a representao da classe Televisor de acordo com a UML. Observe os trs
compartimentos: o primeiro contm o nome da classe (em negrito e centralizado), o segundo contm os
105
atributos da classe (definidos pelas variveis) e o terceiro compartimento contm os mtodos da classe.
Na UML os mtodos so chamados de operaes. Observe tambm que todos os atributos e mtodos
possuem visibilidade pblica, representada na UML pelo caractere + ao lado esquerdo de cada nome.
Televisor
+volune : int
+ aumentarVolume() : void
+canal : int
+aumentarVolume() : void
public void aumentarVolume()
+reduzirVolume() : void
+trocarCanal(int canal) : void
+mostrar() : String Correspondncia UML e Java
Veja um exemplo de correspondncia entre Java e UML ao lado direito da Figura 7.2. O smbolo +
refere-se a uma varivel pblica, aumentarVolume() e void esto presentes nas duas linguagens, o
que muda apenas a ordem da declarao. J o cdigo em Java correspondente Figura 7.2 pode ser
visto na listagem do Exemplo 7.1. A nica diferena o fato de que o cdigo contm a implementao
dos mtodos, o diagrama de classe contm apenas as especificaes dos mtodos. Observa-se tambm
que essa classe ainda no est completa e no ideal; ainda precisamos estudar alguns conceitos e
adicionar outras funcionalidades (isso ser apresentado no Exemplo 7.5).
Exemplo 7.1 Listagem da classe Televisor
106
O Exemplo 7.1 representa um modelo padro para uma classe, isto , ela composta por atributos
e mtodos, mas possvel haver classes somente com atributos ou somente com mtodos, dependendo
das necessidades da aplicao. O leitor j est familiarizado com o uso de classes, uma vez que as apli-
caes que fizemos so formadas por elas. Existem diferentes tipos de classes: as usadas na criao de
componentes grficos (por exemplo, a classe Button usada para criar um boto), as classes executveis
(como temos criado at aqui e que possui o mtodo main) e tambm as classes comuns que possuem
atributos e mtodos, como a classe Televisor. A principal diferena entre elas a presena do mtodo
main, ou seja, uma classe que possui esse mtodo uma aplicao que pode utilizar outras classes ou
objetos de outras classes, como veremos mais frente.
107
Em duas linhas:
nome-da-classe nome-do-objeto;
nome-do-objeto = new nome-do-construtor();
ou
Televisor tv;
// cdigos do programa
tv = new Televisor ();
Ao instanciar um objeto do tipo Televisor, ele passa a possuir todos os atributos e mtodos defi-
nidos em sua classe. No caso, um objeto tv conter os dois atributos e os trs mtodos definidos na
classe Televisor. Vamos verificar isso por meio do Exemplo 7.2.
Exemplo 7.2 A classe UsaTelevisor
108
Considerando seu uso em variveis, a diferena entre escopo de classe e de instncia apresen-
tada na Tabela 7.1.
Tabela 7.1
Para confirmar essa teoria, observe o Exemplo 7.4, que apresenta a classe UsaCelular.
Exemplo 7.4 A classe UsaCelular
109
7.5 Mensagens
Agora vamos definir outro conceito em OO: mensagem entre objetos. J aprendemos que um ob-
jeto pode possuir diversos mtodos definidos em sua classe. Em uma aplicao real muito comum que
existam diversos tipos de objetos e que um objeto necessite realizar uma tarefa que j est definida em
outro objeto, ou seja, numa aplicao pode haver comunicao e interao entre objetos por meio de
mensagens. Em outras palavras, um objeto x pode necessitar de um procedimento (mtodo) j definido
em um objeto y. Para realizar esse processo, o objeto x solicita ao objeto y que execute o mtodo, ou
seja, uma mensagem nada mais do que o fato de um objeto chamar um mtodo de um outro objeto (ou
ainda um mtodo esttico de uma classe).
Vamos tentar elucidar com um exemplo. Digamos que um objeto gerente precise enviar um
e-mail. Ele no sabe como fazer isso, porm o objeto email sabe. Ento, o objeto gerente solicita ao
email que faa isso por ele. Em orientao a objetos, quando um objeto x solicita a um objeto y que
execute um de seus mtodos, diz-se que o objeto x enviou uma mensagem ao objeto y. Uma mensagem
pode conter parmetros que so valores enviados de um objeto a outro quando um mtodo invocado.
Observe a Figura 7.3, em que o objeto gerente envia uma mensagem ao objeto email (invocando o
mtodo enviar). So enviados quatro parmetros: de, para, assunto e mensagem. Esse padro do envio
de mensagens definido pela UML e pode ser encontrado, por exemplo, em diagramas de comunicao
e sequncia.
O processo de comunicao entre os objetos gerente e email pode ser assim descrito:
1. O objeto gerente solicita ao objeto email o envio de e-mail pelo mtodo enviar contido em
email, e fornece os parmetros adequados.
2. O objeto email envia o e-mail usando os dados recebidos de gerente.
3. Nesse caso o objeto email no fornece nenhum retorno para o objeto gerente (veja a palavra
void adicionada ao final da mensagem), mas isso poderia ser diferente e o objeto email poderia
retornar uma mensagem, por exemplo, informando se houve sucesso ou no no envio.
7.6 Encapsulamento
Encapsulamento (em ingls data hidding) mais um dos conceitos presentes na orientao a obje-
tos. Trata-se de um mecanismo que possibilita restringir o acesso a variveis e mtodos da classe (ou
at prpria classe). Os detalhes de implementao ficam ocultos ao usurio da classe, isto , o usurio
110
passa a utilizar os servios da classe sem saber como isso ocorre internamente. Somente uma lista das
funcionalidades existentes torna-se disponvel ao usurio da classe. O encapsulamento tambm co-
nhecido como acessibilidade, pois define o que est acessvel na classe.
O uso do encapsulamento fornece uma srie de vantagens, no apenas pelo fato de ocultar certos
detalhes de implementao, mas por tornar o cdigo mais legvel, minimizar os erros de programao,
restringir o contedo das variveis e facilitar a ampliao do cdigo em funo de novas atualizaes.
Um fabricante de uma classe pode, por exemplo, realizar atualizaes, ou at mesmo modificaes in-
ternas, sem que o usurio da classe se d conta disso.
Para determinar o nvel de acesso dos elementos de uma classe, so usados os qualificadores de
acesso, j citados anteriormente:
ff public: um nvel sem restries, equivalente a no encapsular, ou seja, se uma varivel for definida
como pblica, no ser possvel realizar o encapsulamento.
ff private: o nvel de maior restrio em que apenas a prpria classe pode ter acesso a variveis e/ou
mtodos.
ff protected: um nvel intermedirio de encapsulamento em que as variveis e mtodos podem ser
acessados pela prpria classe ou por suas subclasses (veremos isso mais adiante).
ff package: nvel em que a classe pode ser acessada apenas por outras classes pertencentes ao mes-
mo pacote (veremos a manipulao de pacotes mais frente).
Por meio das restries de acesso possvel assegurar que certas variveis de instncia tenham
valores restritos que s podem ser acessados a partir da prpria classe, mantendo uma certa segurana
com relao integridade do valor armazenado.
Conforme demonstrado at aqui, as variveis declaradas na classe foram acessadas diretamente
pelos objetos por meio da sintaxe nome-do-objeto.nome-da-varivel ou diretamente por meio da classe
quando o atributo era esttico. Considerando o encapsulamento, o contedo das variveis acessado
por mtodos pblicos get e set.
Neste ponto vamos alterar a classe Televisor do Exemplo 7.1, de maneira a implementar os concei-
tos definidos no encapsulamento. Comeamos com a representao da classe usando a UML. Observe
na Figura 7.4 a definio de visibilidade privada (sinal de -) para os atributos. Uma vez que os atributos
volume e canal so privados e visveis apenas prpria classe, necessrio que sejam criados mto-
dos para permitir a manipulao de seus contedos por meio de outras classes (ou de outros objetos).
Por exemplo, como o atributo volume privado, no ser mais possvel usar a sintaxe tv.canal = 150
presente na linha 5 do Exemplo 7.2.
Televisor
volune : int
canal : int
+aumentarVolume() : void
+reduzirVolume() : void
+trocarCanal(int canal) : void
+mostrar() : String
Os atributos privados no podem ser acessados diretamente pelo objeto; deve existir um mtodo
pblico que permita tal acesso, como, por exemplo, tv.setCanal (150). Dessa forma, o valor 150 no
atribudo diretamente ao atributo, ele enviado ao mtodo que pode atuar como um mediador entre
o atributo e o valor a ser armazenado. Considere o seguinte: suponha que s existam televisores com
111
canais de 0 a 1000. Se o atributo for pblico, voc pode adicionar qualquer valor a ele livremente,
mesmo que esse valor seja superior ao mximo (digamos que voc armazene o valor 9000). Por outro
lado, se o atributo for privado e devidamente encapsulado, possvel limitar o valor armazenado, rejei-
tando valores fora da faixa permitida. A Figura 7.5 apresenta um fluxograma para ilustrar esse conceito.
Mais frente apresentaremos um exemplo de cdigo para demonstrar essa caracterstica.
Valor a ser
armazenado
Dentro N
da faixa Rejeita
Armazena
Apresentamos no Exemplo 7.5 a nova classe Televisor contendo os mtodos get e set (com visibi-
lidade pblica) necessrios para permitir o acesso aos atributos privados. Reforando: para cada atri-
buto privado devem ser elaborados um mtodo get e um mtodo set. A estrutura desses mtodos segue
um mesmo padro para qualquer nome usado para o atributo.
ff O mtodo set recebe como parmetro o mesmo tipo de dado do atributo da classe e retorna void.
Ele sempre armazenar no atributo o contedo passado por parmetro. Seu padro :
ff O mtodo get no recebe nenhum parmetro e sempre retorna o mesmo tipo de dado do atributo
da classe. Ele sempre retornar o contedo atual que est armazenado no atributo. Seu padro :
Pelo fato de os mtodos set e get possurem uma estrutura padronizada, as ferramentas de
desenvolvimento permitem automatizar a gerao do cdigo desses mtodos, facilitando a vida do pro-
gramador. Imagine uma classe com dez atributos. Seria necessrio digitar o cdigo de 20 mtodos na
mo, mas com uma IDE (Eclipse ou NetBeans, por exemplo) bastam alguns cliques do mouse e esses
mtodos so gerados automaticamente.
Vamos reforar o conceito dos mtodos set e get analisando o Exemplo 7.5.
Exemplo 7.5 Listagem da classe TelevisorEncapsulada
112
A classe Televisor encapsulou as variveis volume e canal, definindo a visibilidade como private.
Por esse motivo no permitido alterar seu valor diretamente por meio do objeto tv. O contedo des-
sas variveis s pode ser acessado pelos mtodos pblicos. Exemplo: para manipular o contedo do
atributo volume podem ser usados os mtodos aumentarVolume(), diminuirVolume(), setVolume() e
getVolume(). O mesmo acontece para o atributo canal, isto , pode ser acessado por meio dos mtodos
aumentarCanal(), diminuirCanal(), setCanal() ou getCanal(). Todos esses mtodos so pblicos e podem
ser acessados fora da classe. Observe que para mudar o canal possvel usar os mtodos setCanal (que
permite fornecer o nmero do canal), aumentarCanal (aumenta em 1 o valor do canal) e diminuirCanal
(diminui em 1 o valor do canal). Observe ainda que existe uma faixa de valores permitidos, pois o valor
do atributo canal s assumir valores entre 0 e 1000. Valores fora dessa faixa sero travados pelos
mtodos, protegendo o valor a ser armazenado no atributo. Procedimento semelhante foi definido para
o valor do atributo volume, apenas valores entre 0 e 100 so permitidos. O mtodo setVolume define
uma exceo que ser lanada caso o valor do volume esteja fora da faixa.
Apesar de simples, o Exemplo 7.5 demonstra como podem ser definidas regras de negcio por meio
do encapsulamento. Alguns exemplos de regras de negcio que podem ser definidas numa classe com
atributos encapsulados aparecem na Tabela 7.2.
113
Tabela 7.2
J discutimos o papel e o funcionamento dos mtodos get e set. Em breve vamos entender o papel
desempenhado pelo this usado nos mtodos set, mas antes vamos testar a classe Televisor por meio da
classe do Exemplo 7.6.
Exemplo 7.6 Listagem da classe UsaTelevisorEncapsulada
114
Esse cdigo traria problemas, porque o parmetro local canal (que est dentro dos parnteses)
tem o mesmo nome do atributo da classe. Isso faria com que as duas variveis fossem consideradas
locais, isto , do prprio mtodo setCanal. Para resolver esse problema, basta inserir a palavra reser-
vada this ao lado do nome do atributo, conforme o cdigo:
Isso permite diferenciar as duas variveis, a local (do parmetro do mtodo) e a global (referente
varivel do atributo).
Como dissemos, o uso da palavra reservada this faz referncia ao objeto corrente, ento this.canal
o mesmo que tv.canal, pois usamos o objeto tv para invocar o mtodo setCanal (linha 5 do Exemplo
7.6). como se estivesse escrito tv.canal = canal.
7.8 Construtores
At o momento, em todas as instanciaes (ou inicializaes) de objetos foi usada a palavra reser-
vada new da seguinte forma:
115
A seguir, vamos definir quatro mtodos do tipo construtor diferentes classe Televisor (Exemplo
7.5). Os mtodos foram adicionados no incio da classe, logo aps a declarao dos atributos, mas eles
poderiam ser colocados em outro local (por exemplo, antes da ltima chave de encerramento da classe).
De forma semelhante ao exemplo anterior, poderiam ser implementadas regras de negcio e os atribu-
tos poderiam ter seus valores controlados. Para tornar o exemplo menor, optamos por no realizar esse
controle. Veja a listagem do Exemplo 7.7.
Exemplo 7.7 Listagem da classe Televisor
A adio desses mtodos construtores permite maior flexibilidade no momento da criao dos ob-
jetos, no caso na criao de objetos do tipo Televisor.
Funcionalidades comentadas do trecho do Exemplo 7.7 referente aos construtores:
ff Linha 5: define um construtor que no recebe nenhum valor, inicializando as variveis com valo-
res default.
ff Linha 7: define um construtor que recebe o valor do parmetro volume que ser armazenado
no atributo volume na linha 8. O atributo canal, no utilizado no mtodo, ser inicializado com o
valor default, isto , com zero.
ff Linha 10: define um construtor que recebe o valor do parmetro volume que ser armazena-
do no atributo volume na linha 11. Recebe tambm o parmetro canal que ser armazenado no
atributo canal na linha 12.
Para exemplificar o funcionamento desse trecho envolvendo os construtores, vamos criar uma
classe de teste. Veja o cdigo do Exemplo 7.8.
Exemplo 7.8 Listagem da classe TelevisorTestaConstrutor
116
7.9 Destrutores
Ao contrrio dos construtores, como o prprio nome sugere, os destrutores (finalizers) so res-
ponsveis por liberar os recursos usados pelos objetos durante a execuo do programa. Enquanto os
construtores alocam um espao inicial na memria, os destrutores liberam esse espao. A necessidade
e a importncia dos destrutores so liberao de recursos do sistema, pois se isso no for realizado os
recursos podem esgotar-se durante a execuo dos programas, especialmente o espao alocado em
memria. O mtodo destrutor praticamente passa uma borracha nos endereos de memria aloca-
dos para o objeto em questo, liberando espao para que outros objetos ou outros sistemas aplicativos
quaisquer possam utiliz-lo.
Para tornar esse conceito mais fcil de entender, observe o trecho a seguir:
Como o objeto Televisor foi instanciado duas vezes, o espao alocado inicialmente fica perdido na
memria. Apesar de essa caracterstica ser um problema, ela no representa uma ameaa, pois a lin-
guagem Java possui um processo automtico para limpeza de objetos no utilizados depois de um certo
tempo. Isso feito por meio de um processo nomeado coleta automtica de lixo (automatic garbage
collection). Cada vez que um objeto deixa de ser referenciado pelo programa, ficando perdido na mem-
ria, ele recebe uma marcao para eliminao futura. Assim que o programa ficar ocioso, o gerenciador
automtico de memria destri os objetos perdidos, liberando os recursos ao sistema. Com esse pro-
cesso torna-se desnecessrio liberar a memria explicitamente em um programa em Java, uma vez que
isso feito automaticamente.
Existem ainda diversos detalhes a respeito da destruio de objetos cuja descrio foge aos obje-
tivos definidos neste livro.
117
118
7. Adicione a linha import pacote1.* classe C3, logo aps a definio do pacote. Salve a classe no-
vamente. A compilao deve ser realizada com sucesso, pois as classes do pacote1 foram adicio-
nadas classe C3 pela diretiva import. A seo a seguir traz maiores detalhes sobre o uso da dire-
tiva import.
import nome-do-pacote.nome-da-classe;
Esse o formato mais comum em que o nome da classe inserido no final do caminho do pacote.
Talvez esse formato no seja o mais adequado quando se necessita importar diversas classes de um
mesmo pacote, pois haveria a necessidade de especificar, uma a uma, todas as classes importadas. Para
facilitar esse processo, pode ser usado o caractere asterisco (*) ao final do nome do pacote. Isso permite
especificar todas as classes de uma s vez. No entanto, importante observar que o asterisco enxerga
apenas as classes de um diretrio. Caso existam subdiretrios (subpacotes), as classes pertencentes a
eles no so consideradas, sendo necessria outra declarao import que inclua o subpacote. Alguns
exemplos podem ser:
ff import java.util.Date; indica que ser usada a classe Date do pacote java.util, isto , a classe
Date est localizada na pasta java\util. A letra maiscula de Date permite distinguir o nome da
classe do nome do pacote.
ff import java.io.*; indica que ser usada qualquer classe do pacote java.io.
7.11 Herana
Como o prprio nome sugere, na orientao a objetos o termo herana se refere a algo herdado. Em
Java, a herana ocorre quando uma classe passa a herdar caractersticas (variveis e mtodos) defini-
das em outra classe, especificada como sua ancestral ou superclasse. A tcnica da herana possibilita o
compartilhamento ou reaproveitamento de recursos definidos anteriormente em outra classe. A classe
fornecedora dos recursos recebe o nome de superclasse, e a receptora dos recursos, de subclasse.
Outro termo envolvido com herana a especializao. Uma vez que uma classe herda caracte-
rsticas de outra, ela pode implementar partes especficas no contempladas na classe original (super-
classe), tornando-se especializada em algum processo.
Todas as classes criadas em Java herdam, ou seja, recebem recursos da classe Object, a classe
me da linguagem Java. Esse processo transparente ao programador, ocorre de maneira automtica,
sem que ele se d conta disso. Para melhor compreenso, vamos apresentar um exemplo. Considere o
Exemplo 7.11 da classe Camisa. Observe que a classe define apenas trs atributos pblicos.
Exemplo 7.11 Listagem da classe Camisa
Agora verifique o Exemplo 7.12 da classe UsaCamisa. Na linha 4 declarado e instanciado um ob-
jeto chamado camisa. At aqui tudo bem. Porm, nas linhas 5 a 7 so usados os mtodos getClass(),
getSimpleName() e hashCode(). De onde surgiram esses mtodos? Eles no existem na classe Camisa!
Esses mtodos (e alguns outros) foram herdados pela classe Camisa no momento de sua criao.
119
A tcnica da herana extremamente utilizada em Java. Para melhor esclarecimento dos concei-
tos de herana e especializao, observe os exemplos a seguir. Vamos iniciar com a classe Pessoa do
Exemplo 7.13.
Exemplo 7.13 A classe Pessoa
A classe Pessoa possui uma varivel de instncia nome e dois mtodos setNome e getNome
para manipular seu contedo. Essa classe pode ser especializada, uma vez que existem outros tipos de
pessoa, como fsica e jurdica. Observe as classes seguintes dos Exemplos 7.14 (PessoaFisica) e 7.15
(PessoaJuridica). Ambas estendem a funcionalidade da classe Pessoa, adicionando uma varivel e dois
mtodos. Em Java, o mecanismo de herana realizado pela insero da palavra extends na declarao
do nome da classe, seguido pela classe a partir da qual a herana ser recebida.
120
A classe PessoaFisica estende (por meio da palavra extends) a funcionalidade da classe Pessoa,
herdando todo seu estado e comportamento e acrescentando novas funcionalidades: a varivel rg
e seus mtodos de manipulao. Suponha que uma outra classe utilize PessoaFisica, declarando um
objeto da seguinte forma: PessoaFisica pf = new PessoaFisica();.
Ao criar o objeto pf, ele recebe todas as variveis de instncia e todos os mtodos presentes nas
classes Pessoa e PessoaFisica (alm de Object como vimos), ou seja, o objeto pf conter as variveis
nome, rg e os mtodos setNome, getNome, setRg e getRg. De forma similar, o mesmo ocorre com
um objeto da classe PessoaJuridica. importante salientar que, se a classe Pessoa (a superclasse do
exemplo) for alterada, todas as mudanas so refletidas nas classes PessoaFisica e PessoaJuridica (as
subclasses).
Agora suponha que seja necessrio estender tambm as funcionalidades da classe PessoaFisica.
Observe o Exemplo 7.16 da classe Funcionario.
Exemplo 7.16 A classe Funcionario
121
superclasse
Pessoa
nome : String
subclasses
PessoaFisica PessoaJuridica
rg : String cnpj : String
Funcionario
cartao : String
Qualquer alterao realizada numa classe de nvel superior vai refletir nas classes de nveis infe-
riores. O mecanismo da herana possibilita que classes sejam criadas e adicionadas hierarquia sem
necessidade de alterao no cdigo das classes, pois cada uma define exatamente suas funcionalidades.
So como engrenagens que se encaixam umas nas outras. As classes adicionadas a uma hierarquia po-
dem especializar ou restringir o comportamento das classes superiores.
Para concretizar o exemplo de herana, o Exemplo 7.17 apresenta a classe UsaFuncionario. Apesar
de a classe Funcionario declarar apenas a varivel cartao e seus mtodos set e get, todas as variveis
e mtodos de suas classes ancestrais podem ser usados.
Exemplo 7.17 A classe UsaFuncionario
Outro ponto a ser considerado se refere a restringir o uso da herana entre as classes. Suponha
que voc queira definir que uma determinada classe no permita que outras classes se aproveitem de
seu funcionamento, ou seja, voc deseja proibir o uso da herana para essa classe. Isso possvel por
meio do uso da palavra final. Veja como ficaria no caso da classe Pessoa: public final class Pessoa. Se
122
voc alterar a classe Pessoa para final, ocorre um erro em suas subclasses, j que Pessoa no poder ser
herdada por nenhuma classe.
Conforme apresentado, a herana constitui uma importante tcnica para a orientao a objetos
(e para Java), possibilitando que o cdigo j criado em uma classe seja reaproveitado e especializado
em outra. Como um exemplo mais prtico, considere a seguinte situao: a linguagem Java fornece
um componente grfico por meio da classe JButton. Essa classe cria um boto padronizado, contendo
dezenas de atributos e mtodos associados. Um desenvolvedor pode reaproveitar todas as carac-
tersticas j definidas em JButton e criar um boto personalizado (com uma cor de fundo padro,
tamanho etc.), chamado, por exemplo, MyButton. Com isso, em todos os sistemas, o desenvolvedor
poderia usar seu boto personalizado, no caso o MyButton.
Outro aspecto importante referente herana o acesso a recursos da superclasse, isto , uma
subclasse pode acessar recursos de sua subclasse caso seja necessrio. Vamos ilustrar esse recurso por
meio de trs classes bastante simples. Observe a classe do Exemplo 7.18.
Exemplo 7.18 A classe Bola
A classe Bola define dois atributos privados (cor e tamanho), um mtodo construtor que inicia-
liza os atributos e o mtodo mostrar que apresenta o contedo dos atributos em tela. Agora observe a
classe BolaFutebol do Exemplo 7.19.
Exemplo 7.19 A classe BolaFutebol
A classe BolaFutebol define um atributo privado (tipo), um mtodo construtor que recebe os
atributos cor, tamanho e tipo e o mtodo mostrar. As funcionalidades comentadas desse exemplo so
as seguintes:
ff Linha 5: utiliza a instruo super. Por meio dela possvel acessar recursos da superclasse, no
caso a classe Bola. A instruo super(cor, tamanho) acessa o mtodo construtor da classe Bola (li-
nha 6 da classe Bola), inicializando o valor dos atributos cor e tamanho. Esse recurso s pode ser
usado quando a herana implementada (por meio de extends).
ff Linha 9: voltamos a utilizar a instruo super, agora acessando o mtodo mostrar da classe Bola.
Portanto, sempre que for necessrio acessar algum recurso (que no seja privado) da superclasse,
pode ser utilizada a sintaxe super seguindo o recurso (atributo ou mtodo).
123
O Exemplo 7.20 apresenta a classe UsaBolaFutebol para testar as funcionalidades dessas classes.
Exemplo 7.20 A classeUsaBolaFutebol
7.12 Polimorfismo
O leitor pde verificar que, por meio das tcnicas de encapsulamento e herana, novas funcionali-
dades podem ser adicionadas s classes. Enquanto a herana um poderoso mecanismo de especiali-
zao, o polimorfismo oferece um mecanismo para a generalizao. Ao analisar a hierarquia de classes
da Figura 7.8 de forma inversa, isto , da classe de nvel inferior para a classe de nvel superior, percebe-
-se a generalizao das classes relacionadas, ou seja, cada classe da hierarquia pode assumir o mesmo
comportamento da superclasse, sendo tratada como tal. Caso a superclasse modifique sua estrutura,
igualmente todas as classes da hierarquia so afetadas. Com isso nota-se que uma classe da hierarquia
pode assumir diferentes formas (funcionalidades) de acordo com as classes de nvel superior.
O polimorfismo representa uma tcnica avanada de programao, e seu uso pode gerar economia
de recursos computacionais. A ideia geral do polimorfismo que um objeto de uma determinada classe
mais genrica (a superclasse) possa assumir diferentes comportamentos, gerando objetos distintos,
dependendo de certas condies. Na prtica quer dizer que um mesmo objeto pode executar mtodos
diferentes, dependendo do momento de sua criao. Como um mesmo objeto pode ser gerado a partir
de classes diferentes e classes diferentes possuem mtodos distintos, o objeto criado pode ter com-
portamentos variados, dependendo da classe a partir da qual ele foi criado. A definio pode parecer
complicada, mas na realidade nem tanto. Nada melhor do que um exemplo prtico para melhorar o en-
tendimento. Considere o diagrama de classes da Figura 7.8. Um objeto pode ser declarado como do tipo
Pessoa e ser criado, em tempo de execuo, como do tipo PessoaFisica, PessoaJuridica ou Funcionario.
O uso do polimorfismo pressupe duas condies: a existncia de herana entre as classes e
a redefinio de mtodos em todas as classes. Todas as classes devem possuir mtodos com a mesma
assinatura (nome e parmetros), porm com funcionalidades diferentes. Esse mecanismo de redefini-
o de mtodos entre superclasses e subclasses conhecido como overriding, diferente do mecanismo
de sobrecarga (overloading) de mtodos que ocorre em uma mesma classe.
Vamos criar um exemplo de polimorfismo aproveitando o exemplo de herana apontado no dia-
grama de classes anterior. Siga os procedimentos:
1. Ao final de cada uma das quatro classes (Pessoa, PessoaFisica, PessoaJuridica e Funcionrio), adi-
cione um mtodo chamado mostraClasse da forma a seguir:
2. Esse mtodo foi adicionado classe Pessoa. Para as outras classes, modifique apenas a mensagem
de texto que ser impressa na tela, isto , para a classe PessoaFisica, modifique a mensagem para
classe PessoaFisica e assim por diante. Salve e compile as quatro classes.
124
125
Para entender a gravao e leitura de objetos, vamos criar trs classes. O diagrama das classes que
sero criadas est representado na Figura 7.9 e est de acordo com a notao da UML.
cap07
Produto
codigo : in
descricao : String
ProdutoPersiste
UsaProduto
+ gravar() : String
+ main() : void
+ ler(int codigo : int) : Produto
O cdigo de cada uma das classes apresentadas no diagrama comentado a seguir. Vamos iniciar
pela classe Produto do Exemplo 7.22.
Exemplo 7.22 Classe Produto
126
para isso, j que esses mtodos poderiam estar na prpria classe Produto. Essa opo pela diviso em
classes distintas se tornar mais clara quando tratarmos da arquitetura em camadas.
Exemplo 7.23 A classe ProdutoPersiste
127
128
Apesar de a sintaxe estar correta, ocorreria erro, j que no permitido criar um objeto a partir de
uma classe abstrata. No entanto, o cdigo seguinte seria compilado normalmente. Lembre-se de que
estamos nos referenciando ao exemplo da Figura 7.8.
Uma classe abstrata pode ser usada tambm para definir um comportamento padro para um
grupo de outras classes. Vamos examinar essa caracterstica de forma prtica. Considere o diagrama de
classes da Figura 7.10, que apresenta a superclasse Veiculo e as subclasses Automovel e Aviao. Observe
na figura que tanto o nome da classe Veiculo quanto o mtodo acelerar, tambm da classe Veiculo,
esto em itlico. Esse o padro da UML para indicar que algo abstrato.
A classe Veiculo implementa (codifica) os mtodos ligar, desligar e mostrarStatus, que so co-
muns s suas subclasses (Automovel e Aviao), isto , funcionam do mesmo jeito para as duas classes, no
entanto o mtodo acelerar apenas definido na classe Veiculo, ele no implementado (no codi-
ficado). A implementao fica a cargo das subclasses, j que acelerar um automvel pode ser diferente
de acelerar um avio. Veja que a classe abstrata Veiculo apenas define o que as subclasses devem im-
plementar. Reforando: a classe abstrata Veiculo define um mtodo abstrato chamado acelerar, que
deve, obrigatoriamente, ser implementado em todas as subclasses de Veiculo. Veja pelo diagrama que
as duas subclasses possuem tambm o mtodo acelerar. Isso j no ocorre com os outros trs mto-
dos. As subclasses podem at realizar a implementao desses mtodos, mas no obrigatrio, pois
eles no so abstratos. Vamos codificar essas classes iniciando com a classe Veiculo do Exemplo 7.25.
Veiculo
velocidade : int
status : boolean
+ ligar() : void
+ desligar() : void
+ mostrarStatus() : void
+ acelerar() : void
Automovel Aviao
129
Para encerrar, vamos verificar o funcionamento da classe UsaVeiculo do Exemplo 7.28, a qual con-
tm o mtodo main e utiliza as duas subclasses Automovel e Aviao. J que essa classe possui o mtodo
main, ser possvel execut-la.
130
7.15 Interfaces
Costuma-se dizer que uma interface permite estabelecer um contrato entre as classes; funciona
de maneira bastante similar a classes abstratas, porm no permite implementao de nenhum m-
todo, contendo apenas a especificao deste. A codificao de uma interface tambm semelhante de
uma classe, no entanto a declarao de uma interface no se inicia com a palavra reservada class. Um
exemplo de codificao de uma interface :
Veja que existe a palavra reservada interface no lugar de class, mas o arquivo deve ser salvo da
mesma forma que uma classe (no exemplo Teste.java).
Vamos elaborar um exemplo mais real para entendermos melhor. Veja o diagrama da Figura 7.11.
Ele mostra duas possveis representaes para uma interface de acordo com a UML:
ff uma representao similar de uma classe (veja a interface DAO) contendo o esteretipo <<in-
terface>>. Isso permite diferenciar visualmente uma interface de uma classe, j que a represen-
tao grfica a mesma. Essa representao permite tambm visualizar o contedo interno (os
mtodos) da interface.
ff uma representao reduzida, em formato de um pequeno crculo (veja a interface Estoque).
Permite reduzir o tamanho de um diagrama, mas possui a desvantagem de no permitir visualizar
o contedo interno da interface.
131
<<interface>>
DAO
Estoque
+ inserir() : void
+ excluir() : void
+ localizar() : void
Conforme j dissemos, uma interface apenas contm a especificao dos mtodos, e nenhuma im-
plementao. Ela apenas define os mtodos que as classes que a implementam sero obrigadas a conter
(da mesma forma que a classe abstrata). Nesse caso, a interface DAO est especificando os mtodos
incluir, excluir e localizar.
Da mesma forma, a interface Estoque contm apenas a especificao do mtodo baixar. Veja sua
codificao no Exemplo 7.30.
132
Neste ponto vamos apresentar a codificao resumida da classe Cliente. Veja o Exemplo 7.31.
Exemplo 7.31 A classe Cliente
Observe na linha 2 a forma utilizada em Java para vincular uma classe a uma interface: trata-se do
uso da palavra implements. Quando o compilador analisa essa linha, ele identifica que a classe Cliente
precisar implementar todos os mtodos definidos na interface DAO, inclusive seguindo a mesma assi-
natura. Se qualquer um dos mtodos no existir na classe Cliente, o compilador apresenta um erro. Em
outras palavras, voc pode interpretar a linha 2 como se fosse um contrato: Eu, classe Cliente, aceito
implementar todos os mtodos definidos na interface DAO. Se a classe Cliente deixar de cumprir esse
contrato, ela se torna invlida (no compilada). Obviamente, na prtica os mtodos da classe Cliente
(linhas 5 a 10) seriam codificados, isto , possuram todo o cdigo necessrio para, por exemplo, inserir
os dados do cliente num banco de dados. No esse o objetivo no momento. Estamos interessados
apenas em entender o funcionamento de interfaces.
A classe Fornecedor segue exatamente o mesmo princpio da classe Cliente e por isso no apresen-
taremos sua codificao. Neste ponto algo deve ficar claro para o leitor: o estabelecimento de contratos
por meio de interfaces permite padronizar o cdigo de um sistema. Uma vez que tanto a classe Cliente
quanto a classe Fornecedor precisam implementar os mesmos mtodos (com os mesmos nomes), pos-
svel construir um cdigo mais padronizado. Imagine se para inserir dados num banco de dados a classe
Cliente definisse o mtodo inserir, a classe Fornecedor definisse o mtodo inclui e outra classe qual-
quer definisse o mtodo inserirRegistro. Veja que baguna seria!
Como j dissemos, uma classe pode implementar mais de uma interface ao mesmo tempo. Esse
o caso da classe Produto, que necessita implementar os mtodos das interfaces DAO e Estoque. O
princpio o mesmo; basta adicionar todas as interfaces aps a palavra implements, separadas por
vrgulas. Veja o Exemplo 7.32.
Observe na linha 2 que a classe Produto implementa duas interfaces: DAO e Estoque. Como j dis-
semos, os nomes das interfaces aparecem separados por vrgula. Por causa disso, a classe Produto deve
implementar os mtodos das duas interfaces, o que pode ser visto nas linhas 5 a 12.
Exemplo 7.32 A classe Produto
133
Alm do exposto at o momento, uma interface ajuda a garantir que uma classe vai disponibilizar
determinados servios para outras classes. Suponha o seguinte exemplo: considere A e B duas classes
e X uma interface. A classe A implementa servios definidos na interface X e B utiliza esses servios de
A. Caso uma nova classe C, que tambm implementa servios definidos na interface X, melhore os ser-
vios de A e seja colocada no lugar desta, a classe B no deve notar a diferena. Isso refora ainda mais
a ideia de que um sistema pode ficar mais flexvel quando padres so seguidos.
Com as definies apresentadas neste captulo, espera-se que o leitor tenha adquirido um conheci-
mento bsico sobre a orientao a objetos; afinal, a linguagem Java trabalha dessa forma. Obviamente,
o estudo da orientao a objetos no foi esgotado neste captulo, pois para isso seria necessrio escre-
ver um livro inteiro sobre o assunto.
1. Faa uma classe que simule o funcionamento de uma bomba dgua. A bomba possui um atributo
booleano chamado status e os mtodos ligar e desligar (ambos sem retorno). O mtodo li-
gar coloca true em status e o mtodo desligar coloca false em status. A bomba deve ficar liga-
da durante um certo intervalo de tempo (em segundos). O tempo em segundos deve ser recebido
pelo mtodo ligar. A cada segundo, apresente em tela quantos segundos faltam para a bomba ser
desligada. Decorrido o tempo, o mtodo desligar acionado e a bomba desligada.
2. Crie uma classe chamada UsaBomba que utilize a classe do exerccio anterior. Ela deve conter o
mtodo main e:
ff instanciar uma bomba (bomba1);
ff ligar o objeto bomba1 durante 5 segundos;
3. Crie uma classe chamada GPS contendo os seguintes atributos do tipo String: idioma e rota.
Defina dois mtodos construtores: o default e outro para ligar o GPS com o idioma portugus e
uma rota qualquer. Elabore mtodos para realizar as seguintes funes:
ff Definir idioma;
ff Definir rota;
ff Um mtodo chamado mostrar para apresentar todos os valores atuais dos atributos do GPS.
Elabore tambm uma outra classe (UsaGPS) para testar essas funcionalidades.
4. Considere a representao da classe Brinquedo da Figura 7.12. Elabore essa classe em Java con-
tendo os mtodos get e set necessrios e os mtodos construtores apresentados. O atributo
faixaEtaria um atributo do tipo String que deve receber apenas um dos valores seguintes:
0 a 2, 3 a 5, 6 a 10 e acima de 10. Outros valores so invlidos e no devem ser armaze-
nados. Essa validao deve ser realizada no mtodo setFaixaEtaria. A seguir, elabore a classe
UsaBrinquedo para testar as funcionalidades da classe Brinquedo.
Brinquedo
nome : String
faixaEtaria : String
preco : float
+ Brinquedo()
+ Brinquedo(nome : String)
+ Brinquedo(nome : String, preco : float)
+ mostrar()
134
5. Crie uma interface chamada Controle que especifique os mtodos andar, virar e falar. A se-
guir, crie uma classe chamada Robo que implemente esses mtodos. Dentro de cada mtodo im-
prima uma mensagem em tela contendo a ao correspondente. Para testar, elabore uma terceira
classe chamada UsaRobo.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.
Este captulo demonstrou os aspectos fundamentais da linguagem Java em relao orientao a ob-
jetos. Esse o paradigma de desenvolvimento mais aceito atualmente e fundamental para sua carreira
profissional. O prximo captulo fornece uma viso geral da criao de interfaces grficas em Java.
135
8
Interfaces Grficas com Swing
136
As aplicaes grficas so aquelas que possibilitam a criao de uma GUI (Graphical User Interface
Interface Grfica do Usurio). Ao desenvolver uma aplicao dotada de uma GUI, necessrio definir
quais componentes (objetos) sero utilizados e a disposio que eles tero na janela. O swing possui
inmeras classes que podem ser utilizadas na construo da GUI. Neste ponto, a linguagem comea
a ficar mais interessante, pois as aplicaes so criadas a partir de janelas grficas. Ao projetar uma
aplicao grfica, necessrio definir todos os componentes que sero utilizados, seus objetivos e sua
posio na janela.
Este captulo abrange os componentes mais utilizados na criao de interfaces grficas sem ainda
se preocupar com questes de arquitetura (definidas no captulo seguinte). Um componente da GUI
um objeto visual (criado a partir de classes Java) que possibilita realizar a interao com a aplicao
por meio do mouse e do teclado. Os componentes mais comuns so etiquetas, botes, caixas de texto,
painis de rolagem, menus, objetos de mltipla escolha, entre outros. Conforme ser apresentado, cada
um dos componentes possui propriedades que podem ser alteradas em tempo de desenvolvimento ou
execuo (cor, tamanho, fonte etc.), assim como em outras linguagens de programao. As classes do
swing so extenses do pacote awt, que, por sua vez, so extenses da classe java.lang.Object, a su-
perclasse de todas as classes do Java. Alm dos pacotes de classes da awt e swing, existem ainda outras
formas de criar interfaces em Java, no discutidas aqui.
Vale a pena ressaltar que ser estudado apenas o uso do swing para a elaborao de aplicaes.
Todas as classes elaboradas neste captulo necessitam de diversas classes externas tanto do pacote
swing como do awt. Na maioria dos exemplos, as classes tero pelo menos trs linhas com a diretiva
import apontando para pacotes de classes externas, conforme as declaraes seguintes:
ff import java.awt.*; permite a utilizao de diversas classes do pacote awt, alm de possuir uma
srie de constantes numricas.
ff import java.awt.event.*; usado para o processamento dos eventos que ocorrem na janela, tais
como clique do mouse.
ff import javax.swing.*; permite a utilizao de diversas classes do pacote swing.
Exemplo 8.1
Exemplo 8.3
Exemplo 8.2
Exemplo 8.4
Exemplo 8.5
137
A Figura 8.1 apresentou algumas telas dos exemplos iniciais deste captulo e o roteiro de trabalho
a ser seguido. O objetivo ajudar o leitor a entender nossa linha de trabalho e raciocnio. O primeiro
exemplo se refere a um formulrio de login, uma funcionalidade normalmente encontrada em qualquer
tipo de sistema. O segundo exemplo se refere a um formulrio contendo um menu. A partir deste, todos
os exemplos do captulo sero chamados. A ideia que os exemplos deste captulo funcionem como
uma aplicao real, mesmo sabendo que so simples e independentes. O captulo apresenta o funciona-
mento bsico de diversos componentes visuais, um passeio sobre os mtodos e atributos mais usados
de cada componente. Reforando: vamos simular uma aplicao real contendo um menu principal a
partir do qual todas as outras telas so chamadas. A cada exemplo voc adiciona um item de menu que
chamar a nova aplicao.
Observao
No dia a dia do desenvolvimento de aplicaes grficas muito comum a utilizao de alguma ferra-
menta para o design de telas, isto , na criao da interface do usurio. Tanto o NetBeans (Apndice A),
quanto o Eclipse (Apndice B) oferecem este recurso.
Esse exemplo cria um objeto chamado lbNome contendo o texto Nome, alinhado direita. A
Tabela 8.1 apresenta um resumo dos principais mtodos disponveis na classe JLabel.
Tabela 8.1 Resumo dos mtodos da classe JLabel
Mtodo Funo
JLabel() Cria um Label vazio (sem texto)
JLabel(String) Cria um Label com o texto dado
JLabel(String,int) Cria um Label com o texto e o alinhamento dados
JLabel(String, Image) Cria um Label com o texto e a imagem dados
JLabel(String, Image, int) Cria um Label com o texto, a imagem e o alinhamento dados
getText() Obtm o texto do Label
setText() Especifica o texto do Label
138
Esse exemplo cria um objeto chamado tfNome com contedo em branco. A Tabela 8.2 apresenta
um resumo dos principais mtodos disponveis na classe JTextField.
Tabela 8.2 Resumo dos mtodos da classe JTextField
Mtodo Funo
JTextField() Cria uma caixa de texto vazia
JTextField(String) Cria uma caixa de texto com a string dada
JTextField(String,int) Cria uma caixa de texto com a string e a quantidade de colunas especificada
JTextField(int) Cria uma caixa de texto com a quantidade de colunas especificada
getText() Obtm o texto do objeto
getSelectedText() Obtm o texto selecionado no objeto
isEditable() Verifica se o componente editvel ou no
selectAll() Seleciona todo o texto
setEditable(boolean) Especifica se o componente editvel ou no
setText() Especifica o texto contido no componente
Esse exemplo cria um objeto chamado pfSenha com contedo em branco. A Tabela 8.3 apresenta
um resumo dos principais mtodos disponveis na classe JPasswordField.
Tabela 8.3 Resumo dos mtodos da classe JPasswordField
Mtodo Funo
JPasswordField() Cria uma caixa de texto vazia
JPasswordField (String) Cria uma caixa de texto com a string dada
JPasswordField (int) Cria uma caixa de texto com a quantidade de colunas especificada
(continua)
139
(continuao)
Mtodo Funo
Obtm o texto do objeto, porm retornando um array do tipo char. Cada caractere
getPassword()
armazenado num elemento do array
getEchoChar() Obtm o caractere usado na substituio dos caracteres digitados
setEchoChar() Define o caractere a ser usado em substituio aos caracteres digitados
Esse exemplo cria um objeto chamado btCalcular contendo o texto Calcular. A Tabela 8.4 apre-
senta um resumo dos principais mtodos disponveis na classe JButton.
Tabela 8.4 Resumo dos mtodos da classe JButton
Mtodo Funo
Button() Cria um boto sem texto
Button(String) Cria um boto com o texto dado
Button(String, Image) Cria um boto com o texto e a imagem dados
getText() Obtm o texto do boto
setText(String) Especifica o texto do boto
setEnabled (boolean) Define se o boto est habilitado (true) ou desabilitado (false)
Define o tipo de alinhamento horizontal do texto em relao a uma imagem. Pode
setHorizontalTextPosition()
assumir LEFT (esquerda) ou RIGHT (direita)
Define uma letra que ser usada como acionadora do evento clique, em conjunto
setMnemonic(char)
com a tecla ALT
Possibilita atrelar uma mensagem ao boto. Quando o ponteiro do mouse esta-
setToolTipText(String)
ciona sobre o boto, a mensagem apresentada
Define o tipo de alinhamento vertical do texto em relao a uma imagem. Pode
setVerticalTextPosition()
assumir TOP (topo) ou BOTTOM (abaixo)
140
141
142
Vamos entender melhor isso. Todo componente que ser usado para interao com o usurio pre-
cisa conter um ouvinte de eventos, isto , o componente precisa perceber que o usurio executou
alguma ao sobre ele (clicar sobre o componente, passar o mouse etc.). Dessa forma, para todo com-
ponente necessrio registrar um ouvinte para receber as aes do usurio. A estrutura apresentada
anteriormente faz justamente isso. uma estrutura padro para todos os componentes cujo evento de
ao deva ser registrado, ou seja, se uma aplicao tiver dez botes, para cada um deles deve ser criada
essa estrutura, mudando apenas o nome do boto cujo evento est sendo associado. Dependendo do
tipo de evento associado, outros ouvintes (como ActionListener) podem ser usados, assim tambm
como outros receptores (como ActionEvent). Tanto o ouvinte como o receptor podem ser adicionados
em diferentes tipos de componentes (listas, caixas de texto etc.).
ff Linhas 44 a 55: adiciona o evento de ao ao boto btLogar e implementa o cdigo referente a
esse boto.
ff Linha 47: a caixa de senha pfTexto possui um mtodo chamado getPassword que retorna um ve-
tor de caracteres, referente senha digitada pelo usurio. Esse vetor de caracteres est sendo
convertido em String por meio do mtodo valueOf. Esse valor convertido est sendo armazenado
na String senha. Isso se faz necessrio para podermos comparar o que o usurio digitou com a
senha definida no exemplo.
ff Linha 48: realiza a comparao do que o usurio digitou na caixa de texto tfLogin com o conte-
do java8. Para pegar o contedo texto armazenado num JTextField usado o mtodo getText.
Para comparar um texto em Java deve ser usado o mtodo equals. Alm disso, compara tambm o
contedo armazenado na varivel senha com java8. Dessa forma, o resultado do if ser ver-
dadeiro se tanto o login quanto a senha digitada forem iguais a java8; caso contrrio, a execuo
pula para a linha 52 e o usurio informado de que os dados esto incorretos.
ff Linha 49: esconde o frame por meio do mtodo setVisible, que permite tornar visvel (true) ou
oculto (false) um determinado componente, aqui o frame da aplicao. Nesse caso, o objetivo
ocultar a tela de login caso o login e senha estejam corretos.
ff Linha 50: contm uma linha comentada. Isso porque a classe GuiMenuPrincipal ainda no foi cria-
da. Depois de cri-la (no prximo exemplo), retire esse comentrio. Isso faz com que essa aplica-
o seja carregada. Dessa forma, caso o login e a senha fornecidos estejam corretos, a tela de lo-
gin some e aparece a tela referente ao menu principal.
ff Linha 57 a 61: adiciona o evento de ao para o boto btCancelar e implementa o cdigo referen-
te a esse boto. Quanto o usurio clicar nesse boto, a aplicao ser encerrada (linha 59).
ff Linha 64 a 75: contm o cdigo referente ao mtodo main responsvel por iniciar a execuo da
aplicao. Lembre-se de que toda aplicao executvel necessita desse mtodo.
ff Linhas 65 e 66: definem um novo processo de execuo (para entendermos isso precisaramos
aprender threads, assunto no coberto pelo livro).
ff Linha 67: cria o objeto frame a partir do construtor GuiLogin. Esse objeto recebe todas as ca-
ractersticas definidas no construtor, j citadas anteriormente, incluindo a inicializao dos com-
ponentes e a definio dos eventos.
ff Linha 68: possui o mtodo setDefaultCloseOperation, responsvel por encerrar a aplicao
quando a janela for fechada. A constante usada foi EXIT_ON_CLOSE. Outras constantes que
podem ser usadas so: HIDE_ON_CLOSE (oculta a janela quando fechada), DO_NOTHING_ON_
CLOSE (no faz nada, apenas desativa o boto de encerramento) e DISPOSE_ON_CLOSE (a janela
desaparece e os recursos usados pela classe so liberados).
ff Linha 69: cria um objeto chamado tela contendo as dimenses da tela. Essa dimenso varia em
funo da resoluo grfica usada no ambiente em que a aplicao est sendo executada.
ff Linhas 70 e 71: define a localizao em que o frame aparecer na tela do monitor por meio do
mtodo setLocation, que recebe dois parmetros (posicionamento em relao ao canto esquerdo,
posicionamento em relao ao topo), isto , cada valor define um ponto da coordenada x,y a partir
da qual o frame aparecer. Observe que realizado um clculo que leva em considerao o tamanho
143
da tela e do frame ((largura da tela largura do frame)/2,(altura da tela altura do frame)/2). Isso
permite centralizar o frame na tela, independentemente de seu tamanho.
ff Linha 72: torna o frame visvel.
Para definir essa barra de menus como o menu padro da janela, utilizado o mtodo setJMenuBar
da seguinte maneira:
setJMenuBar(<nome da barra de menus>)
Com essas duas linhas de comando j possvel criar e definir a barra de menus, entretanto ne-
cessrio criar tambm os menus que aparecero na barra, pois apenas com as declaraes realizadas
a janela conteria uma barra de menus vazia. Para criar os menus, utiliza-se a classe JMenu, conforme a
sintaxe a seguir:
JMenu <nome do menu> = new JMenu()
Para que o menu criado seja adicionado barra de menus, deve-se utilizar o mtodo add da se-
guinte forma:
<nome da barra de menus>.add(<nome do menu>)
Com isso um menu inserido na barra. Imagine, por exemplo, a insero do menu Arquivo de um apli-
cativo qualquer. Depois de criado o menu, necessrio adicionar a ele os itens que o compem (para o menu
Arquivo seriam: Novo, Salvar, SalvarComo...). Para criar um item de menu, usada a seguinte sintaxe:
JMenuItem <nome do item> = new JMenuItem()
Barra de menus
Menu inserida por meio
de setMenuBar ( )
Itens do Menu
144
O Exemplo 8.2 demonstra a criao de uma classe GuiMenuPrincipal. Deste ponto em diante, to-
dos os exemplos deste captulo sero chamados a partir dela. Como j comentado anteriormente, a
aplicao possui um menu a partir do qual os exemplos so carregados.
Depois de testar a classe GuiMenuPrincipal, retire o comentrio da linha 50 do Exemplo 8.1 (classe
GuiLogin). Como a classe GuiMenuPrincipal no possui o mtodo main, ela no ser executada direta-
mente. Isso ser feito por meio da classe GuiLogin, seguindo a sequncia que j descrevemos, isto , exe-
cute a classe GuiLogin, fornea o login e senha java8 e a aplicao GuiMenuPrincipal ser carregada.
Exemplo 8.2 A classe GuiMenuPrincipal
145
ff Linha 6: declara um objeto chamado contentPane do tipo Container, uma classe que permite que
outros componentes sejam adicionados a ela (como uma fila). No exemplo, o container ser o res-
ponsvel por abrigar todos os prximos exemplos (que sero criados a partir da classe JPanel).
Sendo assim, o objeto contentPane vai abrigar objetos do tipo JPanel.
ff Linhas 7 a 9: contm as classes necessrias para a criao do menu j abordadas anteriormente.
ff Linha 19: cria o objeto contentPane que, como j dissemos, abrigar todos os exemplos seguintes.
ff Linha 22: usando o mtodo setMnemonic, define uma tecla de acesso rpido ao menu. Teclando
ALT + A, o menu Arquivo fica disponvel ao usurio. O mesmo ocorre na linha 24 para o menu
Exemplos (ALT + E).
ff Linha 25: cria o objeto miSair com um texto e um cone (uma imagem). Assim como o texto, esse
cone tambm ser adicionado ao menu Sair. Observe que o arquivo do cone deve estar armaze-
nado na mesma pasta da classe Java.
ff Linhas 26 a 27: definem um menu de atalho para o item Sair por meio do mtodo setAccelerator.
Para acionar essa opo do menu o usurio pode pressionar a sequncia ALT + S. Observe que o
mtodo setAccelerator possui um objetivo diferente do mtodo setMnemonic.
ff Linha 28: cria o item de menu miBotao.
ff Linhas 29 a 30: adicionam os itens de menu aos menus correspondentes.
ff Linhas 31 a 32: adicionam os menus mnArquivo e mnExemplos barra de menus.
ff Linha 33: define o objeto mnBarra como sendo a barra de menus do frame.
ff Linhas 37 a 41: definem o evento clique para o item de menu miSair. Quando o usurio escolher
essa opo, a aplicao ser encerrada (linha 39). A estrutura do cdigo exatamente a mesma
que foi usada na criao de eventos para os botes do Exemplo 8.1.
ff Linhas 43 a 47: definem o evento clique para o item de menu miBotao. O cdigo para esse
evento ainda aparece somente com o comentrio; ele ser feito aps elaborarmos o Exemplo
8.3. Dessa forma, esse item de menu ser o responsvel por carregar a aplicao referente ao
Exemplo 8.3 que faremos em seguida.
ff Linhas 50 a 57: implementam o mtodo esttico abrir, responsvel por criar um objeto do tipo
GuiMenuPrincipal e mostr-lo na tela. O cdigo praticamente o mesmo do Exemplo 8.1 (linhas
67 a 72).
A Figura 8.3 apresenta a tela de execuo do Exemplo 8.2.
146
Um boto pode conter texto e/ou uma imagem associada. Para adicionar uma imagem a um boto
usada a classe ImageIcon. Para criar um objeto do tipo ImageIcon a sintaxe :
ImageIcon <nome do objeto> = new ImageIcon(<Caminho e nome da imagem a ser inserida>)
Para definir o caminho da imagem, deve ser utilizada a barra normal (/). A barra invertida (\) con-
siderada caractere reservado. Depois de criado o objeto que armazena a imagem, ele deve ser inserido
no JButton.
A Tabela 8.5 apresenta a lista de mtodos definidos para a interface MouseListener, usada no
Exemplo 8.3, e descreve em que momento cada mtodo invocado.
Tabela 8.5 Mtodos da interface MouseListener
O Exemplo 8.3 utiliza dois botes e faz uma brincadeira para demonstrar o uso de alguns even-
tos. O boto Mostrar apenas apresenta uma mensagem em tela, j o boto Teimoso muda de posio
quando o usurio tenta pression-lo. Bem, vamos ver o que existe de diferente nesse exemplo.
Funcionalidades comentadas do Exemplo 8.3:
ff Linha 4: a classe GuiBotoes um painel, j que estende (herana) a classe JPanel.
ff Linha 6: contm a declarao do objeto imageIcon1 que armazenar uma imagem.
ff Linha 15: contm a criao do objeto imageIcon1 com a imagem java.jpg. Observa-se que essa
imagem precisa estar na mesma pasta de nosso exemplo, ou deve ser indicado seu caminho (por
exemplo: c:/livro/java8/java.jpg).
ff Linha 16: cria o boto btMensagem contendo o texto e a imagem associada.
ff Linha 18: contm o mtodo setMnemonic j usado em itens de menu. O objetivo o mesmo, isto
, permitir que o usurio pressione ALT + M para acionar o boto.
ff Linha 19: contm o mtodo setToolTipText que define uma frase a ser mostrada em tela quando
o ponteiro do mouse estacionar sobre o boto btMensagem. Em outras linguagens essa proprie-
dade chamada de Hint.
ff Linhas 27 a 31: definem o evento de ao para o boto btMensagem, como j apresentado ante-
riormente.
ff Linhas 33 a 37: definem o evento de ao para o boto btTeimoso. Observa-se que o usurio no
conseguir fazer o cdigo referente a esse evento em funo dos outros mtodos implementados
para esse boto. Veja os comentrios seguintes.
ff Linhas 39 a 49: definem todos os mtodos especificados pela interface MouseListener para
o boto btTeimoso. Observe que essa interface exige a presena dos cinco mtodos, mesmo
que eles no sejam usados. Como apresentado na Tabela 8.5, cada mtodo acionado em fun-
o das aes do usurio. Neste caso, foram implementados apenas os cdigos para os m-
todos mouseEntered e mouseExited. Quando o ponteiro do mouse entrar na rea do boto
btTeimoso, ser executado o mtodo mouseEntered e o posicionamento do boto ser mudado
no painel. O mesmo ocorre para o mtodo mouseExited quando o ponteiro do mouse deixar a
rea do boto. Dessa forma, o boto btTeimoso ficar pulando de cima para baixo ou de baixo
para cima e o usurio no conseguir clicar nele.
147
No se esquea de que este exemplo deve ser chamado a partir da classe GuiMenuPrincipal. Para
isso, voc deve adicionar o seguinte trecho de cdigo classe GuiMenuPrincipal, a partir da linha 45:
ff Linha 45: cria o objeto guiBotao a partir da classe GuiBotao, o Exemplo 8.3.
ff Linha 46: remove todos os objetos do container por meio do mtodo removeAll. Isso usado
para manter apenas o ltimo objeto armazenado no container.
148
Observao
Como dissemos anteriormente, todos os exemplos seguintes sero chamados a partir do menu principal.
No entanto, caso o leitor deseje executar cada exemplo de maneira independente, utilize a classe se-
guinte chamada CarregaFrame para testar cada um deles. Por exemplo, para testar o exemplo da classe
GuiBotao a classe ficaria da seguinte forma:
package cap08;
import javax.swing.JFrame;
public class CarregaFrame {
public static void main(String[] args){
JFrame frame = new JFrame (Uso de Botes);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add (new GuiBotao());
frame.setBounds(0,0,500,300);
frame.setVisible (true);
}
}
Seguindo esse modelo, alterando apenas o nome da classe destacada em negrito, todos os exemplos
seguintes neste captulo podem ser executados de maneira independente, sem a necessidade do menu
principal. Uma outra forma possvel seria incluir em cada um dos exemplos o mtodo main apresentado
anteriormente.
149
A Tabela 8.6 mostra um resumo dos mtodos mais utilizados da classe JCheckBox.
Tabela 8.6 Resumo dos mtodos da classe JCheckBox
Mtodo Funo
JCheckBox(String) Cria um checkbox com o texto especificado e com a opo no selecionada
Cria um checkbox com o texto e estado especificados com a seleo definida
JCheckBox(String, boolean)
em boolean (true ou false)
getStateChange() Obtm o estado do checkbox, retornando verdadeiro (true) ou falso (false)
setSelected(boolean) Especifica o estado do checkbox: true marca a caixa, false desmarca
150
Definidos os passos anteriores, o Exemplo 8.4 pode ser aberto por meio da classe GuiMenuPrincipal.
Observe o resultado da execuo na Figura 8.5.
Este exemplo pode ser chamado tambm a partir da classe CarregaFrame como descrito anterior-
mente.
151
A Tabela 8.7 mostra um resumo dos mtodos mais utilizados das classes JRadioButton e
ButtonGroup.
Tabela 8.7 Resumo dos mtodos das classes JRadioButton e ButtonGroup
Mtodo Funo
JRadioButton(String) Cria um boto de rdio com o texto especificado
Cria um boto de rdio com o texto especificado e com a
JRadioButton(String, boolean)
seleo definida (true ou false)
setSelected(boolean) Define se o boto est ou no selecionado (true ou false)
ButtonGroup() Cria um grupo para botes de rdio
<nome do grupo>.add() Adiciona cada boto de rdio a um determinado grupo
152
153
154
Mtodo Funo
JList() Cria uma caixa de seleo
getSelectedvalue() Obtm o texto do item selecionado
getSelectedIndex() Obtm o ndice do item selecionado
setSelectedIndex(int) Seleciona o ndice especificado
setSelectedInterval(int, int) Seleciona diversos ndices dentro do intervalo especificado
isSelectionEmpty() Verifica se existe algum item selecionado na lista, retornando verdadeiro ou falso
Verifica se o ndice especificado est selecionado, retornando verdadeiro ou
isSelectedIndex(int)
falso
O Exemplo 8.7 demonstra como criar uma lista seguindo os procedimentos anteriores. Neste
exemplo so usados os principais mtodos envolvidos com a manipulao de listas de seleo.
155
156
157
O prximo exemplo, 8.8, apresenta uma maneira diferente de manipular uma lista utilizando a
classe DefaultListModel. Alm disso, mostra como adicionar um evento para identificar o momento em
que o usurio selecionou um item da lista. Traz ainda uma maneira de criar um lbum de fotos aprovei-
tando-se dos recursos da classe JList.
A Tabela 8.9 mostra um resumo dos mtodos mais utilizados da classe DefaultListModel, que per-
mite declarar um objeto para armazenar itens de uma lista.
Tabela 8.9 Resumo dos mtodos da classe DefaultListModel
Mtodo Funo
addElement(String) Adiciona o texto como um novo item da lista
getSize() Obtm a quantidade total de itens da lista
remove(int) Remove o item do ndice especificado
158
No se esquea de que este exemplo deve ser chamado a partir da classe GuiMenuPrincipal. Para
isso, voc deve adicionar um item ao menu Exemplos da classe GuiMenuPrincipal. Se tiver dvidas,
consulte as explicaes finais do Exemplo 8.4.
Exemplo 8.8 A classe GuiListaComFotos
A Figura 8.9 demonstra o resultado da execuo do Exemplo 8.8. Ele apresenta uma lista com dez
opes de fotos. O usurio deve clicar numa opo, e cada uma delas abre uma foto diferente. Esse
exemplo pode ser chamado a partir da classe CarregaFrame ou da GuiMenuPrincipal. Para a segunda
opo, adicione um item ao menu Exemplos da classe GuiMenuPrincipal como descrito nas explica-
es finais do Exemplo 8.4.
159
Mtodo Funo
JComboBox(String) Cria uma caixa de seleo JComboBox com um array do tipo string
addItem(String) Adiciona o texto como um novo item
getSelectedItem() Obtm o texto do item selecionado
getItemCount() Obtm a quantidade total de itens
getSelectedIndex() Obtm o ndice do item selecionado
removeItemAt(int) Remove o item com o ndice especificado
removeAllItems() Remove todos os itens da lista
Observe o Exemplo 8.9, que demonstra como utilizar alguns mtodos da classe JComboBox.
Exemplo 8.9 Listagem da classe GuiCombo
160
Esprito Santo 0
Minas Gerais 1
Rio de Janeiro 2
So Paulo 3
em que:
ff String um texto inicial qualquer que pode ser definido para o objeto no momento de sua criao.
ff n de linhas iniciais um valor inteiro que especifica o nmero de linhas que a rea de texto
apresentar na tela, sem o uso de um painel de rolagem.
ff dimenso um valor inteiro que especifica a dimenso da rea de texto em nmero de carac-
teres, isto , o nmero de caracteres que cabe em uma linha na rea de texto. Essa definio no
tem muita importncia, pois na realidade o nmero de caracteres que uma linha pode conter est
relacionado diretamente ao tipo de caractere usado. Por exemplo, se o nmero de caracteres de
uma linha for definido para 40, ento cabem exatamente 40 caracteres W. Entretanto cabem 62
caracteres A e 156 caracteres I.
161
A Tabela 8.11 mostra um resumo dos mtodos mais utilizados da classe JTextArea.
Tabela 8.11 Resumo dos mtodos da classe JTextArea
Mtodo Funo
JTextArea(int,int) Cria uma rea de texto de acordo com o nmero de linhas e colunas especificadas
Cria uma rea de texto de acordo com o texto, o nmero de linhas e o nmero de colunas
JTextArea(String,int, int)
especificadas
insert(String, int) Insere a string especificada na posio indicada por uma varivel inteira
Substitui o texto fornecido na varivel string pelo texto contido entre as posies definidas
replaceRange(String, int, int)
(incio e fim)
setText(), getText(), setEditable() Mtodos da classe JTextComponent que funcionam da mesma forma que em JTextField
162
A Figura 8.11 demonstra os resultados obtidos com a execuo do Exemplo 8.10. O usurio digita
um texto qualquer na caixa de texto, e, ao pressionar a tecla ENTER, o texto digitado adicionado rea
de texto. Ao clicar na borracha, as caixas so limpas. Esse exemplo pode ser chamado a partir da classe
CarregaFrame ou da GuiMenuPrincipal. Para a segunda opo, adicione um item ao menu Exemplos
da classe GuiMenuPrincipal como descrito nas explicaes finais do Exemplo 8.4.
163
JOptionPane.showMessageDialog(Component,<mensagem>,<ttulo da mensagem>,<tipo de
mensagem>)
em que:
ff Component: refere-se a um objeto do tipo container que permite definir a posio da tela em que
a caixa de mensagem aparecer. Normalmente esse argumento deixado como null (default) para
que a mensagem aparea centralizada na tela.
ff Mensagem: a mensagem a ser apresentada ao usurio.
ff Ttulo da mensagem: o texto que aparece na barra de ttulo da janela da caixa de dilogo.
ff Tipo da mensagem: o cone que representa o tipo de mensagem apresentado ao usurio. A
Tabela 8.12 mostra as constantes da linguagem Java para definio dos cones a serem exibidos
na tela. Conforme veremos adiante, esses cones podem ser usados em outros mtodos, isto , em
outras caixas de dilogo.
Tabela 8.12 Tipos de mensagens/cones da caixa de dilogo
cone Comando
Pergunta QUESTION_MESSAGE
Informao INFORMATION_MESSAGE
Alerta WARNING_MESSAGE
Erro ERROR_MESSAGE
164
O Exemplo 8.11 demonstra a classe GuiDialogoMensagem que permite ao usurio escolher qual
tipo de cone deve aparecer na caixa de dilogo.
Exemplo 8.11 A classe GuiDialogoMensagem
165
A nica diferena entre essa sintaxe e a usada para a caixa de mensagem do Item 8.10.1 refere-se
ao parmetro <botes presentes> no qual so inseridos os botes que aparecero na caixa de dilogo.
O Exemplo 8.12 demonstra a classe GuiDialogoMensagem que permite ao usurio escolher quais bo-
tes ele deseja que apaream na caixa de dilogo.
166
167
ff Linha 38: verifica se o boto de rdio 1 est selecionado por meio do mtodo isSelected.
ff Linhas 39 a 41: definem que a caixa de dilogo conter os botes Yes e No por meio da constante
JOptionPane.YES_NO_OPTION. Observe que a varivel resp vai receber um nmero referente
ao boto que foi pressionado pelo usurio.
ff Linhas 42 a 50: idem aos anteriores, alterando os botes da caixa de dilogo.
ff Linha 51: apresenta uma caixa de dilogo com o nmero do boto que foi pressionado pelo usurio.
A Figura 8.13 demonstra os resultados obtidos com a execuo do Exemplo 8.12. Ele apre-
senta o uso de trs tipos de caixa de confirmao. Esse exemplo pode ser chamado a partir da classe
CarregaFrame ou da GuiMenuPrincipal. Para a segunda opo, adicione um item ao menu Exemplos
da classe GuiMenuPrincipal como descrito nas explicaes finais do Exemplo 8.4.
em que:
ff botes presentes: um tipo de caixa que utiliza as variveis YES_NO_OPTION, YES_NO_CANCEL_
OPTION ou OK_CANCEL_OPTION. Deve-se utilizar o 0 (zero) caso outros botes sejam utilizados no
lugar desses.
ff tipo de mensagem: uma varivel que se refere a uma pergunta, informao, alerta, erro ou defini-
da pelo usurio.
ff cone: um objeto do tipo ImageIcon a ser apresentado no lugar de um dos cones do argumento
anterior (<tipo de mensagem>). Se nenhum cone for usado, deve-se colocar a palavra null no lu-
gar desse argumento.
168
ff array de objetos: um array de objetos que contm os componentes ou outros objetos que
representam as escolhas na caixa de dilogo, caso YES_NO_OPTION, YES_NO_CANCEL_OPTION ou
OK_CANCEL_OPTION no sejam usados.
ff seleo padro: o objeto que representa a seleo padro, caso as opes YES_NO_OPTION,
YES_NO_CANCEL_OPTION ou OK_CANCEL_OPTION no sejam usadas.
O Exemplo 8.13 demonstra o uso da caixa de dilogo de opo que apresenta um cone e dois botes.
Exemplo 8.13 A classe GuiDialogoOpcao
169
em que:
ff Orientao: um valor inteiro que define se a barra de rolagem horizontal (0) ou vertical (1).
A orientao pode ser definida tambm pelas constantes JScrollBar.HORIZONTAL e JScrollBar.
VERTICAL.
ff Valor inicial: o valor inicial da barra de rolagem que deve ser do tipo inteiro, compreendido en-
tre os valores mximo e mnimo da barra de rolagem.
ff Intervalo do meio: um valor do tipo inteiro que define o incremento ou decremento do valor da
barra de rolagem quando o usurio clicar nessa rea.
ff Valor mnimo: define o valor inteiro mnimo da barra de rolagem.
ff Valor mximo: define o valor inteiro mximo da barra de rolagem.
A Tabela 8.13 mostra um resumo dos mtodos mais utilizados da classe JScrollBar.
Tabela 8.13 Resumo dos mtodos da classe JScrollBar
Mtodo Funo
JScrollBar(int,int,int,int,int) Cria uma barra de rolagem de acordo com os argumentos definidos
getMaximum() Obtm o mximo valor da barra de rolagem
getMinimum() Obtm o mnimo valor da barra de rolagem
(continua)
170
(continuao)
Mtodo Funo
Retorna o valor da orientao da barra de rolagem: 0 para
getOrientation()
JScrollBar.HORIZONTAL e 1 para JScrollBar.VERTICAL
getValue() Obtm o valor inteiro corrente da barra de rolagem
getUnitIncrement() Obtm o valor do incremento por meio das setas das extremidades
getBlockIncrement() Obtm o valor do incremento por intermdio do intervalo do meio
setMaximum(int) Determina o valor mximo da barra de rolagem
setMinimum(int) Determina o valor mnimo da barra de rolagem
setOrientation(int) Define o valor da orientao da barra de rolagem: vertical ou horizontal
setValue(int) Determina o valor corrente da barra de rolagem
setUnitIncrement(int) Determina o valor do incremento por meio das setas das extremidades
setBlockIncrement(int) Determina o valor do incremento por intermdio do intervalo do meio
O Exemplo 8.14 demonstra o uso da barra de rolagem, criando um pequeno conversor de polega-
das em centmetros.
Exemplo 8.14 A classe GuiBarraRolagem
171
172
Mtodo Funo
getMaximum() Obtm o mximo valor da barra de rolagem
getMinimum() Obtm o mnimo valor da barra de rolagem
getValue() Obtm o valor inteiro corrente da barra de rolagem
setMaximum(int) Determina o valor mximo da barra de rolagem
setMinimum(int) Determina o valor mnimo da barra de rolagem
setValue(int) Determina o valor corrente da barra de rolagem
173
A Figura 8.16 demonstra os resultados obtidos com a execuo do Exemplo 8.15, que apenas de-
monstra como aumentar e diminuir o valor da barra manualmente pressionando os botes. Na prtica,
deve ser usado um processo automtico que realiza um clculo do tempo restante de processamento e
incrementa a barra em funo disso. Esse exemplo pode ser chamado a partir da classe CarregaFrame
ou da GuiMenuPrincipal. Para a segunda opo, adicione um item ao menu Exemplos da classe
GuiMenuPrincipal como descrito nas explicaes finais do Exemplo 8.4.
8.13.1 FlowLayout
No gerenciador FlowLayout os componentes so inseridos da esquerda para a direita, isto , na or-
dem em que so adicionados pelo mtodo add. Quando no existe mais espao em uma linha, criada
outra linha abaixo dela, e esse critrio usado em todo o espao do componente. A distribuio dos
objetos por meio do FlowLayout pode ser comparada distribuio das palavras que um editor de texto
qualquer faz, isto , ao terminar o espao na linha, a palavra colocada na linha abaixo. Esse processo
feito automaticamente de acordo com o tamanho da janela do componente.
A Figura 8.17 apresenta trs fotos da mesma janela, que composta por seis botes distribudos de
acordo com o tamanho dela, afetando a distribuio dos componentes.
174
em que:
ff Alinhamento: refere-se ao alinhamento que os componentes assumiro no momento em que fo-
rem inseridos, podendo assumir os seguintes valores inteiros: 0=esquerda, 1=centralizado, 2=di-
reita. O alinhamento opcional e quando no especificado assume valor 0.
ff Espaamento_horizontal: refere-se distncia que ser dada entre os objetos inseridos na mes-
ma linha. O espaamento horizontal opcional e quando no especificado considerado com cin-
co unidades.
ff Espaamento_vertical: refere-se distncia que ser dada entre as linhas em que os objetos es-
to inseridos. O espaamento vertical opcional e quando no especificado considerado com
cinco unidades.
Assim, um layout pode ser criado para definir o espaamento que os objetos tero entre si na ja-
nela, da seguinte forma:
setLayout(new FlowLayout(1,20,40));
Com essa declarao, ser criado um layout de alinhamento centralizado, 20 unidades de espaa-
mento horizontal e 40 unidades de espaamento vertical. Observe na Figura 8.18 a disposio dos botes
usando os espaamentos, em comparao com a Figura 8.17, em que o espaamento no foi utilizado.
Mtodo Funo
175
8.13.2 GridLayout
O GridLayout um gerenciador que divide a janela num conjunto de clulas espalhadas numa grade
retangular, de maneira que todas elas possuam a mesma dimenso. Com o GridLayout uma janela pode
ser dividida em linhas e colunas de acordo com os argumentos especificados no momento de sua cria-
o. Os componentes so dispostos na ordem em que aparecem, sendo inseridos na grade da esquerda
para a direita e de cima para baixo. Os componentes adicionados grade so expandidos de forma a
ocuparem todo o espao da clula em que esto inseridos. Qualquer modificao no tamanho da janela
reflete automaticamente no tamanho dos componentes adicionados a ela, ou seja, os componentes so
redimensionados em funo da nova dimenso da janela.
A Figura 8.19 apresenta duas fotos da mesma janela, que composta por seis botes distribudos
em forma de uma grade de trs linhas por duas colunas. Observe como os botes so redimensionados
de acordo com o tamanho da janela.
A sintaxe utilizada para a definio do layout na forma de grade a seguinte:
em que:
ff Nmero de linhas: refere-se quantidade de linhas que a grade conter. Se no especificado,
assume valor 1.
ff Nmero de colunas: refere-se quantidade de colunas que a grade conter. Se no especificado,
assume valor 1.
ff Espaamento_horizontal e Espaamento_vertical: idem ao descrito para o gerenciador FlowLayout.
So parmetros opcionais. A Figura 8.20 apresenta a mesma grade da Figura 8.19, porm com es-
paamentos entre os objetos.
O gerenciador GridLayout indicado quando os objetos a serem inseridos precisam estar dispos-
tos em forma de linhas e colunas, geralmente alinhados. Nem todas as aplicaes utilizam objetos ali-
nhados, e, na maioria das vezes, o gerenciador GridLayout sozinho no uma boa opo, uma vez que
os objetos possuem tamanhos diferentes. Para melhorar o layout de uma aplicao, pode ser usada uma
combinao de diversos gerenciadores.
176
Mtodo Funo
GridLayout() Cria um layout com uma linha e uma coluna
GridLayout(int,int) Cria um layout com o nmero de linhas e colunas especificado
Cria um layout com o nmero de linhas e colunas especificado e
GridLayout(int,int,int,int)
com os espaamentos horizontal e vertical tambm especificados
8.13.3 BorderLayout
O BorderLayout um gerenciador que divide uma janela em cinco regies distintas: north (regio
superior), south (regio inferior), west (regio esquerda), east (regio direita) e center (regio cen-
tral). Diferentemente dos gerenciadores FlowLayout e GridLayout, a ordem em que os componentes
so inseridos irrelevante, uma vez que as regies so fixas. Em cada regio cabe apenas um com-
ponente, ou seja, apenas cinco componentes podem ser inseridos nesse layout. Caso outro compo-
nente seja inserido em uma regio j ocupada, o componente sobreposto. Da mesma forma que no
GridLayout, as regies do BorderLayout so redimensionadas de acordo com as dimenses da janela.
Veja a Figura 8.21.
A diviso de uma janela em apenas cinco regies parece uma desvantagem, porm cada compo-
nente adicionado pode ser um painel com seus componentes prprios, gerenciados por um layout pr-
prio. A sintaxe utilizada para a definio do layout na forma de regies a seguinte:
em que:
ff Espaamento_horizontal e Espaamento_vertical: idem ao descrito para os gerenciadores
FlowLayout e GridLayout. So parmetros opcionais.
Para a utilizao do BorderLayout existe uma pequena diferena em relao aos gerenciadores
anteriores: necessrio informar no mtodo add em qual regio o objeto ser inserido:
add(North, btSuperior);
add(South, btInferior);
add(West, btEsquerda);
add(East, btDireita);
add(Center, btCentro);
177
Outro ponto a ser observado com o uso do BorderLayout que nem todas as regies necessitam
ser preenchidas. possvel usar apenas as desejadas. Aquelas no usadas so consideradas pelo ge-
renciador uma regio nica que pode receber um componente qualquer. Observe a listagem a seguir:
add(North,btSuperior);
add(West,btEsquerda);
add(tfTexto);
Esse trecho utiliza apenas as regies superior e esquerda; as outras no so usadas. Dessa forma, o
objeto tfTexto (um campo texto) ocupa o restante do espao disponvel no layout, conforme apresenta
a Figura 8.22.
Mtodo Funo
BorderLayout() Cria um layout sem espaamento entre as regies
BorderLayout (int,int) Cria um layout com espaamento horizontal e vertical entre as regies
Mtodo Funo
JTabbedPane() Cria um painel vazio com as abas na parte superior
Cria um painel vazio com as abas na localizao fornecida: JTabbedPane.TOP
JTabbedPane(int) (superior), JTabbedPane.BOTTOM (inferior), JTabbedPane.LEFT (esquerda) ou
JTabbedPane.RIGHT (direita)
addTab(String, Component) Adiciona um componente com o ttulo da aba fornecido (no adiciona cone)
addTab(String, Icon,
Adiciona um componente contendo um ttulo e um cone
Component)
getSelectedIndex() Retorna um nmero inteiro referente ao ndice da aba atualmente selecionada
getTabCount() Retorna um nmero inteiro referente quantidade de abas existentes
(continua)
178
(continuao)
Mtodo Funo
remove(int) Remove a aba e o componente correspondentes ao ndice fornecido
removeAll() Remove todas as abas e seus componentes correspondentes de TabbledPane
setSelectedIndex(int) Seleciona a aba correspondente ao ndice fornecido
O Exemplo 8.16 demonstra a utilizao da classe JTabbedPane. Em cada aba aparece um painel que
utiliza um gerenciador de layout diferente.
Exemplo 8.16 A classe GuiAbas
179
ff Linhas 32 a 34: adicionam os painis painel1, painel2 e painel3 ao objeto tpAbas; cada aba
ter um ttulo diferente.
Este exemplo no possui nenhuma interao com o usurio, isto , no possui nenhum evento. Ele
foi construdo apenas com o objetivo de demonstrar o uso de abas e dos gerenciadores de layout.
A Figura 8.23 demonstra os resultados obtidos com a execuo do Exemplo 8.16. Ao clicar sobre
uma aba, aparece uma janela diferente, construda a partir de um gerenciador de layout diferente. Esse
exemplo pode ser chamado a partir da classe CarregaFrame ou da GuiMenuPrincipal. Para a segunda
opo, adicione um item ao menu Exemplos da classe GuiMenuPrincipal como descrito nas explica-
es finais do Exemplo 8.4.
Mtodo Funo
JInternalFrame() Cria um frame interno sem ttulo e sem nenhum boto
JInternalFrame(String) Cria um frame interno contendo um ttulo e sem nenhum boto
JInternalFrame(String, Cria um frame interno contendo um ttulo e outras caractersticas depen-
boolean, boolean, boolean, dendo de cada varivel booleana ser true ou false. Na sequncia temos:
boolean) redimensionamento, boto fechar, boto maximizar e minimizar
setClosable(boolean) Define se o frame interno pode ser fechado pelo usurio
setIconifiable(boolean) Define se o frame interno pode ser minimizado pelo usurio
setMaximizable(boolean) Define se o frame interno pode ser maximizado pelo usurio
setResizable(boolean) Define se o frame interno pode ser redimensionado
show() Torna o frame interno visvel, o mesmo que setVisible(true)
Um frame interno deve ser adicionado a um container. Para um melhor desempenho deve ser
usada a classe JDesktopPane. Como nosso menu principal (a classe GuiMenuPrincipal do Exemplo 8.2)
no utiliza o container JDesktopPane, necessrio realizar algumas modificaes. Faa o seguinte no
Exemplo 8.2:
180
Com essas alteraes voc pode carregar o Exemplo 8.17 da mesma forma que nos exemplos ante-
riores. Sem essas alteraes, no seria possvel maximizar e minimizar o frame interno.
Exemplo 8.17 A classe GuiFrameInterno
181
Mtodo Funo
Cria uma tabela contendo um determinado nmero de linhas e colunas fornecidas com
JTable(int, int)
clulas vazias e usando o DefaultTableModel
JTable(TableModel) Cria uma tabela a partir do TableModel fornecido
getColumnCount() Retorna um nmero inteiro referente ao nmero de colunas existentes
getColumnName(int) Retorna uma string referente ao nome da coluna cujo nmero foi fornecido
getRowCount() Retorna um nmero inteiro referente ao nmero de linhas existentes
getSelectedColumns() Retorna um array de inteiros contendo os ndices de todas as colunas selecionadas
getSelectedRows() Retorna um array de inteiros contendo os ndices de todas as linhas selecionadas
getValueAt(int, int) Retorna um objeto com o contedo da clula cujas linha e coluna foram fornecidas
selectAll() Seleciona todas as linhas, colunas e clulas da tabela
setValueAt(Object, int, int) Define um valor presente em Object para a clula cujas linha e coluna so fornecidas
Como o Exemplo 8.18 relativamente extenso, vamos dividi-lo em partes para facilitar a com-
preenso. A Listagem 1 apresenta apenas as declaraes da classe GuiPedido.
Exemplo 8.18 A classe GuiPedido (Listagem 1: linhas 1 a 15)
182
ff Linha 15: declara e cria o objeto df da classe DecimalFormat com a formatao #,###.00 que
ser aplicada a valores monetrios usados no exemplo.
Obviamente, ainda no possvel compilar e executar a classe GuiPedido. Vamos prosseguir o
exemplo. A Listagem 2 apresenta o mtodo construtor e parte do mtodo inicializarComponentes.
Exemplo 8.18 A classe GuiPedido (Listagem 2: linhas 16 a 37)
183
184
185
186
187
Ufa, finalmente terminamos o Exemplo 8.18. Mesmo assim, preciso dizer que ele pode ser melho-
rado. O objetivo foi apresentar uma tela bsica para emisso de pedidos, mas muita coisa ainda pode ser
alterada para melhorar o funcionamento. Cabe ao leitor incrementar o exemplo.
A Figura 8.25 demonstra os resultados obtidos com a execuo do Exemplo 8.18. Ele pode ser cha-
mado a partir da classe CarregaFrame ou da GuiMenuPrincipal. Para a segunda opo, adicione um item
ao menu Exemplos da classe GuiMenuPrincipal como descrito nas explicaes finais do Exemplo 8.4.
Para realizar um pedido, inicialmente o usurio preenche Nmero do Pedido, Produto, Quantidade,
o PrecoUnitario e pressiona o boto Adicionar. O item adicionado grade. Para adicionar um novo
item, basta preencher os dados e pressionar o boto Adicionar novamente. Para remover um ou vrios
itens, o usurio seleciona as linhas e pressiona o boto Remover. Como dissemos, outras funcionalida-
des poderiam ser adicionadas, como, por exemplo, armazenar os dados em banco de dados ou criar um
arquivo texto com os dados do pedido, mas isso assunto de outro captulo.
188
O caractere # indica que o usurio pode fornecer um dgito numrico; outros caracteres so blo-
queados. A classe MaskFormatter apenas cria uma mscara que ser utilizada por outra classe, no caso a
classe JFormattedTextField. Como o nome sugere, JFormattedTextField gera uma caixa de texto forma-
tada, isto , que suporta o uso de mscaras. Podemos criar um JFormattedTextField da seguinte forma:
Observe que a caixa tfCep foi criada usando a formatao definida em msCep, ou seja, no momento
da digitao o usurio pode digitar apenas os valores numricos contidos no CEP. Os outros caracteres
presentes na mscara permanecero constantes.
A Tabela 8.21 mostra um resumo dos mtodos mais utilizados da classe JFormattedTextField.
Mtodo Funo
setValue() Define o valor a ser formatado, de acordo com o padro atual de formatao
isEditValid() Retorna true se o valor atual que est sendo editado vlido
Para exemplificar, vamos desenvolver uma aplicao que possui quatro campos (CPF, CNPJ, tele-
fone e CEP) com mscaras diferentes. Observe o Exemplo 8.19.
Funcionalidades comentadas do Exemplo 8.19:
ff Linha 5: importa a classe MaskFormatter do pacote javax.swing.text.
ff Linha 8: declara os objetos tfCpf, tfCnpj, tfTel, tfCep como sendo do tipo JFormattedTextField.
ff Linha 9: declara os objetos msCpf, msCnpj, msTel, msCep como sendo do tipo MaskFormatter.
ff Linha 19 a 22: cria as mscaras msCpf, msCnpj, msTel, msCep contendo suas formataes:
###.###.###-## para CPF, ##.###.###/####-## para CNPJ, (##)####-#### para telefone e
##.###-### para CEP.
ff Linhas 27, 31, 35 e 39: cria as caixas de texto com suas respectivas mscaras.
ff Linhas 58 a 70: definem o cdigo referente ao evento clique sobre o boto btMostrar. Ao clicar
no boto, aparecem o contedo das caixas formatadas e tambm o contedo referente ao CNPJ
apenas com caracteres numricos.
ff Linhas 65 a 67: apresentam uma maneira de retirar todos os caracteres no numricos presentes
no contedo do CNPJ, substituindo-os por vazio.
189
190
A Figura 8.26 demonstra os resultados obtidos com a execuo do Exemplo 8.19. Ele pode ser cha-
mado a partir da classe CarregaFrame ou da GuiMenuPrincipal. Para a segunda opo, adicione um item
ao menu Exemplos da classe GuiMenuPrincipal como descrito nas explicaes finais do Exemplo 8.4.
Este captulo apresentou os principais componentes visuais utilizados na criao de interfaces gr-
ficas. Espera-se que o leitor tenha uma boa base para desenvolver e aprimorar suas aplicaes.
1. Faa uma classe contendo um painel que desenhe um tabuleiro de xadrez de acordo com a Figura
8.27. Para isso, divida o painel em 8 x 8 por meio de GriLayout. Teste esse painel usando a classe
CarregaFrame apresentada neste captulo.
2. Faa uma classe contendo um painel que apresenta um combo com nomes de cinco pases dife-
rentes. Assim que o usurio selecionar em uma opo do combo, devem aparecer a foto da ban-
deira correspondente e o nome do continente em que o pas se localiza. Observe a Figura 8.28.
Teste esse painel usando a classe CarregaFrame apresentada neste captulo.
191
3. Crie uma classe que simule vendas contendo trs formas de pagamento, de acordo com o apre-
sentado pela Figura 8.29. O usurio entra com um valor, escolhe a forma de pagamento, e o cl-
culo do preo final realizado conforme os seguintes critrios: para pagamento em dinheiro,
desconto de 5%; para pagamento em cheque, acrscimo de 5%; para pagamento com carto,
acrscimo de 10%.
4. C
rie uma classe contendo um painel que simule o cadastramento de pessoas, de acordo com o
apresentado pela Figura 8.30. O usurio digita o nome e endereo de uma pessoa, escolhe o sexo
e o estado civil atravs de componentes do tipo combo. Ao pressionar o boto Mostrar, todos os
dados cadastrados so copiados para um componente TextArea. Teste esse painel usando a classe
CarregaFrame apresentada neste captulo.
5. Crie uma classe contendo um frame que carrega os Exerccios 8.1 a 8.4 deste captulo, de acordo
com o apresentado pela Figura 8.31.
192
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.
Este captulo apresentou os principais aspectos envolvidos na criao de janelas por meio das classes do
pacote swing. Apesar de tornar o aprendizado mais interessante, uma vez que o ambiente visual moti-
va, existem mais detalhes que devem ser considerados na elaborao de uma aplicao profissional. Um
aspecto a ser observado na criao das interfaces do usurio refere-se aos eventos gerados pelo mouse
e pelo teclado. Este captulo abordou apenas alguns tipos de eventos, mas existem diversos outros que
devem ser levados em conta e merecem ateno. O prximo captulo descreve os principais eventos en-
volvidos na criao da interface grfica do usurio.
193
9
Controle de Eventos
9.1 Definio
No captulo anterior o leitor aprendeu a usar uma boa parte dos componentes disponveis para
a criao de GUI em Java. Apesar de todo o seu aspecto visual, apenas a distribuio dos objetos pela
janela no suficiente para criao de uma aplicao profissional. preciso ter o controle de todas
as aes que o usurio realize na janela. Este captulo torna a interface com o usurio mais receptiva,
reconhecendo diversos tipos de evento, no se limitando apenas ao simples clicar do mouse.
As classes do pacote swing tratam os eventos por meio de um conjunto de classes, chamadas
de receptores de evento. Esses receptores podem ser includos na maioria dos objetos usados nas
janelas da interface do usurio.
194
Evento Descrio
ActionListener Eventos de ao como o clique do mouse sobre um boto, conforme demonstrado at aqui
Eventos de ajuste gerados por um componente ajustado, por exemplo, quando o valor de uma
AdjustmentListener
barra de rolagem mudado
DocumentListener Evento para receber notificaes quando ocorre alguma mudana no documento
Eventos de foco, gerados quando um componente recebe ou perde o foco, por exemplo, quando
FocusListener
um campo texto recebe o foco
Eventos gerados quando o item selecionado de uma lista mudado, por exemplo,
ItemListener
quando o usurio escolhe um item de um componente List ou Combo
Refere-se aos eventos do teclado que ocorrem quando uma tecla pressionada,
KeyListener
quando solta etc.
Refere-se aos eventos gerados pelo mouse quando clicado, entra na rea de um
MouseListener
componente, sai da rea do componente etc.
MouseMotionListener Refere-se a eventos do mouse, gerados pela movimentao dele sobre um componente
WindowListener Refere-se a eventos de janela, gerados quando uma janela maximizada, minimizada etc.
Refere-se a qualquer componente de uma janela, gerado quando o componente se torna visvel,
ComponentListener oculto, movido ou redimensionado. Por exemplo, quando um boto redimensionado, ou quan-
do uma janela oculta
Existe mais de uma maneira de registrar eventos para um objeto. Vamos seguir o mesmo padro usado
at o momento nos exemplos do Captulo 8, isto , adicionar o mtodo receptor do evento a cada objeto
desejado. Por exemplo, para registrar um evento a uma caixa de texto, um cdigo possvel seria este:
Observe que o cdigo do evento executado quando o usurio pressiona a tecla ENTER sobre a
caixa de texto tfCaixa1.
195
addAdjustmentListener() JScrollBar
Toda vez que uma classe implementa as interfaces receptoras de eventos, torna-se necessrio
declarar os mtodos que realizaro o controle dos eventos. Da mesma forma que a interface
ActionListener exige a declarao do mtodo actionPerformed, cada interface exige a declarao de
seus mtodos. A Tabela 9.3 traz um resumo das interfaces e dos mtodos que devem ser declarados
quando forem implementados em uma classe.
Tabela 9.3 Mtodos das interfaces para controle de eventos
(continua)
196
(continuao)
Interface/Evento Mtodos a serem declarados Disparados quando
windowClosing A janela fechada
windowClosed Aps a janela ter sido fechada
windowActivated A janela ativada
WindowListener
windowDeactivated A janela desativada
WindowEvent
windowIconified A janela minimizada
windowDeiconified A janela restaurada
windowOpened A janela aberta
Os mtodos demonstrados na Tabela 9.3 so executados quando um evento ocorre. Para os even-
tos do mouse (MouseEvent) e do teclado (KeyEvent), existem mtodos que permitem verificar certas
caractersticas da gerao do evento. Por exemplo, possvel descobrir se foram dados um clique ou
dois cliques no mouse (duplo clique).
A seguir, so descritos os principais mtodos que atuam em conjunto com os eventos do mouse e
do teclado. A sintaxe para sua utilizao nome_do_evento.nome_do_mtodo.
Alguns mtodos relacionados ao evento do mouse (MouseEvent):
ff int getClickCount() retorna o nmero de vezes que o mouse foi clicado.
ff int getX() retorna a posio X do ponteiro do mouse sobre o componente.
ff int getY() retorna a posio Y do ponteiro do mouse sobre o componente.
ff boolean isPopupTrigger() retorna verdadeiro se o evento gerado pelo mouse causa a abertura
de um menu do tipo Popup.
ff boolean isAltDown() retorna verdadeiro se a tecla ALT estava pressionada quando o mouse foi
clicado.
ff boolean isControlDown() retorna verdadeiro se a tecla CTRL estava pressionada quando o
mouse foi clicado.
ff boolean isShiftDown() retorna verdadeiro se a tecla ALT estava pressionada quando o mouse
foi clicado.
Alguns mtodos relacionados ao evento do teclado (KeyEvent):
ff int getKeyChar() retorna o caractere associado com a tecla do evento.
ff int getKeyCode() retorna um nmero inteiro associado ao caractere gerado no evento.
ff boolean isAltDown(), boolean isControlDown() e boolean isShift Down() funciona da mesma
forma que o descrito para o evento do mouse.
Para ilustrar o tratamento de eventos do pacote swing, exibido um exemplo que implementa a
grande maioria dos eventos apresentados. A tela gerada pelo Exemplo 9.1 apresentada na Figura 9.1.
Voc pode interagir de diversas maneiras com a interface e visualizar o resultado na janela de prompt.
197
198
No Exemplo 9.1 existe uma srie de eventos implementados. Em termos de usurio, a aplicao
funciona da seguinte maneira:
ff Eventos da janela: quando a janela movida ou redimensionada, aparece uma mensagem corres-
pondente; caso a janela seja maximizada ou restaurada, duas mensagens so enviadas em tela. Se
a janela se tornar visvel ou oculta, uma nova mensagem tambm impressa.
199
ff Eventos do boto: quando o usurio movimenta o ponteiro do mouse sobre o boto, ocorrem di-
versos eventos: ao entrar na rea do boto, sua cor mudada para amarelo; ao sair, sua cor vol-
ta para cinza; ao se movimentar sobre o boto, aparecem as coordenadas X e Y da localizao do
ponteiro; o mesmo ocorre quando o mouse arrastado. Quando o mouse clicado sobre o boto
pela primeira vez, a cor da primeira caixa de texto mudada para vermelho.
ff Eventos da primeira caixa de texto: ao movimentar as setas direcionais, a janela movida e uma
mensagem apresentada.
ff Eventos da segunda caixa de texto: quando essa caixa recebe ou perde o foco, uma mensagem
enviada em tela. Quando um caractere digitado, removido ou alterado, uma mensagem corres-
pondente apresentada.
Funcionalidades comentadas do Exemplo 9.1:
ff Linha 9: define duas variveis contendo os valores do posicionamento inicial que a janela ter na
tela.
ff Linhas 13 a 25: implementam todos os eventos que podem ser tratados por uma janela. Os mto-
dos relativos a esses eventos esto descritos na Tabela 9.3.
ff Linhas 26 a 39: implementam outros eventos relativos janela, que verificam a movimentao da
janela pela tela.
ff Linha 40: contm o mtodo setUndecorated que retira a decorao (o estilo) da janela. Quando
esse mtodo definido como true, somente o miolo da janela fica visvel. As bordas, ttulo e bo-
tes desaparecem. Para entender melhor, comente a linha 41 e rode o exemplo novamente.
ff Linha 41: como o mtodo da linha anterior setUndecorated retirou o estilo da janela, o mtodo
setWindowDecorationStyle define o novo estilo. A constante usada no exemplo para definir o
estilo foi JRootPane.FRAME. Esse estilo corresponde ao padro usado pela JVM. Essa constan-
te gera uma janela no formato padro com os botes de minimizar, maximizar e encerrar. Outras
variaes podem ser alcanadas pelas constantes: NONE, COLOR_ CHOOSER_DIALOG, ERROR_
DIALOG, FILE_CHOOSER_DIALOG, INFORMATION_DIALOG, PLAIN_DIALOG, QUESTION_
DIALOG, WARNING_DIALOG. Modifique essas constantes no exemplo e verifique os resultados.
ff Linha 42: possui o mtodo setDefaultCloseOperation, responsvel por encerrar a aplicao quan-
do a janela for fechada. A constante usada foi EXIT_ON_CLOSE. Outras constantes que podem
ser usadas so: HIDE_ON_CLOSE (oculta a janela quando fechada), DO_NOTHING_ON_CLOSE
(no faz nada, apenas desativa o boto de encerramento) e DISPOSE_ON_CLOSE (a janela desa-
parece e os recursos usados pela classe so liberados).
ff Linhas 66 a 91: implementam o cdigo referente aos eventos MouseListener e MouseMotionLis-
tener. Diversos mtodos so implementados para permitir a interao do usurio por meio do
mouse. O cdigo presente nesses mtodos bastante simples e dispensa maiores comentrios.
Destaque para os mtodos mouseEntered e mouseExited disparados quando o mouse entra e sai
da rea do boto.
ff Linhas 92 a 107: adicionam o evento KeyListener ao campo tfCaixa1, isto , quando uma tecla for
pressionada sobre o campo tfCaixa1, os mtodos que controlam esse evento (keyPressed, keyRe-
leased e keyTyped) sero executados. No exemplo, foi implementado apenas o cdigo referente
ao mtodo keyPressed para controlar a movimentao da janela pela tela. O mtodo getKeyCode
permite identificar o cdigo da tecla pressionada. Observe que para cada tecla direcional pressio-
nada os valores da posio da janela so alterados.
ff Linha 104: contm o mtodo setLocation responsvel por definir a posio atual da janela em re-
lao tela. Toda vez que uma seta direcional for pressionada no teclado (estando com o foco em
tfCaixa1), a posio da janela ser atualizada.
ff Linhas 108 a 115: adicionam o evento FocusListener ao campo tfCaixa2, isto , quando tfCaixa2
receber ou perder o foco, os mtodos que controlam esse evento (focusGained e focusLost) so
disparados e uma mensagem enviada em tela.
200
ff Linhas 116 a 126: adicionam o evento DocumentListener ao campo tfCaixa2, isto , quando inseri-
do, removido ou modificado um caractere em tfCaixa2, os mtodos que controlam esse evento (in-
sertUpdate, removeUpdate e changedUpdate) so executados e uma mensagem enviada em tela.
1. Elabore um frame contedo uma caixa de texto que aceite a digitao de no mximo 10 caracteres.
Observe a Figura 9.2. Dica: voc pode fazer esse controle dentro do mtodo keyTyped do evento
KeyListener.
2. Faa um frame contendo um boto com fundo amarelo. Quando o ponteiro do mouse estiver so-
bre o boto, troque a cor de fundo do boto para laranja. Quando o ponteiro do mouse deixar a
rea do boto, volte para a cor original. Veja a Figura 9.3.
3. Faa um frame contendo um boto e uma imagem. Quando o ponteiro do mouse entrar no boto,
a imagem torna-se visvel. Quando o ponteiro do mouse sair da rea do boto, a imagem desapa-
rece. Veja a Figura 9.4.
4. Voc aprendeu que o mtodo setBounds permite definir o local onde um determinado objeto ser
alocado na tela. Faa um painel de tamanho 500 x 500 contendo dois botes, conforme demons-
tra a Figura 9.5. Ao pressionar o boto Mostrar, devem ser gerados dois nmeros randmicos
referentes s coordenadas x e y onde um cone deve aparecer na tela. Para cada vez que o boto
Mostrar for pressionado, a imagem deve aparecer numa posio diferente. O boto Ocultar
oculta a imagem.
201
5. Faa um frame contendo trs caixas de texto e um boto. O boto habilitado quando todas as
caixas de texto tiverem algum valor, caso contrrio o boto permanece desabilitado. Acompanhe
a Figura 9.6.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.
202
10
Manipulao de Data e Hora
A manipulao de data e hora interessante, pois, como a linguagem Java voltada Internet,
os recursos de data e hora devem ser suficientemente flexveis para permitir sua manipulao em
qualquer tipo de cultura nas mais diversas regies do globo, uma vez que cada regio pode possuir
formatos e caractersticas diferentes. Um bom sistema deve funcionar perfeitamente, sem que se-
jam necessrias correes ou adaptaes, em qualquer lugar do mundo, ou seja, um mesmo pro-
grama deve funcionar em qualquer lugar sem que seja necessrio mexer no cdigo. Por exemplo,
no calendrio usado em pases rabes a quantidade de dias de um ano diferente da do calendrio
brasileiro (de origem romana).
A manipulao de data e hora pode confundir at um profissional mais experiente em Java,
pois existem muitos detalhes envolvidos. Pelo fato de existir mais de uma dezena de classes dife-
rentes para a manipulao de datas e horas, ocorre a repetio de mtodos (com o mesmo nome)
em classes diferentes e que funcionam tambm de forma distinta. As classes disponveis para a
manipulao de data e hora pertencem a diversos pacotes diferentes. A Tabela 10.1 apresenta os
pacotes existentes at a verso 6 do Java. A verso 8 do Java trouxe diversas novidades que sero
apresentadas ao final do captulo. Por questes de compatibilidade com verses anteriores, diver-
sos exemplos deste captulo foram mantidos de acordo com verses anteriores do Java.
203
Tabela 10.1 Pacotes e classes para tratamento de data e hora at a verso 6 do Java
Pacote Classes
java.util Date, Calendar, GregorianCalendar, TimeZone, SimpleTimeZone
java.text DateFormat, SimpleDateFormat, FormatSymbols
java.sql Date, Time, Timestamp
Verifique na Tabela 10.1 que a classe Date existe em dois pacotes (util e sql), ambos com caracte-
rsticas e comportamentos diferentes. A seguir, acompanhe a utilizao das classes java.util.Date, java.
text.DateFormat, java.text.SimpleDateFormat e java.util.Calendar:
ff Date (do pacote util): representa um instante no tempo, sem levar em considerao sua represen-
tao ou localizao geogrfica, com preciso de milissegundos.
ff DateFormat: representa uma data com formato String de acordo com um determinado fuso hor-
rio e calendrio.
ff SimpleDateFormat: permite a especificao de diferentes formatos para a data.
ff Calendar: representa um instante no tempo de acordo com um sistema particular de calendrio e
fuso horrio.
Para declarar e inicializar um objeto do tipo data, a sintaxe pode ser:
Como voc j sabe, o compilador compreende que data ser um objeto declarado a partir da classe
Date e, no caso, indica que data ser inicializado com a data e hora atuais do sistema. Dessa forma, o
seguinte trecho de cdigo pode ser usado para apresentar todas as informaes em tela referentes
data e hora. Lembre-se de que, para usar a classe Date, necessrio usar import.java.util.Date.
Dissemos anteriormente que a classe Date representa um instante no tempo. Esse processo rea-
lizado pelo mtodo getTime. Para marcar o tempo, considerado o nmero de milissegundos decor-
ridos desde 1 de janeiro de 1970. Cada segundo possui 1.000 milissegundos, cada minuto possui 60
segundos, cada hora possui 60 minutos e cada dia possui 24 horas. Para saber o correspondente em
dias, basta multiplicar 1.000 x 60 x 60 x 24, ou seja, cada dia corresponde a 86.400.000 milissegundos.
Quando um objeto do tipo Date criado, o nmero de milissegundos decorridos desde 1970 arma-
zenado no objeto e pode ser retornado pelo mtodo getTime, que retorna um inteiro do tipo long, que
permite representar milissegundos decorridos por milhares de anos. Voc deve ter percebido que o uso
de getTime torna possvel realizar o clculo entre datas, bastando calcular a diferena entre os milis-
segundos. O Exemplo 10.1 apresenta algumas formas de utilizao do mtodo getTime da classe Date.
204
205
Observao
Apesar de o mtodo getTime poder ser usado para realizar clculos entre datas, ele pode gerar resul-
tados imprecisos, principalmente quando a diferena entre datas grande. No decorrer do captulo
apresentaremos outras formas de calcular a diferena entre datas. O mtodo getTime retorna um valor
negativo quando a data calculada for inferior ao ano de 1970.
206
207
As principais letras usadas para a criao de patterns esto na Tabela 10.4. A coluna Caractere
contm a letra que pode ser usada na construo do pattern, a coluna Descrio apresenta o signifi-
cado da utilizao da letra, a coluna Formato contm o tipo de dado retornado por cada letra e a coluna
Exemplo mostra um resultado tpico de utilizao das letras usadas no pattern.
Tabela 10.4 Caracteres usados em patterns para data e hora
As letras apresentadas na Tabela 10.4 permitem criar os mais diversos tipos de formatao, sejam
numricos ou textuais, dependendo da combinao de letras e das quantidades de cada letra usada.
Observe que uma simples alterao do caractere de minsculo para maisculo pode gerar um resultado
totalmente diferente. Existem muitas combinaes possveis no citadas aqui.
O prximo exemplo mostra a utilizao da classe SimpleDateFormat. Novamente lembramos que
voc deve usar como base o Exemplo 10.1. Edite a classe ManipulacaoDataHora, adicione a linha import
java.text.SimpleDateFormat e altere apenas o cdigo referente ao evento do boto btMostrar apresen-
tado na listagem do Exemplo 10.3 a seguir. Ento, salve a classe com outro nome para manter a original.
Exemplo 10.3 O uso do SimpleDateFormat
208
outros formatos, como DD (dia do ano), mm (minutos da hora), yy (ano com dois dgitos), SS
(milissegundos), EEE (dia da semana), MMM (ms por extenso) e outras variaes seguindo a
Tabela 10.3.
ff Linha 39: cria o objeto dateFormat do tipo DateFormat com o pattern definido na String formato.
ff Linha 41: formata o contedo do objeto dateFormat por meio do mtodo format. A formatao
aplicada depende do pattern usado na criao do objeto a partir da classe SimpleDateFormat.
A Figura 10.3 apresenta os resultados obtidos com a execuo do Exemplo 10.3.
209
(continuao)
Campo Descrio (em valores inteiros)
SECOND Segundos em relao ao minuto corrente
WEEK_OF_MONTH Semana em relao ao ms corrente (1 a 5)
WEEK_OF_YEAR Semana em relao ao ano corrente
YEAR Ano corrente
JANUARY, FEBRUARY, MARCH,
APRIL, MAY, JUNE, JULY, AUGUST,
Ms correspondente ao ano
SEPTEMBER, OCTOBER,
NOVEMBER, DECEMBER
MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, Dia correspondente semana
SATURDAY, SUNDAY
O prximo exemplo mostra a utilizao da classe Calendar. Novamente lembramos que voc deve
usar como base o Exemplo 10.1. Edite a classe ManipulacaoDataHora, adicione a linha import java.
util.Calendar e altere apenas o cdigo referente ao evento do boto btMostrar apresentado na lista-
gem do Exemplo 10.4 a seguir. Ento, salve a classe com outro nome para manter a original.
Exemplo 10.4 O uso da classe Calendar
210
ff Linhas 41 a 43: realizam os mesmos procedimentos descritos nas linhas 38 a 40, porm com a
hora do dia (HOUR_OF_DAY), o minuto da hora (MINUTE) e o segundo do minuto (SECOND).
ff Linha 44: armazena o dia da semana (DAY_OF_WEEK) na varivel diaDaSemana. Observe que
domingo corresponde ao valor 1, segunda, ao valor 2, sbado, ao valor 7 etc.
ff Linha 46: verifica se o dia da semana, recuperado na linha 44, corresponde a um final de semana
(SATURDAY ou SUNDAY).
A Figura 10.4 apresenta os resultados obtidos com a execuo do Exemplo 10.4.
O Exemplo 10.5 contm uma varivel com o nome hora (linha 40), usada para controlar a hora em
que o usurio acessa o aplicativo. Dependendo do horrio de acesso, verificado com a estrutura if else,
aparece uma mensagem na tela (boa madrugada, bom dia, boa tarde ou boa noite). O exemplo
tambm recupera a data e hora atuais, cuja explicao foi descrita nos exemplos anteriores.
A Tabela 10.7 mostra alguns mtodos da classe Calendar.
Tabela 10.7 Resumo dos mtodos da classe Calendar
211
(continuao)
Mtodo Funo Retorno
before(Object x) Idem ao anterior, porm verifica se o tempo anterior ao objeto boolean
clear() Zera o contedo de data e hora, armazenando 1 de janeiro de 1970 00:00:00 void
getFirstDayOfWeek() Fornece o primeiro dia da semana, dependendo da localidade int
getTime() Fornece o tempo corrente Date
getTimeMillis() Fornece o tempo corrente em milissegundos long
Funo aritmtica para objetos Date aplicando o efeito de rolagem de datas.
roll() void
Verifique maiores detalhes na Seo 10.5
toString() Fornece uma representao em formato String para a data armazenada String
212
Para resolver essas e diversas outras questes, a classe Calendar possui vrios mtodos, tais como
add() e roll(), cujo funcionamento discutido no Exemplo 10.6. Novamente lembramos que voc deve
usar como base o Exemplo 10.1. Edite a classe ManipulacaoDataHora, ento adicione a linha import
java.text.ParseException e altere apenas o cdigo referente ao evento do boto btMostrar apresen-
tado na listagem do Exemplo 10.6 a seguir. Ento, salve a classe com outro nome para manter a original.
Funcionalidades comentadas do Exemplo 10.6:
ff Como dissemos anteriormente, esse exemplo importa a classe ParseException. Como o nome su-
gere, trata-se de uma classe usada para controle de excees. O exemplo converte um tipo String
numa data. Esse processo de converso pode gerar erro caso a data tenha um formato inadequado.
ff Linhas 44, 46 e 53: realizam a converso de tipo String em tipo Date pelo mtodo parse da classe
DateFormat. Essa converso pode gerar erro. Por exemplo, se a String a ser convertida possuir o
contedo igual a 01@01/2015, com o sinal de arroba (@) no lugar da barra (/), ocorre erro, uma
vez que o caractere usado como separador de dia e ms est incorreto. Outros caracteres geram
o mesmo erro. Por outro lado, se o contedo fosse igual a 33/01/2015, apesar de no existir o
dia 33, os dias excedentes ao ms so adicionados automaticamente ao ms seguinte, fazendo
com que a data passe a ser 02/02/2015. Como janeiro tem 31 dias, restam 33-31 dias, isto ,
dois dias que sero adicionados data (31/01/2015 + 2 dias = 02/02/2015).
ff Linhas 45, 47, 54 e 55: ajustam os objetos do tipo Calendar com os valores inicializados nos objetos
do tipo Date, isto , com os valores de data e hora atribudos quando os objetos foram inicializados.
ff Linhas 48 e 49: utilizam o mtodo getTimeInMillis da classe Calendar, o qual retorna o nmero
(tipo long) de milissegundos decorridos desde 1970. Com isso a varivel diaData1 recebe o n-
mero de milissegundos decorridos de 1970 at a data 01/01/2015 e a varivel diaData2 re-
cebe o nmero de milissegundos decorridos de 1970 at a data 01/03/2015. Assim possvel
realizar o clculo entre as datas.
ff Linha 50: realiza o clculo da diferena de dias entre as duas datas, subtraindo a quantidade de
milissegundos armazenados nas duas datas e dividindo o resultado pelo nmero de milissegundos
de um dia. A linha 62 apresenta essa diferena na tela.
ff Linha 51: utiliza o mtodo add da classe Calendar, o qual possui dois parmetros, que so o
tipo de campo a ser manipulado e um valor inteiro que se refere quantidade a ser adicionada
(dependendo do tipo do primeiro parmetro). No exemplo, o primeiro parmetro (Calendar.
DAY_OF_YEAR) indica que o campo o dia do ano. J o segundo parmetro (30) determina que
sero acrescentados 30 dias data. Como o objeto calendario2 mantm internamente a data
01/03/2015 e foi determinado para acrescentar 30 dias, a nova data armazenada passa a ser
31/03/2015.
ff Linha 52: cria um objeto do tipo Date, chamado trinta, com o contedo de milissegundos arma-
zenados em calendario2, isto , a nova data armazenada no objeto calendario2 copiada para
o objeto trinta. A linha 63 apresenta a nova data na tela.
ff Linhas 56 e 57: utilizam os mtodos add e roll, cujo objetivo mostrar a diferena entre eles.
Ambos adicionam um dia data 31/12/2014. O mtodo add, conforme j apresentado, adiciona
um dia data, e o resultado 01/01/2015, como de se esperar. No entanto, o resultado obtido
com o mtodo roll 01/01/2014. Isso ocorre pelo fato de roll realizar o clculo sem considerar
os campos de maior grandeza. So exemplos: a hora tem maior grandeza que o minuto, o ano tem
maior grandeza que o ms e assim por diante. Como no exemplo o campo calculado foi DAY_OF_
YEAR (dia do ano), o campo de maior grandeza que este (no caso o ano) no levado em conside-
rao no clculo, fazendo com que o ano permanea inalterado.
ff Linhas 58 e 59: criam os objetos dia1 e dia2 do tipo Data a partir do contedo armazenado nos
objetos caledario1 e calendario2.
ff As linhas seguintes imprimem os dados na caixa de dilogo.
A Figura 10.5 apresenta os resultados obtidos com a execuo do Exemplo 10.6.
213
Classe Comentrios
DateTimeFormatter Permite realizar a formao de uma data a partir de caracteres padronizados e constantes predefinidas.
Representa a durao entre dois instantes (criados com a classe Instant). Com isso possvel mani-
Duration pular o perodo a partir de dois instantes, um inicial e um final. Em outras palavras, um objeto Duration
pode manipular a diferena entre dois instantes.
Representa um ponto instantneo na linha do tempo. Possui preciso de nanossegundos e
Instant 96 bits para armazenamento. Isso torna possvel armazenar centenas de vezes uma data equivalente
ao tempo de existncia do universo.
Representa campos de datas e contm mtodos que implementam aes comuns, normalmente utili-
LocalDate zadas nos sistemas. Suporta diversos tipos de clculos envolvendo datas, poupando o desenvolvedor
desse trabalho.
Representa uma hora sem time zone (fuso horrio).
LocalTime e Representa data e hora ao mesmo tempo. Isso torna possvel integrar data e hora num s objeto. Ao
alterar a hora de uma data, o sistema faz o clculo de horas corretamente, incrementando ou decre-
LocalDateTime
mentando no apenas o horrio, mas a data, se for necessrio. Por exemplo, se a data representada
for dia 11 e subtrairmos 48 horas, o sistema retorna o dia 9.
Representa um perodo de tempo qualquer, como, por exemplo, a durao de uma aula, de alguma
Period reunio. Alm da classe Period, existe uma classe para cada parte do perodo: Days, Minutes, Months,
Seconds, Weeks, Years.
ZonedDateTime Representa uma forma de armazenamento de data-hora com um fuso horrio. Usando essas classes
possvel, por exemplo, calcular o valor exato da durao de um voo entre um continente e outro
ZoneId considerando-se o fuso horrio.
No conjunto de classes presente em verses anteriores do Java, existe uma srie de problemas que
podem gerar resultados imprevisveis em determinadas condies, alm da necessidade de codificao
(por parte do desenvolvedor das aplicaes em Java) de diversas funes rotineiras para manipulao de
data e hora. Alm de corrigir esses problemas, o novo conjunto de classes busca trazer vrias facilidades.
Vamos apresentar algumas funcionalidades por meio do Exemplo 10.7. A primeira parte desse
exemplo utiliza a classe LocalDate para calcular a diferena entre duas datas. Na linha 8 armazenada
a data em que o piloto Ayrton Senna nasceu, j a linha 9 armazena a data de sua morte. Na linha 10
calculado o perodo decorrido entre essas duas datas por meio do mtodo between da classe Period.
As linhas 11 a 13 apresentam esse perodo decorrido em anos, meses e dias. Observe o resultado na
Figura 10.6.
214
A segunda parte do Exemplo 10.7 utiliza a classe DateTimeFormatter para realizar a formatao da
data por meio de um padro. A linha 14 cria esse padro, definindo dia/ms/ano hora:minutos:segundos.
A Tabela 10.4 contm a descrio de cada caractere que pode ser usado para definir o padro de for-
matao. Na linha 16 a classe LocalDateTime pega o valor atual da data e hora. Na Linha 16 a String
dataHora recebe o valor da data e hora formatado pelo objeto dtf criado na linha 14. Observe o resul-
tado na Figura 10.7.
A terceira parte do Exemplo 10.7 (linhas 18 a 22) faz o mesmo do trecho anterior, definindo o pa-
dro usado no Brasil para a formatao da data e hora. Para criar o padro de formatao (objeto dtf)
foi usado um estilo resumido (SHORT) para o pas definido na classe Locale. Observe o resultado na
Figura 10.8.
A quarta parte do Exemplo 10.7 (linhas 23 a 27) mostra como possvel adicionar uma quantidade
de dias a uma data qualquer. Na linha 23 criado um objeto do tipo LocalDate a partir da data atual do
sistema. A linha 24 cria um novo objeto do tipo LocalDate, definindo 10 dias a mais a partir da data ante-
rior por meio do mtodo plusDays. As linhas seguintes so iguais s que j comentamos anteriormente.
Observe o resultado na Figura 10.9.
A quinta parte do Exemplo 10.7 (linhas 28 a 32) mostra como possvel identificar o tempo de-
corrido de um processamento por meio da classe Instant. Na linha 28 armazenado o instante atual.
A linha 29 contm um lao de repetio com for que vai levar um certo tempo de processamento. Na
linha 30 armazenado o novo instante. Com isso ser possvel visualizar nas linhas 31 e 32 o instante de
tempo do primeiro e segundo objetos (inicio e fim) do tipo Instant. Observe o resultado na Figura 10.10.
215
1. Crie uma classe que imprima uma mensagem diferente em tela dependendo do horrio do dia.
Considere uma repartio pblica cujo atendimento entre 8h e 17h, de segunda a sexta-feira.
Quando estiver no horrio de atendimento, deve aparecer a mensagem estamos atendendo,
caso contrrio, expediente encerrado, de acordo com a Figura 10.13.
2. Elabore uma classe que mostre na tela a diferena em horas entre dois fusos horrios quaisquer,
conforme exibido na Figura 10.14.
216
3. Faa uma classe que receba uma data inicial, uma data final e mostre quantos anos, meses e dias
existem entre as duas datas fornecidas. Observe a Figura 10.15.
4. Um determinado banco precisa saber em quanto tempo seus clientes so atendidos a partir da
hora da chegada. Ao chegar ao banco, o cliente retira uma senha e sua hora registrada. Da mes-
ma forma, ao ser atendido armazenado o horrio. Faa uma classe que apresente em tela o hor-
rio de chegada, o de sada e a diferena decorrida em minutos. Observe a Figura 10.16.
5. Faa uma classe que receba o valor total de uma compra e a quantidade de parcelas (3, 6 ou 12).
Considerando que a primeira parcela sempre vista, emita em tela os vencimentos das parcelas
seguintes (a cada 30 dias) e o valor de cada parcela. O valor da parcela ser o valor total dividido
pela quantidade de parcelas.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.
217
Este captulo mostrou os mtodos para a manipulao de data e hora existentes em Java. O prximo
captulo destaca a manipulao de diretrios e a leitura e gravao de arquivos no formato texto, item
importante para muitas aplicaes.
218
11
Diretrios e Arquivos
11.1 Definio
A grande maioria das aplicaes necessita armazenar dados para manipul-los posterior-
mente. Na prtica, so poucas as aplicaes que se limitam a armazenar dados apenas na memria
durante o processo de execuo, pois eles precisam ser recuperados a qualquer momento. Por esse
motivo, devem ser usados os arquivos de dados, isto , um conjunto de dados armazenado em uma
memria secundria no voltil que pode ser recuperado pelo programa em qualquer instante.
Inmeras so as aplicaes para o armazenamento de dados, e sua utilizao praticamente obri-
gatria em qualquer site, salvo aqueles que so usados apenas para consulta de informaes. Para
a manipulao de arquivos, vamos utilizar classes do pacote java.io. Associado a isso, os arquivos
so armazenados em diretrios, pastas que permitem organizar arquivos e dados. Os dados podem
ser armazenados e recuperados pelo pacote java.io por intermdio de um sistema de comunica-
o denominado controle de fluxo (Stream), permitindo a manipulao de diferentes formatos de
arquivo, entre eles txt, dat, gif etc. Este captulo fornece alguns exemplos para o tratamento de
arquivos texto e as principais classes para manipular diretrios.
219
O Exemplo 11.1 apresenta o cdigo necessrio para criar o conjunto de pastas que aparece na
Figura 11.1.
Exemplo 11.1 A classe CriaDiretorio
220
para tal. Por causa disso, o mtodo mkdir (linha 7, por exemplo) retorna tipo booleano (verda-
deiro ou falso). Se esse mtodo retornar verdadeiro, a criao do diretrio foi bem-sucedida,
caso contrrio no foi.
221
222
Os Exemplos 11.4 e 11.5 demonstram o cdigo necessrio para a criao de um cadastro de pes-
soas, usando leitura e gravao em arquivo texto. O nome do arquivo a ser lido ou gravado ser formado
pelo cdigo da pessoa + .txt e ser armazenado numa pasta qualquer fornecida pelo usurio. Para
isso criaremos duas classes: a classe Pessoa, que mantm dados sobre a pessoa e realiza a leitura e
gravao desses dados, e a classe CadastroComArquivoTexto, um frame que realiza a interface com o
usurio. Vamos comear com a classe Pessoa.
Exemplo 11.4 A classe Pessoa
223
ff Linhas 16 e 17: contm o mtodo close responsvel por fechar o arquivo e o return respon-
svel por retornar os dados pesquisados, na forma de um objeto. A linha 18 trata a exceo
IOException gerada quando, por um motivo qualquer, no for possvel realizar a abertura do ar-
quivo. Provavelmente a exceo ocorrer quando o arquivo a ser aberto no for encontrado.
ff Linha 22: especifica o mtodo gravar Exemplo 11.5 A classe CadastroComArquivoTexto
que recebe o caminho do arquivo a (Listagem 1 linhas 1 a 61)
ser gravado (por meio do parmetro
path) e retorna um texto informando
o resultado final da execuo.
ff Linhas 24 a 27: so responsveis
por criar o diretrio especificado na
varivel path, caso este no exista,
como vimos em exemplos anteriores.
ff Linha 28: contm a classe PrintWriter
usada para criar o arquivo texto, cujo
nome o contedo da varivel path,
concatenada com o contedo da cai-
xa de texto tfCodigo, concatenado
com a extenso .txt. O arquivo a ser
criado controlado pelo objeto pw.
ff Linhas 29 a 31: o objeto pw reali-
za a gravao dos valores do cdigo,
nome e e-mail, cada um em uma linha
diferente do arquivo texto por meio
do mtodo println.
ff Linhas 32 e 33: contm os mtodos
flush e close responsveis por forar
a transferncia da memria para o
arquivo e por fechar o arquivo. A li-
nha 35 trata a exceo IOException
gerada quando, por um motivo qual-
quer, no for possvel realizar a gra-
vao do arquivo.
Em resumo, para o armazenamento
de dados em um arquivo texto, ne-
cessrio: 1) criar um arquivo de fluxo
para a sada de dados por meio da
classe PrintWriter; 2) gravar os da-
dos no arquivo por meio do mtodo
println; 3) fechar o arquivo gravado
por meio do mtodo close.
O Exemplo 11.5 a seguir, chamado
de CadastroComArquivoTexto, contm
um frame que ser usado como interface
do usurio. Por meio dele o usurio far
interao com a classe Pessoa de ma-
neira a permitir a leitura e gravao de
arquivos texto.
224
O frame do Exemplo 11.5 possui trs botes: um para abrir o arquivo texto, outro para gravar o
arquivo texto e outro para limpar o contedo das caixas de texto, conforme apresenta a Figura 11.2. Ao
pressionar o boto Gravar, o contedo das caixas de texto armazenado num arquivo cujo nome igual
ao cdigo da pessoa (mais a extenso .txt). Por padro, foi definida a pasta temp onde os arquivos sero
gravados ou lidos, mas outras pastas poderiam ser utilizadas. Dessa forma, cada pessoa cadastrada
armazenada num arquivo texto diferente, isto , a pessoa de cdigo 10 armazenada no arquivo 10.
txt, a pessoa de cdigo 15 armazenada no arquivo 15.txt e assim sucessivamente. Ao pressionar o
boto Abrir, ocorre o processo inverso, isto , o contedo armazenado no arquivo, cujo cdigo da pes-
soa deve ser fornecido pelo usurio, copiado para as caixas de texto. Ao pressionar o boto Limpar, o
contedo das caixas de texto tfCodigo, tfNome e tfEmail apagado.
225
Concentrar-nos-emos apenas nas funcionalidades associadas aos botes, visto que as referentes
criao do frame j foram comentadas em exemplos anteriores. As principais funcionalidades so:
ff Linha 9: declara um objeto do tipo Pessoa, nossa classe do exemplo 11.4 responsvel por ler e gra-
var o arquivo texto. A linha 52 realiza a criao do objeto pessoa. Esse objeto ser usado nos bo-
tes ler e gravar, por isso ele foi declarado e criado com escopo global da classe.
ff Linhas 64 a 73: realizam a validao das caixas de texto ao pressionar o boto Gravar. Todas as
caixas de texto precisam ter algum contedo, caso contrrio, uma mensagem enviada ao usu-
rio, indicando a obrigatoriedade do preenchimento.
ff Linhas 74 a 76: realizam a cpia do valor armazenado nas caixas de texto para os atributos cor-
respondentes ao objeto do tipo pessoa (codigo, nome e email). Isso necessrio, visto que o mto-
do gravar gera o arquivo texto a partir do estado atual do objeto, isto , a partir dos dados previa-
mente armazenados nos atributos do objeto.
ff Linha 77: chama a execuo do mtodo gravar da classe Pessoa, passando como parmetro o ca-
minho no qual o arquivo ser gerado. Por padro, definimos a pasta c:/temp. Como o mtodo gra-
var retorna um texto ao final de sua execuo, ento aparecer uma mensagem na tela para avisar
o usurio sobre o sucesso ou no da gravao.
ff Linha 83: solicita a digitao do cdigo da pessoa quando o usurio pressiona o boto Abrir. Em
nosso caso, ser solicitado o valor por meio de uma caixa de mensagem do tipo JOptionPane, mas
poderia ser diretamente por meio da caixa de texto j existente no prprio frame.
ff Linha 84: o objeto pessoa recebe o resultado da leitura do arquivo. Como j dissemos, esse re-
torno ser um objeto contendo os valores existentes no arquivo ou conter um valor nulo, caso o
cdigo da pessoa no seja encontrado.
ff O exemplo foi criado para gerar um arquivo novo para cada pessoa. Se voc gravar o mesmo cdi-
go duas vezes ele ser sobrescrito, pois a criao do segundo se sobrepe ao primeiro. Em deter-
minadas situaes ser necessrio acrescentar dados a um arquivo texto j existente, como em
um arquivo de log, por exemplo, em que as inseres so realizadas ao final do arquivo, processo
conhecido como append. O trecho seguinte mostra como possvel abrir um arquivo j existen-
te e adicionar contedo a ele. A diferena est no uso da classe FileWriter, que permite abrir um
arquivo j existente. Essa funcionalidade controlada pelo segundo argumento: quando ele est
true o arquivo apenas aberto, quando falso o arquivo recriado.
O Exemplo 11.6 a seguir apresenta uma aplicao que funciona como um editor de textos bem b-
sico. Ele realiza a leitura ou a gravao de um arquivo texto qualquer, escolhido pelo usurio por meio
da caixa de dilogo da classe FileDialog. Quando o usurio pressiona o boto Gravar ou Abrir, aparece
226
uma caixa de dilogo semelhante utilizada nos aplicativos do Windows. Com isso, torna-se possvel
escolher o arquivo que ser lido ou gravado pela aplicao. O cdigo do Exemplo 11.6 apresentado em
seguida, e a Figura 11.3 mostra o exemplo executado.
Exemplo 11.6 A classe EditorDeTexto (Listagem 1 linhas 1 a 52)
227
228
1. Crie um frame contendo uma caixa de texto e um boto, de acordo com a Figura 11.4.
Figura 11.4 Tela de execuo do Exerccio 11.1.
229
O usurio preenche o nome do amigo e pressiona o boto inserir. O nome do amigo adicionado
num arquivo texto chamado amigos.txt na pasta c:/meusamigos. Caso no exista, essa pasta deve
ser criada no momento da incluso do primeiro amigo.
2. Faa um frame que simule uma enquete sobre o aborto, conforme apresenta a Figura 11.5. O ttu-
lo do frame deve conter o texto Voc a favor do aborto?, com dois botes de rdio (Sim e No)
e um boto (Votar). Para cada voto computado, o arquivo texto deve ser atualizado. Considere
que a primeira linha do arquivo texto mantm a quantidade de votos sim e a segunda linha, a
quantidade de votos no. Dessa forma, o arquivo texto ter apenas duas linhas que sero atualiza-
das para cada voto computado.
Figura 11.5 Tela de execuo do Exerccio 11.2.
3. Faa uma classe para apurar os votos do arquivo do exerccio anterior, isto , que permita consul-
tar o resultado da enquete do exerccio anterior. Observe a Figura 11.6.
4. Considere que um arquivo texto contm diversas linhas (no sabemos sua quantidade) com valo-
res numricos inteiros. Faa uma classe que abra esse arquivo texto e apresente em tela a soma
de todos os valores existentes.
5. Faa uma classe que abra um arquivo texto qualquer e verifique se ele possui uma das seguintes
palavras: jogo, jogos, game e games. Caso exista alguma dessas palavras, apresente em tela uma
mensagem: esse arquivo provavelmente fala sobre jogos, caso contrrio emita a mensagem ne-
nhuma palavra encontrada no arquivo.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.
230
O prximo captulo demonstra como realizar a manipulao de banco de dados por meio de aplicaes.
No Captulo 13 aprenderemos a construo de aplicaes que rodam no servidor, tratam-se de pginas
em JSP (Java Server Pages). J o Captulo 14 encerra os estudos com a criao de Servlets no acesso a
banco de dados.
231
12
Manipulao de Banco de Dados com Java
12.1 Definio
A linguagem Java possui classes que permitem a conexo com um banco de dados, as quais
fazem parte do pacote JDBC (Java Database Connectivity), uma API (Aplication Program Interface)
que permite a comunicao com diversos Sistemas Gerenciadores de Bancos de Dados, como
Oracle, MySQL, SQL Server, PostgreSQL, entre outros. Existe tambm a possibilidade de se uti-
lizar um banco de dados relacional open source chamado Java DB, um banco criado a partir do
projeto Apache Derby. Independentemente do banco de dados usado, a linguagem padro para
manipulao dos dados a SQL (Structured Query Language).
Existe ainda a possibilidade de manipular bancos de dados por meio de frameworks, sem a
necessidade de conhecer a linguagem SQL. No entanto, o processo de instalao e configurao
desses ambientes nem sempre uma tarefa trivial, fato que pode gerar muitas dvidas aos leitores.
No momento, o framework mais difundido e usado o Hibernate, mas, devido simplicidade do
processo, vamos nos concentrar no uso da linguagem SQL para acessar o banco de dados.
Seja qual for o Sistema Gerenciador de Banco de Dados usado, so os seguintes os passos bsi-
cos necessrios para a manipulao de banco de dados por meio de uma aplicao:
1. A criao do banco de dados.
2. A incluso do driver a ser usado para a conexo ao banco de dados.
3. A definio do endereo (URL) da localizao do banco de dados que ser includo na aplicao.
4. A criao da aplicao Java propriamente dita para acessar os dados.
232
Para ilustrar todo o processo, ser criada uma pequena aplicao que realiza a leitura de uma ta-
bela armazenada no banco de dados MySQL. Neste ponto consideramos que o leitor j possui certo
conhecimento em banco de dados, envolvendo a criao e a manipulao de tabelas. Pode-se tambm
consultar o Apndice A, que contm informaes a respeito da criao do banco de dados usando o
MySQL. Os procedimentos so muito parecidos, mesmo considerando diferentes verses do MySQL.
Os procedimentos anteriores criaram um banco de dados com uma tabela vazia no MySQL. Esse
ser o banco de dados manipulado pela aplicao Java descrita no Item 12.4.
Observao
Para que seja possvel consultar os dados da tabela, obviamente o banco de dados deve ser preenchido,
isto , diversos filmes devem ser cadastrados. O leitor pode escolher entre cadastrar seus prprios filmes
ou acessar o site da Editora rica e realizar o download de um banco de dados no formato MySQL forne-
cido com este livro, que j possui milhares de filmes cadastrados. Para que o banco seja reconhecido em
seu MySQL, necessrio inseri-lo na pasta data, que armazena todas as bases de dados do MySQL. Em
nosso caso, o nome da pasta deve ser banco (esse nome ser usado em nossas classes veja a linha 8 do
Exemplo 12.2 e tambm a linha 6 do Exemplo 12.3). Dependendo do Sistema Operacional que voc es-
tiver utilizando, a pasta data do MySQL pode estar num local diferente. No Windows 7, por exemplo, o
endereo padro de sua localizao C:\ProgramData\MySQL\MySQL Server 5.6. Para saber a locali-
zao exata da pasta do MySQL, consulte o contedo da varivel datadir localizado no arquivo my.cnf
(por padro, esse arquivo est em C:\Arquivos de programas\MySQL\MySQL Server 5.6). No Windows
8 o endereo padro de sua localizao : C:\ProgramData\MySQL\MySQL Server 5.6.
233
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
ff No MySQL
Class.forName(com.mysql.jdbc.Driver);
ff No Oracle
Class.forName(oracle.jdbc.driver.OracleDriver);
Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);
Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);
ff No Sysbase
Class.forName(com.sybase.jdbc2.jdbc.SybDriver);
ff No PostgreSQL
Class.forName(org.postgresql.Driver);
ff No DB2/Neon
Class.forName(com.neon.jdbc.Driver);
234
235
mensagem de alerta (linha 17). Outros dados necessrios conexo so login e senha. No caso
do login, o padro do MySQL root, no entanto outros usurios podem ser inseridos no MySQL.
A senha definida no momento da instalao do MySQL e tambm pode ser diferente, dependen-
do do banco de dados. De qualquer forma, caso um (ou mais) desses trs valores (nome do banco,
login ou senha) esteja incorreto, gera o erro controlado na linha 16.
Caso a conexo seja realizada com sucesso na linha 10, a execuo do programa segue normal-
mente na linha 11, que envia a mensagem indicando o sucesso da conexo.
ff Linha 12: contm o mtodo close() que encerra a conexo criada.
O Exemplo 12.1 demonstrou apenas como estabelecer uma conexo com o banco de dados. O pr-
ximo passo realizar uma consulta ao banco de dados por intermdio de instrues SQL.
236
ff Linha 15: cria um objeto chamado resultSet a partir da interface ResultSet. Como o prprio nome
sugere, resultSet ser usado para armazenar o resultado gerado pelo script SQL por meio do m-
todo executeQuery. Pode-se dizer que o objeto resultSet armazena o resultado da ao efetuada
pelo script SQL. O script SQL significa: selecione (SELECT) os campos cdigo (codigo) e ttulo (ti-
tulo) da tabela de filmes (FROM Filmes) em que (WHERE) o cdigo do filme seja maior que 03120
(codigo > ?) e menor que 03140 (cdigo < ?) ordenados pelo cdigo do filme (ORDER BY codigo).
O resultado do script SQL armazenado no objeto resultSet com o formato de uma tabela con-
tendo linhas e colunas (registros), relativo tabela em que a consulta realizada. No caso, o obje-
to resultSet armazena registros referentes tabela de Filmes.
ff Linha 18: realiza a varredura de todos os registros armazenados no objeto resultSet usan-
do while(resultSet.next()), isto , o loop executado enquanto existirem registros no objeto
resultSet. Dessa forma, todos os registros do objeto resultSet so varridos e os dados armazena-
dos so recuperados pelo mtodo getString (linhas 19 e 20).
ff Linha 19: a String codigo recebe o contedo armazenado no atributo codigo da tabela de
Filmes pelo mtodo getString.
ff Linha 20: a String titulo recebe o contedo armazenado no atributo titulo da tabela de Filmes
pelo mtodo getString.
ff Apesar de a tabela de Filmes usada no exemplo possuir diversos atributos, apenas dois deles fo-
ram usados (codigo e titulo). Em uma aplicao que utiliza scripts em SQL existe essa flexibilidade,
em que o desenvolvedor passa a ter um leque de opes para a realizao de consultas.
Observe na Figura 12.1 a listagem de filmes obtida com a execuo do Exemplo 12.2.
237
238
239
da linha 7. Caso contrrio, isto , se houver falha na conexo, ele retorna false e executada a ins-
truo else da linha 27.
ff O restante das funcionalidades j foi explicado no Exemplo 12.2.
240
241
A seguir, veja alguns exemplos de script em SQL que podem ser digitados no ConsultaSQL e seus
resultados correspondentes, sempre se referindo tabela de Filmes do banco de dados, para que o
leitor possa compreender melhor os resultados apresentados.
ff Select * from filmes seleciona todos os campos (*) da tabela de Filmes.
ff Select * from filmes order by genero seleciona todos os campos (*) da tabela de Filmes, orde-
nados pelo gnero do filme.
ff Select titulo, genero from filmes where genero=AVENTURA seleciona os campos ttulo e g-
nero da tabela de Filmes de todos os filmes do gnero AVENTURA.
ff Select titulo from filmes where genero=COMEDIA seleciona os ttulos de todos os filmes do
gnero COMEDIA.
ff Select * from filmes where genero=INFANTIL or genero=DESENHO seleciona todos os
campos da tabela de Filmes em que o gnero seja INFANTIL ou DESENHO.
ff Select * from filmes where genero=DESENHO and year(datacompra)>1991 seleciona to-
dos os campos da tabela de Filmes em que o gnero seja DESENHO e o ano da data de compra
seja maior do que 1991.
ff Select * from filmes where datacompra > 1994-05-12 seleciona todos os campos da tabela
de Filmes em que a data de compra seja superior a 12-05-1994.
ff Select * from filmes where datacompra>1990-05-15 and datacompra < 1990-05-31
seleciona todos os campos da tabela de Filmes em que o filme tenha sido comprado na segunda
quinzena de maio de1990.
ff Select titulo, datacompra from filmes where month(datacompra)=10 seleciona o ttulo e a
data de compra dos filmes da tabela de Filmes em que o ms de compra seja outubro (10).
ff Select * from filmes where month(datacompra)=10 and day(datacompra)=4 seleciona todos
os campos da tabela de Filmes em que o dia de compra seja 4 de outubro.
ff Select codigo,titulo from filmes where titulo like Z% seleciona o cdigo e o ttulo dos filmes
da tabela de Filmes em que o ttulo do filme inicia com a letra Z.
ff Select codigo,titulo from filmes where titulo like %DAY% seleciona o cdigo e o ttulo dos
filmes da tabela de Filmes em que o ttulo do filme possua a palavra DAY em qualquer posio.
ff Select codigo,titulo from filmes order by titulo desc seleciona cdigo e ttulo dos filmes da
tabela de Filmes dispostos em ordem decrescente.
ff Select distinct titulo from filmes mostra todos os ttulos dos filmes sem repetio (distinct).
ResultSet rs = statement.executeQuery();
242
O objeto rs, criado a partir de ResultSet, recebe o resultado da execuo da instruo SQL, isto
, recebe todos os registros de uma determinada tabela selecionados por meio da instruo SQL. Alm
disso, rs suportar diversas operaes (mtodos), dentre as quais destacamos:
ff rs.first() posiciona o ponteiro no primeiro registro.
ff rs.last() posiciona o ponteiro no ltimo registro.
ff rs.next() coloca o ponteiro no prximo registro.
ff rs.previous() posiciona o ponteiro no registro anterior.
ff rs.absolute(5) coloca o ponteiro na quinta posio a partir do primeiro registro.
ff rs.absolute(-5) coloca o ponteiro na quinta posio anterior a partir do ltimo registro. Se o ob-
jeto rs tiver 100 linhas, o ponteiro posicionado na linha 96.
ff rs.relative(5) coloca o ponteiro na quinta posio posterior posio atual. Se o ponteiro esti-
ver na posio 10, ento relative(5) faz com que se posicione em 15.
ff rs.relative(-5) coloca o ponteiro na quinta posio anterior atual. Se o ponteiro estiver na posi-
o 15, ento relative(-5) faz com que ele se posicione em 10.
ff rs.beforeFirst() posiciona o ponteiro antes do incio do primeiro registro, ou seja, fora o pontei-
ro a se posicionar no incio do objeto, como se fosse o incio de um arquivo (BOF).
ff rs.afterLast() coloca o ponteiro depois do ltimo registro, ou seja, fora-o a se posicionar no fim
do objeto, como se fosse o fim de um arquivo (EOF).
ff rs.isBeforeFirst() usado para verificar se o ponteiro est no incio dos registros, como, por exem-
plo, if (rs.isBeforeFirst()).
ff rs.isAfterLast() usado para verificar se o ponteiro est no final dos registros, como, por exemplo,
if (rs.isAfterLast()).
Os exemplos anteriores deste captulo apresentaram o mtodo getString, responsvel por recupe-
rar um dado do tipo String armazenado no objeto ResultSet. Como existem diversos formatos de dados,
existem tambm vrios mtodos que podem ser usados de acordo com o tipo de dado armazenado. Os
mtodos so: getByte, getShort, getInt, getLong, getFloat, getDouble, getBigDecimal, getBoolean,
getString, getBytes, getDate, getTime, getTimestamp, getAsciiStream, getUnicodeStream, getBina-
ryStream, getObject. Cabe ao desenvolvedor escolher o tipo mais apropriado de acordo com o dado a
ser recuperado.
243
244
245
246
247
Filmes
- codigo : String
- titulo : String
- genero : String
- produtora : String
- dataCompra : String
<<usa>>
FilmesDAO
- statement: PreparedStatement
- resultSet: ResultSet
- men: String
GuiCadastroFilmes
- sql: String <<usa>>
+ INCLUSAO : int = 1
+ ALTERACAO : int = 2 + main (args:String[]):void
+ EXCLUSAO : int = 3
+ localizar() : boolean
+atualizar(operacao : int) : String <<usa>>
BD
+ connection : Connection
+ getConnection() : Boolean
+ close() : void
Ao rodar a aplicao, os campos aparecem em branco, os botes Novo e Localizar ficam disponveis
(habilitados) e os demais botes ficam indisponveis. Dependendo da ao executada, isto , do boto
pressionado, os botes assumem estados diferentes. Isso necessrio para restringir a ao do usu-
rio, dependendo do processo executado no momento. As diversas funes disponveis para o usurio
podem ser assim descritas:
ff Para localizar um determinado filme, o usurio digita o cdigo no campo correspondente e pres-
siona o boto Localizar. Caso o filme esteja cadastrado, ele apresentado automaticamente nas
caixas de texto do formulrio; caso contrrio, uma mensagem informa que o filme no foi encon-
trado no cadastro.
ff Para inserir um filme, o usurio pressiona o boto Novo para que os campos sejam limpos, digita
os dados sobre o filme nas caixas de texto e pressiona o boto Gravar.
ff Para cancelar qualquer operao, o usurio pode pressionar o boto Cancelar.
ff Para excluir um determinado filme, o usurio preenche a caixa de texto referente ao cdigo e
pressiona o boto Excluir.
ff Para atualizar os dados de um filme, o usurio localiza o filme desejado, altera os dados presentes
nas caixas de texto e pressiona o boto Alterar.
248
249
250
251
252
253
254
ff Linhas 74 a 79: definem o cdigo para o boto Sair. Esse trecho se encarrega de fechar a conexo
com o banco de dados (linha 76) e a aplicao (linha 77).
ff Linhas 80 a 85: definem o cdigo para o boto Novo. Esse trecho chama o mtodo limparCampos
(linha 82), responsvel por limpar o contedo das caixas de texto, e define o estado dos botes da
aplicao por meio do mtodo setBotoes (linha 83).
ff Linhas 86 a 90: indicam o cdigo para o boto Cancelar. Esse trecho se encarrega de chamar o
mtodo limparCampos e com isso cancelar qualquer operao realizada no momento.
ff Linhas 91 a 126: definem o cdigo para o boto Gravar. Esse trecho se encarrega de duas funes:
verificar se todos os campos da interface grfica esto preenchidos e gravar os dados na tabela
de Filmes. As linhas 92 a 117 fazem a validao dos campos. Caso algum deles no esteja preen-
chido, emitida uma mensagem e o foco atribudo caixa de texto correspondente. As linhas
118 a 122 se encarregam de copiar os contedos das caixas de texto da interface do usurio para
os atributos do objeto filme, que um dos atributos do objeto filmes. A linha 123 chama o m-
todo atualizar, indicando que uma incluso deve ser realizada a partir dos dados armazenados
no objeto filme. Essa mesma linha responsvel por imprimir uma mensagem em tela referente
ao resultado da incluso do filme, em seguida (linha 124) executado o mtodo limparCampos.
ff Linhas 127 a 137: definem o cdigo para o boto Alterar. Esse trecho se encarrega de atualizar a
tabela de Filmes a partir dos dados armazenados no objeto filme. As linhas 129 a 133 armaze-
nam o contedo das caixas de texto nos atributos do objeto filme. A linha 134 invoca o mtodo
atualizar e indica que deve ser realizada uma alterao na tabela de Filmes, em seguida (linha
135) executado o mtodo limparCampos.
ff Linhas 138 a 149: determinam o cdigo para o boto Excluir. Esse trecho se encarrega de excluir
um registro da tabela de Filmes a partir do contedo armazenado no atributo codigo do objeto
filme. emitida uma mensagem ao usurio (linhas 142 e 143) perguntando se ele realmente de-
seja excluir o registro. Se a resposta for positiva, o programa executa a operao de excluso pelo
mtodo atualizar (linha 145), em seguida (linha 146) executado o mtodo limparCampos.
ff Linhas 156 a 164: definem o cdigo para o mtodo limparCampos, que se encarrega de limpar ()
o contedo de todos os TextFields da interface grfica. A linha 162 solicita o foco para o TextField
tfCodigo e a linha 163 define o estado dos botes.
ff Linhas 165 a 178: indicam o cdigo para o mtodo atualizarCampos, que se encarrega de definir
o cdigo do filme a ser localizado a partir do contedo da caixa tfCodigo (linha 166), chamar o m-
todo localizar (linha 167) e copiar o contedo dos atributos do objeto filme para as caixas de tex-
to da interface grfica (linhas 168 a 172). Conforme citamos anteriormente, o mtodo localizar
da classe FilmesDAO localiza o filme no banco de dados e preenche o contedo do objeto a partir
do filme encontrado. A linha 173 redefine o estado dos botes.
ff Linhas 179 a 187: definem o cdigo para o mtodo setBotoes, que recebe seis parmetros do
tipo booleano para estabelecer o estado dos botes Novo, Localizar, Gravar, Alterar, Excluir e
Cancelar. Se o parmetro passado for true, o boto correspondente habilitado; se o parmetro
passado for false, o boto fica desabilitado.
Esse foi o exemplo mais complexo, todavia o mais bem elaborado apresentado at o momento. Ele
foi concebido numa arquitetura em camadas, uma maneira bastante atual de desenvolver software. A
arquitetura mais usada atualmente a MVC (Model View Controler). No temos como objetivo discutir
a arquitetura em camadas neste livro. De qualquer forma, importante que o leitor se conscientize
da importncia de desenvolver software com uma arquitetura similar apresentada no Exemplo 12.7.
1. Faa uma classe contendo um cadastro de usurio, seguindo os mesmos procedimentos apresen-
tados no Exemplo 12.7. Utilize os campos cdigo, nome, email. Voc deve seguir todos os passos
desde a criao do banco de dados. Veja a Figura 12.6.
255
2. Faa uma aplicao em Java que leia um arquivo texto no formato a seguir e adicione registros
tabela de usurio usada no Exerccio 1. A aplicao deve ler os usurios armazenados no arquivo e
gravar os registros na tabela de Usurio.
0001,Srgio Furgeri,user1@gmail.com
0002,Daniel Almeida,user2@gmail.com
0003,Lucas Ferreira,user3@gmail.com
0004,Ivone Medeiros,user4@gmail.com
3. Faa uma aplicao em Java que apresente em uma grade (use o JTable) a relao de usurios usa-
da nos exerccios deste captulo. Veja a Figura 12.7.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.
Este captulo abordou os procedimentos necessrios para a manipulao de banco de dados em Java por
meio de scripts SQL. Destacou tambm as tcnicas usadas para a manipulao de contedo e navegao
em registros. O prximo passo a criao de aplicaes que rodam no ambiente da Internet, isto , que
podem ser executadas a partir de um browser. Voc aprender o funcionamento bsico de pginas em JSP
e sua comunicao com formulrios em HTML
256
13
JSP - Java Server Pages
257
Para ilustrar as divises da estrutura existente numa pgina em JSP, observe a listagem do Exemplo
13.1. Vamos analisar o contedo:
ff Linha 1: contm o cabealho da pgina onde especificada a diretiva page e contm alguns atri-
butos: language: a linguagem utilizada, no caso java; contentType: o tipo de contedo da pgina
e a codificao utilizada. Por padro o charset ISO-8859-1 (latin 1), mas se voc substituir por
UTF-16, por exemplo, quando carregar a pgina ver os caracteres em formato chins. Portanto,
o charset se refere ao contedo de resposta que ser gerado pela pgina; pageEncoding: similar
ao anterior, porm se refere codificao utilizada na criao da pgina; existem ainda diversos
outros atributos usados com a diretiva page (import, session, buffer etc.). Se voc editar o arqui-
vo pelo NetBeans, notar que na linha 1 existe um cone de uma pequena lmpada que simboliza
uma especie de advertncia. Ele sugere que seja utilizado o charset windows-1252. No entanto,
em nossos exemplos optamos por manter o padro ISO.
ff Linha 2: define o incio da pgina em HTML, ou seja, os elementos seguintes sero considerados
de acordo com a especificao da HTML.
ff Linhas 3 a 6: definem o cabealho da pgina em HTML. A tag meta define o tipo de codificao
utilizada no documento HTML. A tag title define o ttulo da pgina que aparecer na barra de ttu-
lo do software navegador.
ff Linhas 7 a 15: definem o corpo do documento HTML. As linhas 9 a 14 delimitam o cdigo em JSP
inserido na pgina HTML. Observe que entre os caracteres <% e %> existe cdigo em Java. Esse
cdigo responsvel por gerar o contedo dinmico no momento em que a pgina for carregada.
No caso, ser gerada uma contagem de 1 a 10 por meio do lao for. A sintaxe exatamente a mes-
ma que estudamos em Java.
Exemplo 13.1 Uma pgina JSP
A Figura 13.1 apresenta o resultado da execuo da pgina. Como dissemos anteriormente, para
executar pginas em JSP necessria a existncia de um servidor Java. Por isso, voc ainda no conse-
guir visualizar a execuo deste exemplo. A seo a seguir descreve a instalao do Tomcat.
258
Tomcat j vem integrado (como ilustrado no Apndice B). Se voc estiver usando o NetBeans, o servi-
dor padro GlassFish (como mostrado no Apndice A). Para integrar o Tomcat ao NetBeans, consulte
a Seo 13.2.2. Se voc j tem experincia, poder usar o GlassFish mesmo, sem nenhum prejuzo. Se
esse for seu caso, poder pular para a Seo 13.3.
259
endereo IP do servidor local. Quando o servidor instalado, ele nomeia um endereo local com esse
nmero de IP. Em todas as aplicaes executadas neste captulo, um desses endereos deve ser utili-
zado. O 8080 o nmero da porta local de comunicao com o servidor. Da mesma forma que o ende-
reo IP, em todas as aplicaes executadas localmente esse nmero deve ser utilizado.
Se for necessrio parar o Tomcat, os passos so praticamente os mesmos da inicializao, isto ,
colocar o boto direito sobre o cone do Tomcat e selecionar Stop service.
ff Em Nome do Projeto insira java8. Se desejar escolher um novo caminho para armazenar o projeto,
basta clicar no boto Procurar... e selecionar a pasta desejada; caso contrrio, deixe o caminho pa-
dro e clique no boto Prximo.
260
ff Em servidor, caso no seja o Tomcat que esteja em uso, clique na seta e selecione Apache Tomcat
ou TomEE. Clique no boto finalizar. A Figura 13.4 ilustra esse processo.
Aps criado o projeto ser gerada a estrutura mostrada na Figura 13.5. Se voc criar o mesmo pro-
jeto pelo Eclipse, a estrutura ser praticamente a mesma.
261
Uma vez criado o arquivo, ao clicar sobre ele o cdigo ser apresentado na tela de edio da fer-
ramenta. Altere o cdigo de acordo com a listagem do Exemplo 13.2.
Exemplo 13.2 Vrios tamanhos de texto com a tag H
262
ff Linha 9: determina o incio do cdigo JSP por meio dos caracteres <%.
ff Linhas 10 a 12: define um lao for com a varivel i variando de 1 a 6. Carrega na tela a mensagem
Iniciando estudos JSP com a tag <h> variando de acordo com o valor de i, o que resulta na varia-
o do tamanho da frase cada vez que passar pelo lao (h1, h2 etc.).
ff Linha 13: encerra a declarao do cdigo JSP por meio dos caracteres %>.
Ao executar a pgina aparecer o resultado apresentado na Figura 13.8.
O Exemplo 13.3 demonstra como utilizar o atributo import em pginas JSP por meio da diretiva page.
O objetivo do exemplo pegar informaes sobre a data atual presente no servidor. Utilizando sua fer-
ramenta de desenvolvimento, adicione a pgina do Exemplo 13.3 ao projeto. A seguir, realize sua execuo.
Exemplo 13.3 Manipulao de data
263
Voc j percebeu que as pginas da Internet so bastante dinmicas. Por exemplo: voc pode criar
um site que emita uma mensagem diferente a cada perodo do dia. No exemplo a seguir, vamos usar a
classe Calendar apresentada no Captulo 10. Crie uma nova pgina JSP e adicione o import seguinte:
<%@page import=java.util.Calendar%>
Ento, digite o cdigo a seguir do Exemplo 13.4 a partir da tag <body> do documento HTML.
Exemplo 13.4 Uso da classe Calendar numa pgina JSP
264
teve uma noo de como o processo funciona. Na prtica, uma pgina JSP dificilmente funcionar so-
zinha, visto que ela hospedada num servidor para responder solicitaes provenientes de aplicaes
cliente, como uma pgina HTML, por exemplo. Esta seo apresenta a comunicao entre uma aplica-
o cliente (um formulrio) e uma aplicao servidora (a pgina em JSP).
265
266
Figura 13.12 Execuo do Exemplo 13.6 correspondente ao envio dos dados da Figura 13.11.
267
1. Se voc est seguindo os exemplos do livro, j deve ter criado o pacote cap13. Caso contrrio, crie
esse pacote em seu projeto.
2. Copie a classe BD no pacote cap13.
3. Copie o driver de conexo do MySQL na pasta Bibliotecas. No Eclipse na pasta WEB-INF/lib.
4. A estrutura do projeto deve estar conforme demonstra a Figura 13.13.
268
ff Linha 1: importa a classe BD.java presente no pacote cap13. Essa classe ser usada na pgina JSP.
ff Linha 12: declara e cria o objeto bd a partir da classe BD.
ff Linha 13: chama o mtodo getConnection para realizar a conexo ao banco de dados. Como j
dissemos, caso a conexo seja realizada com sucesso, o mtodo getConnection retorna true, o
que faz com que o comando condicional if seja verdadeiro e a execuo da pgina prossiga a partir
da linha 14. Caso contrrio, isto , se houver falha na conexo, ele retorna false e executada a
instruo else da linha 32.
ff Linha 14: cria o script em SQL que ser usado na consulta ao banco de dados e o armazena na
String sql. Nele usada a instruo distinct (titulo), que significa que a seleo vai retornar ape-
nas um ttulo do filme que corresponder aos critrios da pesquisa, caso o mesmo esteja duplicado
no banco de dados. Um ponto a observar o uso do caractere de interrogao (?), que ser substi-
tudo por um parmetro durante a execuo da pgina. A seguir vamos explicar melhor isso.
ff Linha 15: cria um objeto chamado statement a partir da interface PreparedStatement que possi-
bilita a execuo de um script SQL.
ff Linha 17: o parmetro usado no script em SQL (?) deve ser passado ao objeto statement por meio
de um mtodo apropriado. Existem diversos mtodos que podem ser usados, dependendo do
tipo de valor a ser enviado ao statement, por exemplo: setInt, setDouble, setString etc. Em nosso
caso, o parmetro do tipo String, j que o titulo da tabela de Filmes do tipo texto, isto , String.
Dessa forma, para passar um valor do tipo String deve ser usado o mtodo setString e assim por
diante. Na linha 17, usamos o contedo % amor % (referente ao contedo que ser colocado no
lugar do caractere de interrogao). Em SQL, o sinal de porcentagem se refere a um caractere co-
ringa (qualquer tipo de caractere). Dessa forma, o valor procurado no ttulo do filme pode iniciar
ou terminar com qualquer outra palavra, desde que possua internamente a palavra amor. Assim,
a instruo SQL definida na linha 15 ser transformada em SELECT distinct (titulo) FROM Filmes
WHERE titulo like % amor %.
ff Linha 18: cria um objeto chamado resultSet a partir da interface ResultSet. Como o prprio nome
sugere, resultSet ser usado para armazenar o resultado gerado pelo script SQL por meio do mto-
do executeQuery. Pode-se dizer que o objeto resultSet armazena o resultado da ao efetuada pelo
script SQL. O script SQL significa: selecione (SELECT) o campo ttulo de forma distinta (dintinct (ti-
tulo)), ou seja, sem repetio, da tabela de filmes (FROM Filmes) em que (WHERE) o titulo do filme
contenha a palavra amor % amor %. O resultado da execuo do script SQL armazenado no objeto
resultSet com o formato de uma tabela contendo linhas e colunas (registros), relativo tabela em que
a consulta realizada. No caso, o objeto resultSet armazena registros referentes tabela de Filmes.
ff Linha 21: realiza a varredura de todos os registros armazenados no objeto resultSet usando
while(resultSet.next()), isto , o loop executado enquanto existirem registros no objeto resultSet.
Dessa forma, todos os registros do objeto resultSet so varridos e os dados armazenados so recupe-
rados pelo mtodo getString (linha 22), e mostrados no browser pelo mtodo out.println (linha 23).
ff Apesar de a tabela de Filmes usada no exemplo possuir diversos atributos, apenas um deles foi
usado, o titulo.
A Figura 13.14 apresenta a execuo da pgina JSP do Exemplo 13.8.
269
1. Elabore uma pgina HTML e outra JSP. A pgina HTML envia dois nmeros e um operador mate-
mtico (+, -, * ou /) para a pgina JSP que realiza o clculo correspondente e apresenta a resposta
em tela. Veja a Figura 13.15.
2. Elabore uma pgina HTML contendo um formulrio de reclamaes dos moradores de uma cida-
de. O morador preenche o fomulrio contendo o endereo aproximado, seleciona o tipo de pro-
blema (buracos, praa, policiamento etc.) e a descrio do problema. Os dados so enviados a uma
pgina JSP que armazena esses dados num arquivo texto, juntamente com a data e a hora do en-
vio. A cada envio, a reclamao adicionada a esse arquivo, como se fosse um arquivo de log. Veja
a Figura 13.16.
270
3. Modifique o Exemplo 13.7 apresentado neste captulo. Crie um formulrio HTML em que o usu-
rio fornece as iniciais do ttulo do filme e envia a pgina JSP. Esta, por sua vez, apresenta em tela
apenas os filmes cujo ttulo seja semelhante ao fornecido pelo usurio. Veja a Figura 13.17.
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.
Este captulo abordou os procedimentos necessrios para a criao de aplicaes que rodam no ambiente
da Internet, isto , que podem ser executadas a partir de um browser. Para isso, utilizamos a manipulao
de arquivos .HTML e .JSP, abordando o uso de classes Java e sua interao com o JSP. O prximo passo
aprimorar os recursos do ambiente Web, realizando a manipulao de Servlets em Java. Voc aprender
a criao como criar e utilizar uma Servlet e ver suas relaes com JSP.
271
14
Criao de Servlets
14.1 Definio
Este captulo apresenta a utilizao de Servlets, mdulos de software compilados (objetos)
que ficam armazenados em um servidor Java. Esse nome em ingls significa Serv (Servidor) e let
(pequeno), ou seja, pequeno servidor. Como j dissemos, os servidores Java so referenciados tam-
bm como contineres de aplicaes Java. Da mesma forma que uma pgina em JSP, para que uma
Servlet seja executada, necessria a utilizao de um servidor Java. A Servlet uma classe em
Java que estende as funcionalidades de um servidor. Por esse motivo, ao criar uma Servlet deve ser
usado o mecanismo de herana por meio de extends HttpServlet.
Uma Servlet muito semelhante a uma pgina JSP. Quando uma pgina JSP carregada, ocorre
o processo de compilao no servidor. Esse processo transforma a pgina JSP em uma Servlet. Por
isso a grande semelhana entre Servlets e pginas JSP. Dessa forma, uma Servlet uma aplicao
em Java que recebe requisies de uma aplicao cliente e emite respostas de maneira dinmica.
Uma Servlet pode, por exemplo, ser responsvel por receber dados (parmetros) vindos de um
formulrio em HTML e atualizar um banco de dados. Antes do advento das Servlets, as aplicaes
que rodavam no lado do servidor eram as chamadas CGI (Common Gateway Interface). As Servlets
Java comearam a conquistar o mercado por causa de uma srie de vantagens sobre as aplicaes
CGI. Existem ainda outras aplicaes instaladas em servidores, desenvolvidas por outras lingua-
gens de programao, que desempenham papis semelhantes s Servlets Java. Assim como vimos
no captulo anterior, uma Servlet pode receber dados de uma pgina HTML.
272
273
ff Linha 46: Percebemos que essa linha contm um + no incio, nesse caso o contedo desse mtodo
no aparece. Para podermos visualiz-lo, basta clicarmos no + que todo o contedo ser apresen-
tado em tela. Vamos descrever os dois principais mtodos: doGet e doPost apresentados nas duas
listagens seguintes.
ff Linhas 56 a 59: implementam o mtodo doGet que recebe requisies provenientes de aplica-
es cliente, cuja transferncia de dados ocorre pelo mtodo GET. Num formulrio em HTML, por
exemplo, a sintaxe <form action=incluir.jsp method=GET> define que a transmisso dos dados
do formulrio ser realizada para a pgina incluir.jsp usando o mtodo GET. Nesse caso, portanto,
os dados enviados pelo formulrio seriam transferidos para o objeto request do mtodo doGet.
Quando voc envia os dados por meio do mtodo GET, na barra de endereo do software navega-
dor aparecem todos os valores enviados.
274
ff Linhas 70 a 73: implementam o mtodo doPost, uma forma mais confivel de passar informaes
para uma aplicao servidora, uma vez que, diferentemente do mtodo GET, os dados enviados
no aparecem na barra de endereos do software navegador. Ao transmitir uma senha, por exem-
plo, jamais pode ser usado o mtodo GET, isto , o mtodo POST deve ser escolhido. Num for-
mulrio em HTML, por exemplo, a sintaxe <form action=incluir.jsp method=POST> define que
a transmisso dos dados do formulrio ser realizada para a pgina incluir.jsp usando o mtodo
POST. Nesse caso, portanto, os dados enviados pelo formulrio seriam transferidos para o objeto
request do mtodo doPost.
Agora que o leitor j possui uma viso geral sobre Servlets, na seo a seguir vamos criar um cadas-
tro na Web, disponibilizandos as funes de incluso, alterao, excluso e busca. Para fins didticos,
cada funo ter uma Servlet separada.
14.4 C
adastro de filmes
com Servlets
Vamos criar diversos exemplos do tipo
cliente servidor. Para cada operao a ser re-
alizada no banco de dados (incluso, alterao
etc.) vamos construir um formulrio HTML
(aplicao cliente) e uma Servlet (a aplicao
servidora). Para que possamos testar as funcio-
nalidades de cada uma das Servlets, vamos criar
uma pgina HTML que utilize seus servios. A
Figura 14.1 apresenta um formulrio cuja lista- Figura 14.1 Formulrio de Incluso.
gem aparece no Exemplo 14.2.
275
Observe na linha 7 da listagem do Exemplo 14.2 que o atributo action da tag <form> aponta para
ServletFilmesInclusao, o nome da Servlet que receber os dados e armazenar no banco de dados.
Para criar a Servlet, repita o mesmo procedimento apresentado na Seo 14.3. Ao criar a Servlet, digite
ServletFilmesInclusao. Sua listagem aparece no Exemplo 14.3.
Exemplo 14.3 ServletFilmesInclusao.java
276
Agora que j finalizamos a Servlet para a incluso, nosso prximo passo ser criar um exemplo de
localizao de um filme que ser usado para permitir a alterao de dados. O usurio fornece o cdigo
do filme, pressiona o boto localizar e os dados do filme so apresentados num formulrio para alte-
rao. Vamos iniciar pelo formulrio em HTML. A Figura 14.3 apresenta um formulrio cuja listagem
aparece no Exemplo 14.4.
Repita o mesmo procedimento apresentado na Seo 14.3 e crie uma Servlet chamada
ServletFilmesLocaliza. A funo dessa Servlet ser localizar o filme e apresentar um formulrio con-
tendo os dados do filme e que permita a alterao dos dados. Como o cdigo do filme chave primria
da tabela Filmes, ele no poder ser alterado. Ao executar o exemplo, voc ver que o valor do cdigo
no aparecer disponvel para alterao. O cdigo da Servlet apresentado no Exemplo 14.5.
Funcionalidades comentadas do Exemplo 14.5:
ff Linhas 22 a 56: geram o formulrio com os dados do filme localizado. Na linhas 31 e 32 o filme a
ser localizado definido. Caso o filme seja localizado, os dados so apresentados num formul-
rio HTML construdo dinamicamente pela Servlet. Observe que o contedo de cada caixa de tex-
to definido por meio do atributo value. Este recebe os dados armazenados do filme localizado
e o contedo aparece na caixa de texto. Esse contedo proveniente do banco de dados, isto ,
corresponde aos dados do filme localizado. Os dados do filme aparecem numa tabela em HTML
construda pela Servlet. Caso o filme procurado no exista no banco de dados, a execuo da
Servlet salta para a linha 48 e uma mensagem correspondente emitida em tela.
277
ff Linha 33: define um campo do tipo hidden (oculto). Esse tipo de campo usado para transmitir in-
formaes para a aplicao servidora, sem que seja necessrio que o usurio visualize seus dados.
Para o servidor no existe diferena, pois seu contedo transmitido da mesma maneira que uma
caixa de texto comum.
ff Linha 54: apresenta um boto para nova busca, que permite carregar novamente o formulrio lo-
calizar.html.
ff Observe pela Figura 14.4 o resultado da execuo ao localizar o filme de cdigo 0120. Observe
que os campos podem ser atualizados (exceto o cdigo), e, ao pressionar o boto Salvar, os dados
sero enviados para ServletFilmesAlteracao, definida na linha 24 do formulrio gerado.
278
Nesse ponto temos o formulrio preparado para realizar a alterao, resta apenas criar a Servlet
que receber esses dados e far a atualizao no banco. Repita o mesmo procedimento apresentado
na Seo 14.3 e crie uma Servlet chamada ServletFilmesAltera (Exemplo 14.6). Observe que a Servlet
para alterao praticamente a mesma apresentada para a incluso. A nica diferena que a linha 33
solicita uma alterao, em vez de uma incluso.
Exemplo 14.6 ServletFilmesAlteracao.java
Nosso ltimo exemplo o que realiza a excluso de um filme. Os procedimentos so os mesmos dos
exemplos anteriores. Vamos apresentar o formulrio HTML, local em que o usurio fornece o cdigo do
filme que ser excludo. A Figura 14.5 apresenta um formulrio cuja listagem aparece no Exemplo 14.7.
279
Repita o mesmo procedimento apresentado na Seo 14.3 e crie uma Servlet chamada
ServletFilmesExcluso. Essa Servlet ser usada para excluir um filme. A listagem da Servlet aparece no
Exemplo 14.8. Novamente, os procedimentos implementados nessa Servlet so os mesmos descritos
anteriormente.
Exemplo 14.8 ServletFilmesExclusao.java
280
281
Vamos fornecer uma viso geral do conjunto de pastas e arquivos criados para que o leitor possa
entender o papel de cada elemento.
ff A pasta webapps a principal em que so armazenados todos os projetos (sites) do Tomcat.
Tambm possvel criar outra pasta para tal propsito.
ff A pasta java8 se refere ao caminho principal para acesso aos exemplos criados nos Captulos 13
e 14. Ela contm todos os arquivos necessrios ao funcionamento de nossos exemplos, com exce-
o do banco de dados que voc precisa ter criado em seu MySQL. Para carregar os arquivos, de-
vemos indicar esse caminho na URL do browser, por exemplo, http://localhost:8080/java8/incluir.
html. Veja que ela a primeira pasta a ser inserida na URL aps o endereo da porta.
ff A pasta WEB-INF contm as pastas lib e classes. Essa estrutura de pastas a mesma tanto
para o Eclipse quanto para o NetBeans.
ff Na pasta classes esto armazenadas todas as classes Java usadas na aplicao. Nesse caso, den-
tro da pasta classes existem os pacotes cap13 e cap14 que contm todas as classes e todas as
Servlets criadas.
ff A pasta lib manipula todos os pacotes em Java que sero usados na aplicao. Nesse caso esto
armazenados os arquivos para conexo ao banco de dados MySQL.
Com isso chegamos ao final do captulo. Apresentamos apenas uma breve introduo ao uso de
Servlets por meio de alguns exemplos. Existem outros conceitos e detalhes no apresentados aqui.
Esperamos que o leitor tenha absorvido no apenas os conceitos deste captulo, mas tambm os do
restante do livro.
1. Elabore um formulrio HTML em que o usurio digita nome e telefone de um contato e esses da-
dos so inseridos no banco de dados por meio de uma Servlet. Veja a Figura 14.7.
2. Elabore um formulrio HTML em que o usurio seleciona o gnero do filme desejado e uma
Servlet apresenta em tela todos os ttulos dos filmes do gnero selecionado, ordenados pelo ttulo
do filme. Veja a Figura 14.8.
282
3. Seguindo o mesmo princpio do exerccio anterior, o usurio seleciona o gnero do filme e uma
Servlet emite em tela a quantidade de filmes existentes do gnero selecionado. Veja a Figura 14.9.
283
Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.
284
DEITEL, H. M.; DEITEL, P. J. Java Como programar. 8. ed. So Paulo: Pearson Prentice-Hall, 2010.
FILHO, R. R. Desenvolva aplicativos com Java 6. So Paulo: rica, 2008.
HORSTMANN, C. Conceitos de computao com o essencial de Java. 3. ed. Porto Alegre:
Bookman, 2005.
MOREIA, O. Entendendo e dominando Java. 3.ed. So Paulo: Digerati Books, 2009.
NIEMEYER, P.; KNUDSEN, J. Learning Java. Seastopol, California: OReilly, 2005.
SIERRA, K.; BATES, B. Use a cabea Java. Rio de Janeiro: AltaBooks, 2007.
THE JAVA TUTORIAL. Sun Microsystems, 2014. Disponvel a partir do endereo
http://docs.oracle.com/javase/tutorial/.
285
Marcas Registradas
Todos os nomes registrados, marcas registradas ou direitos de uso citados neste livro pertencem
aos seus respectivos proprietrios.
286
A
NetBeans e MySQL
NetBeans uma IDE (Integrated Development Environment), isto , um ambiente integrado para
o desenvolvimento de aplicaes Java. Este apndice apresenta uma breve introduo a algumas
das funcionalidades da ferramenta que podem ajudar na execuo dos exemplos constantes no
livro. O estudo completo dessa IDE, envolvendo todas as suas caractersticas e funcionalidades,
demandaria mais de um livro para ser executado. Assim, so apresentados apenas os seguintes,
pertinentes elaborao do projeto abordado.
Este apndice no mostra a descrio do funcionamento das classes e outros arquivos usa-
dos no projeto. Ele demonstra apenas a sequncia de passos para criao e execuo do projeto.
Espera-se que isso ajude o leitor a se ambientar com a utilizao do NetBeans. Apesar de pequeno,
contempla a base de conhecimento necessria para criar aplicaes Java por meio do NetBeans.
Quando este livro foi escrito, o NetBeans estava na verso 8. Provavelmente o leitor vai usar
uma verso mais recente. Mas isso no deve representar nenhum problema, j que as funcio-
nalidades bsicas devem permanecer as mesmas e o leitor no ter dificuldade em manipular a
ferramenta. Outro aspecto importante se refere incluso do JDK. O NetBeans possui diversas
distribuies, algumas com o JDK embutido e outras no, o que no faz diferena, uma vez que o
processo de instalao do JDK j foi realizado no Captulo 1.
287
Veja que possvel escolher o idioma da ferramenta, a plataforma em que a IDE ser executada
e tambm o tipo de distribuio, que inclui vrias tecnologias (Java SE, JavaFX, Java Web e EE, Java
ME, Ruby, C/C++, Groovy, PHP e os diversos servidores embutidos). Neste caso especfico estamos
utilizando a distribuio mais completa (ltima coluna), mas o leitor pode escolher uma outra distribui-
o, desde que oferea suporte s tecnologias Java utilizadas no livro, no caso a coluna da tabela com
o ttulo Java EE.
Baixado o arquivo, voc deve clicar duas vezes nele para iniciar o processo de instalao. A seguir
apresentado o processo de instalao considerando a verso 8 do NetBeans. Siga os procedimentos:
1. Localize o arquivo do NetBeans que voc baixou e d duplo clique nele para iniciar a instalao.
2. A primeira janela a de boas-vindas; ela permite selecionar os servidores que sero instalados em
conjunto com o NetBeans. Mantenha os servidores selecionados por padro (Glassfish e Apache
Tomcat) e pressione o boto Prximo.
3. A prxima janela sugere a leitura do contrato de licena. Selecione o boto Eu aceito os termos no
contrato de licena e pressione o boto Prximo. A prxima janela sugere outro contrato de licen-
a, agora para o JUnit (usado em testes de classes Java). Selecione a opo desejada e pressione o
boto Prximo.
4. A prxima janela, mostrada na Figura A.2, permite escolher o diretrio de instalao e definir a lo-
calizao do JDK. Se os caminhos estiverem corretos, pressione o boto Prximo; caso contrrio,
selecione o novo caminho por meio do boto Procurar. O caminho da localizao do JDK neces-
srio por ser um requisito para o NetBeans. Apesar de ser uma IDE para desenvolvimento Java, o
NetBeans necessita do JDK para compilar e executar as classes. Conforme j citado, a instalao
do NetBeans pode vir com o JDK embutido ou no. De qualquer forma, o JDK essencial.
288
6. A prxima janela apresenta um resumo de todas as escolhas definidas pelo usurio. Pressione o
boto Instalar.
7. Ao terminar o processo de instalao, aparece uma janela com o ttulo Instalao concluda, con-
forme a Figura A.4. Essa janela sugere que voc contribua para o projeto NetBeans. Para nossos
objetivos, essa opo no ser necessria, por isso desmarcamos a caixa referente a isso. Caso o
289
leitor deseje receber informaes sobre futuras verses do NetBeans e outros itens relacionados,
mantenha a opo marcada.
290
1. Localize o arquivo do MySQL que voc baixou e d duplo clique nele para iniciar a instalao.
2. O Windows pergunta se voc realmente deseja executar a instalao do software; pressione o bo-
to Executar.
3. A primeira tela da instalao a de boas-vindas (Welcome); selecione a opo Install MySQL
Products.
4. Abrir a janela MySQL Installer contendo diversas abas ao lado esquerdo. A primeira aba License
Information, aceite os termos de licena e clique no boto Next.
5. A segunda aba Find Latest Products em que o programa solicita permisso de conexo
Internet para a busca de atualizaes. Clique em Execute e depois no boto Next.
6. Abrir a aba Setup Type, onde pode se escolher o tipo de instalao. Em nosso caso escolhemos
a opo Server Only porque nosso interesse apenas pelo servidor do MySQL, mas voc poder
escolher outras opes. O processo de instalao ir apresentar o local em que o sistema ser ins-
talado. Clique no boto Next.
7. Abrir a aba Check Requirements, que ir verificar o sistema em busca de componentes externos
adicionais necessrios para a instalao secionada e em seguida fazer a instalao desses compo-
nentes ao sistema. Clique no boto Next.
8. Aps isso o servidor MySQL ser instalado. Clique no boto Next.
9. A prxima tela permite selecionar as configuraes do servidor. Clique no boto Next. Abriro
algumas opes conforme apresenta a Figura A.6. Mantenha os valores sugeridos pelo sistema e
pressione o boto Next.
10. Aps pressionar o boto Next a prxima janela solicita que voc defina a senha principal para
acesso ao MySQL, conforme mostra a Figura A.7. No caso definimos uma senha extremamente
simples: 123456 (sem as aspas), pois a exigncia de no mnimo quatro caracteres. importan-
te que o leitor guarde a senha escolhida em algum local porque ela ser necessria mais frente,
quando elaborarmos a aplicao em Java.
291
11. Na prxima janela pressione o boto Execute para o MySQL executar todas as opes escolhidas
no processo de configurao. Se tudo estiver correto, surge uma nova janela indicando o sucesso
do processo. Clique no boto Next. Se houver algum problema durante o processo de instalao
ou configurao, repita os procedimentos apresentados.
292
12. Neste ponto j deve ser possvel acessar o MySQL. Vamos fazer isso no modo linha de comando
do Windows. Para isso acompanhe o caminho a seguir: no Windows 7: boto Iniciar Todos os
programas MySQL MySQL Server 5.6 MySQL Command Line Client. No Windows 8, clique
no boto Iniciar - pressione a seta para aplicativos MySQL 5.6 Command Line Client. Isso faz a
abertura de uma janela de prompt solicitando a senha (Enter Password). Ao digitar a senha defini-
da durante o processo de configurao do MySQL (em nosso caso a senha 123456), surge a janela
da Figura A.8. Observe que estamos acessando o MySQL pelo prompt de comando, mas existem
ferramentas grficas para realizar isso, tais como MySQL Administrator, MySQL Query Browser,
MySQL Front. Para nossos objetivos, usaremos o NetBeans para manipular o MySQL.
13. Para visualizar os bancos de dados j armazenados no MySQL e que fazem parte da instalao, digi-
te o comando show databases; (sem as aspas). Aparece uma lista dos bancos de dados disponveis.
Apresentamos os passos necessrios para instalar, configurar e acessar o MySQL. Na prxima se-
o realizamos a criao do banco de dados e da tabela para manter os dados usados no projeto.
293
4. Digite o script create table usuarios (login varchar(35) primary key, password varchar(35)); e pres-
sione a tecla Enter. Deve aparecer a mensagem Query OK. Isso faz com que seja criada uma tabela
com o nome usurios contendo duas colunas (login e password), com o tamanho de 35 caracte-
res cada uma. Esse tamanho parece grande, mas necessrio porque os contedos do login e do
password sero criptografados antes de serem armazenados no banco. Alm disso, o script tambm
define o login como sendo chave primria para que no possam ser cadastrados dois logins iguais.
5. Para confirmar que a tabela foi criada, digite o comando show tables; e pressione a tecla Enter.
Com isso o banco de dados est pronto para ser usado. Voc tambm pode visualizar o contedo
da tabela por meio do script select * from usuarios. Obviamente, nesse momento ainda no existe
nenhum usurio cadastrado e o resultado da execuo do script ser vazio.
Figura A.9 Registro do MySQL no NetBeans. Figura A.10 O n do servidor MySQL registrado.
4. Neste ponto j possvel manipular bancos de dados armazenados no MySQL por meio do
NetBeans. Vamos iniciar criando um banco de dados.
5. Para criar um banco de dados, selecione o n Servidor MySQL (na aba de servios), clique com o
boto direito nele e escolha a opo Criar Banco de Dados..., conforme a Figura A.11.
294
Em seguida, se abre uma caixa de dilogo pedindo o nome do banco de dados, Figura A.12. Digite o
nome empresa e clique no boto OK.
A partir da possvel visualizar o banco de dados empresa no n do Servidor MySQL, Figura A.13.
6. Aps a criao do banco de dados, passamos para a criao da tabela usurios. Essa tabela ter
apenas os campos login e password. Clique com o boto direito do mouse em Tabelas abaixo do
n da conexo empresa e escolha a opo Executar comando. Observe a Figura A.14. aberta a
janela do Editor SQL do NetBeans.
Figura A.13 O banco de dados Figura A.14 Passo inicial para a criao
empresa criado no MySQL. de uma tabela por meio do Editor SQL.
7. Na janela Criar Tabela que surge, digite o nome da tabela como: usuarios e clique em Adicionar
Coluna. Observe a Figura A.15. Vamos criar a coluna login varchar(35) primary key e password
varchar(35), conforme apresentam as Figuras A.16 e A.17, respectivamente.
295
8. Aps a adio das colunas, clique no boto OK. A tabela usuarios ser criada dentro do banco de
dados empresa, conforme apresenta a Figura A.18.
Esses procedimentos simples permitiram a criao do banco de dados e da tabela que ser usada
no projeto. A seo a seguir apresenta os passos necessrios para a elaborao do projeto por meio do
NetBeans.
296
2. Pressione o boto Prximo. Aps alguns instantes surge a janela da Figura A.20, que permite de-
finir o nome do projeto, sua localizao e outras configuraes. Em Nome do Projeto digite login.
Mantenha o restante das configuraes conforme definido pelo NetBeans.
3. Pressione o boto Prximo. Surge a janela da Figura A.21, que permite definir o servidor Web que
ser usado no projeto.
297
Seria possvel definir outro servidor, como o TomCat, por exemplo. Isso seria feito por meio do bo-
to Adicionar... No entanto, vamos manter as configuraes sugeridas, isto , vamos utilizar o ser-
vidor Glassfish. Voc j aprendeu que necessrio um continer Java para abrigar aplicaes que
rodam no ambiente Web.
4. Mantenha todas as configuraes sugeridas e pressione o boto Prximo. Surge uma nova jane-
la, como mostra a Figura A.22, a qual permite a escolha de diversos frameworks que podem ser
usados no projeto. Como no utilizaremos nenhum framework, apenas pressione o boto
Finalizar. O projeto criado e o NetBeans apresenta diversas janelas, cada qual com sua utilidade.
O contedo das principais janelas descrito a seguir.
Janela do Projeto
A janela mostrada na Figura A.23 contm as pastas e arquivos do projeto. Veja toda a estrutura do
projeto que o NetBeans criou automaticamente. Nessas pastas so armazenados todos os arquivos re-
ferentes ao projeto, incluindo arquivos de configuraes, pginas Web, classes em Java, bibliotecas etc.
Janela do Editor
A janela mostrada na Figura A.24 apresenta o editor de cdigo do
NetBeans. Todos os arquivos manipulados pelo projeto podem ser cria-
dos e editados por meio dessa janela. Arquivos comuns editados nessa
janela so classes Java, pginas JSP, Servlets, arquivos em formato texto,
entre outros tipos. No caso, o editor est apresentando o cdigo-fonte do Figura A.23 Os
arquivo index.jsp, gerado automaticamente quando o projeto foi criado. arquivos do projeto.
298
Janela do Navegador
A janela exibida na Figura A.25 mostra a estrutura dos arquivos que so abertos pelo editor do
NetBeans. No caso, a janela apresenta a estrutura da pgina index.jsp que est sendo editada no mo-
mento. O navegador permite ao desenvolvedor o acesso rpido a qualquer parte do arquivo que est
sendo editado. Por exemplo, ao dar um duplo clique no elemento title, o editor localiza imediatamente
esse elemento no cdigo-fonte.
Criado o projeto, j possvel execut-lo. V at o menu Executar do NetBeans e escolha Executar
Projeto Principal... (ou simplesmente pressione a tecla F6). iniciado o processo de deployment do pro-
jeto, e, aps alguns instantes, aberto o navegador (o browser instalado em sua mquina) com uma p-
gina contendo a mensagem Hello World, conforme mostra a Figura A.26. Ela apresenta o carregamento
do arquivo index.jsp criado pelo NetBeans durante a execuo do projeto.
299
ff verificasessao.jsp: pgina em JSP responsvel por verificar se a sesso do usurio est aberta.
ff BD.java: classe usada para realizar a conexo ao banco de dados.
ff Criptografia.java: classe usada para realizar a criptografia do login e da senha que so armazena-
dos na tabela de usurios do banco.
ff Usuario.java: classe que mantm apenas os atributos privados login e password e seus mto-
dos get e set correspondentes.
ff UsuarioDAO.java: classe responsvel por fazer a incluso e a excluso de usurios armazenados
na tabela do MySQL. Permite tambm a validao de usurios para o processo de login.
ff UsuarioTestaExcluir.java: classe usada para realizar o teste da excluso de usurios.
ff UsuarioTestaInserir.java: classe usada para realizar o teste da incluso de usurios.
ff UsuarioTestaLogar.java: classe que faz o teste do login de usurios.
ff mysql-connector: driver usado para a conexo do Java ao MySQL.
Principais arquivos do projeto login
Vamos iniciar a produo de nosso projeto adicionando classes em Java. Faremos isso passo a
passo para que o leitor possa compreender todo o processo. As funcionalidades do projeto sero inse-
ridas e testadas uma a uma, por isso siga atentamente as instrues fornecidas.
Acompanhe os procedimentos a seguir:
1. O primeiro passo realizar o download dos arquivos que sero usados no projeto. Acesse o site da
Editora rica conforme explicado no incio do livro, baixe os arquivos e instale-os em sua mquina.
2. Como voc j aprendeu, as classes em Java devem ser adicionadas em pacotes. Na aba Projetos
da janela Explorer do NetBeans, clique com o boto direito na pasta Pacotes de Cdigos-fonte e
escolha a opo Novo/Pacote Java. Veja a Figura A.28.
300
3. Em seguida, aberta uma tela em que voc precisa fornecer o nome do pacote. Em nosso caso,
digite o nome br.pro.sergio.beans.bd e clique no boto Finalizar. Veja a Figura A.29.
4. Vamos criar a classe BD em nosso pacote. Selecione o pacote criado e, com o boto direito do
mouse, selecione Novo e a seguir Classe Java... . Na janela que surge, em Nome da classe digite BD
e pressione o boto Finalizar. Isso faz com que a classe BD seja criada.
5. O procedimento anterior foi descrito apenas para demonstrao da criao de uma classe por
meio do NetBeans, pois a classe BD j est pronta e disponvel no site da Editora rica. Desta for-
ma, podemos excluir a classe BD criada. Para isso, selecione a classe e pressione a tecla Del do
teclado e, em seguida, o boto OK.
6. Agora vamos adicionar a classe BD.java ao projeto. Para isso copie a classe (Ctrl + C) e cole-a
(Ctrl + V) dentro do pacote br.pro.sergio.beans.bd, conforme apresenta a Figura A.30.
7. Para que o projeto faa a conexo ao banco de dados, devemos adicionar o driver JDBC pasta das
bibliotecas. O nome do driver que faz essa conexo mysql-connector-java-5.1.8. Na aba pro-
jetos, clique com o boto direito em nosso projeto (login) e selecione a opo Propriedades. Em
seguida, selecione a categoria Bibliotecas e a opo Adicionar JAR/Pasta. Veja a Figura A.31.
8. Em seguida apresentada uma nova janela em que voc deve localizar o arquivo conector
(mysql-connector-java-5.1.8-bin.jar); clique em Open. O conector aparece na janela, como mostra
a Figura A.32. Clique no boto OK.
301
9. Neste ponto j possvel executar a classe BD para verificar se a conexo com o banco de dados
empresa est correta. Selecione a classe BD.java e pressione as teclas Shift+F6. Isso faz com que a
classe BD seja executada. Se tudo estiver correto, na aba Sada aparecem as mensagens Conectou e
Desconectou. Observe a Figura A.33. Isso indica que a classe BD conseguiu se conectar ao banco de
dados empresa e desconectar-se com sucesso. Analise o cdigo da classe BD e veja que ela j pos-
sui todas as configuraes necessrias para se conectar ao banco de dados empresa.
302
10. O prximo passo se refere incluso da classe Criptografia.java, responsvel por realizar a crip-
tografia dos dados (login e password) que sero inseridos na tabela usuarios. Da mesma forma
que adicionamos a classe BD.java ao pacote br.pro.sergio.beans.bd, adicionaremos a classe
Criptografia a um novo pacote chamado br.pro.sergio.beans.seguranca. Crie esse pacote confor-
me a Figura A.34.
11. Localize a classe Criptografia.java, copie e cole no novo pacote conforme a Figura A.35.
12. O prximo passo adicionar a classe Usurio ao pacote br.pro.sergio.beans.usuario. Crie um
pacote com esse nome. Siga as mesmas instrues da criao de pacotes descrita anteriormente,
localize a classe Usuario.java, copie e cole no pacote, conforme apresenta a Figura A.36. Repita o
processo para a classe UsuarioDAO.java; ela deve ser adicionada ao mesmo pacote.
13. Vamos incluir as classes que permitem incluir, logar e excluir um usurio. Primeiro testaremos
uma insero de usurio. Localize a classe UsuarioTestaInserir.java, copie e cole no pacote br.pro.
sergio.beans.usuario, conforme apresenta a Figura A.37.
Figura A.35 A classe Figura A.36 A classe Usuario Figura A.37 A classe Usuario
Criptografia adicionada ao projeto. adicionada ao projeto. TestaInserir adicionada ao projeto.
14. Para testar a incluso de um usurio, sobre a classe UsuarioTestaInserir.java pressione as te-
clas Shift + F6, fornea o login (no mnimo seis caracteres) e a senha (no mnimo seis caracteres).
Observe a Figura A.38.
15. Conforme dito anteriormente, aps a insero dos dados do usurio no projeto os dados so crip-
tografados e armazenados na tabela usuarios do banco de dados. Para visualizar esse contedo
criptografado, acesse o Editor SQL do NetBeans e digite o seguinte script: select * from usuarios.
303
Execute esse script pressionando as teclas Ctrl+Shift+E. So apresentados todos os usurios ca-
dastrados, em nosso caso apenas um. Observe as Figuras A.39 e A.40.
16. Nosso prximo passo se refere ao teste do login, que verifica se um determinado usurio est ca-
dastrado no banco de dados. Mais frente ser criada uma pgina em HTML simulando o proces-
so de login do usurio em um site. Localize a classe UsuarioTestaLogar.java, copie e cole no pacote
br.pro.sergio.beans.usuario de acordo com a Figura A.41.
17. Para executar a classe UsuarioTestaLogar.java pressione as teclas Shift + F6, fornea os dados de
login e senha e verifique o resultado. Fornea valores vlidos e invlidos para verificar o funciona-
mento. Veja a Figura A.42.
18. O prximo passo verificar a excluso de um usurio. O procedimento o mesmo descrito ante-
riormente para fazer a incluso e o login de um usurio. Localize a classe UsuarioTestaExluir.java,
copie e cole-a dentro do pacote br.pro.sergio.beans.usuario, conforme apresenta a Figura A.43.
19. Para executar a classe UsuarioTestaExcluir.java pressione as teclas Shift + F6, fornea o login e
verifique o resultado. Fornea valores vlidos e invlidos para verificar o funcionamento. Veja a
Figura A.44.
304
20. A partir deste ponto iniciamos a incluso dos arquivos Web, que utilizam as classes Java adiciona-
das anteriormente ao projeto. Vamos comear adicionando os arquivos login.html e abreses-
sao.jsp. Enquanto a pgina login.html abre um formulrio para permitir que o usurio fornea
seus dados de login, a pgina abresessao.jsp recebe esses dados, verifica se eles so vlidos, isto
, se esto gravados no banco de dados (isso feito por meio da classe Usuario.java), e abre uma
sesso para o usurio no site.
21. Localize o arquivo login.html, copie e cole no pacote Pginas Web, conforme a Figura A.45.
22. Localize o arquivo abresesso.jsp, copie e cole no pacote Pginas Web, conforme apresenta a
Figura A.46.
23. Para executar os arquivos clique em login.html e pressione as teclas Shift+F6. Aps verificar o
arquivo, o NetBeans automaticamente abre o browser de sua mquina, Figura A.47.
305
Existe uma comunicao entre as pginas login.html e abresessao.jsp, isto , a pgina login.html
submete os dados para a pgina abresessao.jsp que possui o mtodo getParameter(). Este captura o
valor digitado em p_login e p_password, campos presentes em login.html, fazendo sua validao
ao banco de dados por intermdio da classe UsuarioDAO.java, adicionada anteriormente ao projeto.
Se os dados retornados forem verdadeiros, isto , se forem encontrados no banco de dados, a sesso
ser aberta por meio de session.putValue(), um mtodo j depreciado, mas que serve a nossos objetivos.
Neste exemplo, a sesso est armazenando o login do usurio (criptografado) e a data/hora do acesso.
Enquanto o navegador estiver aberto, a sesso continua a reconhecer o usurio e ele pode navegar pelo
site com sua identificao reconhecida. Assim que o usurio fechar o navegador, a sesso expira.
1. O prximo passo consiste na incluso dos arquivos verificasessao.jsp e index.jsp. A pgina ve-
rificasessao.jsp tenta encontrar os dados armazenados por meio da pgina abresessao.jsp. Caso
os dados sejam encontrados, significa que a sesso est aberta, ou seja, o usurio j realizou sua
validao e pode navegar pelo site. Dessa forma, caso a sesso esteja aberta, a pgina index.jsp
chamada, simulando que o usurio est sendo direcionado para a pgina principal do site.
2. Localize o arquivo verificasessao.jsp, copie e cole no pacote Pginas Web, conforme a Figura A.48.
3. Antes de localizar o arquivo index.jsp, exclua o arquivo index.jsp j existente em sua pasta
Pginas Web (clique com o boto direito em index.jsp e selecione excluir). Localize o novo arquivo
index.jsp (presente no download do projeto), copie e cole no pacote Pginas Web, conforme a
Figura A.49.
4. Execute o arquivo login.html (pressione Shift+F6 sobre ele) realizando o processo de login nor-
malmente. Mantenha o browser aberto aps confirmar os dados do login e execute o arquivo
verificasessao.jsp (pode ser na mesma janela ou em outra janela do browser), ento receber a
seguinte mensagem: Sesso encontrada! (veja a parte superior da Figura A.50). Se voc fechar o
browser mesmo aps ter realizado o login e depois executar o arquivo verificasessao.jsp, rece-
ber a seguinte mensagem: A sesso expirou. V para a pgina de login novamente !! (veja a parte
inferior da Figura A.50).
306
Com isso terminamos nosso pequeno projeto. Ele pode servir como base para projetos maiores,
pois praticamente qualquer aplicao na Web necessita de um processo de validao do usurio con-
tendo login e senha. O usurio pode aprimorar o projeto adicionando mais pginas em JSP, Servlets etc.
Como dissemos no incio deste apndice, a utilizao do NetBeans pode representar um
longo caminho a seguir. Apresentamos apenas os passos iniciais que demonstraram a criao
de uma pequena aplicao para a Internet. Cabe ao leitor buscar maiores informaes para
aprimorar-se no desenvolvimento de aplicaes usando essa poderosa ferramenta.
307
B
Eclipse, TomCat e MySQL
308
Veja que possvel escolher a plataforma em que a IDE ser executada e tambm o tipo de distri-
buio, que inclui vrias verses (Eclipse Standard, Java EE, Indigo, Juno etc). Neste caso especfico
estamos utilizando a distribuio eclipse Luna Java EE (Eclipse IDE for Java EE Developers), mas o leitor
pode escolher uma outra verso, desde que oferea suporte s tecnologias Java EE utilizadas no livro.
Ao baixar o arquivo, salve-o em seu disco rgido. A seguir, descompacte o arquivo. Ser criada uma
pasta contendo o arquivo eclipse.exe, o arquivo executvel. O Eclipse no requer instalao direta na
mquina, basta clicar sobre o arquivo executvel (exe) e comear a utilizar a ferramenta. O nico pr-
-requisito ter o Java instalado na mquina. Ao ser executado, aparecer uma tela para a escolha do
Workspace (sua rea de trabalho), o local onde ficaro armazenados todos os seus projetos. Voc pode
deixar o padro, ou escolher uma pasta prpria criada por voc em alguma pasta de seu computador.
Em nosso caso, estamos alocando o wokspace na pasta java8, localizada no c:. Veja a Figura B.2.
Como nosso projeto utilizar o MySQL, necessrio que ele esteja instalado em sua mquina. Caso
no esteja, consulte a Seo A.2 do Apndice A. Ela contm os passos necessrios para instalar, confi-
gurar e acessar o MySQL. Na prxima seo realizamos a criao do banco de dados e da tabela para
manter os dados usados no projeto.
309
Como dissemos no Apndice A, existem duas maneiras de acessar o MySQL. Nesta seo, vamos
apresentar apenas pelo prompt de comando. Siga estes procedimentos:
1. Acesse o MySQL pelo caminho: boto Iniciar Todos os Programas MySQL MySQL 5.6
MySQL Command Line Client. Em Enter password fornea a senha definida durante o processo de
instalao do MySQL, no caso 123456. Se aparecer mysql> na linha de prompt, significa que a se-
nha foi digitada corretamente e o MySQL est pronto para ser usado.
2. Digite o script create database meubanco; (no esquea o ponto e vrgula no final da linha) e
pressione a tecla Enter. O banco de dados meubanco ser criado.
3. Digite o script use meubanco; e pressione a tecla Enter. Deve aparecer a mensagem Database
changed. Isso faz com que o MySQL passe a utilizar o banco de dados meubanco.
4. Digite o script create table enquete (votos1 int, votos2 int, votos3 int, votos4 int, votos5 int); e
pressione a tecla Enter. Deve aparecer a mensagem Query OK. Isso faz com que seja criada uma
tabela com o nome enquete contendo cinco colunas (votos1,votos2,votos3,votos4 e votos5), do
tipo inteiro (int).
5. Para confirmar que a tabela foi criada, digite o comando show tables; e pressione a tecla Enter.
Com isso o banco de dados est pronto para ser usado.
6. Digite o script insert into enquete values (0,0,0,0,0); isso far com que seja inserido o valor 0 em
todas as colunas de voto.
7. Voc pode visualizar o contedo da tabela por meio do script select * from enquete;
310
2. Pressione o boto Prximo. Aps alguns instantes surge a janela da Figura B.4, que permite definir
o nome do projeto, sua localizao e outras configuraes. Em Nome do Projeto digite enquete.
Mantenha o restante das configuraes conforme definido pelo Eclipse. Abaixo, o Target runtime
permite definir o servidor Web que ser usado no projeto. Seria possvel definir outro servidor Java,
como o Glassfish, por exemplo. Isso seria feito por meio do boto New Runtime... . No entanto, va-
mos manter as configuraes sugeridas, isto , vamos utilizar o servidor TomCat. Voc j aprendeu
que necessrio um continer Java para abrigar aplicaes que rodam no ambiente Web.
3. Mantenha todas as configuraes sugeridas e pressione o boto Finish. O projeto ser criado com
a estrutura semelhante da Figura B.5.
Vamos apresentar uma viso geral sobre as principais janelas existentes no Eclipse e que esto
relacionadas diretamente com os exemplos apresentados no livro.
311
Janela do Projeto
A janela mostrada na Figura B.5 chamada de Project Explorer. Como o nome sugere, contm as
pastas e arquivos do projeto. Nessas pastas so armazenados todos os arquivos referentes ao projeto,
incluindo arquivos de configuraes, pginas Web, classes em Java, bibliotecas etc.
Janela do Editor
A janela mostrada na Figura B.6 apresenta o editor de cdigo do Eclipse. Todos os arquivos mani-
pulados pelo projeto podem ser criados e editados por meio dessa janela. Arquivos comuns editados
nessa janela so classes Java, pginas JSP, Servlets, arquivos em formato texto, entre outros tipos. No
caso, o editor est apresentando o cdigo-fonte do arquivo enquete.html, que ser a pgina inicial do
nosso projeto.
Janela do Navegador
Uma vez criada a pgina html, j possvel execut-la. Clique com o boto direito do mouse no
arquivo criado Run As Run on Server... (ou simplesmente pressione a CTRL + F11). Aparecer o
servidor; selecione-o e pressione Finish. Se tudo estiver correto, o servidor ser iniciado e a pgina ser
exibida. Se tiver dvidas quanto a esse processo, assista nosso vdeo na Internet no endereo citado no
incio deste Apndice.
A Figura B.7 apresenta o carregamento do arquivo enquete.html em execuo.
312
Vamos iniciar a produo de nosso projeto adicionando classes em Java. Faremos isso passo a
passo para que o leitor possa compreender todo o processo. As funcionalidades do projeto sero inse-
ridas e testadas uma a uma, por isso siga atentamente as instrues fornecidas.
313
3. Em seguida, aberta uma tela em que voc precisa fornecer o nome do pacote. Em nosso caso,
digite o nome banco e clique no boto Finish. Veja a Figura B.10.
4. Vamos criar a classe BD em nosso pacote. Selecione o pacote criado e, com o boto direito do
mouse, selecione New e a seguir Class... . Na janela que surge, em Name digite BD e pressione o
boto Finish. Isso faz com que a classe seja criada.
5. O procedimento anterior foi descrito apenas para demonstrao da criao de uma classe por
meio do Eclipse, pois a classe BD j est pronta e disponvel no site da Editora rica. Dessa forma,
podemos excluir a classe BD criada. Para isso, selecione a classe e pressione a tecla Del do teclado
e, em seguida, o boto OK.
6. Agora vamos adicionar a classe BD.java ao projeto. Para isso copie a classe (Ctrl + C) e cole-a
(Ctrl + V) dentro do pacote banco, conforme apresenta a Figura B.11.
314
7. Nosso projeto utilizar alguns arquivos externos (do tipo .jar). Esses arquivos so responsveis
pela conexo ao banco de dados (o driver JDBC) e pela gerao de grficos. Eles devem ser copia-
dos na pasta WEB-INF/lib do projeto (todos com a extenso jar), como mostra a Figura B.12.
8. Neste ponto j possvel executar a classe BD para verificar se a conexo com o banco de dados
meubanco est correta. Clique com o boto direito na classe BD.java Run As Java Aplication.
Isso faz com que a classe BD seja executada. Se tudo estiver correto, na aba Sada aparecem as
mensagens Conectou e Desconectou. Observe a Figura B.13. Isso indica que a classe BD conse-
guiu se conectar ao banco de dados meubanco e desconectar-se com sucesso. Analise o cdigo
da classe BD e veja que ela j possui todas as configuraes necessrias para se conectar ao banco
de dados banco.
9. O prximo passo se refere incluso da classe Enquete.java, responsvel por realizar a inser-
o dos dados na tabela enquete. Da mesma forma que adicionamos a classe BD.java ao pacote
315
banco, adicionaremos a classe Enquete a um novo pacote chamado enquete. Crie esse pacote
conforme a Figura B.14
10. Localize a classe Enquete.java, copie e cole no novo pacote conforme a Figura B.15.
11. O prximo passo adicionar as pginas enquete.html, enquete.jsp e grafico.jsp. Para isso basta co-
piar esses arquivos e colar na pasta WebContent do projeto no Eclipse. Observe a Figura B.15.
12. Com isso encerramos a insero dos arquivos e j podemos executar o projeto. Execute a pgina
enquete.html. Aparecer a tela apresentada na Figura B.7. Escolha o personagem de sua prefe-
rncia e pressione o boto Votar. O voto ser armazenado no banco de dados e surgir uma pgi-
na. Veja Figura B.16.
13. Ao clicar em visualizar, aparecer uma nova tela contendo quatro grficos representando o status
das votaes. Veja imagens nas Figuras B17 a B20.
316
Resultado da Votao
3,0
2,5
Quantidade
2,0
1,5
1,0
0,5
0,0
Super Homem Wolverine Batman Hulk Homem de Ferro
Candidatos
votos
Resultado da Votao
3,0
2,5
Quantidade
2,0
1,5
1,0
0,5
0,0
Super Homem Wolverine Batman Hulk Homem de Ferro
Candidatos
votos
Resultado da Votao
3,0
2,5
Quantidade
2,0
1,5
1,0
0,5
0,0
Super Homem Wolverine Batman Hulk Homem de Ferro
Candidatos
votos
317
Resultado da Votao
Super Homem
Wolverine
Batman
Hulk
Homem de Ferro
Com isso chegamos ao final de nosso apndice. Nosso objetivo foi apenas apresentar uma viso
geral a respeito do funcionamento da ferramenta Eclipse. Esperamos que voc possa se aperfeioar na
utilizao da ferramenta. Bons estudos!
318
{ ... }, 25 JEE, 15
8080, 299 JME, 15
JSE, 15
A JSP, 273
abresessao.jsp, 299
L
C Localhost, 299
classe BufferedReader, 223 Login, 299
classe FileReader, 229 login.html, 299
classe JButton, 140 Long, 30
classe JCheckBox, 150
classe JFrame, 138 M
classe JList., 155 Main, 24
classe JOptionPane, 164 Math, 64
classe JOptionPane, 46 Math.E, 64
classe JTextField, 139 Math.PI, 64
Cdigos do corpo, 90 mtodo getFile, 229
mtodo getValueAt, 187
D mtodo setBackground, 154
declarao do objeto, 107 mtodo setMnemonic,, 146
Development Tools, 19 mtodo validate, 149
Multithreading, 15
E
equalsIgnoreCase 73 N
erro de compilao:, 128 NetBeans, 287
estrutura if-else, 43
O
I operador new, 115
IDE NetBeans, 21 Orientao a objetos, 15
import java.awt.*, 137
import java.awt.event.*, 137 P
import javax.swing.*, 137 pacote swing, 194
index.jsp, 299 PHP, ASP, Python, 273
inicializao do objeto, 107 Plataforma, 17
instanciao do objeto:, 107 Portabilidade, 15
Private, 89
J Protected, 89
Java Card, 15 Public JRE, 19
JavaFX, 15 Public, 24
JComboBox, 160 Public, 89
319
Q showOptionDialog, 164
Qualificador, 89 Source Code:, 19
Static, 24
R Static, 90
rs.absolute(5), 243 (String[ ] args), 25
rs.absolute(-5), 243 Suporte comunicao, 15
rs.afterLast(), 243 switch, 49
rs.beforeFirst(), 243
rs.first(), 243 T
rs.isAfterLast(), 243 trim, 75
rs.isBeforeFirst(), 243 try-catch-finally, 51
rs.last(), 243
rs.next(), 243 U
rs.previous(), 243 UsaProduto, 127
rs.relative(5), 243
rs.relative(-5), 243 V
Void, 24
S
showConfirmDialog, 164 W
showInputDialog, 164 while, 59
showMessageDialog, 164
320