Você está na página 1de 321

Java 8 Ensino Didtico

Desenvolvimento e Implementao de Aplicaes

ERJ_Java_8.indb 1 31/03/2015 16:40:43


Srgio Furgeri

Java 8 Ensino Didtico


Desenvolvimento e Implementao de Aplicaes

1a Edio

ERJ_Java_8.indb 1 31/03/2015 16:40:43


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Dados Internacionais de Catalogao na Publicao (CIP)


Anglica Ilacqua CRB-8/7057

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

1. Java (Linguagem de programao para computadores) I. Ttulo

15-0212 CDD 005.133


Editado tambm como livro impresso. CDU 004.43

ndice para catlogo sistemtico:


1. Java - Linguagem de programao

Copyright 2015 da Editora rica Ltda.


Todos os direitos reservados. Nenhuma parte desta publicao poder ser reproduzida por qualquer meio ou forma sem
prvia autorizao da Editora rica. A violao dos direitos autorais crime estabelecido na Lei no 9.610/98 e punido pelo
Artigo 184 do Cdigo Penal.

Coordenao Editorial: Rosana Arruda da Silva


Capa: Maurcio S. de Frana
Edio de Texto: Beatriz M. Carneiro, Paula Craveiro, Raquel F. Abranches, Silvia Campos
Reviso de Texto: Clara Diament
Produo Editorial: Dalete Oliveira, Graziele Liborni, Laudemir Marinho dos Santos, Lvia Vilela,
Rosana Aparecida Alves dos Santos
Editorao: ERJ Composio Editorial
Produo Digital: Lashmi Mayumi Hayashi Yelisetty

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.

Seu cadastro muito importante para ns


Ao preencher e remeter a ficha de cadastro constante no site da Editora rica, voc passar a receber informaes sobre nossos
lanamentos em sua rea de preferncia.
Conhecendo melhor os leitores e suas preferncias, vamos produzir ttulos que atendam suas necessidades.

Editora rica Ltda. | Uma Empresa do Grupo Saraiva


Rua: Henrique Schaumann, 270
Pinheiros - So Paulo - SP - CEP: 05413-010
Fone: (11) 3613-0000
www.editoraerica.com.br

ERJ_Java_8.indb 2 31/03/2015 16:40:43


Fabricante
Produto: Java 8 Endereo no Brasil:
Fabricante: Oracle Rua: Alexandre Dumas, 2016
Site: http://www.oracle.com 04717-004 - So Paulo - SP
Site: http://br.sun.com

Requisitos de Hardware e de Software


Hardware
ff 2 GB de RAM (mnimo) / 4 GB de RAM (recomendado);
ff 1 GB de espao em disco rgido;
ff Acesso Internet.

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.

Pacotes (Java Packages) Disponveis no site da Editora rica


ff mysql-connector-java-5.1.8-bin.jar Driver de Conexo ao MySQL
ff servlet-api.jar Criao de Servlets
ff jfreechart e jcommon Manipulao de Grficos

ERJ_Java_8.indb 3 31/03/2015 16:40:43


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

ERJ_Java_8.indb 4 31/03/2015 16:40:43


Dedicatria

Aos meus filhos Lucas e Daniel e minha esposa Ivone, presentes de Deus para minha vida.

Se clamares por conhecimento,


e por inteligncia alares a tua voz,
Se como a prata a buscares e como
a tesouros escondidos a procurares,
Ento entenders o temor do Senhor,
e achars o conhecimento de Deus.
Provrbios 2:3-5

Bem-aventurado o homem que


acha sabedoria, e o homem
que adquire conhecimento;
Porque melhor a sua mercadoria
do que artigos de prata, e maior o
seu lucro que o ouro mais fino.
Provrbios 3:13-14

ERJ_Java_8.indb 5 31/03/2015 16:40:43


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

ERJ_Java_8.indb 6 31/03/2015 16:40:43


Sumrio
Captulo 1 Java 8 Linguagem e Plataforma.................................................................................................................13
1.1 Breve histrico da linguagem Java.................................................................................................................................. 13
1.2 A linguagem Java.................................................................................................................................................................... 14
1.3 As caractersticas da linguagem Java............................................................................................................................. 15
1.4 Criao de programas em Java......................................................................................................................................... 16
1.5 A plataforma Java.................................................................................................................................................................. 17
1.6 Ambiente de desenvolvimento......................................................................................................................................... 17
1.6.1 Instalao do Java..................................................................................................................................................... 18
1.7 Primeiro contato com Java................................................................................................................................................. 21
1.7.1 Java com a IDE NetBeans........................................................................................................................................ 21
1.7.2 Java com a IDE Eclipse............................................................................................................................................ 22
Captulo 2 Aspectos Fundamentais de Java...................................................................................................................27
2.1 Tipos de dados......................................................................................................................................................................... 27
2.2 Definio de variveis e constantes............................................................................................................................... 28
2.2.1 Declarao de variveis.......................................................................................................................................... 29
2.2.2 Declarao de constantes..................................................................................................................................... 31
2.3 Comentrios............................................................................................................................................................................. 31
2.4 Operadores............................................................................................................................................................................... 32
2.4.1 Operadores aritmticos......................................................................................................................................... 32
2.4.2 Operadores relacionais.......................................................................................................................................... 33
2.4.3 Operadores lgicos.................................................................................................................................................. 34
2.4.4 Sequncias de escape.............................................................................................................................................. 34
2.5 Converso de tipos................................................................................................................................................................ 35
2.6 Entrada de dados pelo teclado.......................................................................................................................................... 36
2.6.1 Uso da classe DataInputStream.......................................................................................................................... 36
2.6.2 Uso da classe BufferedReader............................................................................................................................. 38
2.6.3 Uso da classe Scanner............................................................................................................................................. 38
2.7 Caixa de dilogo para a entrada de dados.................................................................................................................... 39
Captulo 3 Estruturas Condicionais, de Exceo e Repetio..................................................................................42
3.1 Estruturas condicionais....................................................................................................................................................... 42
3.1.1 A estrutura if-else..................................................................................................................................................... 42
3.1.2 Estrutura if resumido.............................................................................................................................................. 47
3.1.3 A estrutura switch-case......................................................................................................................................... 48
3.2 Excees em Java................................................................................................................................................................... 50
3.2.1 Unchecked Exception ............................................................................................................................................. 50
3.2.2 Checked Exception................................................................................................................................................... 50
3.2.3 Uso da estrutura try-catch-finally...................................................................................................................... 51
3.2.4 Uso da clusula throws........................................................................................................................................... 53
3.2.5 Uso da instruo throw.......................................................................................................................................... 55
3.2.6 Uso de getMessage e printStackTrace............................................................................................................. 56
3.3 Laos de repetio................................................................................................................................................................. 56
3.3.1 Uso do lao for........................................................................................................................................................... 57
3.3.2 Uso do lao while...................................................................................................................................................... 59

ERJ_Java_8.indb 7 31/03/2015 16:40:43


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Captulo 4 Operaes Matemticas e de String............................................................................................................64


4.1 Operaes matemticas...................................................................................................................................................... 64
4.1.1 Mtodo ceil.................................................................................................................................................................. 64
4.1.2 Mtodo floor............................................................................................................................................................... 65
4.1.3 Mtodos round, max, min, sqrt, pow e abs...................................................................................................... 66
4.1.4 Mtodo random......................................................................................................................................................... 67
4.1.5 Formatao com a classe DecimalFormat...................................................................................................... 68
4.1.6 Internacionalizao com a classe Locale......................................................................................................... 69
4.2 Operaes com Strings........................................................................................................................................................ 71
4.2.1 Mtodo length............................................................................................................................................................ 71
4.2.2 Mtodo charAt .......................................................................................................................................................... 72
4.2.3 Mtodos toUpperCase e toLowerCase........................................................................................................... 73
4.2.4 Mtodo substring..................................................................................................................................................... 73
4.2.5 Mtodo trim................................................................................................................................................................ 75
4.2.6 Mtodo replace......................................................................................................................................................... 75
4.2.7 Mtodo valueOf........................................................................................................................................................ 76
4.2.8 Mtodo indexOf........................................................................................................................................................ 76
Captulo 5 Utilizao de Arrays..........................................................................................................................................79
5.1 Definio................................................................................................................................................................................... 79
5.2 Arrays unidimensionais....................................................................................................................................................... 80
5.3 Arrays bidimensionais.......................................................................................................................................................... 82
5.4 Busca em arrays...................................................................................................................................................................... 84
Captulo 6 Criao de Mtodos em Java.........................................................................................................................88
6.1 Mtodos sem retorno........................................................................................................................................................... 91
6.2 Mtodos com retorno de valores.................................................................................................................................... 93
6.3 Recursividade.......................................................................................................................................................................... 95
6.4 Sobrecarga................................................................................................................................................................................ 96
6.5 Acesso a mtodos de outras classes............................................................................................................................... 97
6.6 Mtodos que manipulam Arrays....................................................................................................................................100
Captulo 7 Orientao a Objetos.................................................................................................................................... 103
7.1 Definies sobre objetos...................................................................................................................................................103
7.2 Classes e a UML....................................................................................................................................................................104
7.3 Utilizao de objetos da classe.......................................................................................................................................107
7.4 Escopo de classe e escopo de instncia.......................................................................................................................109
7.5 Mensagens..............................................................................................................................................................................110
7.6 Encapsulamento...................................................................................................................................................................110
7.7 Uso da palavra reservada this.........................................................................................................................................115
7.8 Construtores..........................................................................................................................................................................115
7.9 Destrutores............................................................................................................................................................................117
7.10 Definio de pacotes........................................................................................................................................................117
7.10.1 Criao de pacotes..............................................................................................................................................118
7.10.2 Uso da diretiva import........................................................................................................................................119
7.11 Herana.................................................................................................................................................................................119
7.12 Polimorfismo.......................................................................................................................................................................124
7.13 Gravao e leitura de objetos.......................................................................................................................................125
7.14 Classes abstratas e concretas......................................................................................................................................128
7.15 Interfaces..............................................................................................................................................................................131

ERJ_Java_8.indb 8 31/03/2015 16:40:44


Captulo 8 Interfaces Grficas com Swing................................................................................................................... 136
8.1 Criao de frames................................................................................................................................................................138
8.1.1 Classe JLabel.............................................................................................................................................................138
8.1.2 Classe JTextField.....................................................................................................................................................139
8.1.3 Classe JPasswordField.........................................................................................................................................139
8.1.4 Classe JButton.........................................................................................................................................................140
8.1.5 O frame Login...........................................................................................................................................................140
8.2 Incluso de menus................................................................................................................................................................144
8.2.1 Barras de menus......................................................................................................................................................144
8.3 Incluso de painis e botes............................................................................................................................................146
8.4 Incluso de caixas de opo.............................................................................................................................................149
8.5 Incluso dos botes de rdio...........................................................................................................................................152
8.6 Mais sobre Labels.................................................................................................................................................................153
8.7 Incluso de listas de seleo............................................................................................................................................155
8.8 Incluso do JComboBox....................................................................................................................................................160
8.9 Incluso de reas de texto................................................................................................................................................161
8.10 Incluso de caixas de dilogo........................................................................................................................................164
8.10.1 O mtodo showMessageDialog.....................................................................................................................164
8.10.2 O mtodo showConfirmDialog.......................................................................................................................166
8.10.3 O mtodo showOptionDialog.........................................................................................................................168
8.11 Incluso de barras de rolagem.....................................................................................................................................170
8.12 Incluso de barras de progresso..................................................................................................................................172
8.13 Gerenciadores de layout................................................................................................................................................174
8.13.1 FlowLayout.............................................................................................................................................................174
8.13.2 GridLayout..............................................................................................................................................................176
8.13.3 BorderLayout.........................................................................................................................................................177
8.14 Incluso de abas.................................................................................................................................................................178
8.15 Incluso de frames internos..........................................................................................................................................180
8.16 Incluso de grades.............................................................................................................................................................182
8.17 Incluso de mscaras.......................................................................................................................................................188
Captulo 9 Controle de Eventos....................................................................................................................................... 194
9.1 Definio.................................................................................................................................................................................194
9.2 Classes receptoras de evento.........................................................................................................................................194
9.3 Mtodos para manipulao de eventos......................................................................................................................195
Captulo 10 Manipulao de Data e Hora.................................................................................................................... 203
10.1 Uso da classe Date............................................................................................................................................................204
10.2 Uso da classe DateFormat.............................................................................................................................................206
10.3 Uso da classe SimpleDateFormat...............................................................................................................................207
10.4 Uso da classe Calendar...................................................................................................................................................209
10.5 Clculos com data.............................................................................................................................................................212
10.6 Novidades do Java 8.........................................................................................................................................................214
Captulo 11 Diretrios e Arquivos.................................................................................................................................. 219
11.1 Definio...............................................................................................................................................................................219
11.2 Criao de diretrios.......................................................................................................................................................220
11.3 Consulta em diretrios...................................................................................................................................................221
11.4 Excluso de diretrios.....................................................................................................................................................221
11.5 Leitura e gravao.............................................................................................................................................................222

ERJ_Java_8.indb 9 31/03/2015 16:40:44


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Captulo 12 Manipulao de Banco de Dados com Java......................................................................................... 232


12.1 Definio...............................................................................................................................................................................232
12.2 A criao do banco de dados.........................................................................................................................................233
12.3 A definio do driver para conexo............................................................................................................................234
12.4 A criao da aplicao em Java....................................................................................................................................234
12.4.1 A conexo com o banco de dados..................................................................................................................235
12.4.2 A consulta ao banco de dados por meio da linguagem SQL ...............................................................236
12.4.3 Criao de uma classe genrica para conexo ao banco......................................................................238
12.4.4 Outros exemplos de instrues em SQL ....................................................................................................240
12.5 Movimentao em registros e recuperao de contedo.................................................................................242
12.5.1 Criao de uma aplicao para navegao em registros......................................................................243
12.6 A criao de uma aplicao de cadastro...................................................................................................................247
Captulo 13 JSP - Java Server Pages............................................................................................................................... 257
13.1 Introduo ao JSP.............................................................................................................................................................257
13.2 Instalao do Tomcat.......................................................................................................................................................258
13.2.1 O Tomcat como um processo independente.............................................................................................259
13.2.2 Integrando o Tomcat ao NetBeans................................................................................................................260
13.3 Exemplos com JSP.............................................................................................................................................................260
13.3.1 Exemplos de aplicaes JSP.............................................................................................................................261
13.4 Aplicao cliente servidor..............................................................................................................................................264
13.4.1 Aplicao cliente..................................................................................................................................................265
13.4.2 Aplicao servidora.............................................................................................................................................266
13.5 Uso de classes em pginas JSP.....................................................................................................................................267
Captulo 14 Criao de Servlets...................................................................................................................................... 272
14.1 Definio...............................................................................................................................................................................272
14.2 Servlets e JSP......................................................................................................................................................................273
14.3 Criao de Servlets...........................................................................................................................................................273
14.4 Cadastro de filmes com Servlets.................................................................................................................................275
14.5 Publicar uma aplicao na Web...................................................................................................................................281
Bibliografia................................................................................................................................................................................. 285
Apndice A NetBeans e MySQL...................................................................................................................................... 287
A.1 Download e instalao do NetBeans...........................................................................................................................287
A.2 Download e instalao do MySQL................................................................................................................................290
A.3 A criao do banco de dados...........................................................................................................................................293
A.3.1 Por meio do prompt de comando.....................................................................................................................293
A.3.2 Por meio do NetBeans..........................................................................................................................................294
A.4 A criao de um projeto....................................................................................................................................................296
A.5 Adio dos arquivos ao projeto......................................................................................................................................299
Apndice B Eclipse, TomCat e MySQL........................................................................................................................... 308
B.1 Download e instalao do Eclipse.................................................................................................................................308
B.2 A criao do banco de dados...........................................................................................................................................310
B.3 A criao de um projeto....................................................................................................................................................310
B.4 Adio dos arquivos ao projeto......................................................................................................................................313

10

ERJ_Java_8.indb 10 31/03/2015 16:40:44


Prefcio

Os profissionais da rea de informtica no tm descanso. A cada dia surgem novas ferramen-


tas, tornando praticamente impossvel e estressante acompanhar todas as evolues tecnolgicas.
No mundo do desenvolvimento de sistemas existe uma srie de linguagens de programao. Apenas
para citar, dentre as modernas linguagens de programao podemos destacar: Java, .Net, Ruby, Scala,
Pynton, entre muitas outras. Em novembro de 2014, o site tiobe (www.tiobe.com) apontava que as qua-
tro linguagens de programao mais usadas eram C, Java, Objective-C e C++.
Diante desse contexto se encontra a linguagem Java como uma das mais usadas e uma das mais im-
portantes inovaes dos ltimos anos. Seu sucesso tem sido muito grande e seu aprendizado no pode
ser descartado, em especial para iniciantes e profissionais desenvolvedores da rea da computao.
Muita gente espalhada pelo globo, inclusive eu, investiu bastante tempo no aprendizado da lingua-
gem Java, perdendo muitas horas de sono. Mesmo com todo esse esforo, vale a pena. O resultado final
da elaborao de aplicaes muito motivante e compensador, e voc vai perceber no decorrer da leitura.
Muitas coisas na vida acontecem por acaso, e o mesmo ocorreu com a linguagem Java, uma vez que,
originalmente, ela no foi concebida para a utilizao na Internet. Inicialmente, Java foi elaborada para ser
usada em aparelhos eletrodomsticos, entretanto seu destino e desenvolvimento tm direcionado a lin-
guagem para ser utilizada nas mais diversas aplicaes. Uma conferncia nos Estados Unidos, no final da
dcada passada, apresentou como novidade um anel dotado de um programa em Java que, ao ser inserido
em uma mquina de caf, possibilitava personalizar o caf de acordo com as caractersticas do usurio.
Com isso notamos que no h limites para a linguagem Java, pois ser restrita apenas criatividade.
Quando ocorreu o surgimento da linguagem Java, houve uma verdadeira revoluo em termos de
desenvolvimento de software, sobretudo nos ligados Internet. Uma das grandes vantagens da lingua-
gem se referia incluso de programas que podiam ser transportados pela Internet e executados na
mquina local do usurio. Existem muitas outras possibilidades de desenvolvimento em Java no abor-
dadas nesta obra, como, por exemplo, a criao de Midlets, Portlets, Enterprise Java Beans, pginas
em JSP (Java Server Pages), AJAX (Asynchronous JavaScript Technology and XML) e diversas outras
interessantes. Vrias pesquisas apontam que o crescimento e a aceitao de Java tendem a continuar
nos prximos anos, mas necessrio dizer tambm que outras linguagens j citadas esto despertando,
e Java tem perdido um certo terreno.
Sem dvida esta publicao uma iniciativa que vem ao encontro das atuais necessidades de co-
nhecimento dos profissionais de informtica em termos de linguagem de programao. No perca mais
tempo, comece hoje mesmo a aprender essa fascinante linguagem. Encare esta obra como um ponto de
partida, porque h muitos detalhes que voc precisa aprender sobre Java.
Algumas pessoas me questionam por abordar os conceitos de orientao a objetos somente na
metade do livro (Captulo 7), uma vez que praticamente todos os livros de Java o fazem logo no incio.
Minha prtica do dia a dia como professor da linguagem, o prprio sucesso do livro e os comentrios
dos leitores mostraram-me que os alunos se adaptam melhor Orientao a Objetos se j possurem
uma certa experincia com a linguagem. No vejo nenhum problema nisso, pois o mais importante
facilitar o aprendizado dos alunos.
Este livro uma atualizao do Java 7 Ensino Didtico e contm diversas modificaes e melho-
rias. Vamos destacar as principais mudanas:
ff Todas as figuras do livro foram refeitas de forma a facilitar a interpretao dos assuntos aborda-
dos. A maioria dos exemplos presentes na verso 7 foi alterada. Todos os exerccios propostos fo-
ram alterados para trazer novos desafios ao leitor. Alm disso, conta com um material de apoio,
incluindo um endereo de QRCode a cada final de captulo, local onde o leitor encontrar outros
exerccios semelhantes para facilitar seu estudo.

11

ERJ_Java_8.indb 11 31/03/2015 16:40:44


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

ERJ_Java_8.indb 12 31/03/2015 16:40:44


Captulo

1
Java 8 Linguagem e Plataforma

Objetivos deste captulo


99Possibilitar ao leitor compreender a importncia da linguagem Java para os dias atuais, so-
bretudo no desenvolvimento da Internet.
99Descrever as principais caractersticas da linguagem Java.
99Descrever os procedimentos necessrios para o desenvolvimento de aplicaes em Java.
99Fornecer ao leitor o primeiro contato com a linguagem Java.

1.1 Breve histrico da linguagem Java


Linguagem Java? Um nome relativamente estranho para uma linguagem de programao se
comparado a Pascal, Cobol, Basic e diversos outros nomes de linguagem. Ele surgiu por acaso, quando
a equipe de engenheiros da Sun, a criadora do Java, foi tomar caf na esquina. Como numa reunio de
amigos, comearam a chamar a linguagem de Java, inspirados pelo nome da cidade de onde provinha
o caf que tomavam. Talvez a equipe nem imaginasse que o nome seria conhecido mundialmente.
Na realidade, no existe muito consenso entre os escritores americanos com relao verda-
deira histria da linguagem, o que para ns no importa muito. Alguns autores afirmam que o nome
Java se deve a um passeio que o pessoal da Sun fez numa ilha da Indonsia. Bem, como j comen-
tado, isso no importa. O que vale a pena aprender essa incrvel linguagem!
Originalmente, a linguagem foi concebida para utilizao em pequenos dispositivos eletrni-
cos inteligentes; entretanto, com as dificuldades de financiamento desse setor na poca e, princi-
palmente, devido ao surgimento da Internet a partir de 1993, novas oportunidades apareceram, e
a Sun entrou de cabea nessa rea.
A partir de 1995, a Sun anunciou o Java, no apenas como mais uma linguagem de progra-
mao, mas como uma nova plataforma de desenvolvimento. Dessa forma, Java comeou a ser
utilizada na elaborao de pginas para a World Wide Web, proporcionando uma produo com
contedo interativo e dinmico, inicialmente com o uso de applets com imagens em movimento.
Desde o ano de 1996 at hoje, a linguagem Java no para de crescer, produzindo solues
desde pequenas aplicaes at aplicativos corporativos, controle de servidores WWW etc. Java

13

ERJ_Java_8.indb 13 31/03/2015 16:40:44


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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!

1.2 A linguagem Java


bem provvel que o leitor j tenha ouvido falar da linguagem Java diversas vezes. Basta ler uma
revista especializada na rea de informtica que l est ela. A linguagem tem tido muito sucesso no
mercado, e diversas ferramentas tm surgido para manipular ou gerar cdigo Java.
Um dos motivos da grande aceitao da linguagem Java e que a tornou to atraente o fato de
que programas podem ser executados virtualmente em muitas plataformas, aceitos em muitos tipos
de equipamento. Com Java o processamento pde deixar de ser realizado apenas no lado do servidor,
como era a Internet no princpio, passando a ser executado tambm no cliente (entenda-se browser).
O aspecto da utilizao de Java em multiplataforma muito importante, porque os programado-
res no necessitam ficar preocupados em saber em qual mquina o programa ser executado, uma vez
que um mesmo programa pode ser usado num PC, num Mac ou em um computador de grande porte.
muito melhor para uma empresa desenvolver um software que possa ser executado em qualquer
lugar, independentemente da mquina do cliente. Seguindo essa mesma linha, a maioria das linguagens
de programao desenvolvidas recentemente tambm multiplataforma.
Java pode atuar em conjunto com outras linguagens, como o caso de HTML, em que as aplicaes po-
dem ser embutidas em documentos HTML, podendo ser transmitidas e utilizadas na Internet. Os programas
escritos em Java funcionam como um acessrio (por exemplo, um applet) que colocado no computador do
usurio no momento que ele acessa um site qualquer, isto , o computador do usurio passa a executar um
programa armazenado no servidor web que transferido para sua mquina no momento do acesso.
Num certo site o usurio pode executar um programa para a compra de um veculo e, logo em seguida,
ao acessar outro site, executar outro programa para consultar o extrato bancrio; tudo escrito em Java.
No fabuloso? Certamente voc no v a hora de comear a programar em Java. Tenha calma, durante
os captulos do livro voc ser guiado passo a passo nesse sentido.
A linguagem Java tambm tem sido usada para a criao de processos automticos na web. Os
processos envolvidos na atualizao de notcias, por exemplo, aquelas que aparecem a cada minuto em
um site qualquer, so aplicaes que podem ser desenvolvidas a partir do Java. Existe uma infinidade
de exemplos que poderia ser citada, entretanto apenas se convena de que Java importante para a
Internet e, principalmente, para voc e sua carreira.
Um outro aspecto a ser observado sobre a linguagem Java sua semelhana com a linguagem C++,
tanto no que diz respeito sintaxe dos comandos utilizados quanto na caracterstica de ser orientada a
objetos. A programao orientada a objetos hoje universalmente adotada como padro de mercado.
Muitas linguagens tradicionais foram aperfeioadas para implementar essa nova forma de trabalho, e
Java j nasceu assim.
Em funo do grande sucesso e aceitao que Java obteve no mercado, foram desenvolvidos mui-
tos frameworks que visam facilitao e automao do processo de desenvolvimento de software. Um
framework pode ser entendido como um ambiente de trabalho que torna transparente o processo de de-
senvolvimento, isto , o desenvolvedor normalmente no precisa se preocupar em como as coisas fun-
cionam e como elas se integram umas com as outras, o prprio ambiente se encarrega disso, reduzindo

14

ERJ_Java_8.indb 14 31/03/2015 16:40:44


Java 8 Linguagem e Plataforma

o trabalho e o tempo de desenvolvimento do software. Existem muitos frameworks (talvez centenas)


desenvolvidos para Java, dentre os quais podemos citar Struts, JSF, JUnit, Jasper Reports, Hibernate,
Prevayler, Spring, GWT, MyFaces. Cada framework traz sua contribuio para o aprimoramento no desen-
volvimento de aplicaes em Java e exige muita dedicao por parte dos profissionais da rea.
No temos por objetivo apresentar nenhum framework no decorrer do livro, mas importante que
o leitor saiba que num ambiente real de desenvolvimento de sistemas talvez exista a necessidade de
utilizar frameworks.
Outra questo importante se refere s edies da linguagem Java, isto , a diviso existente entre os
diferentes ambientes em que o Java pode ser empregado. As principais divises da linguagem Java so:
ff JSE (Java Standard Edition): pode ser considerada o core (a base principal) da linguagem, projeta-
da para execuo em mquinas simples e estaes de trabalho.
ff JEE (Java Enterprise Edition): voltada para o desenvolvimento de aplicaes baseadas em servi-
dor, tais com pginas JSP (JavaServer Pages), Servlets, XML (Extensible Markup Language) etc.
ff JME (Java Micro Edition): projetada para dispositivos com menor poder de processamento e me-
mria, tais com dispositivos mveis, celulares etc.
ff JavaFX: uma plataforma que suporta o desenvolvimento de aplicaes ricas que podem ser execu-
tadas em vrios dispositivos diferentes, tornando as interfaces grficas mais interativas e dinmi-
cas. Fornece suporte a qualquer biblioteca Java, o que torna possvel a criao de interfaces grficas
para diversos ambientes, incluindo desktop, browser, celulares, TVs, videogames, entre outros.
ff Java Card: uma plataforma voltada a dispositivos embarcados com limitaes de processamento e
armazenamento, como smart cards e o Java Ring.

1.3 As caractersticas da linguagem Java


A linguagem Java possui diversas caractersticas que podem gerar pginas e pginas de conceitos,
entretanto esses detalhes no sero discutidos, pois o objetivo maior pratic-los por meio da progra-
mao em Java. No decorrer dos captulos, diversos desses conceitos so demonstrados na prtica, pois
o que interessa. As principais caractersticas enfocadas neste livro se referem orientao a objetos,
portabilidade, suporte comunicao em rede e acesso remoto a banco de dados. Sobre essas caracte-
rsticas ser fornecida uma breve descrio em seguida:
ff Orientao a objetos: um paradigma de programao j slido no mercado, e a maioria das lingua-
gens de programao atuais permite trabalhar dessa forma. Como conceito inicial, imagine a orienta-
o a objetos como uma prtica de programao que torna possvel elaborar um software a partir da
gerao de objetos que se comunicam entre si. Esses objetos podem simular, apesar de no ser ape-
nas isso, um objeto do mundo real, como um automvel, uma casa, uma pessoa etc. Mais frente ser
apresentado o conceito de classe, um trecho de cdigo a partir do qual os objetos so criados. Imagine
a classe como uma forma de po que possibilita fazer pes com as mesmas caractersticas da forma.
ff Portabilidade: Java uma linguagem multiplataforma, ou seja, uma mesma aplicao pode ser exe-
cutada em diferentes tipos de plataforma sem a necessidade de adaptao de cdigo. Essa porta-
bilidade permite que um programa escrito na linguagem Java seja executado em qualquer sistema
operacional que possua uma mquina virtual Java.
ff Multithreading: threads (linhas de execuo) so o meio pelo qual se consegue fazer com que mais
de um evento acontea simultaneamente em um programa. Assim, possvel criar servidores de
rede multiusurio, em que cada thread, por exemplo, cuida de uma conexo de um usurio ao ser-
vidor, isto , um mesmo programa pode ser executado vrias vezes ao mesmo tempo e cada exe-
cuo pode processar uma instruo em um ponto diferente do mesmo programa.
ff Suporte comunicao: uma das vantagens do Java fornecer um grande conjunto de classes com
funcionalidades especficas, ou seja, muitos detalhes de programao so encapsulados em clas-
ses j prontas. Nesse contexto, a linguagem oferece um conjunto de classes para programao
em rede, o que agiliza a implementao de sistemas multiusurios. Tais classes so desenvolvidas

15

ERJ_Java_8.indb 15 31/03/2015 16:40:45


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

1.4 Criao de programas em Java


Na verdade, o ttulo desta seo soa meio estranho porque em Java dizemos que vamos criar uma
classe, no um programa, mas, como Java uma linguagem de programao, cremos que o termo pro-
grama no seja to absurdo. Seja como for, classe ou programa, sua digitao pode ser realizada por
meio de um editor de textos qualquer, ou de uma ferramenta especfica para isso, gerando o cdigo-
-fonte do programa (ou da classe).
Depois de digitado, esse programa deve passar por um processo de anlise do cdigo, a fim de
que seja verificada a existncia de erros de sintaxe. Esse processo chamado de compilao e re-
alizado por meio de um compilador Java, normalmente o compilador presente no kit de desenvolvi-
mento do Java. Todo programa Java deve ser compilado, assim como ocorre com outras linguagens
de programao, como Pascal, C, entre outras.
Com o compilador realizada a traduo do programa escrito em Java para uma linguagem in-
termediria chamada Java bytecodes um cdigo independente de plataforma que decifrado por
um interpretador Java, isto , para que um programa em Java seja executado, necessrio possuir uma
outra ferramenta chamada interpretador, responsvel por executar o programa escrito em Java em que
cada instruo do bytecode interpretada e executada no computador.
A Figura 1.1 ilustra a sequncia de desenvolvimento de um programa em Java. Como um programa
em Java deve ser criado na forma de uma classe, conceito estudado mais frente, deste ponto em diante
os programas sero chamados de classes.
Conforme pode ser observado na Figura 1.1, uma classe em Java (cdigo-fonte) pode ser digitada
em um editor de textos qualquer e deve ser salva com a extenso Java.
A seguir, uma ferramenta realiza sua compilao (compilador). Caso ocorram erros no processo de
compilao, o programa-fonte deve ser corrigido e compilado novamente enquanto persistirem os erros.
Quando no existirem mais erros de compilao, ser gerado um arquivo com extenso .class (o arquivo
com os bytecodes), a ser executado por um interpretador Java ou pelo browser, caso o programa seja
utilizado na Internet. Na maioria das principais ferramentas de desenvolvimento, o processo de compila-
o automtico, isto , ocorre durante a digitao do cdigo-fonte. A compilao vai sendo executada
automaticamente durante a digitao da mesma forma que o corretor ortogrfico dos editores de texto.

Cdigo-Fonte
Classe.java
Compilador
Ajustar
Cdigo-Fonte

S
Erros?

N Classe.class
Interpretador
ByteCodes
Execuo

Figura 1.1 Sequncia de desenvolvimento de um programa em Java.

16

ERJ_Java_8.indb 16 31/03/2015 16:40:45


Java 8 Linguagem e Plataforma

1.5 A plataforma Java


Plataforma um ambiente de software ou hardware no qual um programa roda. A maioria das
plataformas formada pelo conjunto hardware e um Sistema Operacional, isto , um conjunto de
hardware e software que atuam juntos. Java difere da maioria das outras plataformas porque com-
posta apenas de um software operando sobre uma outra plataforma qualquer.
No mundo dos computadores existem muitas plataformas, como Microsoft Windows, Macintosh,
Solaris, OS/2, UNIX e NetWare. Normalmente, para que um mesmo programa funcione em diferen-
tes plataformas, necessrio que ele seja compilado separadamente, isto , ele deve ser compilado na
plataforma em que ser executado. Uma aplicao que executada sobre uma plataforma pode no
funcionar sobre outra, porque o arquivo foi criado para uma plataforma especfica.
Java uma nova plataforma de software que possibilita que um mesmo programa seja executado
em diversas plataformas, talvez a caracterstica mais importante dessa linguagem. Os bytecodes gera-
dos pelo processo de compilao contm instrues para uma mquina virtual, independentemente de
uma mquina fsica. Um programa escrito na linguagem Java compilado e gera um arquivo de byteco-
des (com extenso .class), que pode ser executado onde quer que a plataforma Java esteja presente, em
qualquer sistema operacional subjacente. Em outras palavras, o mesmo programa pode ser executado
em qualquer sistema operacional que execute a plataforma Java.
Uma analogia relacionada plataforma Java pode ser visualizada na Figura 1.2, em que o mesmo
programa Java executado em diferentes plataformas.
Enquanto cada plataforma possui sua prpria implementao da mquina virtual Java, existe so-
mente uma especificao padronizada para a mquina virtual, proporcionando uma interface uniforme
para aplicaes de qualquer hardware. A Sun, a empresa desenvolvedora inicial do Java, criou um slogan
para a plataforma: Write Once, Run AnywhereSM, ou seja, uma vez criada a aplicao, ela pode ser execu-
tada em qualquer mquina, desde obviamente que exista a mquina virtual correspondente.

Software Java Software Java Software Java

Mquina Virtual Java Mquina Virtual Java Mquina Virtual Java

Windows Solaris UNIX

Mquina 1 Mquina 2 Mquina 3

Figura 1.2 Um mesmo programa Java executado em plataformas diferentes.

O desenvolvimento da plataforma Java permitiu o surgimento de outras linguagens de programa-


o que rodam sob a mquina virtual. o caso de Groovy, uma linguagem que possibilita a gerao de
bytecodes em Java, ou seja, possvel criar um programa em outra linguagem e gerar um arquivo
de bytecodes como se o programa tivesse sido criado em Java. Outra linguagem recente que se de-
senvolveu a partir do Java o Android, uma plataforma presente na maioria dos celulares e tablets do
mercado. Essa caracterstica torna possvel que outras linguagens ampliem o poder do prprio Java.

1.6 Ambiente de desenvolvimento


Este item apresenta um esboo das ferramentas bsicas necessrias para a elaborao, compilao
e execuo de aplicaes em Java.
Como qualquer outra linguagem, h muitos ambientes de desenvolvimento que suportam Java.
Existe uma infinidade de ferramentas que podem deixar o desenvolvedor em dvida na hora de esco-
lher o ambiente adequado de trabalho. No momento, as duas principais ferramentas de desenvolvi-
mento Java so NetBeans (http://www.netbeans.org) e Eclipse (http://www.eclipse.org); ambas podem

17

ERJ_Java_8.indb 17 31/03/2015 16:40:45


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

1.6.1 Instalao do Java


Existem diversas maneiras de preparar o ambiente para o desenvolvimento de aplicaes em Java.
Consideraremos inicialmente apenas o kit de ferramentas da Oracle: o JDK. Para detalhes sobre ins-
talao e utilizao da ferramenta NetBeans, consulte o Apndice A. Para detalhes sobre instalao e
utilizao da ferramenta Eclipse, consulte o Apndice B.
Na poca em que este livro foi escrito, a Oracle fornecia download gratuito de sua ferramenta a
partir do endereo http://www.oracle.com/technetwork/java/javase/downloads/index.html. O nome
do kit de ferramentas que voc deve baixar JDK 8, ou ainda uma outra verso mais recente, caso
se encontre disponvel. Na Figura 1.3 voc pode ver um link com o nome Java Plataform (JDK) 8.
Clique nesse item para acessar a pgina de download do Java 8. A letra u presente em 8u11 se refere
a update, isto , Java 8 update 11.

Figura 1.3 Download do JDK na plataforma Windows.

18

ERJ_Java_8.indb 18 31/03/2015 16:40:45


Java 8 Linguagem e Plataforma

Os procedimentos para instalao do JDK no Windows so os seguintes:


Faa o download da verso correspondente ao Sistema Operacional instalado em sua mquina.
Ao clicar no boto Accept Licence Agreement, aparece a tela referente Figura 1.4. Clique no link de
download e ser transferido o arquivo de instalao. Como voc pode notar, existem verses para v-
rias plataformas (Windows, Linux, Solaris etc.).

Figura 1.4 Download do JDK na plataforma Windows.

O processo de instalao bastante simples. Ao clicar no arquivo transferido pelo processo de


download, aparece uma janela de boas-vindas. Para prosseguir a instalao, pressione o boto Next. A
seguir surge uma nova janela, Figura 1.5. Por meio dela voc pode selecionar os itens que sero instala-
dos em sua mquina. Vamos entender cada um desses itens:
ff Development Tools: contm as ferramentas de desenvolvimento (compilador, interpretador
etc.), essenciais para o desenvolvimento de aplicaes em Java. Aps o trmino da instalao,
essas ferramentas estaro armazenadas numa pasta chamada bin dentro do diretrio prin-
cipal do Java.
ff Source Code: contm o cdigo-fonte das classes em Java. A Oracle passou a disponibilizar os
cdigos-fonte em Java a partir da verso 7 da linguagem. Aps o trmino da instalao, as
classes estaro armazenadas num arquivo compactado chamado src dentro do diretrio
principal do Java.
ff Public JRE: trata-se da mquina virtual (JRE Java Runtime Environment) necessria para a exe-
cuo de aplicaes em Java. Ela acompanha o JDK e por padro instalada no diretrio c:\
ProgramFiles\Java\jdk1.8.0_11 (o usurio pode escolher outro local, se preferir). Dependendo
da mquina do usurio, esse diretrio pode ser c:\ Arquivos de programas\Java\ jdk1.8.0_11. A
pasta padro de instalao tambm pode variar se a verso do Windows for 32 ou 64 bits.
Como o leitor pode observar pela Figura 1.5, no caso selecionamos todos os itens. Faa a escolha
que preferir e pressione o boto Next.
A prxima janela que aparece na Figura 1.6 solicita que o usurio defina o caminho da insta-
lao do JRE, conforme j informamos. Essa janela s aparecer se voc selecionou o item
Public JRE na janela do passo anterior. Pressione o boto Next para manter a pasta padro de ins-
talao do JRE.

19

ERJ_Java_8.indb 19 31/03/2015 16:40:46


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 1.5 Itens de instalao do JDK.

Figura 1.6 Caminho do JRE.

Ao encerrar a instalao, voc pode registrar o JDK no site da Oracle.


O processo de instalao transfere todas as ferramentas e outros pacotes
da linguagem para sua mquina. Ao instalar o JDK, criada uma pasta com
todos os arquivos do kit de ferramentas. O caminho padro da instalao
C:\Arquivos de programas\Java\jdk1.8.0_11. Dependendo da verso
instalada, uma pasta de nome diferente ser criada. Quando este livro foi
escrito, a verso da ferramenta JDK estava na 1.8.0_11. Provavelmente
a Oracle disponibilizar outras verses em breve, como, por exemplo,
jdk1.8.0_12, jdk1.8.0_13 e assim por diante. Como j dissemos, o nmero Figura 1.7 Pastas criadas
11, 12, 13 ao final do nome se refere ao nmero do update. Ao instalar o pela instalao do JDK.
JDK, so criadas diversas pastas, mostradas na Figura 1.7.
Observe que a pasta jdk1.8.0_11 a principal em que esto todas as outras (a Oracle chama-a de
JAVA_HOME). Dependendo da verso do JDK instalada, essa pasta pode ter nomes e contedos dife-
rentes. Concentre-se no nome da verso que voc baixou.

20

ERJ_Java_8.indb 20 31/03/2015 16:40:46


Java 8 Linguagem e Plataforma

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).

1.7 Primeiro contato com Java


Inicialmente, para fornecer o primeiro contato com a linguagem, ser apresentada uma classe em Java
que escreve uma mensagem qualquer na tela. Apesar de o exemplo ser simples, ele contm os itens funda-
mentais para a criao de qualquer aplicao em Java: elaborao do cdigo, compilao e execuo.
Antes de testar seu primeiro programa em Java, vamos elaborar um projeto em sua ferramenta
preferida (NetBeans ou Eclipse) e vamos adicionar um pacote chamado cap01 contendo a classe Livro.
java. Pense num pacote como uma pasta, mais frente forneceremos maiores detalhes a respeito. Em
nosso livro para todo captulo ser criado um pacote. Veja nas Figuras 1.8 e 1.9 como ficar o projeto
depois de pronto. Vamos descrever os procedimentos bsicos para criar o projeto. Caso tenha dvidas,
consulte os Apndices A (NetBeans) e B (Eclipse).

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.

1.7.1 Java com a IDE NetBeans


Para criar e executar uma classe a partir do NetBeans, siga estes passos:
1. Abra a IDE Net Beans Acesse o menu Arquivo Novo Projeto. Em Categoria escolha Java e em
Projetos escolha Aplicao Java. Pressione o boto Prximo. Surgir uma nova janela para definir
alguns dados de seu projeto. Em Nome do Projeto digite java8, desabilite a opo Criar classe prin-
cipal e pressione o boto Finalizar. Nesse ponto o seu projeto ter sido criado. Veja a Figura 1.10.

Figura 1.10 Projeto java8 na IDE NetBeans.

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

ERJ_Java_8.indb 21 31/03/2015 16:40:46


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 1.11 Classe Livro na IDE NetBeans.

Altere o cdigo da classe Livro, digitando a listagem do Exemplo 1.1.


Exemplo 1.1 Listagem da classe Livro no NetBeans

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.

Figura 1.12 Sada da execuo da classe Livro no NetBeans.

1.7.2 Java com a IDE Eclipse


Para criar e executar uma classe a partir do Eclipse, siga estes passos:

1. Abra a IDE Eclipse Acesse o menu File New Java Project.


Caso a opo Java Project no esteja disponvel, escolha
Project... e depois Java Project. Abrir uma nova janela con-
tendo os detalhes do projeto, em Project Name digite java8
e pressione o boto Finish. O projeto ser criado contendo a Figura 1.13 Projeto java8 na IDE Eclipse.
pasta src (source) e a biblioteca do JRE, veja a Figura 1.13.
2. Assim como fizemos no NetBeans, o prximo passo ser criar o pacote cap01 para armazenar nossa
classe Livro. Selecione o projeto java8, pressione o boto direito do mouse sobre ele e selecione New
Package. Na nova janela que surge, em Name digite cap01 e pressione o Finish. O prximo passo ser
criar a classe Livro dentro do pacote cap01. Para isso, selecione cap01, pressione o boto direito do
mouse sobre ele e selecione New Class. Na janela que surge, em Name digite Livro e pressione o bo-
to Finish. A Figura 1.14 apresenta a estrutura do projeto ( esquerda) e a classe Livro ( direita).

22

ERJ_Java_8.indb 22 31/03/2015 16:40:47


Java 8 Linguagem e Plataforma

Figura 1.14 A classe Livro na IDE Eclipse.

Altere o cdigo da classe Livro, digitando a listagem do Exemplo 1.1.


Para executar a classe, pressione o boto direito do mouse sobre o nome da classe e selecione Run
As Java Application (ou pelo atalho F11). Se tudo estiver correto, aparecer a sada na janela Console
como mostra a Figura 1.16.

Figura 1.15 A classe Livro criada na IDE Eclipse. Figura 1.16 Sada da execuo da classe Livro no Eclipse.

Toda classe em Java exige a presena da palavra reservada


class seguida do nome da classe. Por conveno, todo nome de Dica
classe em Java inicia-se com letra maiscula. Este livro tambm
utiliza esse padro. Um par de chaves envolve todo o cdigo da Procure salvar os arquivos em Java
classe sempre uma classe em Java possui uma chave que en- com o mesmo nome definido na
volve o cdigo. Existem muitos detalhes envolvidos na criao classe. Por exemplo, se voc criar
uma classe com o nome Veiculo
de classes de que trataremos no decorrer dos exemplos do livro.
(class Veiculo), salve-a com o nome
Toda classe executvel, isto , toda classe que ser inter- Veiculo.java. Esse procedimento
pretada e executada deve, obrigatoriamente, possuir o mtodo obrigatrio quando uma classe
main (principal), invocado quando a classe executada. No declarada como pblica (public
Exemplo 1.1, quando a classe for executada, ser invocado o m- class Veiculo). Todas as classes usa-
todo main que possui trs instrues para envio de mensagens das no livro sero declaradas como
na tela (System.out.println). No exatamente uma instruo pblicas e por isso precisam ter o
nome do arquivo exatamente igual
simples e sim uma classe da linguagem que possui um mtodo
ao definido para a classe.
especializado em sada de dados, mas vamos por partes.

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

ERJ_Java_8.indb 23 31/03/2015 16:40:47


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

ERJ_Java_8.indb 24 31/03/2015 16:40:47


Java 8 Linguagem e Plataforma

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/>.

Exerccios para fixao do contedo

As questes seguintes tm apenas uma resposta correta.


1. Complete as lacunas em cada uma das frases seguintes:
a. A empresa criadora da linguagem Java foi a _________________________.
b. __________ trata-se de um qualificador que indica que o mtodo pertence classe.
c. Toda classe executvel deve, obrigatoriamente, possuir o mtodo _________________________.
d. __________ um qualificador que faz com que uma classe seja visvel a outras classes.

25

ERJ_Java_8.indb 25 31/03/2015 16:40:47


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

2. A palavra reservada em Java utilizada para definir o nome da classe :


a. public
b. void
c. main
d. class
3. Um dos principais motivos que contribuiu para o desenvolvimento da linguagem Java foi:
a. O nome da linguagem.
b. O desenvolvimento da Internet.
c. A linguagem ser relativamente simples.
d. O desempenho da linguagem em termos de velocidade.
4. Por que a utilizao de Java em multiplataforma muito importante para os programadores?
5. Qual das caractersticas seguintes no diz respeito linguagem Java?
a. Pode ser executada em qualquer computador, independentemente de existir uma mquina vir-
tual Java instalada.
b. uma linguagem que pode ser usada para o desenvolvimento de aplicaes voltadas web.
c. uma linguagem com suporte orientao a objetos.
d. uma linguagem com um bom nvel de segurana.
6. A sequncia de desenvolvimento de uma classe em Java :
a. Compilao, digitao e execuo.
b. Digitao, execuo e compilao.
c. Digitao, compilao e execuo.
d. Digitao e execuo.
7. Cite um nome de linguagem que pode ser executada a partir da mquina virtual Java.
8. Com base no Exemplo 1.1 apresentado neste captulo, crie uma nova classe que mostre na tela as
mensagens Ensino didtico Java 8 e Uma maneira fcil e gostosa de aprender.
9. Qual a funo do compilador Java?
10. Assinale a alternativa correta em relao ao JDK.
a. JDK uma ferramenta de desenvolvimento e serve apenas para testar a execuo de aplica-
es em Java.
b. uma ferramenta de desenvolvimento e serve apenas para compilar classes feitas em Java.
c. um kit de ferramentas e serve para proporcionar uma interface amigvel com o usurio.
d. um kit de ferramentas e serve para o desenvolvimento completo de aplicaes em Java.

Seu prximo passo

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

ERJ_Java_8.indb 26 31/03/2015 16:40:47


Captulo

2
Aspectos Fundamentais de Java

Objetivos deste captulo


99Fornecer o primeiro contato com a linguagem Java por meio de pequenos exemplos.
99Descrever os principais tipos de dados e operadores.
99Demonstrar a declarao de variveis e sua utilizao.
99Enumerar os principais conversores de tipo usados em Java.
99Demonstrar diferentes formas de entrada de dados em Java.

2.1 Tipos de dados


Antes de comearmos, vamos fazer uma pequena analogia. Um caminho pode transportar dife-
rentes objetos, e cada um deles pode exigir uma embalagem diferente para ser armazenado. Em fun-
o disso, cada objeto pode exigir um espao fsico diferente no compartimento de carga. Ao sair de
viagem com o caminho, seu Francisco carrega diversos produtos alimentcios, todos acondicionados
em embalagens especiais. Isso importante para que os produtos permaneam bem acomodados
no compartimento de carga. Dessa forma, seu Francisco tem certeza de que os produtos chegaro
ao destino da mesma maneira como iniciaram a viagem, isto , suas caractersticas permanecero as
mesmas, os produtos chegaro ao destino de maneira intacta, sem sofrerem nenhum dano.
Para que o exposto seja verdade, essencial utilizar a embalagem correta para cada tipo de
produto. Por exemplo, a embalagem usada para transporte de bananas ser diferente da usada
para peras. O que aconteceria se seu Francisco tentasse colocar uma melancia numa caixa desti-
nada a guardar caquis? A embalagem ideal para acondicionar caquis no pode ser a mesma usada
para melancias, que seriam muito grandes para a embalagem; no possvel guardar uma melancia
numa caixa de caquis.
De forma semelhante, em computao existem diferentes tipos de dados (tipos numricos,
caracteres, textuais etc.), e cada um precisa de um espao diferente na memria do computador,
cada um exige uma embalagem adequada para seu armazenamento. Cada embalagem pode ser
considerada um tipo de dado diferente.

27

ERJ_Java_8.indb 27 31/03/2015 16:40:48


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Tipo Quantidade de bits Valores


char 16 \u0000 a \uFFFF
byte 8 -128 a + 127
int 32 -2.147.483.648 a +2.147.483.647
short 16 -32.768 a + 32.767
-9.223.372.036.854.775.808 a
long 64
+9.223.372.036.854.775.807
float 32 -3.40292347E+38 a +3.40292347E+38
-1.79769313486231570E+308 a
double 64
+1.79769313486231570E+308
boolean 8 true ou false

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.

2.2 Definio de variveis e constantes


Uma varivel ou constante um tipo de identificador cujo nome, escolhido pelo programador,
associado a um valor pertencente a um certo tipo de dado. Em outras palavras, um identificador a lo-
calizao da memria (um endereo ou vrios deles) capaz de armazenar o valor de um certo tipo, para o
qual se d um nome (o nome da varivel, constante, objeto etc.) que usualmente descreve seu significado
ou propsito. Dessa forma, todo identificador possui um nome, um tipo e um contedo. Os identificadores

28

ERJ_Java_8.indb 28 31/03/2015 16:40:48


Aspectos Fundamentais de Java

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

abstract default goto* Package this


assert*** do if Private throw
boolean double implements protected throws
break else import public transient
byte enum**** instanceof Return try
case extends int Short true
catch false interface static void
char final long strictfp** volatile
class finally native Super while
const* float new Switch
continue for null Synchronized
* no usado
** adicionado verso 1.2
*** adicionado verso 1.4
**** adicionado verso 1.5

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.

2.2.1 Declarao de variveis


Quando as variveis so declaradas, a linguagem Java atribui a elas valores padro, a menos que
especificado de maneira contrria pelo programador. Atribui-se a todas as variveis dos tipos char, byte,
short, int, long, float e double o valor 0 por default. J s variveis do tipo boolean, por default, atribui-se
false. Entretanto, dependendo do ponto do programa em que a varivel utilizada, torna-se obrigatria
sua inicializao com algum valor, mesmo que a linguagem possua esses valores padro.
As variveis tambm possuem sensibilidade, isto , ao declarar uma varivel com o nome dolar, ela
deve ser utilizada sempre da mesma forma. No pode ser usada como Dolar, DOLAR, dOlar ou qualquer
outra variao, apenas com todas as letras minsculas, como realizado em sua declarao.
Os nomes de variveis devem comear com letra, caractere de sublinhado (_) ou cifro ($). No
permitido iniciar o nome de uma varivel com nmero. Por conveno, a linguagem Java utiliza o se-
guinte padro para nomear as variveis (e outros identificadores):
ff Quando o nome da varivel for composto apenas por um caractere ou palavra, os caracteres de-
vem ser minsculos.

29

ERJ_Java_8.indb 29 31/03/2015 16:40:48


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Exemplo 2.1 Listagem da classe Tipos 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

ERJ_Java_8.indb 30 31/03/2015 16:40:48


Aspectos Fundamentais de Java

Figura 2.1 A classe TiposPrimitivos. Figura 2.2 Tela de execuo do Exemplo 2.1.

2.2.2 Declarao de constantes


Uma constante um tipo de varivel que no pode alterar seu contedo depois de ter sido iniciali-
zado, ou seja, o contedo permanece o mesmo durante toda a execuo do programa. Na realidade no
existem constantes em Java, o que existe um tipo de varivel com comportamento semelhante a uma
constante de outras linguagens. Em Java, essa varivel definida como final. Essas constantes so usa-
das para armazenar valores fixos, geralmente definidos no incio de uma classe. Em Java, padronizou-se
identificar as variveis do tipo final com todas as letras maisculas, e quando existe mais de uma palavra
elas so separadas pelo caractere de underline (_). Exemplos de valores constantes so: o valor de PI na
matemtica (3.14), o valor da acelerao na fsica (9.81 m/s2), a quantidade de milissegundos existentes
em um segundo (1.000) etc. Veja alguns exemplos seguintes de declarao de variveis do tipo final:

final double PI = 3.14;


final int MILISEGUNDOS_POR_SEGUNDO = 1000;
final long MILISEGUNDOS_POR_DIA = 24 * 60 * 60 * 1000;

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.

final int MILIMETROS_POR_CENTIMETRO;


.
.
.
MILIMETROS_POR_CENTIMETRO = 10;

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

ERJ_Java_8.indb 31 31/03/2015 16:40:49


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 2.2 Listagem da classe Comentarios

Para testar a execuo do Exemplo 2.2, faa o seguinte:


1. Salve a classe Comentarios dentro do pacote cap02 criado no exemplo anterior.
2. Selecione e execute a classe Comentarios (Shift + F6 no NetBeans ou F11 no Eclipse).
A Figura 2.3 apresenta a estrutura do projeto com a classe Comentarios e a Figura 2.4 apresenta o
resultado da execuo do Exemplo 2.2.

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.

2.4.1 Operadores aritmticos


A Tabela 2.3 demonstra os operadores aritmticos usados na linguagem Java.
Tabela 2.3 Operadores aritmticos em Java

Funo Sinal Exemplo


Adio + x+y
Subtrao - xy
Multiplicao * x*y
Diviso / x/y
Resto da diviso inteira % x%y
Sinal negativo - -x
Sinal positivo + +x
Incremento unitrio ++ ++x ou x++
Decremento unitrio -- --x ou x--

32

ERJ_Java_8.indb 32 31/03/2015 16:40:49


Aspectos Fundamentais de Java

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.

Exemplo 2.3 Listagem da classe OperadoresAritmeticos

Para testar a execuo do Exemplo 2.3, faa o seguinte:


1. Salve a classe OperadoresAritmeticos dentro do pacote cap02.
2. Selecione e execute a classe OperadoresAritmeticos (Shift + F6 no NetBeans ou F11 no Eclipse).
A Figura 2.5 apresenta a estrutura do projeto com a classe OperadoresAritmeticos e a Figura 2.6
apresenta o resultado da execuo do Exemplo 2.3.

Figura 2.5 A classe OperadoresAritmeticos. Figura 2.6 Tela de execuo do Exemplo 2.3.

2.4.2 Operadores relacionais


Os operadores relacionais possibilitam comparar valores ou expresses, retornando um resultado
lgico verdadeiro ou falso. A Tabela 2.4 demonstra os operadores relacionais usados em Java, e sua
utilizao apresentada no Captulo 3.

33

ERJ_Java_8.indb 33 31/03/2015 16:40:49


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Tabela 2.4 Operadores relacionais em Java


Dica
Caractere(s)
Funo Exemplo
utilizado(s) Cabe observar a utilizao do sinal de igualda-
Igual == x == y de (==) para a comparao de variveis ou ex-
presses. Pelo fato de o sinal de igual simples
Diferente != x != y (=) ser utilizado na maioria das outras lingua-
gens de programao, boa parte dos iniciantes
Maior que > x>y
em Java troca o duplo igual (==) pelo sinal de
Maior ou igual a >= x >= y atribuio (igual simples). Isso nem sempre
acarreta erro de compilao, gerando resulta-
Menor que < x<y dos imprevisveis. Procure prestar muita aten-
Menor ou igual a <= x <= y o em sua utilizao nas classes.

2.4.3 Operadores lgicos


So operadores que permitem avaliar o resultado lgico de diferentes operaes aritmticas em
uma expresso. Os operadores lgicos usados em Java so demonstrados na Tabela 2.5, e sua utilizao
apresentada no Captulo 3.
Tabela 2.5 Operadores lgicos em Java

Funo Caractere(s) utilizado(s) Exemplo


E lgico ou AND && x && y
Ou lgico ou OR || x || y
Negao ou NOT ! !x

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.

2.4.4 Sequncias de escape


A linguagem de programao Java tambm possui algumas sequncias de escape, que so atalhos utiliza-
dos para representar um caractere especial como, por exemplo, uma quebra de linha (\n). Observe a Tabela 2.6.
Tabela 2.6 Sequncias de escape

Sequncia Caractere especial


\b Espao
\f Form feed
\n Nova linha
\r Retorno
\t Tabulao
\ Aspas duplas
\ Aspas simples
\\ Barra invertida

34

ERJ_Java_8.indb 34 31/03/2015 16:40:49


Aspectos Fundamentais de Java

2.5 Converso de tipos


Em diversas aplicaes em Java preciso realizar a converso dos diversos tipos primitivos exis-
tentes. A linguagem Java possui uma srie de classes que realizam essa tarefa. A Tabela 2.7 apresenta
algumas converses de tipos. As palavras principais usadas na converso aparecem em negrito. No de-
correr do livro, diversas vezes sero utilizados esses conversores de tipos.

Tabela 2.7 Algumas converses de tipo


Supondo a varivel x Converter em y recebe o valor convertido
int x = 10 float float y = (float) x
int x = 10 double double y = (double) x
float x = 10.5 int int y = (int) x
String x = 10 int int y = Integer.parseInt(x)
String x = 20.54 float float y = Float.parseFloat(x)
String x = 20.54 double double y = Double.parseDouble(x)
String x = Java Vetor de bytes byte b[] = x.getBytes()
int x = 10 String String y = String.valueOf(x)
float x = 10.35 String String y = String.valueOf(x)
double x = 254.34 String String y = String.valueOf(x)
byte x[] - (x um vetor de bytes) String String y = new String(x)

O Exemplo 2.4 apresenta a classe ConversaoTipos que realiza algumas converses presentes na
Tabela 2.7.

Exemplo 2.4 Listagem da classe ConversaoDeTipos

Funcionalidades mais importantes do Exemplo 2.4:


ff Linha 4: contm a declarao da varivel s1 do tipo String que recebe o valor 10.
ff Linha 5: contm a declarao da varivel v (do tipo inteiro) que recebe o valor da varivel s1 (do tipo
String), convertido para inteiro por meio de Integer.parseInt(s1). Ainda cedo para explicar isso,
mas, s para que voc v se acostumando com os termos em Java, Integer uma classe (inicia em
maiscula) e parseInt um mtodo da classe Integer que recebe um texto e o transforma em inteiro.
Essa caracterstica se refere base da linguagem Java: ela formada por classes que contm mtodos.
ff Linhas 6 e 7: semelhantemente linha 5, contm a declarao das variveis x (do tipo float) e y (do tipo
double) recebendo o contedo da varivel s1 (do tipo String) em forma de float e double, respectiva-
mente, por meio do mtodo parseFloat da classe Float e do mtodo parseDouble da classe Double.
ff Linhas 8 e 9: contm a declarao de duas variveis inteiras w e z, que recebem, respectivamente,
o contedo das variveis x (do tipo float) e y (do tipo double), como inteiros. Como vimos anterior-
mente, para realizar a converso de valores numricos, basta inserir o tipo entre parnteses antes
do nome da varivel (ou contedo) a ser convertida.
ff Linha 10: contm a declarao da varivel s2 (do tipo String) que recebe o contedo da varivel v
(do tipo inteiro) convertido em texto por meio do mtodo valueOf da classe String.

35

ERJ_Java_8.indb 35 31/03/2015 16:40:50


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

2.6 Entrada de dados pelo teclado


Uma aplicao provavelmente no receber dados pelo prompt durante a execuo. O mais co-
mum receber os dados do usurio por meio do teclado. Esta seo apresenta trs classes diferentes
que permitem realizar esse processo: DataInputStream, BufferedReader e Scanner.

2.6.1 Uso da classe DataInputStream


O Exemplo 2.5 recebe o comprimento e a largura de um retngulo em tempo de execuo e apre-
senta o valor da rea e do permetro. A entrada dos dados do usurio realizada por meio da classe
DataInputStream.

Exemplo 2.5 Listagem da classe EntradaComDataInputStream

Funcionalidades mais importantes do Exemplo 2.5:

36

ERJ_Java_8.indb 36 31/03/2015 16:40:50


Aspectos Fundamentais de Java

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

ERJ_Java_8.indb 37 31/03/2015 16:40:50


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

ff Linhas 14 a 17: so praticamente idnticas s linhas 9 a 12. A diferena se refere utilizao de


outras variveis.
ff Linhas 19 a 22: realizam o clculo da rea do permetro e imprimem o resultado em tela.
Para testar a execuo do Exemplo 2.5, faa o seguinte:
1. Salve a classe EntradaComDataInputStream dentro do pacote cap02.
2. Selecione e execute a classe EntradaComDataInputStream.
A Figura 2.9 apresenta a estrutura do projeto com a classe EntradaComDataInputStream e a Figura
2.10 apresenta o resultado da execuo do Exemplo 2.5.

Figura 2.9 A classe EntradaComDataInputStream. Figura 2.10 Tela de execuo do Exemplo 2.5.

2.6.2 Uso da classe BufferedReader


A seguir apresentado o Exemplo 2.6, similar ao 2.5, porm utilizando o mtodo readLine da classe
BufferedReader. O resultado da execuo idntico ao Exemplo 2.5.

Exemplo 2.6 Listagem da classe EntradaComBufferedReader

2.6.3 Uso da classe Scanner


Outra possibilidade de entrada de dados pelo usurio se refere ao uso da classe Scanner, disponvel
a partir da verso J2SE 5.0. A grande vantagem dessa classe possuir diversos mtodos para leitura de
tipos de dados diferentes, caracterstica que facilita o desenvolvimento do cdigo. Da mesma forma
que na classe BufferedReader, voc consegue ler a linha inteira digitada pelo usurio, porm a classe
Scanner mais simples de se utilizar. Observe o Exemplo 2.7.

38

ERJ_Java_8.indb 38 31/03/2015 16:40:51


Aspectos Fundamentais de Java

Exemplo 2.7 Listagem da classe EntradaComScanner

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.

2.7 Caixa de dilogo para a entrada de dados


A linguagem Java dispe de uma forma grfica para receber dados do usurio. Trata-se da utilizao
de caixas de dilogo, no caso a caixa gerada a partir da classe JOptionPane, vista em detalhes no Cap-
tulo 8. O fato de receber dados de forma grfica parece dar mais motivao aos iniciantes em Java. Por
esse motivo, os exemplos seguintes utilizam essa forma para entrada de dados do usurio. O Exemplo 2.8
refaz os exemplos anteriores, porm empregando a classe JOptionPane para entrada de dados.
Exemplo 2.8 Listagem da classe EntradaComJOptionPane

39

ERJ_Java_8.indb 39 31/03/2015 16:40:51


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Exerccios para prtica da linguagem Java

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

ERJ_Java_8.indb 40 31/03/2015 16:40:52


Aspectos Fundamentais de Java

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/>.

Seu prximo passo

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

ERJ_Java_8.indb 41 31/03/2015 16:40:52


Captulo

3
Estruturas Condicionais,
de Exceo e Repetio

Objetivos deste captulo


99Fornecer conhecimentos suficientes para que o leitor possa utilizar corretamente as estru-
turas condicionais.
99Demonstrar a utilizao das estruturas de repetio.
99Esclarecer as diferenas entre as estruturas de repetio.
99Fornecer uma viso geral de excees durante a execuo de um programa e os tratamen-
tos de erro.

3.1 Estruturas condicionais


As estruturas condicionais existem em todas as linguagens de programao e possibilitam
que a execuo de um programa seja desviada de acordo com certas condies. Os comandos
condicionais (ou ainda instrues condicionais) usados em Java so if-else e switch-case. Essas
duas estruturas de desvio existentes na linguagem possibilitam executar diferentes trechos de
um programa com base em certas condies.

3.1.1 A estrutura if-else


O if, em conjunto com o else, forma uma estrutura que permite a seleo entre dois caminhos
distintos para execuo, dependendo do resultado (verdadeiro ou falso) de uma expresso lgica
(condio). Nesse tipo de estrutura, se a condio for verdadeira, so executadas as instrues
que estiverem posicionadas entre as instrues if/else. Sendo a condio falsa, so executadas as
instrues que estiverem aps a instruo else. A sintaxe para a utilizao do conjunto if else
demonstrada em seguida. Observe que a condio sempre deve aparecer entre parnteses, item
obrigatrio na linguagem Java.

42

ERJ_Java_8.indb 42 31/03/2015 16:40:52


Estruturas Condicionais, de Exceo e Repetio

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

Figura 3.1 Representao grfica do if/else.

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

[verdadeira] [falsa] [verdadeira] [falsa]


condio condio

bloco 1 bloco 1 bloco 2

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

Incio Incio Incio Incio

[verdadeira] [verdadeira]
[falsa] [falsa]
[verdadeira] [verdadeira]
[falsa] [falsa]
condio condio condio condio

bloco 1 bloco 1 bloco 1 bloco 1 bloco 2 bloco 2

Fim Fim Fim Fim

if com else aninhado

Incio Incio

[verdadeira] [verdadeira][falsa] [falsa]


condio condio

[verdadeira] [verdadeira]
[falsa] [falsa]
bloco 1 bloco 1 condio condio

[verdadeira] [verdadeira]
[falsa] [falsa]
bloco 2 bloco 2 condio condio

bloco 3 bloco 3 bloco 4 bloco 4

Fim Fim

Figura 3.2 Variaes da estrutura condicional.

No primeiro caso executado um bloco de instrues somente se a condio for verdadeira; no


segundo caso sero executados um bloco de instrues para a condio verdadeira e outro para a falsa;
j no terceiro caso, quando encontrada a primeira condio verdadeira todas as outras sero descon-
sideradas. Seja o caminho que for, apenas um bloco de instrues ser executado. O terceiro caso de-
monstra que para cada condio falsa executada uma outra condio, mas poderia ser representado
ao contrrio, ou seja, a condio verdadeira poderia levar execuo de uma outra condio.
Os exemplos seguintes demonstram esses trs tipos de estrutura em Java.

Estrutura 1: if sem else


O Exemplo 3.1 mostra um uso prtico do if sem a presena do else. Trata-se de uma classe em que
o usurio seleciona uma opo (Masculino ou Feminino) e a partir disso usada a instruo if para exe-
cutar instrues diferentes. Vamos analisar o exemplo.

44

ERJ_Java_8.indb 44 31/03/2015 16:40:53


Estruturas Condicionais, de Exceo e Repetio

Exemplo 3.1 Listagem da classe If

Funcionalidades comentadas do Exemplo 3.1:


ff Linha 5: cria um array de objetos chamado op contendo os valores Masculino e Feminino.
Esses so os itens que aparecem para o usurio escolher. Se precisar de outras opes, basta adi-
cionar seguindo o mesmo padro. O estudo detalhado de arrays apresentado no Captulo 5. Por
enquanto, considere que um array permite criar uma relao de valores.
ff Linhas 6 a 9: conforme abordado no captulo anterior, o mtodo showInputDialog da caixa de di-
logo JOptionPane permite que um valor seja fornecido pelo usurio. Nesse caso em especfico,
estamos apresentando uma maneira de customizar essa caixa de dilogo, pois, em vez de apre-
sentar uma caixa de texto para digitao de um valor (a forma padro), apresentada uma lista de
opes. O estudo mais aprofundado da classe JOptionPane dado no Captulo 8. Nesse momen-
to vamos apresentar apenas alguns aspectos relacionados ao mtodo showInputDialog. As linhas
6 e 9 formam uma nica linha, mas, por questes didticas, achamos melhor dividi-la em partes.
Vamos entender isso seguindo as instrues da esquerda para a direita.
String resp: declara uma varivel do tipo String chamada resp. Essa varivel receber o contedo
selecionado pelo usurio na caixa de dilogo.
(String): um mecanismo de converso, isto , o resultado da instruo direita ser convertido
para o tipo String.
JOptionPane.showInputDialog: mtodo showInputDialog da classe JOptionPane que abrir a
caixa de opes para o usurio. Neste exemplo, o mtodo recebe 7 valores (tecnicamente cha-
mados de parmetros): o 1. se refere ao local em que a caixa de mensagens ser exibida: como
est definido null a caixa de dilogo ser exibida no centro da tela; o 2. se refere mensagem que
ser exibida ao usurio, no caso selecione o sexo; o 3. se refere ao ttulo que ser exibido na cai-
xa de mensagem, no caso Pesquisa; o 4. se refere a um valor inteiro que define qual cone ser
exibido na caixa de mensagem, no caso uma interrogao por meio da constante (JOptionPane.
QUESTION_MESSAGE); o 5. se refere a um cone externo que pode ser usado, isto , pode ser
definida uma imagem que ser exibida na caixa de dilogo;
o 6. se refere lista de opes que sero exibidas para o
usurio selecionar, no caso definido pela varivel op (um
Dica
array de objetos); o 7. se refere opo que aparecer se-
lecionada por default. Esse texto deve ser igual a uma das Para realizar vrias comparaes
opes possveis de ser selecionada. em um mesmo if, podem ser utili-
ff Linha 10: a instruo if verifica se foi pressionado o boto zados os operadores lgicos nas
seguintes formas: if (x>y && x<7),
Cancel da caixa de dilogo, ou seja, caso o usurio pressio-
if (x>y || x>z || x>k). Todas as com-
ne o boto Cancel no momento em que a caixa de dilogo
paraes devem estar envolvidas
aparece, ento a varivel resp recebe o valor null (isso
por um nico parntese.
ocorre na linha 6).

45

ERJ_Java_8.indb 45 31/03/2015 16:40:53


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 3.3 Tela de execuo do Exemplo 3.1 com seleo de Feminino.

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

Funcionalidades comentadas do Exemplo 3.2:


ff Quando este exemplo for executado, o usurio deve entrar com um valor numrico entre 1 e 12
na caixa de dilogo gerada pela classe JOptionPane.
ff Linha 5: conforme abordado anteriormente, o mtodo showInputDialog da classe JOptionPane
permite que um valor seja fornecido pelo usurio. Esse valor armazenado na varivel aux.
Como se notou, a caixa de dilogo possui os botes OK e Cancel. Caso o usurio pressione o boto
Cancel, o valor da varivel aux ser nulo (null).
ff Linha 6: verifica se o usurio pressionou o boto Cancel da caixa de dilogo presente na linha 5, ou
seja, se o valor de aux diferente de nulo (!=null). Se for diferente de nulo, executa o trecho entre
chaves composto pelas linhas 7 a 17.
O bloco try catch (entre as linhas 7 e 16) o responsvel por verificar se o usurio digitou um
valor numrico, uma vez que valores indevidos provocam erros de converso. Maiores detalhes
sobre o bloco try catch so apresentados na Seo 3.2 deste captulo.
ff Linha 9: contm a instruo if responsvel por verificar se o nmero referente ao ms, digitado
pelo usurio, est compreendido entre os valores 1 e 12. Se a comparao for verdadeira, envia
uma mensagem positiva (linha 10); caso seja falsa, executa a instruo else (linha 11) e envia uma

46

ERJ_Java_8.indb 46 31/03/2015 16:40:53


Estruturas Condicionais, de Exceo e Repetio

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.

Figura 3.4 Tela de 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

Conforme citamos anteriormente, nesse tipo de estrutura, ao se encontrar a primeira condio


verdadeira, todas as outras so desprezadas e o controle da execuo levado ao final da primeira ins-
truo if que iniciou o processo. Por exemplo: se na linha 9 a condio mes == 1 for verdadeira, todas as
condies abaixo so desprezadas e a execuo do programa salta para a linha 21. Essa caracterstica
da estrutura permite economizar tempo, pois se a condio verdadeira j foi encontrada no existe
necessidade de se testar outras condies. Se fosse utilizada a estrutura do if sem o else (um if simples
para cada condio como no Exemplo 3.1), todas as 12 comparaes seriam executadas sempre, uma a
uma, mesmo que a condio verdadeira j tivesse sido encontrada anteriormente.

3.1.2 Estrutura if resumido


Agora que o leitor j conhece o funcionamento da estrutura condicional if, vamos apresentar uma
sintaxe alternativa por meio do operador interrogao (?).
Para facilitar a compreenso, vamos analisar o Exemplo 3.4, cuja listagem aparece em seguida.

47

ERJ_Java_8.indb 47 31/03/2015 16:40:54


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 3.4 Listagem da classe IfResumido

Funcionalidades comentadas do Exemplo 3.4:


ff O exemplo realiza a comparao de dois valores e apresenta o maior deles em tela. Esse processo
realizado duas vezes, uma usando a estrutura if-else que apresentamos anteriormente e outra
por meio do if reduzido.
ff Linhas 5 a 11: so declaradas duas variveis inteiras com os valores 10 e 15. Na estrutura if
compara-se se o valor das variveis (a e b). O maior valor dentre as duas variveis armaze-
nado na varivel maior. A linha 11 imprime na caixa de dilogo o valor da maior varivel, no
caso o valor 15.
ff Linhas 13 a 15: fazem exatamente a mesma coisa do tpico anterior, porm de forma resumida. A
linha 13 declara e inicializa o valor nas variveis c e d. Na linha 14, o operador ? faz o papel do if do
tpico anterior. Da esquerda para a direita podemos interpretar a sintaxe da forma seguinte:
(c > d) ? o contedo da varivel c maior do que o contedo da varivel d?
c : d caso a pergunta anterior seja verdadeira, retorna o contedo da varivel c, caso contrrio, o
contedo da varivel d. Dessa forma, a varivel maior receber o maior valor dentre as duas variveis.

3.1.3 A estrutura switch-case


A estrutura switch-case se refere a uma outra modalidade de desvio da execuo do programa de
acordo com certas condies, semelhante ao uso da instruo if. Ao trabalhar com uma grande quantidade
de desvios condicionais contendo instrues if, pode-se comprometer a inteligibilidade do programa, di-
ficultando sua interpretao. A estrutura switch-case possibilita uma forma mais adequada e eficiente de
atender a esse tipo de situao, constituindo-se uma estrutura de controle com mltipla escolha.
A estrutura switch-case equivale a um conjunto de instrues if encadeadas, fornecendo maior
inteligibilidade. Sua sintaxe a seguinte:

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

ERJ_Java_8.indb 48 31/03/2015 16:40:54


Estruturas Condicionais, de Exceo e Repetio

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

Figura 3.5 Representao grfica switch-case.

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

ERJ_Java_8.indb 49 31/03/2015 16:40:54


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

A Figura 3.6 apresenta a execuo do Exemplo 3.5.


Exemplo 3.5 Listagem da classe SwitchCase

Figura 3.6 Tela de execuo do Exemplo 3.5.

3.2 Excees em Java


As excees em Java referem-se aos erros que podem ser gerados durante a execuo de um pro-
grama. Como o nome sugere, trata-se de algo que interrompe a execuo normal do programa. Em Java,
as excees so divididas em duas categorias: Unchecked (no verificadas) e Checked (verificadas).

3.2.1 Unchecked Exception


Nesse tipo de exceo o compilador Java no verifica o cdigo-fonte para determinar se a exce-
o est sendo capturada. Assim, o tratamento desse tipo de exceo opcional. A linha 8 do exemplo
anterior apresenta o uso de uma exceo no verificada (a converso de String em inteiro). Apesar de
termos tratado o erro de converso pela estrutura try-catch, isso opcional. Mesmo se a estrutura
try-catch for retirada, a classe continua compilando normalmente. Outros exemplos de exceo desse
tipo so o acesso a um ndice inexistente num array e o uso do mtodo de um objeto que ainda no foi
instanciado (nulo). Esses itens so estudados mais frente.

3.2.2 Checked Exception


Ao contrrio de Unchecked Exception, nesse tipo de exceo o compilador Java verifica o cdigo-
-fonte para determinar se a exceo est sendo capturada. Se uma exceo verificada no for captu-
rada (no estiver sendo tratada no cdigo-fonte), o compilador acusa a possvel exceo e obriga o
programador a trat-la. Essa exceo pode ser tratada de duas maneiras: por meio da estrutura try-
-catch-finally ou por meio da clusula throws. Nos exemplos do livro vamos nos deparar com diversas
excees desse tipo.

50

ERJ_Java_8.indb 50 31/03/2015 16:40:55


Estruturas Condicionais, de Exceo e Repetio

3.2.3 Uso da estrutura try-catch-finally


A estrutura try-catch foi exemplificada anteriormente e o leitor pde notar que o objetivo de sua
utilizao a previso de erros de execuo. Vamos fazer uma analogia com o mundo real. Considere que
voc vai fazer uma viagem de automvel de uma cidade para outra. Durante o trajeto, podem ocorrer
eventos que o obriguem a fazer uma pausa ou mudar seu trajeto. Por exemplo, ao furar o pneu do veculo
voc ter que parar a viagem para realizar sua troca. Se houver algum acidente na estrada, talvez voc
resolva pegar outro caminho. Veja que podem ocorrer vrios incidentes que exigiro um tratamento dife-
rente ou a mudana de rota. Algo bastante semelhante pode ocorrer durante a execuo de um programa
de computador: cada tipo de erro necessita que seja realizado um tratamento diferente.
Portanto, a estrutura try-catch-finally tem como funo desviar a execuo de um programa caso
ocorram certos tipos de erro, predefinidos durante o processamento das linhas, e evitar que o progra-
mador precise fazer testes de verificao e avaliao antes de realizar certas operaes. Quando um
erro ocorre, ele gera uma exceo que pode ser tratada pelo programa. A estrutura try-catch-finally
pode ser usada tanto com Unchecked Exceptions como com Checked Exceptions.
Existem muitas excees que podem ser geradas pelas mais diversas classes, e enumer-las seria
um processo dispendioso e desnecessrio, pois as excees que devem ser obrigatoriamente tratadas
(Checked Exceptions) so apontadas pelo prprio compilador. Neste livro, as excees sero devida-
mente comentadas toda vez que uma exceo diferente for usada.
A estrutura try-catch-finally possui a seguinte sintaxe:

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>
}

Toda vez que a estrutura try utilizada, obrigatoriamente


em seu encerramento (na chave final) deve existir pelo menos Dica
um catch, a no ser que ela utilize a instruo finally. A sintaxe
apresentada pode ser interpretada como: tente executar o con- Um erro muito comum entre os
junto de instrues do try que esto entre as chaves; se houver iniciantes na linguagem Java usar
algum erro, execute seu tratamento no catch. Depois de tra- a estrutura try sem adicionar ne-
tado o erro, a execuo do programa continua a partir do final nhum catch. Isso gera erro de com-
do ltimo catch. O finally opcional e fornece um conjunto de pilao, pois ao usar try obrigat-
cdigos que sempre executado, independentemente de uma ria a presena de pelo menos um
exceo ocorrer ou no. catch. Outro erro comum esque-
A estrutura try pode no conter nenhum bloco catch, porm cer-se de encerrar a chave do try
o bloco finally torna-se obrigatrio. Bem, na verdade isso mudou antes de iniciar um catch. Quando
um pouco a partir do Java 7, mas vamos por partes. Antes do Java isso ocorre, o compilador apresen-
7 existiam trs possibilidades de utilizao: try-catch, try-catch- ta uma mensagem de erro do tipo
-finally ou ainda try-finally. O objetivo do finally manter cdigos try without catch, ou seja, se o
para liberao de recursos, adquiridos em seu bloco try corres- catch for inserido no try, o compi-
pondente. Um exemplo prtico de sua utilizao mostrado mais lador vai achar que ele nem existe.
adiante na manipulao de arquivos texto, em que o bloco finally Como j afirmamos, isso no se
ser utilizado para fechar um arquivo aps abri-lo, ou seja, liberar aplica se o finally for utilizado.
um recurso externo depois de adquiri-lo.

51

ERJ_Java_8.indb 51 31/03/2015 16:40:55


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Durante a execuo de um programa, caso no ocorra nenhuma exceo, os blocos catch no so


executados e o controle prossegue para o bloco finally, que libera o recurso e passa a executar a pri-
meira instruo aps o bloco finally. Caso ocorra alguma exceo, a execuo do programa desviada
para o grupo de instrues catch antes de passar pelo finally.
Os erros gerados pelo programa sempre esto relacionados com as classes usadas. Por exemplo,
o mtodo parseFloat da classe Float (Float.parseFloat) pode gerar um erro de converso numrica
(NumberFormatException), isto , esse tipo de erro pode ser tratado quando essa classe for usada. No
faz sentido verificar se ocorrer um erro de entrada e sada de dados (IOException) quando a classe
Float for utilizada. Portanto, o tratamento de erros deve ser realizado de forma coerente, de acordo
com as classes utilizadas no programa.
O Exemplo 3.6 demonstra duas excees em Java. Ele recebe dois nmeros inteiros e realiza as
quatro operaes bsicas entre eles.
Exemplo 3.6 Listagem da classe TryCatch

Funcionalidades comentadas do Exemplo 3.6:


ff Linhas 7 e 9: encarregam-se da converso dos valores fornecidos pelo usurio (tipo String) para
nmeros inteiros. Ao editar essa linha no NetBeans pode aparecer um alerta referente a redun-
dncia do mtodo toString(), uma vez que aux1 j uma varivel do tipo String (portanto, o mtodo
toString() no seria necessrio). No entanto, em nosso caso, o uso desse mtodo foi proposital para
ilustrar a gerao de uma exceo: se o usurio pressionar o boto Cancel na caixa de dilogo (exibi-
da pela linha 6 ou 8), a varivel aux1 (ou aux2) receber o valor null. Se a varivel aux1 estiver com
o contedo nulo ser gerado o erro NullPointerException ao executar o mtodo toString(), pois no
possvel retornar uma String a partir de um valor nulo. Uma vez gerado o erro, a execuo do pro-
grama ser desviada para a linha 20. No Exemplo 3.5 (linha 6) usamos a instruo if para verificar se
a varivel mes possua o valor null, uma forma diferente de fazer a mesma verificao.
ff Como o leitor j sabe, se houver qualquer um dos erros apontados durante o processamento
das instrues presentes no try, automaticamente a execuo do programa direcionada para o
catch com o tratamento da devida exceo.
ff Linha 14: realiza o tratamento da exceo ArithmeticExcetion que ocorre quando um erro mate-
mtico (aritmtico) acontece. No caso, o erro pode ocorrer na diviso de um nmero inteiro por
zero (isso pode ocorrer na linha 13).

52

ERJ_Java_8.indb 52 31/03/2015 16:40:55


Estruturas Condicionais, de Exceo e Repetio

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.

Figura 3.7 Parte da tela de execuo do Exemplo 3.6.

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.

3.2.4 Uso da clusula throws


Em alguns momentos, pode ocorrer de o programador no querer realizar controle sobre uma ex-
ceo, isto , no desejar tratar um erro. A linguagem Java permite ao programador que um erro seja
descartado, mesmo que ele ocorra. Entretanto preciso que esse fato seja informado na declarao
do mtodo. Esse processo pode ser realizado pela clusula throws. Para ilustrar o uso dessa clusula,
vamos elaborar um exemplo que demonstra a criao de um arquivo no disco rgido.

53

ERJ_Java_8.indb 53 31/03/2015 16:40:55


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Funcionalidades comentadas do Exemplo 3.7:


ff Esse exemplo contm alguns elementos que sero discutidos em mais detalhes em captulos pos-
teriores, como, por exemplo, o uso das classes FileWriter e PrintWriter e a criao de objetos, em
nosso exemplo definido por file (linha 8) e out (linha 9).
ff Linha 5: especifica que a exceo IOException no ser tratada no mtodo main (throws
IOException). Esse fato torna desnecessrio definir a estrutura try-catch para tratar esse erro,
mesmo sendo uma exceo considerada obrigatria pela linguagem Java.
ff Linha 8: cria um objeto chamado file a partir da classe FileWriter, responsvel por criar um ar-
quivo chamado frases.txt a partir da pasta c:/temp. A funo da classe FileWriter semelhante
a voc criar um arquivo em branco usando o aplicativo bloco de notas do Windows. Como j dis-
semos, certifique-se de ter criado a pasta temp antes de executar a classe. O parmetro true, in-
serido no final da linha, indica que o arquivo ser criado somente se ele no existir; caso exista,
ele ser apenas aberto (disponvel para leitura e gravao). Essa linha pode gerar um erro (caso a
pasta no exista, por exemplo). A exceo que trata esse erro realizada pela classe IOException,
definida na clusula throws da linha 6. Como j afirmamos, esse erro poderia estar associado a
uma exceo usando a estrutura try-catch.
ff Linha 9: cria um objeto chamado out a partir da classe PrintWriter, responsvel por enviar
dados ao arquivo criado (frases.txt). Essa classe permite armazenar dados em arquivos. Resu-
midamente, essa linha cria um arquivo chamado frases.txt. Essa linha pode gerar um erro do tipo
FileNotFoundException, cuja execuo da classe ser direcionada para a linha 13. Voltando ana-
logia com o bloco de notas, considere o seguinte: quando voc abre um arquivo com ele, o cursor
aparece no incio do texto, mas, de forma oposta, quando PrintWriter abre um arquivo o cursor
posicionado em seu final. Em funo disso, quando a prxima insero de dados for realizada no ar-
quivo, ela ser feita no final deste, por isso toda vez que voc executar nosso exemplo ser inserida
uma frase no final do arquivo.
ff Linha 10: cada vez que essa linha executada, a frase fornecida pelo usurio por meio da linha
6 ser inserida no final do arquivo. Cada vez que voc executar essa classe aparecer uma nova
linha no arquivo. A Figura 3.8 ilustra o arquivo frases.txt depois de executar a classe Exemplo 3.7
trs vezes. Para cada execuo, uma frase foi inserida.
ff Linhas 11 e 12: encerram a comunicao com o arquivo frases.txt, chamando o mtodo close as-
sociado a cada objeto criado anteriormente. Esse processo bastante comum em todas as lingua-
gens de programao: o programa abre uma comunicao com o arquivo, realiza os procedimen-
tos necessrios e, ao final, encerra a comunicao (ou conexo, como tambm pode ser chamada).

54

ERJ_Java_8.indb 54 31/03/2015 16:40:56


Estruturas Condicionais, de Exceo e Repetio

Figura 3.8 O arquivo frases.txt aps trs execues do Exemplo 3.7.

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.

3.2.5 Uso da instruo throw


Conforme comentado anteriormente, a linguagem Java possui muitas excees, incluindo sua ge-
rao e tratamento. Assim, seu estudo detalhado precisaria ser definido em um livro parte. O obje-
tivo deste item apenas demonstrar que um desenvolvedor Java pode criar suas prprias excees e
dispar-las no momento em que necessitar.
A instruo throw utilizada para disparar uma exceo, isto , ela pode forar que uma determi-
nada exceo ocorra. O Exemplo 3.8 mostra como possvel utilizar a instruo throw para gerar uma
exceo. Nesse exemplo, o usurio deve fornecer uma idade maior ou igual a 18 anos. Caso insira um va-
lor inferior, o programa fora uma exceo (veja na linha 9 o uso da instruo throw). Na linha 14 a exce-
o tratada. O disparo dessa exceo pode ser realizado sempre que for fornecido um valor invlido.
Exemplo 3.8 Listagem da classe InstrucaoThrows

A Figura 3.9 apresenta o resultado obtido com a execuo do Exemplo 3.8.

Figura 3.9 Tela de execuo do Exemplo 3.8.

55

ERJ_Java_8.indb 55 31/03/2015 16:40:56


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

3.2.6 Uso de getMessage e printStackTrace


Em determinadas aplicaes torna-se necessrio descobrir o tipo de erro e em que linha
do programa ele ocorreu. Para reconhecer esses erros, so utilizados os mtodos getMessage e
printStackTrace (a definio e a criao de mtodos so estudadas em detalhes no Captulo 5). O m-
todo getMessage serve para retornar a mensagem armazenada numa exceo qualquer. J o mtodo
printStackTrace retorna o tipo de exceo gerado e informa em que linha da classe ocorreu o erro.
O Exemplo 3.9 traz uma pequena demonstrao, com fins didticos, para que o leitor compreenda
mais claramente a utilizao dos mtodos getMessage e printStackTrace.
Exemplo 3.9 Listagem da classe GetMessageEPrintStackTrace

Funcionalidades comentadas do Exemplo 3.9:


ff Linha 6: produz uma exceo de diviso por zero (x/0), a qual ser tratada na linha 8 por meio
de catch (Exception erro). Note que no foi definida a exceo aritmtica ArithmeticException,
como feito anteriormente. Quando for utilizado Exception em um bloco catch, qualquer exce-
o gerada, isto , qualquer tipo de exceo, ser tratada nesse bloco. Isso equivale a dizer que
Exception pode ser considerado uma exceo default, caso o desenvolvedor no queira tratar to-
dos os tipos de erro que podem ser gerados durante a execuo de um programa.
ff Linha 9: o mtodo getMessage se encarrega de retornar o erro ocorrido (no caso: / by zero divi-
so por zero).
ff Linha 10: o mtodo printStackTrace retorna diversas informaes: o tipo de exceo, a mensagem de
erro, o nome da classe que gerou o erro, o nome do mtodo em que o erro ocorreu e o nmero da linha
do programa. No exemplo so retornadas as seguintes informaes: java.lang.ArithmeticException (tipo
da exceo), / by zero (mensagem de erro), cap03.GetMessageEPrintStackTrace (pacote.nome da classe),
main (nome do mtodo) e 6 (linha em que ocorreu o erro).
A Figura 3.10 apresenta os resultados obtidos com a execuo do Exemplo 3.9:

Figura 3.10 Tela de execuo do Exemplo 3.9.

3.3 Laos de repetio


Os laos de repetio (looping) formam uma importante estrutura nas linguagens de programao
por possibilitarem a repetio da execuo de um bloco de instrues em um programa. Eles determinam

56

ERJ_Java_8.indb 56 31/03/2015 16:40:57


Estruturas Condicionais, de Exceo e Repetio

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.

3.3.1 Uso do lao for


A instruo for um tipo de contador finito, isto , ela realiza a contagem de um valor inicial co-
nhecido at um valor final tambm conhecido. Uma possvel representao grfica da estrutura de fun-
cionamento de um lao de repetio pode ser visualizada na Figura 3.11. No incio da execuo da es-
trutura inicializada uma varivel. Aps isso, o valor dessa varivel verificado na condio (losango),
e enquanto essa condio for verdadeira o bloco de instrues ser executado dentro da estrutura.
Somente quando a condio se tornar falsa que a execuo ser desviada para o final da estrutura
do lao. O incremento ou decremento do valor da varivel essencial para que o lao tenha uma sada
(encerre), caso contrrio a execuo nunca sairia do lao.
Vamos a um exemplo: suponha que voc queira escrever seu nome na tela trs vezes. Pode ser
usado um lao de repetio para isso. A estrutura funcionaria da seguinte forma (tente acompanhar a
sequncia dos passos olhando na representao da Figura 3.11):
1. Uma varivel chamada x inicializada com o valor 1.
2. A condio verifica se x<=3. Se a condio for verdadeira, so executados os passos 3 e 4, se no
pula para o passo 5.
3. Seu nome impresso em tela.
4. O valor de x incrementado (x++) e volta ao passo 2.
5. A estrutura encerrada, isto , o lao de repetio terminou.

A estrutura de repetio com for contm uma Incio


varivel de controle do tipo contador, que pode ser
crescente ou decrescente e possui a seguinte sintaxe:
ff for (inicializao; condio; incremento ou de-
Inicializao da varivel
cremento)
Em que:
ff Inicializao: o valor inicial da varivel de
controle do lao.
[falsa]
ff Condio: contm uma expresso booleana Condio
que ser usada para controlar a continuidade
do lao. Deve conter o valor final que a vari-
vel de controle pode assumir dentro do lao. [verdadeira]
ff Incremento ou decremento: o passo com
que a varivel de controle ser acrescida ou
decrescida. Esse incremento pode ser reali- Instrues
zado por meio de uma varivel inteira ou com
ponto flutuante, permitindo pequenos incre-
mentos decimais.
Exemplo:
Incremento/decremento
for (int cont=0; cont<10; cont++){
<conjunto de instrues>
} Fim

Figura 3.11 Representao grfica do lao for.

57

ERJ_Java_8.indb 57 31/03/2015 16:40:57


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

A Figura 3.12 exibe o resultado obtido com a execuo do Exemplo 3.10.

Figura 3.12 Tela de execuo do Exemplo 3.10.

O Exemplo 3.11 demonstra o uso do for na simulao de um relgio.


Exemplo 3.11 Listagem da classe Relogio

58

ERJ_Java_8.indb 58 31/03/2015 16:40:57


Estruturas Condicionais, de Exceo e Repetio

Funcionalidades comentadas do Exemplo 3.11:


ff Linhas 5 a 7: contm os laos de repetio para o controle das horas (0 a 23), minutos (0 a 59) e
segundos (0 a 59). Um ponto a ser observado a possibilidade de criao de um lao de repetio
dentro do outro. Quando isso ocorre, o lao interno executado n vezes, de acordo com o nmero
de vezes definido pelo lao superior. Como exemplo, observe as linhas 7 a 17. O lao mais interno
(s) controla os segundos e executado 60 vezes a cada minuto (o lao superior). Da mesma forma,
o lao dos minutos ser executado 60 vezes a cada hora (o lao superior).
ff Linha 10: contm Thread.sleep(1000); que invoca um temporizador que espera mil milissegundos
(um segundo) at a execuo da prxima instruo. Esse procedimento pode gerar uma exceo e
por isso deve ser usado dentro de um bloco try, ou pode ser desconsiderado caso voc prefira usar
a clusula throws, citada anteriormente. No ltimo caso, o exemplo ficaria um pouco mais resumi-
do: deveria ser adicionado throws InterruptedException ao final da linha 3 e retiradas as linhas
9 e 13 a 16. O uso de Thread talvez no seja a melhor forma de se criar uma temporizao; para
isso existem outras classes como Timer e TimerTask, cujo estudo foge aos objetivos. Tambm no
objetivo estudar threads. Alm disso, o uso do mtodo sleep dentro de um lao de repetio no
muito recomendado por questes de desempenho.
ff Linhas 11 e 12: controlam o final da execuo do relgio. Quando o relgio contar dez segundos, o
programa encerrado por meio de System.exit(0). Sempre que for necessrio forar o encerramento
de um programa, o mtodo exit pode ser usado. Se voc estiver usando uma IDE (NetBeans, Eclipse)
existe um boto especfico para isso, um boto de stop, normalmente um quadradinho vermelho.
Os resultados obtidos ao executar o Exemplo 3.11 podem ser vistos na Figura 3.13.

Figura 3.13 Tela de execuo do Exemplo 3.11.

3.3.2 Uso do lao while


O while outro lao condicional, isto , um conjunto de instrues que so repetidas enquanto o re-
sultado de uma expresso lgica (uma condio) avaliado como verdadeiro. Veja a seguir sua sintaxe:

while (<condio>){
<conjunto de instrues>
}

A instruo while avalia o resultado da expresso (condio) antes de executar as instrues do


bloco { }, assim possvel que as instrues nunca sejam executadas, caso a condio seja inicialmente
falsa. Um problema tpico, relacionado avaliao da condio while, o lao infinito. Caso a condio
nunca se torne falsa, o lao ser repetido infinitamente. A mesma representao da Figura 3.11 vlida
para o lao por meio da instruo while.
H outro tipo de lao condicional, o chamado do-while, que bem parecido com o while, porm
o conjunto de instrues executado antes da avaliao da expresso lgica. Isso faz com que essas
instrues sejam executadas pelo menos uma vez. Veja como a sintaxe do do-while bem parecida com
a do while:

59

ERJ_Java_8.indb 59 31/03/2015 16:40:57


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Figura 3.14 Representao grfica do lao do-while.

O Exemplo 3.12 demonstra a utilizao das estruturas while e do do-while.


Funcionalidades comentadas do Exemplo 3.12:
Este exemplo recebe um nmero do usurio e inicia sua contagem regressiva at zero, pausada-
mente, decrescendo de um em um.
ff Linha 6: o usurio digita um nmero que ser armazenado na varivel limite. Caso ocorra algum
erro de converso, o direcionamento do programa alterado para NumberFormatException (li-
nha 20), conforme abordamos anteriormente.
ff Linha 8: o valor da varivel limite armazenado na varivel contador. Isso foi realizado para man-
ter o valor fornecido pelo usurio que ser utilizado mais frente na classe.
ff Linhas 9 a 12: uma vez que a varivel contador receba um nmero inteiro positivo, realizada sua
contagem decrescente at o valor zero por meio da estrutura while. Caso seja fornecido um valor
negativo, a contagem no realizada porque a expresso do while ser falsa. A cada ciclo (chama-
do tambm de iterao) o valor da varivel contador impresso na tela (linha 10) e decrementado
(linha 11) at -1, quando o lao termina, pois -1 no maior ou igual a zero.
ff Linha 14: o valor da varivel contador zerado para que a contagem progressiva do prximo lao
se inicie do zero, j que at a linha anterior o valor da varivel contador -1.

60

ERJ_Java_8.indb 60 31/03/2015 16:40:58


Estruturas Condicionais, de Exceo e Repetio

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

A Figura 3.15 apresenta o resultado do Exemplo 3.12 executado.

Figura 3.15 Tela de execuo do Exemplo 3.12.

Exerccios para prtica da linguagem Java

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

Valor (R$) Desconto (%)


>=50 e <200 5
>=200 e <500 6
>=500 e <1000 7
>=1000 8

61

ERJ_Java_8.indb 61 31/03/2015 16:40:58


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 3.16 Exemplo de execuo do Exerccio 3.1.

2. Na rea da eletrnica, em um circuito em srie


temos que a resistncia equivalente (total) des-
se circuito obtida mediante a soma de todas
as resistncias existentes (RE = r1 + r2 + ... + rn).
Faa uma classe que receba o valor de quatro
resistncias ligadas em srie, calcule e mostre a
resistncia equivalente, a maior e a menor resis-
tncia, conforme indica a Figura 3.17. Figura 3.17 Exemplo de execuo do Exerccio 3.2.

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.

Figura 3.18 Exemplo de execuo do Exerccio 3.3.

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.

Figura 3.19 Exemplo de execuo do Exerccio 3.4.

62

ERJ_Java_8.indb 62 31/03/2015 16:40:59


Estruturas Condicionais, de Exceo e Repetio

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

Figura 3.20 Exemplo de execuo do Exerccio 3.5.

Material de apoio

Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.

Seu prximo passo

Este captulo demonstrou os comandos condicionais, as estruturas de controle em Java e o tratamento de


excees. No passe para o prximo captulo se voc ainda sente dificuldades nos exemplos e exerccios
propostos. Se precisar, releia o captulo e refaa todos os exemplos. importante que as dvidas no se
acumulem para facilitar o progresso nos estudos do captulo seguinte. O prximo passo trata dos tipos de
funes matemticas e de manipulao de strings.

63

ERJ_Java_8.indb 63 31/03/2015 16:40:59


Captulo

4
Operaes Matemticas e de String

Objetivos deste captulo


99Demonstrar as principais operaes matemticas em Java e seu uso prtico.
99Apresentar mecanismos de internacionalizao e formatao da linguagem Java.
99Introduzir tcnicas de simulao por meio da gerao aleatria de nmeros.
99Demonstrar os principais mtodos para manipulao de strings em Java e seu uso prtico.

4.1 Operaes matemticas


A linguagem Java possui uma classe chamada Math que contm diversos mtodos especializa-
dos em realizar clculos matemticos. Observe a seguinte sintaxe:

Math.<nome do mtodo>(<argumentos ou lista de argumentos>)

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.

4.1.1 Mtodo ceil


O mtodo ceil tem como funo realizar o arredondamento de um nmero (do tipo float ou
double) para o seu prximo inteiro, por exemplo: o prximo inteiro de 1.8 2, de 5.5 6, de 4.1 5,
e assim por diante. Sua sintaxe a seguinte:

Math.ceil(<valor>)

64

ERJ_Java_8.indb 64 31/03/2015 16:40:59


Operaes Matemticas e de String

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

Figura 4.1 Tela de execuo do Exemplo 4.1.

4.1.2 Mtodo floor


Assim como ceil, o mtodo floor tambm utilizado para arredondar um nmero, mas para o seu
inteiro anterior, por exemplo: o inteiro anterior de 1.1 1, de 2.9 2 e de 6.54 6. Sua sintaxe a mesma
do mtodo ceil:

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.

Exemplo 4.2 Listagem da classe ArredondamentoParaBaixo

65

ERJ_Java_8.indb 65 31/03/2015 16:41:00


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 4.2 Tela de execuo do Exemplo 4.2.

4.1.3 Mtodos round, max, min, sqrt, pow e abs


Esta seo apresenta alguns mtodos da classe Math. A Tabela 4.1 traz um resumo deles.
Tabela 4.1 Alguns mtodos da classe Math

Mtodo Sintaxe Descrio


Recebe um valor numrico e retorna esse valor arredondado.
Para valores decimais <0.5 arredonda para baixo, para valores
round Math.round(<valor>) >=0.5 arredonda para cima. Exemplos:
Math.round(2.35) 2, Math.round(2.59) 3
Recebe dois valores numricos e retorna o maior deles.
max Math.max(<valor1>,<valor2>)
Exemplo: Math.max(10,20) 20
Recebe dois valores numricos e retorna o menor deles.
min Math.min(<valor1>,<valor2>)
Exemplo: Math.max(10,20) 10
Recebe um valor numrico e retorna sua raiz quadrada.
sqrt Math.sqrt(<valor>)
Exemplo: Math.max(25) 25
Recebe dois valores numricos (o operando e o expoente) e
pow Math.pow(<valor1>,<valor2>) eleva o primeiro valor ao segundo.
Exemplo: Math.max(10,2) 100
Recebe um valor numrico e retorna seu valor absoluto,
abs Math.abs(<valor>) desconsiderando o sinal.
Exemplo: Math.max(-2) 2

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

ERJ_Java_8.indb 66 31/03/2015 16:41:00


Operaes Matemticas e de String

O mtodo min fornece o resultado oposto do


mtodo max, sendo ento utilizado para obter o
valor mnimo entre dois nmeros. Do mesmo modo
que o mtodo max, esses nmeros tambm podem
ser double, float, int ou long. O restante dos m-
todos constantes na Tabela 4.1 apresentado no
Exemplo 4.3 a seguir. Pela simplicidade do funcio-
namento dos mtodos, no faremos comentrios a
respeito. O resultado da execuo do Exemplo 4.3
demonstrado na Figura 4.3. Figura 4.3 Tela de execuo do Exemplo 4.3.

4.1.4 Mtodo random


O mtodo random da classe Math utilizado para gerar valores de forma aleatria. Toda vez que
o mtodo random chamado, sorteia-se um valor do tipo double entre 0.0 e 1.0 (o valor 1 nunca sor-
teado). Nem sempre essa faixa de valores suficiente numa aplicao real. Por exemplo, para simular
o sorteio de nmeros entre 0 e 99 para um jogo de loteria qualquer, torna-se necessrio o sorteio de
nmeros inteiros aleatrios no intervalo de 0 a 99. Para que esses nmeros possam ser sorteados,
preciso utilizar o operador de multiplicao (*) em conjunto com o mtodo random. Com isso torna-se
possvel definir o intervalo em que o nmero ser sorteado. O conversor (int) tambm pode ser usado
para truncar a parte do ponto flutuante (a parte depois do ponto decimal) para que um nmero inteiro
seja gerado, da seguinte forma:

(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

Funcionalidades comentadas do Exemplo 4.4:


ff Linha 5: declara uma varivel do tipo String chamada senha com contedo vazio.
ff Linha 6: contm um loop for que executa um bloco de instrues 10 vezes, variando o valor da
varivel i de 1 a 10. O lao encerra na linha 9.
ff Linha 7: gera um nmero entre 0 e 9 de forma randmica. Esse nmero guardado como inteiro
na varivel num.

67

ERJ_Java_8.indb 67 31/03/2015 16:41:01


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

ff Linha 8: acrescenta o nmero gerado na varivel senha, no final de seu contedo.


ff Linha 9: imprime a senha gerada contendo 10 caracteres randmicos. Esse processo bastante
usado em aplicaes da Internet quando o usurio esquece sua senha.
ff Linha 12: define um loop for responsvel pela contagem de um a quatro (os quatro cartes). O
segundo loop for (linha 14) o responsvel pela contagem de um a seis (os seis nmeros de cada
carto). Um possvel resultado para uma execuo do Exemplo 4.4 aparece na Figura 4.4.
Com isso apresentamos alguns mtodos da classe Math, mas existem diversos outros mtodos
cujo estudo foge aos objetivos desta obra.

Figura 4.4 Tela de execuo do Exemplo 4.4.

4.1.5 Formatao com a classe DecimalFormat


Os clculos matemticos, em especial os que envolvem multiplicao e diviso, podem gerar re-
sultados com muitas casas decimais. Isso nem sempre necessrio e esteticamente correto, pois apre-
sentar um resultado com muitas casas decimais no muito agradvel nem legvel maioria dos usu-
rios. Por exemplo, considere duas variveis do tipo double: x=1 e y=6. Ao realizar a diviso de x por y,
aparece na tela o resultado 0.16666666666666666, que no o mais adequado para se apresentar
na tela. Seria mais conveniente mostrar o resultado formatado com duas ou trs casas decimais. Para
realizar a formatao, necessrio definir um modelo de formatao, conhecido pelo nome pattern.
Considere pattern o estilo de formatao que ser apresentado sobre um valor numrico. Em outras
palavras, voc ter de informar ao compilador qual estilo de formatao deve ser usado para apresen-
tar o nmero. Para definir o pattern so usados caracteres especiais; veja os mais usados na Tabela 4.2.
Tabela 4.2 Caracteres mais usados na definio de patterns

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.

Para realizar a formatao foi usada a classe DecimalFormat no Exemplo 4.5.

68

ERJ_Java_8.indb 68 31/03/2015 16:41:01


Operaes Matemticas e de String

Exemplo 4.5 Listagem da classe FormatacaoDeNumeros

Funcionalidades comentadas do Exemplo 4.5:


ff Linha 2: importa a classe DecimalFormat do pacote java.text, uma vez que ela no pertence ao
conjunto de classes default do pacote java.lang.
ff Linha 5: declara o objeto df da classe DecimalFormat que ser usado para realizar a forma-
tao dos nmeros por meio do mtodo format (df.format). Essa linha poderia conter a defi-
nio do pattern no momento da inicializao do objeto df. Uma definio vlida poderia ser:
DecimalFormat df = new DecimalFormat (000). possvel observar que a definio do pattern
pode ser realizada dentro dos parnteses.
ff Linha 7: contm a definio do pattern pelo mtodo applyPattern (df.applyPattern(000)). Essa
instruo define que todos os nmeros impressos a partir do objeto df sero formatados com trs
dgitos, mesmo que eles possuam menos que isso, conforme exemplificado na Tabela 4.1. As linhas
10, 13, 16, 19 e 22 redefinem o pattern, aplicando novas formataes ao objeto df, isto , aos n-
meros que sero impressos por meio do mtodo format.
ff Linha 22: exibe uma maneira de formatar um nmero a partir de um formato string. A varivel
valorEmReais (linha 21) armazena um contedo do tipo string, que no pode ser manipulado dire-
tamente pela classe DecimalFormat. Para que isso seja possvel, o valor string convertido no tipo
double pelo mtodo parseDouble da classe Double (Double.parseDouble(valorEmReais)).
O resultado da execuo do Exemplo 4.5 aparece na Figura 4.5.

Figura 4.5 Tela de execuo do Exemplo 4.5.

4.1.6 Internacionalizao com a classe Locale


A linguagem Java utilizada no mundo todo. Em funo disso, um mesmo software feito em Java
pode ser utilizado por usurios espalhados pelo globo. Cada pas ou regio adota certos formatos para
representao monetria, apresentao de datas etc., os quais so definidos pelo sistema operacional

69

ERJ_Java_8.indb 69 31/03/2015 16:41:01


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Funcionalidades comentadas do Exemplo 4.6:


ff Linhas 2 e 3: importam as classes DecimalFormat do pacote java.text e Locale do pacote
java.util, ambas essenciais ao funcionamento do exemplo.
ff Linha 7: declara e cria o objeto df da classe DecimalFormat que ser usado para formatar um va-
lor monetrio, dependendo da regio em que a classe executada.
ff Linha 8: declara e cria o objeto local da classe Locale que ser usado para identificar as configura-
es do sistema operacional da mquina do usurio. Nessa linha o objeto local passa a armazenar
todas as configuraes default do sistema operacional.
ff Linha 10: faz uma comparao usando o mtodo getCountry() que retorna a sigla do pas configu-
rado no sistema operacional. Caso seja Brasil (sigla BR), aplica um pattern (linha 11) para formatar
um valor monetrio em reais, de acordo com o padro brasileiro. Outras comparaes, de outros
pases, poderiam existir para adequar o formato monetrio regio.
ff Linhas 14 a 17: contm a impresso das configuraes regionais por meio dos mtodos
getCountry() que retorna a sigla do pas, getDisplayCountry() que retorna o nome do pas,
getDisplayLanguage() que retorna o idioma do pas e getDisplayName() que retorna a linguagem
do teclado.
ff Linha 18: imprime o valor monetrio de acordo com o formato estabelecido (se existissem diver-
sas comparaes para pases diferentes).
O resultado da execuo do Exemplo 4.6 aparece na Figura 4.6.

Figura 4.6 Tela de execuo do Exemplo 4.6.

70

ERJ_Java_8.indb 70 31/03/2015 16:41:02


Operaes Matemticas e de String

4.2 Operaes com Strings


String um tipo texto que corresponde unio de um conjunto de caracteres. Em Java, uma va-
rivel do tipo string uma instncia da classe String, isto , gera objetos que possuem propriedades e
mtodos, diferentemente dos tipos primitivos como int, float, double etc. No se preocupe com esses
termos no momento, pois eles so estudados em mais detalhes no Captulo 7 (definies da orientao
a objetos). Essas strings podem ser manipuladas de vrias formas. Por exemplo, possvel verificar seu
comprimento, retirar uma parte dela, acessar ou mudar caracteres individuais. As strings constituem
uma cadeia de caracteres entre aspas. Exemplo: frase = Linguagem Java. Da mesma forma que as ope-
raes matemticas, existem diversos mtodos para manipulao de strings, os quais acompanham a
seguinte sintaxe:

<Nome da string>.<nome-do-metodo>(<argumentos>)

A seguir, so apresentados os mtodos mais comuns (e mais usados) da classe String.

4.2.1 Mtodo length


O mtodo length utilizado para retornar o tamanho de uma determinada string, incluindo tambm
os espaos em branco presentes nela. Esse mtodo retorna sempre um valor do tipo int. Veja sua sintaxe:

<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:

Figura 4.7 Tela de execuo do Exemplo 4.7.

71

ERJ_Java_8.indb 71 31/03/2015 16:41:02


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

4.2.2 Mtodo charAt


O mtodo charAt usado para retornar um caractere de determinada string de acordo com um
ndice especificado entre parnteses. Esse ndice se refere posio do caractere na string, sendo 0
(zero) o ndice do primeiro caractere, 1 (um) o do segundo e assim por diante. O mtodo charAt til
quando for necessrio verificar a existncia de um caractere na string. Por exemplo, suponha que uma
determinada string s possa conter nmeros - o mtodo charAt pode ser usado para verificar a existn-
cia de dgitos numricos nessa string. A sintaxe do mtodo charAt a seguinte:

<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.

Exemplo 4.8 Listagem da classe CaracteresDaFrase

Figura 4.8 Tela de execuo do Exemplo 4.8.

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

Funcionalidades comentadas do Exemplo 4.9:


ff Linhas 6 e 10: contm um lao de repetio que faz o valor da varivel i variar de 0 (o primeiro n-
dice da string), at a ltimo caractere (definido pelo comprimento da string com o mtodo length),
de 1 em 1. Dessa forma, ser possvel percorrer todos os ndices da string, independentemente de
seu tamanho. A linha 7 armazena o caractere a ser impresso na linha 8. A linha 9 contm um tem-
porizador de um segundo, conforme apresentamos num exemplo do Captulo 3.

72

ERJ_Java_8.indb 72 31/03/2015 16:41:02


Operaes Matemticas e de String

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.

4.2.3 Mtodos toUpperCase e toLowerCase


Os mtodos toUpperCase e toLowerCase so utilizados para transformar todas as letras de uma
determinada string em maisculas ou minsculas. O mtodo toUpperCase transforma todos os carac-
teres de uma string em maisculos. O mtodo toLowerCase transforma todos os caracteres de uma
string em minsculos. Sua sintaxe a seguinte:

<Nome da string>.toUpperCase() ou <Nome da string>.toLowerCase()

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.

Exemplo 4.10 Listagem da classe TransformacoesNaFrase

Figura 4.9 Tela de 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.

4.2.4 Mtodo substring


O mtodo substring retorna a cpia de caracteres de uma string a partir de ndices inteiros especi-
ficados. A sintaxe de substring a seguinte:

<Nome da string>.substring(<ndice inicial>,[<ndice final>])

73

ERJ_Java_8.indb 73 31/03/2015 16:41:03


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

A Figura 4.10 exibe o resultado do Exemplo 4.11.

Figura 4.10 Tela de execuo do Exemplo 4.11.

74

ERJ_Java_8.indb 74 31/03/2015 16:41:03


Operaes Matemticas e de String

4.2.5 Mtodo trim


O mtodo trim remove todos os espaos em branco que aparecem no incio e no final de uma deter-
minada string, porm no so removidos os espaos entre as palavras. Sua sintaxe a seguinte:

<Nome da string>.trim()

O Exemplo 4.12 mostra a utilizao do mtodo trim.


Exemplo 4.12 Listagem da classe RetirandoEspacos

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:

Figura 4.11 Tela de execuo do Exemplo 4.12.

4.2.6 Mtodo replace


O mtodo replace utilizado para substituio de caracteres, ou grupo de caracteres, em uma de-
terminada string. Para isso necessrio informar o(s) caractere(s) que deseja substituir e por qual(is)
caractere(s) ele(s) ser(o) substitudo(s). Caso no haja na string nenhuma ocorrncia do caractere a
ser substitudo, a string original retornada, isto , no ocorre nenhuma alterao. Veja sua sintaxe:

<Nome da string>.replace(<caracteres a serem substitudos>,<substituio>)

O Exemplo 4.13 mostra o uso do mtodo replace.


Exemplo 4.13 Listagem da classe TrocandoCaracteres

75

ERJ_Java_8.indb 75 31/03/2015 16:41:03


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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:

Figura 4.12 Tela de execuo do Exemplo 4.13.

4.2.7 Mtodo valueOf


O mtodo valueOf usado para converter diversos tipos de dados em strings. Esse mtodo aceita
vrios tipos de argumento (nmeros ou cadeia de caracteres) e os transforma em strings. Uma das sin-
taxes possveis para o mtodo valueOf :

<Nome da string>.valueOf(<nome da varivel a ser convertida>)

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;

A Figura 4.13 mostra os resultados obtidos com a execuo do Exemplo 4.14.

Exemplo 4.14 Listagem da classe ConversaoParaString

Figura 4.13 Tela de


execuo do Exemplo 4.14.

4.2.8 Mtodo indexOf


O mtodo indexOf usado para localizar caracteres ou substrings em uma String. Quando realiza-
mos a busca de uma palavra em um texto, usamos algo parecido com o funcionamento de indexOf, isto
, ele busca uma palavra e retorna a posio em que ela se encontra. Voc j sabe que um texto (ou uma
String) indexado a partir do nmero zero. Caso haja sucesso na busca, retornado um nmero inteiro
referente posio do texto (o ndice) em que o caractere foi encontrado, ou a posio do texto na qual

76

ERJ_Java_8.indb 76 31/03/2015 16:41:04


Operaes Matemticas e de String

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 :

<Nome da string>.indexOf(<caractere ou substring a ser localizada, [posio ini-


cial]>)

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.

Exerccios para prtica da linguagem Java


1. Crie uma classe que simule a jogada de um dado de seis lados
(nmeros de 1 a 6) por trs vezes. Ao final some seus valores e
apresente o resultado das trs jogadas. Veja o resultado dos lan-
amentos na Figura 4.15.
2. Uma farmcia precisa ajustar os preos de seus produtos em
12%. Elabore uma classe que receba o valor do produto e apli-
que o percentual de acrscimo. O novo valor a ser calculado
deve ser arredondado para mais ou para menos usando o m- Figura 4.15 Tela de
todo round. A classe deve tambm conter um lao de repetio execuo do Exerccio 4.1.
que encerre o programa quando o usurio fornecer o valor zero
(0) para o valor do produto. Dessa forma, o usurio digita o valor do produto, a classe calcula e
mostra o valor com acrscimo, a seguir solicita um novo valor. Esse processo continua enquanto
o valor do produto for diferente de zero; caso contrrio o programa ser encerrado.

77

ERJ_Java_8.indb 77 31/03/2015 16:41:04


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 4.16 Tela de execuo do Exerccio 4.2.

3. Crie uma classe que gera um nmero aleatoriamente (entre 5 e 10)


por Math.random. Em seguida, faa com que aparea em tela uma
senha numrica contendo a mesma quantidade de dgitos corres-
pondentes ao valor aleatrio gerado. Apresente em tela o nmero
sorteado e a senha.
4. Construa uma classe que receba uma frase qualquer e mostre essa
frase de trs para a frente e sem espaos em branco, como indica a Figura 4.17 Tela de
Figura 4.18. execuo do Exerccio 4.3.

Figura 4.18 Tela de execuo do Exerccio 4.4.

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.

Figura 4.19 Tela de execuo do Exerccio 4.5.

Material de apoio
Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.

Seu prximo passo

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

ERJ_Java_8.indb 78 31/03/2015 16:41:04


Captulo

5
Utilizao de Arrays

Objetivos deste captulo


99Apresentar os diversos tipos de arrays.
99Definir os aspectos fundamentais da necessidade do uso de arrays.
99Demonstrar a praticidade da utilizao de arrays.
99Fornecer conceitos que permitam ao leitor desenvolver aplicaes mais consistentes e
com cdigo reduzido.

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

Figura 5.1 Exemplos de arrays unidimensional e bidimensional.

79

ERJ_Java_8.indb 79 31/03/2015 16:41:05


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Observe que, em Java, o primeiro elemento do array sempre possui ndice 0 (zero). Maiores deta-
lhes so apresentados nas sees que se seguem.

5.2 Arrays unidimensionais


Os arrays unidimensionais so os que possuem apenas um ndice para acessar seu contedo. Eles
so declarados da seguinte maneira:

Tipo-de-dado[] nome-do-array = new Tipo-de-dado[quantidade], em que:

ff Tipo-de-dado pode ser qualquer tipo de varivel.


ff Nome-do-array um nome vlido; as mesmas regras para nomes das variveis.
ff quantidade a quantidade de elementos que o array pode manipular.
Exemplos:
ff int[] numeros=new int[10]; cria um array com o nome numeros que contm 10 elemen-
tos do tipo int e seu ndice varia de 0 a 9.
ff double[] precos=new double[5]; cria um array com o nome precos que contm 5 elemen-
tos do tipo double e seu ndice varia entre 0 e 4.
ff char[] sexo=new char[2]; cria um array com o nome sexo que contm 2 elementos do tipo
char e seu ndice varia entre 0 e 1.
ff boolean[] opcoes=new boolean[2]; cria um array com o nome opcoes que contm 2 ele-
mentos do tipo boolean e seu ndice varia entre 0 e 1.
ff String[] meses=new String[12]; cria um array com o nome meses que contm 12 ele-
mentos do tipo String e seu ndice varia de 0 a 11.
Para atribuir o valor a um elemento do array, deve-se indicar o ndice desejado dentro dos colche-
tes, como nos exemplos a seguir:

numeros[0] = 100; numeros[5] = 38; numeros[8] = 17;


meses[0] = Janeiro; meses[3] = Abril; meses[11] = Dezembro;

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.

Exemplo 5.1 Listagem da classe ArrayNumeros

Figura 5.2 Tela de execuo do Exemplo 5.1.

Funcionalidades comentadas do Exemplo 5.1:


ff Linha 5: declara o array unidimensional chamado inteiro contendo dez elementos (ndices de 0 a 9).
Caso seja necessrio gerar uma quantidade maior, basta trocar o valor 10 pela quantidade necessria.

80

ERJ_Java_8.indb 80 31/03/2015 16:41:05


Utilizao de Arrays

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 :

Tipo-de-dado[] nome-do-array = { valores separados por vrgulas }

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

Figura 5.3 Tela de execuo do Exemplo 5.2.

81

ERJ_Java_8.indb 81 31/03/2015 16:41:06


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas do Exemplo 5.2:


ff Linhas 5 a 8: declaram e inicializam quatro arrays unidimensionais, cada um de um tipo diferente
de dado.
ff Linhas 9, 14, 19 e 24: classificam os elementos do array em ordem alfabtica (ou numrica) por
meio da classe Arrays. A classe Arrays permite manipular os elementos de um array (orden-los
ou realizar uma pesquisa com eles). Para ordenar os elementos foi usado o mtodo sort.
ff Linha 11: contm um lao de repetio com a instruo for que faz com que cada elemento do
array nomes seja atribudo varivel nome, um de cada vez para cada execuo do lao. Como o
array possui 6 elementos, o lao ser executado 6 vezes, imprimindo o contedo de todos os ele-
mentos do array. O mesmo ocorre com os laos das linhas 16, 21 e 26.

5.3 Arrays bidimensionais


Um array bidimensional possui dois ndices e possibilita que os valores sejam armazenados na
forma de matrizes. A linguagem Java no suporta arrays bidimensionais como as outras linguagens (no
formato linha, coluna, por exemplo), entretanto possvel obter a mesma funcionalidade criando um
array de arrays. Os de uso mais comum so os que envolvem dois arrays, mas possvel criar arrays com
quantas dimenses forem necessrias. Esses arrays devem ser declarados da seguinte maneira:

Tipo-do-dado nome-do-array[][] = new tipo-do-dado [<indice1>] [<indice2>]

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

Exemplo 5.3 Listagem da classe ArrayBidimensional

Funcionalidades comentadas do Exemplo 5.3:


ff So armazenados nove nmeros no array matriz (linhas 5 a 7) no formato de uma matriz, confor-
me apresenta a Tabela 5.1.
ff Linha 8: contm um lao de repetio com a instruo for, responsvel por percorrer todas as li-
nhas da matriz. O mtodo length retorna a quantidade de linhas existentes no array. Dessa forma,
o valor da varivel linha assumir os valores 0, 1 e 2 (a primeira linha zero).

82

ERJ_Java_8.indb 82 31/03/2015 16:41:06


Utilizao de Arrays

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.

Figura 5.4 Tela de execuo do Exemplo 5.3.

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

Funcionalidades comentadas do Exemplo 5.4:


ff Linha 5: declara o array de trs dimenses chamado cubo contendo duas matrizes com seis posi-
es cada.
ff Linhas 15 a 17: contm trs laos de repetio usados para somar os nmeros pares e mpares
na matriz. O lao da linha 15 percorre as linhas, o lao da linha 16 percorre as colunas e o lao da
linha 17 manipula uma matriz de cada vez. Em outras palavras, a sequncia de leitura ser: o pri-
meiro elemento da matriz 1 ([0,0,0]), o primeiro elemento da matriz 2 ([0,0,1]), o segundo elemen-
to da matriz 1 ([0,1,0]), o segundo elemento da matriz 2 ([0,1,1]) e assim sucessivamente.

83

ERJ_Java_8.indb 83 31/03/2015 16:41:07


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

5.4 Busca em arrays


Outro aspecto pertinente ao uso de um array se refere busca de um valor entre seus elementos.
Existem diversas maneiras de realizar esse processo, umas mais simples, porm lentas, e outras mais
complexas, porm mais velozes. Vamos iniciar pela forma mais simples. O exemplo a seguir solicita
ao usurio a digitao de uma cor e verifica se ela est armazenada em um dos elementos do array. A
Figura 5.5 exibe a tela de resultados do Exemplo 5.5.
Exemplo 5.5 Listagem da classe ArrayPesquisaCor

Figura 5.5 Tela de execuo do Exemplo 5.5.

Funcionalidades comentadas do Exemplo 5.5:


ff Linha 5: declara um array chamado cores contendo cinco cores diferentes: verde, amarelo, azul,
vermelho e preto.
ff Linha 7: atribui um valor inicial varivel mensagem. Consideramos inicialmente que a cor forne-
cida pelo usurio no existe no array cores.
ff Linha 8: contm um lao de repetio com a instruo for que faz com que as linhas 9 a 13 se-
jam executadas vrias vezes, dependendo da quantidade de elementos do array. A estrutura des-
se lao for contm uma sintaxe reduzida (usada nesse caso para percorrer todos os elementos do
array). A cada ciclo do for, a varivel elemento recebe um contedo diferente armazenado num
elemento do array cores.
ff Linha 9: compara a string digitada pelo usurio com cada um dos elementos do array, dependendo
do ciclo de execuo do lao for. Ao encontrar a cor correspondente, atribui um novo valor vari-
vel mensagem (linha 10) e quebra o lao de repetio por meio da instruo break (linha 11).
O leitor notou que nesse tipo de pesquisa o programa percorre os elementos do array um a um, at
que o valor seja encontrado e a busca encerrada. O problema quando o vetor muito grande. Suponha
que seja um vetor de 10.000.000 de elementos. Seria necessrio realizar todas essas comparaes at
encontrar o valor desejado. Uma soluo para reduzir o nmero de comparaes e aumentar a eficin-
cia do algoritmo fazer a busca binria.

84

ERJ_Java_8.indb 84 31/03/2015 16:41:07


Utilizao de Arrays

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

Funcionalidades comentadas do Exemplo 5.6:


ff Linha 5: declara o array chamado n contendo 10000 elementos (ndices de 0 a 9999).

85

ERJ_Java_8.indb 85 31/03/2015 16:41:07


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 5.6 Tela de execuo do Exemplo 5.6.

Exerccios para prtica da linguagem Java

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

ERJ_Java_8.indb 86 31/03/2015 16:41:07


Utilizao de Arrays

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/>.

Seu prximo passo

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

ERJ_Java_8.indb 87 31/03/2015 16:41:07


Captulo

6
Criao de Mtodos em Java

Objetivos deste captulo


99Identificar os principais mtodos usados em Java.
99Explicar as vantagens de uso dos mtodos.
99Introduzir o conceito de modularidade a partir da criao de mtodos.
99Fornecer subsdios para que o leitor possa criar seus prprios mtodos.
99Descrever os mecanismos necessrios para a troca de dados entre os mtodos.

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

ERJ_Java_8.indb 88 31/03/2015 16:41:08


Criao de Mtodos em Java

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:

qualificador tipo-do-retorno nome-do-mtodo ([lista-de-parmetros]){


cdigos do corpo
}

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

ERJ_Java_8.indb 89 31/03/2015 16:41:08


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Mtodo com retorno


Valores de entrada
(argumentos) Valor de retorno

Processamento interno

Mensagens Classe que chama os mtodos

Mtodo sem retorno

Valores de entrada
(argumentos)
Processamento interno

Figura 6.1 Analogia do funcionamento dos mtodos.

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

ERJ_Java_8.indb 90 31/03/2015 16:41:08


Criao de Mtodos em Java

Classe A Classe B

Mtodo 1

Mtodo 2

Mtodo 3

Mtodo n

Figura 6.2 Classe B chamando mtodos da Classe A.

6.1 Mtodos sem retorno


No retornam valores e so semelhantes s procedures encontradas em outras linguagens de pro-
gramao, como Pascal. Os mtodos que no retornam valores devem ser definidos como void. Dessa
forma, todos os mtodos sem retorno acompanham a seguinte estrutura:

qualificador void nome-do-mtodo ([lista-de-parmetros]){


//cdigos do corpo
}

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

ERJ_Java_8.indb 91 31/03/2015 16:41:08


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 6.1 Listagem da classe MetodosSemRetorno

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

ERJ_Java_8.indb 92 31/03/2015 16:41:09


Criao de Mtodos em Java

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).

6.2 Mtodos com retorno de valores


Nos exemplos anteriores os mtodos utilizados no retornaram nenhum valor (void), podendo ser
comparados s procedures de outras linguagens de programao. Este item aborda mtodos que re-
tornam valores, os quais podem ser comparados s functions de outras linguagens. Os mtodos com
retorno observam a seguinte estrutura:

93

ERJ_Java_8.indb 93 31/03/2015 16:41:09


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

qualificador tipo-de-retorno nome-do-mtodo ([lista-de-parmetros]){


// cdigos do corpo
return (valor-de-retorno)
}

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:

public static int multiplicar(int x, int y){


return x * y;
}

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

ERJ_Java_8.indb 94 31/03/2015 16:41:09


Criao de Mtodos em Java

O Exemplo 6.2 apresenta a utilizao de diversos mtodos que retornam valores.


Aspectos importantes do Exemplo 6.2:
ff Ao rodar a aplicao, o mtodo main executado e invoca os quatro mtodos existentes na classe
(somar, mostrarPares, mostrarDiaPorExtenso e contarLetrasA), e todos eles retornam valores.
Observe o uso da instruo return no final de cada mtodo (linhas 10, 17, 36 e 46). O resultado
do retorno dos mtodos impresso em tela nas linhas 4 a 7. O resultado da execuo do mtodo,
retornado por meio de return, substitudo no mesmo ponto em que o mtodo foi chamado.
ff Linha 9: contm a especificao do mtodo somar: public static double somar(double a, double b).
Ele recebe dois valores do tipo double (a e b) e retorna a soma desses valores na linha 10. Observe
que o tipo de dado de retorno (colocado aps a instruo return) deve ser o mesmo definido na
especificao do mtodo; no caso foi definido que o retorno do mtodo somar um tipo double.
Veja que a assinatura do mtodo (definida na especificao do mtodo na linha 9) e sua invocao
(na linha 4) so idnticas.
ff Linha 12: contm a especificao do mtodo mostrarPares: public static String mostrarPares(int
valor). Ele recebe um valor do tipo int (valor) e retorna uma String (linha 17) com todos os nme-
ros pares compreendidos entre 0 e esse valor.
ff Linha 19: contm a especificao do mtodo mostrarDiaPorExtenso: public static String
mostrarDiaPorExtenso(int dia). Ele recebe um valor do tipo int (dia) e retorna o dia da semana
por extenso por meio da linha 36.
ff Linha 38: contm a especificao do mtodo contarLetrasA: public static int contarLetrasA
(String palavra). Ele recebe um valor do tipo String (palavra) e retorna um valor inteiro referente
quantidade de letras A contidas no valor recebido (linha 46).
Os mtodos representam um dos mais importantes recursos de programao, uma vez que sua
funcionalidade pode ser reaproveitada em diferentes programas. Por exemplo, possvel a criao de
mtodos especializados para a entrada de dados, pois um mtodo possibilita a digitao de dados do
tipo inteiro, outro de dados do tipo double, outro de dados String e assim por diante. Com isso, toda vez
que uma entrada via teclado for necessria, um mtodo pode ser invocado.

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

ERJ_Java_8.indb 95 31/03/2015 16:41:09


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 6.3 Listagem da classe Recursividade

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

Funcionalidades comentadas do Exemplo 6.4:


ff As linhas 4 a 6 invocam o mtodo calcularArea. Cada linha passa uma quantidade diferente de pa-
rmetros. Quando passado apenas um parmetro, o compilador compreende que deve ser exe-
cutado o mtodo da linha 8, pois apenas um valor est sendo enviado. Da mesma forma, quando

96

ERJ_Java_8.indb 96 31/03/2015 16:41:10


Criao de Mtodos em Java

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.

6.5 Acesso a mtodos de outras classes


At este ponto s foi demonstrado o acesso a mtodos da prpria classe, com exceo dos mtodos
internos da prpria linguagem Java. Essa caracterstica, apesar de til, no exatamente a mais usada
em Java; o mais comum que um mtodo seja acessado externamente, isto , ele declarado em uma
classe externa e sua funcionalidade reaproveitada por qualquer outra classe. J utilizamos mtodos
externos diversas vezes, como, por exemplo, os das classes Math e String.
Qualquer mtodo do tipo static criado em uma classe pode ser chamado a partir de outra classe
usando o formato nome-da-classe.nome-do-mtodo. Com isso um mtodo necessita ser criado ape-
nas uma vez em uma nica classe. Esse recurso muito importante, pois, uma vez que o mtodo foi
criado, ele pode ser reutilizado em outra aplicao; basta chamar a classe em que ele se encontra.

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

ERJ_Java_8.indb 97 31/03/2015 16:41:10


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 6.6 A classe EntradaDeDadosComMetodos

98

ERJ_Java_8.indb 98 31/03/2015 16:41:11


Criao de Mtodos em Java

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

A Figura 6.3 apresenta os resultados obtidos com a execuo do Exemplo 6.7.

Figura 6.3 Tela de execuo do Exemplo 6.7.

99

ERJ_Java_8.indb 99 31/03/2015 16:41:11


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

6.6 Mtodos que manipulam Arrays


Os mtodos apresentados at aqui foram relativamente simples, mas podem existir mtodos que
manipulam estruturas mais complexas. Apresentamos neste ponto um mtodo que recebe um array,
manipula os elementos desse array internamente e retorna outro array.
Funcionalidades comentadas do Exemplo 6.8:
ff Linhas 4 a 10 e 18 a 23: contm comentrios dos mtodos buscarMaior e ordenarPalavras. Os
comentrios so muito importantes para a documentao dos mtodos, pois facilitam a com-
preenso de seu funcionamento, em especial quando o desenvolvimento de um sistema reali-
zado por uma equipe.
ff Linha 11: contm a especificao do mtodo buscarMaior. Ele recebe um array de nmeros e re-
torna (linha 16) o maior dos nmeros presentes no array.
ff Linha 24: contm a especificao do mtodo ordenarPalavras. Ele recebe um array de elementos do
tipo String e retorna esse mesmo array, porm com os elementos organizados em ordem alfabtica.
Exemplo 6.8 A classe MetodosComArray

O Exemplo 6.9 apresenta uma classe que utiliza os mtodos do Exemplo 6.8.
Exemplo 6.9 A classe UsaMetodosComArray

Funcionalidades comentadas do Exemplo 6.9:


ff Linhas 4 a 6: inicializa um array de nmeros (linha 4), chama o mtodo buscarMaior (linha 5) en-
viando os nmeros definidos na linha 4 e imprime em tela o maior nmero presente no array n-
meros (linha 6) que est armazenado na varivel maior declarada na linha 5.

100

ERJ_Java_8.indb 100 31/03/2015 16:41:12


Criao de Mtodos em Java

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.

Exerccios para prtica da linguagem Java

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.

Nmero do Ms Idioma Retorno


1 1 Janeiro
2 2 February
3 1 Maro
4 2 April
5 1 Maio
6 2 June

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.

Figura 6.4 Tela de execuo do Exerccio 6.3.

101

ERJ_Java_8.indb 101 31/03/2015 16:41:12


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 6.5 Tela de execuo do Exerccio 6.4.

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.

Seu prximo passo

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

ERJ_Java_8.indb 102 31/03/2015 16:41:12


Captulo

7
Orientao a Objetos

Objetivos deste captulo


99Fornecer definies bsicas da orientao a objetos.
99Introduzir o conceito e uso de pacotes de classe.
99Demonstrar as diferentes partes que compem uma classe.
99Definir a instanciao de objetos por meio de classes.
99Demonstrar o processo de troca de dados entre objetos.
99Enumerar as vantagens da utilizao das tcnicas de encapsulamento, herana e polimor-
fismo.
99Demonstrar como manter objetos em arquivos.

A teoria da Orientao a Objetos (OO) extremamente importante para o mercado atual de


software, e, alm disso, a linguagem Java se baseia nesse paradigma de desenvolvimento. Os con-
ceitos da OO so essenciais para os padres atuais de desenvolvimento de software. Para que o
leitor compreenda melhor os pontos abordados, sero apresentados diversos exemplos prticos
pertinentes ao tema. Outro aspecto importante que abordaremos neste captulo e que possui forte
vnculo com a OO a UML (Unified Modeling Language), uma linguagem de modelagem muito usada
no mercado para representar certas caractersticas do software. O objetivo no abordar a UML
em detalhes, mas apresentar algumas de suas relaes com a OO.
Para compreender a OO, o ponto de partida entender o que objeto e quais so os aspectos
envolvidos em sua criao e manipulao. O item a seguir descreve conceitos referentes a objetos.

7.1 Definies sobre objetos


Na OO, objeto uma abstrao dos objetos reais existentes. Em uma sala de aula, por exemplo,
existem diversos objetos: alunos, cadeiras, mesas, lousa etc. Se for necessrio manter controle de
uma sala de aula, pode ser elaborado um software que manipula objetos desse tipo.
No cotidiano vivemos cercados por objetos de diversos tipos e formas. O contato com esses
objetos nos leva a identificar suas caractersticas fsicas, sua forma etc. Ao visualizar um objeto

103

ERJ_Java_8.indb 103 31/03/2015 16:41:12


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Figura 7.1 O objeto contaBancaria (baseado no tutorial da Oracle).

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.

7.2 Classes e a UML


Os objetos descritos no item anterior so criados a partir das classes. Os objetos so instncias
de classe que permanecem em memria e mantm seus valores de maneira individual. A criao de
uma classe deve anteceder a de um objeto, uma vez que este criado a partir daquela. Uma classe um
molde, um modelo, um prottipo a partir do qual os objetos podem ser criados.
Ao definir uma classe, podem ser criados muitos objetos a partir dela. Imagine a classe como o projeto
de um veculo criado por uma empresa montadora. Depois de definidos todos os aspectos importantes do
projeto do veculo (partes que o compem, lista de peas, aes a serem executadas sobre o veculo etc.),
podem ser criados muitos veculos, sempre tendo como base o projeto original. Na orientao a objetos

104

ERJ_Java_8.indb 104 31/03/2015 16:41:12


Orientao a Objetos

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:

qualificador class Nome-da-classe{


// atributos
// mtodos
}

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:

qualificador class Nome-da-classe{


// declarao de variveis (atributos)

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

ERJ_Java_8.indb 105 31/03/2015 16:41:12


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Figura 7.2 Classe Televisor.

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

Funcionalidades comentadas do Exemplo 7.1:


ff Linha 2: indica que a classe Televisor pblica (public), isto , ela ser visvel a qualquer classe, in-
dependentemente de pertencer ao pacote cap07. Uma classe pertencente a outro pacote (cap06,
por exemplo) poderia utiliz-la normalmente.
ff Linhas 3 e 4: declaram os atributos canal e volume como pblicos (public), indicando que seu
contedo ser visvel a qualquer classe. Normalmente os atributos de uma classe so definidos
como privados (private). Falaremos sobre isso mais frente ao estudarmos o encapsulamento.
ff Linhas 5, 8, 11 e 14: possui a declarao dos mtodos que simulam as operaes de aumentar o volu-
me, reduzir o volume, trocar o canal e mostrar o contedo armazenado nos atributos. Cada mtodo
realiza uma ao diferente. Observe que todos os mtodos so pblicos e visveis a outras classes.
ff Essa classe no executvel, uma vez que no possui o mtodo main. Por esse motivo, no pos-
svel execut-la, como vnhamos fazendo. Em outras palavras, se voc tentar executar a classe vai
aparecer uma mensagem de erro informando que o mtodo main no foi encontrado. Essa classe
ser usada para criar objetos que sero declarados em outras classes.

106

ERJ_Java_8.indb 106 31/03/2015 16:41:13


Orientao a Objetos

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.

7.3 Utilizao de objetos da classe


Conforme j citado, uma classe permite criar objetos que podem ser utilizados em outras classes
ou aplicaes. Para utilizar um objeto, existem trs partes a serem consideradas:
1. A declarao do objeto: segue o mesmo padro de declaraes para tipos primitivos, isto , nome-
-do-tipo nome-da-varivel. Para declarar objeto, usada a seguinte sintaxe: nome-da-classe
nome-do-objeto. No caso, como desejamos gerar um objeto a partir da classe Televisor, criada
anteriormente, a sintaxe ser: Televisor televisor1. O nome Televisor se refere classe a partir
da qual o objeto televisor1 est sendo declarado. Vale a pena ressaltar que a declarao no
cria o objeto em si, trata-se apenas de uma declarao dizendo que televisor1 um objeto do ti-
po Televisor. O nome televisor1 se refere a uma conveno muito usada em Java, isto , o nome do
objeto possui o mesmo nome da classe, adicionando um nmero sequencial para diferenciar dos
outros objetos, porm com o nome iniciando em letra minscula. No caso, uma aplicao poderia
ter os objetos televisor1, televisor2, televisor3 e assim sucessivamente.
2. A instanciao do objeto: corresponde criao do objeto pela alocao de memria para arma-
zenar informaes sobre ele, semelhantemente ao que ocorre na declarao de uma varivel
qualquer, isto , so reservados endereos de memria para armazenar os dados correspon-
dentes. Para realizar a instanciao de um objeto qualquer, usado o operador new. Seguindo o
exemplo, a sintaxe ser nome-do-objeto = new (inicializao-do-objeto). A inicializao do ob-
jeto tratada no item 3 a seguir.
3. A inicializao do objeto: corresponde ao processo de definir valores iniciais s variveis do obje-
to. Conforme apresentado no item anterior, a inicializao precedida pelo operador new. Para
inicializar um objeto, usado o mtodo construtor, estudado mais frente neste captulo. Por
enquanto o mtodo construtor ser usado em sua forma default (com o mesmo nome da classe
sem nenhum parmetro associado) e as variveis tero seus valores iniciais conforme definidos na
classe. Quando as variveis no possuem um valor inicial definido em sua classe, ao criar um ob-
jeto todas as variveis recebem um valor padro: 0 (zero) para variveis numricas, false para
variveis booleanas e null para objetos. Da mesma forma que as variveis de instncia, ao criar
um objeto, ele recebe os mtodos presentes na classe. Como o leitor j possui conhecimentos so-
bre os mtodos, esse aspecto no deve representar maiores dificuldades.
Dessa forma, a partir da definio de uma classe podem ser criados inmeros objetos que passam
a conter o estado e o comportamento declarados na classe. Essa a base de funcionamento de toda a
linguagem Java. Os procedimentos de declarao, instanciao e inicializao de objetos podem ser
realizados em uma ou duas linhas de cdigo. Segue a sintaxe das duas formas possveis:
Em uma nica linha:

nome-da-classe nome-do-objeto = new nome-do-construtor();

107

ERJ_Java_8.indb 107 31/03/2015 16:41:13


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Em duas linhas:

nome-da-classe nome-do-objeto;
nome-do-objeto = new nome-do-construtor();

Considerando a classe Televisor, a sintaxe ser:

Televisor tv = new Televisor();

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

Funcionalidades comentadas do Exemplo 7.2:


ff Linha 4: contm a declarao e a criao do objeto tv a partir da classe Televisor. Ao ser criado,
o objeto recebe todas as caractersticas da classe Televisor, ou seja, todos os atributos e mtodos
existentes.
ff Linha 5: o atributo canal do objeto tv recebe o contedo 150.
ff Linha 6: o atributo volume do objeto tv recebe o contedo 3.
ff Linhas 7 e 8: chamam o mtodo aumentarVolume da classe Televisor. Esse mtodo responsvel
por aumentar em 1 o valor do atributo volume, simulando que o usurio pressionou o boto + do
controle remoto. Como o mtodo chamado duas vezes, ento o valor do volume aumentar em 2.
ff Linha 9: chama o mtodo trocarCanal da classe Televisor. Esse mtodo responsvel por alterar
o valor do atributo canal, simulando que o usurio mudou o canal da TV. O atributo canal receber
o valor passado dentro dos parnteses (o valor do parmetro), no caso o valor 10.
ff Linha 10: invoca o mtodo mostrar existente na classe Televisor que emitir em tela o contedo
dos atributos.
ff Ao executar a classe UsaTelevisor, a sada em tela ser: canal 10 e volume 5. Apesar de nosso
exemplo no ter usado o mtodo diminuirVolume da classe Televisor, ele poderia ser usado nor-
malmente, da mesma forma que o mtodo aumentarVolume.
ff O Exemplo 7.2 cria apenas um objeto do tipo Televisor chamado tv, mas poderiam ser criados
outros objetos (como tv1, tv2, tv3 e assim por diante) e cada um deles poderia ter diferentes
valores para os atributos. Esse foi apenas um exemplo inicial. No decorrer do captulo so forneci-
dos maiores detalhes.

108

ERJ_Java_8.indb 108 31/03/2015 16:41:13


Orientao a Objetos

7.4 Escopo de classe e escopo de instncia


Escopo de classe e escopo de instncia existem para atributos e mtodos. Vamos iniciar o estudo
considerando apenas o uso em atributos. Conforme demonstrado anteriormente, cada objeto (ou ins-
tncia) mantm o contedo das variveis de forma exclusiva, isto , cada objeto mantm um conte-
do diferente para um mesmo atributo da classe. Entretanto, em muitos casos no necessrio man-
ter um contedo exclusivo para cada objeto, isto , para todos os objetos da classe a varivel pode
conter o mesmo contedo. Essa caracterstica faz com que o contedo da varivel seja controlado
pela prpria classe e no pelos objetos individualmente. Para que essa funcionalidade seja possvel,
basta declarar a varivel como sendo static, ou seja, o contedo da varivel ser esttico, controlado
apenas pela classe.
Vamos entender o pargrafo anterior criando um exemplo. Considere a classe Celular do Exemplo
7.3, que possui dois atributos: numero e empresa. Se criarmos vrios objetos do tipo Celular, cada
um deles poder manter um contedo diferente para o atributo numero, afinal cada telefone celular
possui um nmero diferente. Mas isso no acontece para a varivel empresa, uma vez que ela foi de-
clarada como sendo static; com isso a varivel passa a ter escopo de classe e no de instncia. Isso
equivale a dizer que todos os telefones celulares pertencero a uma nica empresa. No importa a
quantidade de objetos existentes, ao ser atribudo o contedo Empresa Genrica para o atributo em-
presa, todos os objetos passam a enxergar esse contedo. Apesar de ser possvel acessar o contedo
de uma varivel esttica por meio de um objeto, na prtica isso no recomendado. O correto faz-lo
por meio da prpria classe (veja a linha 10 do Exemplo 7.4).
Exemplo 7.3 A classe Celular

Considerando seu uso em variveis, a diferena entre escopo de classe e de instncia apresen-
tada na Tabela 7.1.
Tabela 7.1

Escopo de Classe Escopo de Instncia


Uso do modificador static. No usa static.
O contedo da varivel pertence classe. O contedo da varivel pertence aos objetos.
Somente um valor comum poder ser Cada objeto pode manter um valor diferente
armazenado na varivel. para sua varivel.

Para confirmar essa teoria, observe o Exemplo 7.4, que apresenta a classe UsaCelular.
Exemplo 7.4 A classe UsaCelular

109

ERJ_Java_8.indb 109 31/03/2015 16:41:13


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

As funcionalidades da classe UsaCelular so:


ff Linhas 4 a 6: declaram e criam trs objetos do tipo Celular.
ff Linhas 7 a 9: atribuem um nmero diferente para cada objeto celular.
ff Linha 10: atribui o nome da empresa ao atributo empresa pertencente classe Celular.
Como j dissemos, o modificador static pode ser usado tambm em mtodos. O princpio o
mesmo; o mtodo pertencer classe e no aos objetos. Isso faz com que o mtodo possa ser chamado
usando a sintaxe Nome-da-classe.nome-do-mtodo. Fizemos isso muitas vezes no captulo anterior.

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.

1: enviar(de:String, para:String, assunto:String, mensagem:String) : void

gerente : Gerente email : Email

Figura 7.3 Mensagem do objeto gerente para o objeto email.

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

ERJ_Java_8.indb 110 31/03/2015 16:41:14


Orientao a Objetos

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

Figura 7.4 Classe Televisor com atributos privados.

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

ERJ_Java_8.indb 111 31/03/2015 16:41:14


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Figura 7.5 Funcionamento de um mtodo.

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 :

public void setNomeDoAtributo (tipo_do_atributo nomeDoAtributo) {


this.nomeDoAtributo = nomeDoAtributo;
}

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 :

public tipo_do_atributo getNomeDoAtributo () {


return nomeDoAtributo;
}

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

ERJ_Java_8.indb 112 31/03/2015 16:41:14


Orientao a Objetos

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

ERJ_Java_8.indb 113 31/03/2015 16:41:15


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Tabela 7.2

Atributo Regra de negcio exemplificada em Java


Um banco pode definir que o valor mximo a ser sacado do saldo R$ 1000,00.
Exemplo:
public void sacar(double valor){
Saldo if(valor<=1000){
saldo = saldo - valor;
}
}
Uma farmcia pode definir que os aposentados possuem desconto de 10% nas compras vista de qualquer
medicamento.
public double calcularPrecoFinal(double total, boolean aposentado){
Preo if (aposentado==true){
total = total * 0.9;
}
return total;
Num cadastro de pessoas, a idade deve ser um valor entre 0 e 120.
public void setIdade(int idade){
Idade if(idade>=0 && idade<=120){
this.idade = idade;
}

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

Funcionalidades comentadas do Exemplo 7.6:


ff Linha 4: contm a declarao e a criao do objeto tv a partir da classe TelevisorEncapsulada.
Ao ser criado, o objeto recebe todas as caractersticas da classe Televisor, ou seja, todos os atribu-
tos e mtodos existentes.
ff Linha 5: define o contedo do atributo canal como 150 por meio do mtodo setCanal. O valor
150 ser enviado ao parmetro canal presente na linha 46 do Exemplo 7.5.
ff Linha 6: aumenta em 1 o valor atual do canal.
ff Linha 7: define o contedo do atributo volume como 3 por meio do mtodo setVolume. O valor
3 ser enviado ao parmetro volume presente na linha 32 do Exemplo 7.5.
ff Linha 8: reduz em 1 o valor atual do volume.
ff Linha 9: resgata o contedo do atributo canal por meio do mtodo getCanal presente na linha
43 do Exemplo 7.5. O contedo ser impresso em tela.

114

ERJ_Java_8.indb 114 31/03/2015 16:41:15


Orientao a Objetos

7.7 Uso da palavra reservada this


A palavra reservada this faz referncia ao objeto corrente, isto , ao objeto que chamou o mtodo.
Vamos analisar o mtodo setCanal da classe Televisor, mas inicialmente sem utilizao da palavra this.
Outra declarao possvel para esse mtodo seria:

O parmetro c local, enquanto a varivel canal global classe e se refere ao atributo da


classe. Nesse caso, o valor a ser atribudo ao atributo canal recebido por meio do parmetro c. Isso
est perfeitamente correto, no entanto, na maioria das aplicaes, desejvel manter o mesmo nome
da varivel tanto para o parmetro quanto para o atributo da classe. Na verdade isso um padro de
construo em Java, o que produziria o cdigo:

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:

Televisor tv = new Televisor();

Conforme comentado anteriormente, o operador new o responsvel pelo processo de instan-


ciao do objeto, representando uma forma extremamente simples de atribuir valores default a um
objeto. A declarao anterior pode ser lida como: construa o objeto tv (do tipo Televisor) com valo-
res default. Como o prprio nome diz, o mtodo construtor o responsvel por construir um objeto
com determinados valores. Se um construtor no for declarado, assumido um construtor default da
linguagem Java, em que as variveis so inicializadas com os contedos default (variveis numricas
recebem zero, valores lgicos recebem false e objetos recebem null). Quando declarado, ele deve pos-
suir, obrigatoriamente, sempre o mesmo nome (idntico) da classe em que se localiza. Dependendo das
necessidades, uma classe pode conter de 0 a N construtores declarados.
O mtodo construtor responsvel por alocar espao na memria para a manipulao do objeto
e pode conter tambm a chamada para outros mtodos, possibilitando a criao de objetos mais com-
plexos. Na criao de janelas grficas (frames), por exemplo, o mtodo construtor pode definir todas as
propriedades dos componentes visuais do frame (cor do formulrio, tamanho dos botes etc.).

115

ERJ_Java_8.indb 115 31/03/2015 16:41:15


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Funcionalidades comentadas do Exemplo 7.8:


ff A linhas 4 a 6 da classe TelevisorTestaConstrutor chamam um mtodo construtor diferente da
classe Televisor, dependendo da assinatura do mtodo.
ff Linha 4: utiliza o construtor que no recebe nenhum valor, inicializando as variveis com valores
default.
ff Linha 5: utiliza o construtor que recebe apenas o canal.

116

ERJ_Java_8.indb 116 31/03/2015 16:41:15


Orientao a Objetos

ff Linha 6: utiliza o construtor que recebe o canal e o volume.


ff Linhas 8 a 10: apresentam o contedo dos objetos do tipo Televisor por meio do mtodo mostrar.
Voc deve ter notado que o construtor funciona como um mtodo qualquer da linguagem Java, su-
portando sobrecarga e podendo receber parmetros para que os objetos sejam criados com quaisquer
valores, passados no momento da sua instanciao.

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.

7.10 Definio de pacotes


Conforme citado anteriormente, um pacote (package) em Java um diretrio (pasta) em que est
armazenado um conjunto de classes. Geralmente as classes de mesma afinidade, ou mesmo propsito,
so armazenadas num mesmo local. Alguns exemplos de pacote do prprio Java so: awt, beans, io, lang,
math, net, rmi etc. Na realidade, todas as classes pertencem a algum pacote. Quando o pacote no es-
pecificado, a classe passa a pertencer ao pacote default, isto , a prpria pasta na qual a classe foi salva.
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; como j estamos usando desde nosso primeiro
exemplo do livro. Outros exemplos vlidos para nomeao de pacotes poderiam ser cap01.java.exem-
plos, teste, br.com.pacotes.sistemadetransporte.meupacote etc.

117

ERJ_Java_8.indb 117 31/03/2015 16:41:15


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

7.10.1 Criao de pacotes


Para compreender a criao de pacotes, nada melhor do que praticar sua criao. J estamos
criando pacotes desde o incio do livro, mas vamos fornecer alguns detalhes adicionais. Para isso, cria-
remos classes extremamente simples. Siga os procedimentos na sequncia usando a ferramenta de sua
preferncia (NetBeans ou Eclise). Caso sinta dificuldades, consulte os Apndices do livro.
1. Em um projeto java qualquer, crie um pacote com o nome pacote1.
2. Pressione com o boto direito do mouse sobre o pacote1 e crie as duas classes seguintes (C1 e
C2) conforme o Exemplo 7.9.
Exemplo 7.9 As classes C1 e C2 no mesmo pacote

3. No mesmo pacote1, crie outra classe chamada C3 conforme o Exemplo 7.10.


Exemplo 7.10 Listagem da classe C3

4. Execute a classe C3 e verifique seu resultado na Figura 7.6.

Figura 7.6 Execuo do Exemplo 7.10.

5. Vamos analisar os exemplos envolvidos:


ff Todas as classes pertencem ao mesmo pacote (pacote1) e so pblicas, isto , podem ser acessa-
das a partir de outros pacotes.
ff A classe C1 possui um mtodo pblico (somar) que recebe dois valores inteiros e retorna sua soma.
ff A classe C2 possui um mtodo pblico (subtrair) que recebe dois valores inteiros e retorna sua
diferena.
ff A classe C3 cria um objeto (x) da classe C1, um objeto (y) da classe C2 e utiliza os mtodos corres-
pondentes para realizar clculos.
ff Se for retirada a definio do pacote da classe C3 (package pacote1), as classes C1 e C2 no so
localizadas e produzem erro de compilao. Isso porque a classe C3 passa a pertencer ao pacote
default, devido omisso da declarao do pacote.
ff Se todas as declaraes de pacotes forem retiradas das trs classes, o exemplo funciona normal-
mente, uma vez que todas as classes pertencem ao mesmo pacote.
6. Vamos colocar a classe C3 em outro pacote. Modifique a definio do pacote da classe C3 para
package pacote2 e salve a classe novamente. Surgem erros de compilao, pois as classes C1 e C2
pertencem a um pacote diferente da classe C3. Para utilizar classes localizadas em pacotes dife-
rentes, o mais comum usar a diretiva import.

118

ERJ_Java_8.indb 118 31/03/2015 16:41:16


Orientao a Objetos

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.

7.10.2 Uso da diretiva import


Como vimos em exemplos anteriores, a diretiva import permite utilizar um pacote externo em uma
classe qualquer do seguinte modo:

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

ERJ_Java_8.indb 119 31/03/2015 16:41:16


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 7.12 Listagem da classe UsaCamisa

Funcionalidades comentadas do Exemplo 7.12:


ff Linha 4: cria o objeto camisa a partir da classe Camisa.
ff Linha 5: utiliza o mtodo getClass() da classe Object, herdado pela classe Camisa e disponibiliza-
do para o objeto camisa. Esse mtodo apresenta em tela o nome do pacote seguido do nome da
classe. Esse mtodo torna possvel descobrir, em tempo de execuo, qual o tipo do objeto, ou
seja, a qual classe ele pertence ou ainda a partir de qual classe ele foi criado.
ff Linha 6: similar ao anterior, porm retorna apenas o nome da classe por meio do mtodo getSim-
pleName().
ff Linha 7: utiliza o mtodo hashCode() da classe Object. Esse mtodo retorna um nmero nico
para o objeto, um nmero diferente para cada objeto. Esse mtodo usado para agilizar o proces-
so de armazenamento e recuperao em estruturas de dados complexas, no abordadas aqui.
O resultado da execuo da classe do Exemplo 7.12 aparece na Figura 7.7.

Figura 7.7 Execuo do Exemplo 7.12.

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

ERJ_Java_8.indb 120 31/03/2015 16:41:16


Orientao a Objetos

Exemplo 7.14 A classe PessoaFisica

Exemplo 7.15 A classe PessoaJuridica

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

A classe Funcionario estende a funcionalidade da classe PessoaFisica pelo mecanismo de herana,


especializando ainda mais a classe original Pessoa. Por meio do mecanismo da herana, torna-se pos-
svel a criao de uma hierarquia de classes. A Figura 7.8 apresenta o diagrama das classes criadas no
exemplo de acordo com a notao da UML. A hierarquia das classes criada pelo mecanismo de herana
faz com que a subclasse Funcionario herde as funcionalidades da subclasse PessoaFisica que herda as
funcionalidades da superclasse Pessoa. Da mesma forma, a subclasse PessoaJuridica herda as funcio-
nalidades da superclasse Pessoa. Todas as subclasses foram criadas a partir da classe Pessoa.

121

ERJ_Java_8.indb 121 31/03/2015 16:41:16


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

superclasse
Pessoa
nome : String

+ setNome(nome : String) : void


+ getNome() : String

subclasses

PessoaFisica PessoaJuridica
rg : String cnpj : String

+ setRg(rg : String) : void + setCnpj(cnpj : String) : void


+ getRg() : String + getCnpj() : String

Funcionario
cartao : String

+ setCartao(cartao: String) : String


+ getCartao() : String

Figura 7.8 Diagrama de classes de acordo com a UML.

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

ERJ_Java_8.indb 122 31/03/2015 16:41:17


Orientao a Objetos

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

ERJ_Java_8.indb 123 31/03/2015 16:41:17


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

O Exemplo 7.20 apresenta a classe UsaBolaFutebol para testar as funcionalidades dessas classes.
Exemplo 7.20 A classeUsaBolaFutebol

A sequncia de execuo a seguinte: na linha 4 da classe UsaBolaFutebol chamado o m-


todo construtor da classe BolaFutebol (linha 4), passando o valor dos atributos. Na linha 5 da classe
BolaFutebol chamado o mtodo construtor da classe Bola (linha 6). Na sequncia, executada a linha
5 da classe UsaBolaFutebol que chama o mtodo mostrar da classe BolaFutebol (linha 8), que, por sua
vez, chama o mtodo mostrar da classe Bola (linha 10).

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

ERJ_Java_8.indb 124 31/03/2015 16:41:17


Orientao a Objetos

3. Salve e compile o Exemplo 7.21, referente classe PessoaPolimorfa.


Exemplo 7.21 A Classe PessoaPolimorfa

4. Vamos analisar a classe PessoaPolimorfa:


ff Linha 5: declara um objeto do tipo Pessoa, porm ele inicializado com null (nulo), ou seja, nesse
ponto o objeto ainda no foi criado. Ainda no foi decidido a que tipo de classe (do diagrama de
classes da herana) o objeto pertence. Isso ocorre durante a execuo da classe.
ff Linha 6: declara e inicializa uma varivel inteira tipo dependendo da entrada do usurio.
Dependendo do contedo dessa varivel (1, 2, 3 ou 4), o objeto pessoa criado a partir de uma
classe diferente, de acordo com a estrutura switch da linha 8.
ff Linhas 9 a 16: criam um objeto diferente, dependendo do valor da varivel tipo. Observe que o
objeto pessoa foi declarado como do tipo Pessoa, porm ele pode ser criado a partir de qual-
quer classe presente na estrutura, criada com o uso da herana.
ff Linha 18: imprime em tela uma mensagem tipo desconhecido, caso o valor da varivel tipo seja
diferente de 1, 2, 3 ou 4.
ff Linha 22: imprime uma mensagem diferente na tela, dependendo da classe a partir da qual o ob-
jeto pessoa foi criado. Observe que todas as classes possuem esse mesmo mtodo, no entanto
cada um imprime uma mensagem diferente. Isso serve para provar que se trata de objetos dife-
rentes com comportamentos especficos.
O exemplo apresentado referente ao polimorfismo extremamente simples, serve apenas para fins
didticos. Existem outras formas de utilizao, como, por exemplo, passagem de um objeto polimrfico
como parmetro num mtodo. Tenha em mente que o polimorfismo constitui uma tcnica para o reapro-
veitamento e a simplificao do cdigo, possibilitando o desenvolvimento de aplicaes mais robustas.

7.13 Gravao e leitura de objetos


O contedo das variveis de instncia dos objetos de uma classe pode ser armazenado e recupe-
rado mediante sua gravao em arquivo. Apesar de o mtodo mais usual de armazenamento de dados
do mercado ser por meio de tabelas, usadas no modelo relacional de banco de dados, existe a tendncia
da utilizao de banco de dados orientado a objetos, como, por exemplo, o DB4O, um banco de dados
orientado a objetos criado a partir da linguagem Java. No objetivo discutir essas questes, apenas
apresentar uma forma simples de armazenar objetos em disco para futura recuperao. Os exemplos a
seguir demonstram como isso possvel.

125

ERJ_Java_8.indb 125 31/03/2015 16:41:18


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Figura 7.9 Diagrama de classes de acordo com a UML.

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

Funcionalidades comentadas do Exemplo 7.22:


ff Linha 2: importa o pacote java.io necessrio para a leitura e gravao em arquivos.
ff Linha 3: declara a classe Produto e implementa a interface Serializable, necessria para a leitura e
gravao dos objetos em arquivo.
ff Linhas 4 e 5: declaram duas variveis codigo e descricao que sero usadas para manter os da-
dos referentes ao produto.
ff As linhas seguintes declaram os mtodos set e get necessrios para que o valor das variveis pos-
sa ser acessado a partir da classe ProdutoPersiste, comentada a seguir.
A classe ProdutoPersiste do Exemplo 7.23 estende a classe Produto e adiciona os mtodos ler
e gravar para ler e armazenar os dados a partir de um arquivo. Parece ser estranho criar outra classe

126

ERJ_Java_8.indb 126 31/03/2015 16:41:18


Orientao a Objetos

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

Funcionalidades comentadas do Exemplo 7.23:


ff Linha 4: contm a definio do mtodo gravar, responsvel por armazenar em disco os dados
atuais presentes no objeto do tipo produto. O mtodo retorna um texto referente ao resultado da
gravao.
ff Linhas 6 a 11: encarregam-se de gravar o objeto produto em um arquivo localizado na unidade C.
O arquivo ser gravado com o nome Produto, concatenado com o contedo do cdigo do produto,
isto , se o cdigo do produto for 1, ento o nome do arquivo ser Produto1; se o cdigo for 22,
ento o nome do arquivo ser Produto22 e assim por diante. No forneceremos maiores detalhes
desse trecho; procure apenas entender que toda vez que um objeto for gravado essa sequncia de
linhas deve estar inserida no programa.
ff Linhas 12 a 14: encarregam-se de definir uma mensagem a ser apresentada em tela, caso algum
erro ocorra durante o processo de gravao do arquivo. Isso pode ocorrer, por exemplo, caso voc
no tenha permisso para criar um arquivo na unidade C.
ff Linha 15: retorna uma mensagem de texto cujo contedo informa se houve ou no sucesso na
gravao. A mensagem retorna para a classe que chamar o mtodo gravar.
ff Linha 17: contm a definio do mtodo ler que recebe o cdigo do produto a ser lido por meio
do parmetro codigo. Se for passado o contedo 10, ento o arquivo a ser lido ser Produto10 e
assim por diante.
ff Linhas 18 a 22: encarregam-se de ler e retornar o objeto armazenado em arquivo. O objeto ser
retornado na linha 21. Se ocorrer algum problema nesse processo, como, por exemplo, o arquivo
no for encontrado, o controle da execuo passa para a linha 23, imprimindo o erro ocorrido e
retornando null para a classe (no caso a classe UsaProduto) que chamou o mtodo ler.
A classe UsaProduto do Exemplo 7.24 possui a funo de testar a gravao e a leitura da classe
ProdutoPersiste.

127

ERJ_Java_8.indb 127 31/03/2015 16:41:18


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 7.24 Tela de execuo da classe UsaProduto

Funcionalidades comentadas do Exemplo 7.24:


ff Linha 5: declara e cria um objeto da classe ProdutoPersiste chamado produto.
ff Linhas 6 e 7: armazenam os dados do produto que sero guardados em arquivo.
ff Linha 8: chama o mtodo gravar da classe ProdutoPersiste, enviando os dados armazenados em
produto e que sero guardados em arquivo na unidade C.
ff Linha 10: chama o mtodo ler da classe ProdutoPersiste. Como esse mtodo esttico, no
existe a necessidade de criar um objeto; ele pode ser chamado diretamente a partir da classe.
Observe que passado o cdigo do produto a ser lido. Conforme j dissemos, esse cdigo ser
usado na composio do nome do arquivo gravado na unidade C. O resultado da execuo do m-
todo ler retorna um objeto do tipo Produto que ser armazenado no objeto p.
ff Linhas 11 e 12: imprimem em tela o contedo do objeto lido e armazenado em p.
Os temas a seguir, a respeito de classes abstratas e interfaces, poderiam ocupar um espao consi-
dervel no livro, mas, novamente, temos de dizer que o objetivo apenas fazer uma breve introduo a
respeito. Vamos iniciar pela classe abstrata.

7.14 Classes abstratas e concretas


A classe abstrata uma classe que NO PERMITE a gerao de instncias a partir dela, isto ,
no permite que sejam criados objetos; ao contrrio, uma classe concreta permite a gerao de ins-
tncias. Bem, por que precisamos de uma classe que no permite a criao de objetos? Isso no parece
estranho? Afinal, no para isso que elaboramos classes? Bem, uma classe abstrata tem realmente essa
caracterstica, isto , impedir que seja criado um objeto de seu tipo. Uma justificativa para seu uso
quando a classe serve apenas de base para a elaborao de outras classes. A superclasse Pessoa, pre-
sente no diagrama de classes da Figura 7.8, poderia ser uma classe abstrata. Vamos entender isso.
Considere que numa aplicao real existam apenas pessoas do tipo Fsica ou Jurdica. A classe
Pessoa poderia apenas servir de base para a gerao das classes PessoaFisica e PessoaJuridica, j que
ela contm um atributo comum a essas duas classes (no caso o atributo nome). Observe que numa
aplicao real no existe uma pessoa apenas com nome, ela precisa ter tambm um RG (no caso de pes-
soa fsica) ou um CNPJ (no caso de pessoa jurdica). Se declararmos que Pessoa uma classe abstrata,
usando a sintaxe a seguir:

public abstract class Pessoa {


...// cdigos da classe
}

ento a sintaxe seguinte gerar um erro de compilao:

Pessoa pessoa = new Pessoa();

128

ERJ_Java_8.indb 128 31/03/2015 16:41:19


Orientao a Objetos

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.

PessoaFisica pf = new PessoaFisica();


PessoaJuridica pj = new PessoaJuridica();

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

+ acelerar() : void + acelerar() : void

Figura 7.10 A classe abstrata Veiculo.

Exemplo 7.25 A classe Veiculo

129

ERJ_Java_8.indb 129 31/03/2015 16:41:19


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas do Exemplo 7.25:


ff Linha 2: declara que a classe Veiculo abstrata.
ff Linhas 3 e 4: declaram os atributos velocidade e status. Ambos foram definidos como pblicos
para facilitar o exemplo.
ff Linha 5: declara o mtodo ligar que simula o acionamento do motor do veculo. Quando o conte-
do do atributo status estiver true, indica que o motor do veculo est ligado.
ff Linha 8: declara o mtodo desligar, que simula o desligamento do motor do veculo. Quando o
contedo do atributo status estiver false, indica que o motor do veculo est desligado.
ff Linha 11: declara o mtodo mostrarStatus, que se encarrega de apresentar em tela o contedo
do atributo status (true ou false).
ff Linha 14: declara o mtodo abstrato acelerar. No existe nenhuma implementao para esse
mtodo. Isso deve ser feito pelas subclasses da classe Veiculo.
Uma vez elaborada a classe Veiculo, vamos analisar a classe Automovel do Exemplo 7.26.
Exemplo 7.26 A classe Automovel

Funcionalidades comentadas do Exemplo 7.26:


ff Linha 2: declara a classe Automovel como herdeira de Veiculo.
ff Linha 3: possui uma anotao (notation) em Java. Anotaes so metadados com o objetivo de
possibilitar que, em tempo de compilao, carregamento ou execuo de classes, suas informa-
es (atributos e mtodos) sejam acessadas. Toda anotao inicia-se com o caractere @. Neste
caso, trata-se de uma maneira de indicar que o mtodo seguinte, no caso o mtodo acelerar, est
sendo redefinido (overriding, j abordado anteriormente).
ff Linhas 4 a 6: implementam o mtodo acelerar, que incrementa em um a velocidade atual do ve-
culo. Lembre-se de que esse mtodo obrigatrio para a classe Automovel, uma vez que ele foi
definido como abstrato na classe Veiculo.
A prxima classe do exemplo Aviao, praticamente idntica classe Automovel, exceto pelo fato
de aumentar a velocidade atual em dez. Observe no Exemplo 7.27 que o mtodo o mesmo da classe
Automovel, porm funciona de maneira diferente.
Exemplo 7.27 A classe Aviao

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

ERJ_Java_8.indb 130 31/03/2015 16:41:19


Orientao a Objetos

Exemplo 7.28 A classe UsaVeiculo

Funcionalidades comentadas do Exemplo 7.28:


ff Linha 4: contm uma linha comentada para lembrar ao leitor que no possvel criar uma instn-
cia de Veiculo, uma vez que a classe abstrata.
ff Linhas 5 a 9: criam o objeto automovel e usam os mtodos e atributos disponveis dessa classe.
ff Linhas 11 a 15: criam o objeto aviao e utilizam os mtodos e atributos disponveis dessa classe.
Como voc viu, uma classe abstrata funciona como um modelo para outras classes, mas possui fun-
cionalidades no totalmente definidas (por meio dos mtodos abstratos). Cabe a cada uma das classes
concretas adicionar um comportamento especfico, implementando os mtodos abstratos definidos na
classe abstrata.

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

ERJ_Java_8.indb 131 31/03/2015 16:41:19


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

<<interface>>
DAO
Estoque
+ inserir() : void
+ excluir() : void
+ localizar() : void

Cliente Fornecedor Produto


codigo : int cnpj : String numero : int
nome : String razaoSocial : String descricao : String

+ inserir() : void + inserir() : void + inserir() : void


+ excluir() : void + excluir() : void + excluir() : void
+ localizar() : void + localizar() : void + localizar() : void
+ baixar() : void

Figura 7.11 As interfaces DAO e Estoque.

Esse diagrama representa o seguinte:


As classes Cliente e Fornecedor implementam a interface DAO, ou seja, codificam todos os mto-
dos especificados na interface DAO, no caso os mtodos incluir, excluir e localizar. Por esse motivo,
cada uma das classes possui trs mtodos. As classes poderiam tambm implementar outros mtodos
no especificados pela interface DAO.
A classe Produto implementa a interface DAO (os mtodos incluir, excluir e localizar) e a inter-
face Estoque (o mtodo baixar). Como dissemos anteriormente, apesar de a representao ser dife-
rente, ambas so interfaces.
Bem, se voc no entendeu algo, no se preocupe. Isso ficar mais claro ao codificar as interfaces e
classes. Vamos iniciar pelas interfaces.
O Exemplo 7.29 apresenta a interface DAO.
Exemplo 7.29 A interface DAO

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

ERJ_Java_8.indb 132 31/03/2015 16:41:20


Orientao a Objetos

Exemplo 7.30 A interface Estoque

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

ERJ_Java_8.indb 133 31/03/2015 16:41:20


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Exerccios para prtica da linguagem Java

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()

Figura 7.12 A classe Brinquedo.

134

ERJ_Java_8.indb 134 31/03/2015 16:41:20


Orientao a Objetos

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/>.

Seu prximo passo

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

ERJ_Java_8.indb 135 31/03/2015 16:41:20


Captulo

8
Interfaces Grficas com Swing

Objetivos deste captulo


99Demonstrar o funcionamento das principais classes do pacote swing para a criao da In-
terface Grfica do Usurio.
99Identificar os principais objetos presentes nas janelas de uma aplicao em Java, tais como
botes, campos texto, painis de rolagem, listas de mltipla escolha, entre outros.
99Demonstrar a utilizao de diversos tipos de caixa de mensagens e menus de barra e sus-
pensos.
99Definir os principais mtodos usados no controle de layout das janelas de uma aplicao
por meio dos gerenciadores de layout.
99Fornecer uma srie de informaes que permite desenvolver a maioria das interfaces gr-
ficas necessrias em uma aplicao.
99Desenvolver a capacidade de abstrair uma necessidade de entrada e sada de dados de
uma aplicao, transformando-a numa interface grfica.

Este captulo aborda a utilizao de classes disponveis no Java para o desenvolvimento de


interfaces grficas, conhecidas inicialmente como AWT ABSTRACT WINDOW TOOLKIT. Com o
desenvolvimento da linguagem Java, o AWT foi substitudo pelo swing pertencente biblioteca
JFC (Java Foundation Classes), portanto o swing uma extenso das classes da AWT. Por esse mo-
tivo, o captulo d enfoque s classes do swing que possuem diversas vantagens e muitos aprimora-
mentos em relao s classes da AWT melhor aparncia, melhor tratamento de eventos, recursos
estendidos, entre outros.
A diferena bsica entre as classes do swing em relao s do pacote awt est na presena da
letra J antes do incio do nome da classe. Por exemplo, para inserir um boto do pacote awt, usada
a classe Button, j para inserir um boto do pacote swing usada a classe JButton. O mesmo vale
para as classes do swing, pois todas iniciam com J.

136

ERJ_Java_8.indb 136 31/03/2015 16:41:20


Interfaces Grficas com Swing

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

Figura 8.1 A sequncia dos exemplos.

137

ERJ_Java_8.indb 137 31/03/2015 16:41:21


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

8.1 Criao de frames


Para criar frames utilizaremos a classe JFrame disponvel no pacote swing, a qual gera uma janela
com barra de ttulo, bordas e pode ter outros componentes visuais (objetos) em seu interior. Neste ca-
ptulo optamos por criar uma aplicao MDI (multiple document interface), em que todas as telas do sis-
tema aparecem dentro de uma nica janela; no caso, cada aplicao ser um painel a ser adicionado ao
frame principal.
Antes de apresentarmos o primeiro exemplo, vamos descrever algumas funcionalidades das qua-
tro classes do pacote swing que sero usadas: JLabel, JTextField, JPasswordField e JButton.

8.1.1 Classe JLabel


A classe JLabel permite definir um texto que pode ser adicionado a um outro componente (frame,
painel etc.). Podem ser definidas vrias propriedades para esse texto, tais como alinhamento, tipo de
letra, tamanho, cor etc. Uma possvel sintaxe para a declarao e criao de um objeto JLabel :

JLabel <nome do objeto> = new JLabel(<texto do label>,JLabel.<alinhamento>);


Exemplo: JLabel lbNome = new JLabel(Nome,JLabel.RIGHT);

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

ERJ_Java_8.indb 138 31/03/2015 16:41:21


Interfaces Grficas com Swing

8.1.2 Classe JTextField


A classe JTextField permite criar uma caixa de texto grfica em que o usurio pode digitar dados.
Assim como JLabel, existem diversas propriedades cujos contedos podem ser modificados. Uma pos-
svel sintaxe para a declarao e criao de um objeto JTextField :

JTextField <nome do objeto> = new JTextField();


Exemplo: JTextField tfNome = new JTextField();

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

8.1.3 Classe JPasswordField


De forma semelhante JTextField, a classe JPasswordField permite criar um componente visual em
que o usurio digita os caracteres, porm eles so substitudos (visualmente) por outro caractere. O fun-
cionamento da classe JPasswordField praticamente o mesmo da classe JTextField, a diferena que o
caractere digitado substitudo por outro para ocultar a senha digitada. O caractere default que aparece
no momento da digitao o asterisco (*), entretanto qualquer caractere pode ser definido pelo mtodo
setEchoChar. Uma possvel sintaxe para a declarao e criao de um objeto JPasswordField :

JPasswordField <nome do objeto> = new JPasswordField();


Exemplo: JPasswordField pfSenha = new JPasswordField();

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

ERJ_Java_8.indb 139 31/03/2015 16:41:21


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

(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

8.1.4 Classe JButton


A classe JButton permite a criao de botes grficos a serem adicionados em outros componentes
grficos (como frames e painis). Um boto pode ser criado com apenas um texto e/ou com cones para
tornar o ambiente mais intuitivo. Neste primeiro exemplo vamos criar botes da maneira mais simples.
Uma possvel sintaxe para a declarao e criao de um objeto JButton :

JButton <nome do objeto> = new JButton(<texto do boto>);


Exemplo: JButton btCalcular = new JButton(Calcular);

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)

8.1.5 O frame Login


O primeiro exemplo simula uma tela de login para entrada no sistema. O usurio fornece login e
senha, e, caso estejam corretos, apresentada a tela principal do sistema. Antes de iniciarmos as expli-
caes referentes listagem do Exemplo 8.1, o leitor deve compreender que nem todas as funcionali-
dades sero explicadas em detalhes. A cada exemplo, e no momento oportuno, so fornecidas outras
informaes referentes aos componentes grficos.

140

ERJ_Java_8.indb 140 31/03/2015 16:41:21


Interfaces Grficas com Swing

Exemplo 8.1 A classe GuiLogin

141

ERJ_Java_8.indb 141 31/03/2015 16:41:22


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas do Exemplo 8.1:


ff Linhas 2 a 4: contm os imports necessrios referentes aos componentes grficos usados no
exemplo.
ff Linha 5: a palavra extends (lembre-se da herana) informa que a classe GuiLogin vai utilizar todos
os recursos da classe JFrame, porm ter outras caractersticas prprias, definidas em seu mto-
do construtor, no caso o mtodo GuiLogin (linha 14).
ff Linhas 6 a 12: contm a declarao de diferentes componentes visuais utilizados na aplicao. A
cada exemplo voc aprender a utilizar diferentes componentes.
ff Linhas 14 a 17: contm a implementao do mtodo construtor, que invoca dois mtodos inter-
nos: inicializarComponentes e definirEventos, os quais so usados de forma padronizada em to-
dos os exemplos envolvendo aplicaes grficas. Eles sero usados para definir, respectivamente,
as caractersticas visuais dos componentes grficos e os eventos envolvidos neles. Os eventos de-
finem as funcionalidades para cada componente visual (como, por exemplo, o que acontecer se
clicarmos em cima do boto).
ff Linha 20: define o ttulo Login no Sistema por meio do mtodo setTitle. Essa frase aparecer na
barra de ttulo do frame ( janela do programa).
ff Linha 21: define a coordenada de posicionamento e as dimenses do frame. Os dois primeiros va-
lores dizem respeito posio da tela (x,y) a partir da qual o frame ser desenhado. Os dois lti-
mos valores se referem ao tamanho do frame (largura e altura) empixelsporpolegada. O mtodo
setBounds aceita quatro parmetros (posio esquerda que o componente aparece na tela, posi-
o superior que o componente aparece na tela, largura do componente, altura do componente),
resumindo (x, y, largura, altura).
ff Linha 22: define como nulo o gerenciador de layout a ser usado no frame por meio do mtodo
setLayout. Como voc ver mais frente, um frame (e outros componentes) pode usar diferentes
tipos de gerenciadores de layout, uma maneira de definir o posicionamento fsico dos componentes
no frame. Ao definir o layout como nulo, temos maior liberdade em posicionar os componentes.
ff Linhas 23 a 24: contm a declarao e criao dos objetos tfLogin e pfSenha. O nmero 5, defini-
do entre parnteses, diz respeito ao comprimento das caixas de texto.
ff Linhas 25 a 28: contm a declarao e criao de outros componentes visuais (labels e botes)
com os seus respectivos ttulos.
ff Linhas 29 a 34: definem o posicionamento e o tamanho que cada um dos componentes grficos
ocupar no frame.
ff Linhas 35 a 40: todos os componentes grficos so adicionados ao frame. De forma similar a um
quebra-cabeas, necessrio montar as peas. Nessas linhas, cada uma das peas (componentes)
adicionada ao frame, na posio e tamanho definidos anteriormente.
ff Linha 43: contm a definio do mtodo definirEventos, que tem a responsabilidade de definir
todos os eventos associados ao usurio. Para cada interao do usurio, como, por exemplo, o cli-
que sobre um boto, criado um evento associado.
Todo evento a ser controlado pela aplicao possui a seguinte estrutura:

Vamos entender isso por partes:


ff Primeira linha: adicione ao boto cancelar um novo ouvinte de ao chamado ActionListener,
uma interface que especifica o mtodo actionPerformed.
ff Segunda linha: receba a ao disparada por meio de ActionEvent e execute o cdigo implementa-
do no mtodo actionPerformed, presente a partir da terceira linha.

142

ERJ_Java_8.indb 142 31/03/2015 16:41:22


Interfaces Grficas com Swing

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

ERJ_Java_8.indb 143 31/03/2015 16:41:22


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

8.2 Incluso de menus


H dois tipos de menu utilizados em Java: as barras de menu que aparecem na parte superior de
quase todos os aplicativos e os menus Popup que aparecem quando o usurio coloca o ponteiro do mouse
sobre algum objeto e pressiona o boto direito. Por enquanto vamos estudar apenas o primeiro tipo.

8.2.1 Barras de menus


Antes de criar um menu, necessrio criar uma barra de menus para que ela contenha o conjunto
de menus que aparece na parte superior da janela. Essa barra de menus criada com a seguinte sintaxe:
JMenuBar <nome da barra de menus> = new JMenuBar()

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()

Para adicionar o item ao menu, utiliza-se o mtodo add:


<nome do menu>.add(<nome do item>)
De acordo com os pargrafos anteriores, pode-se notar que o processo de criao de menus possui
uma srie de passos que devem ser seguidos. A Figura 8.2 ilustra os itens necessrios para a criao de
menus. Em resumo, cria-se uma barra de menus, adicionam-se os menus a essa barra, juntam-se os itens
a cada menu e adiciona-se a barra de menus janela.

Barra de menus
Menu inserida por meio
de setMenuBar ( )

Itens do Menu

Figura 8.2 A criao de menus.

144

ERJ_Java_8.indb 144 31/03/2015 16:41:22


Interfaces Grficas com Swing

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

Funcionalidades comentadas do Exemplo 8.2:

145

ERJ_Java_8.indb 145 31/03/2015 16:41:23


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 8.3 Janela do Exemplo 8.2.

8.3 Incluso de painis e botes


Um painel um container, isto , um componente que abriga outros componentes, um local que
permite agregar outros componentes para fins de melhoria do layout e organizao. Isso pode ser feito,
por exemplo, por meio de bordas simples ou coloridas. Para manipular painis ser usada a classe JPanel.
A Seo 8.1 j apresentou o uso de botes. Nesta seo vamos apresentar outras propriedades e
eventos que podem ser manipulados por esse componente. Vamos nos prender a comentar apenas as
caractersticas que ainda no foram citadas nos exemplos anteriores. Alm disso, criaremos nossa pri-
meira classe usando um painel. Isso ser feito em todos os prximos exemplos do livro, ou seja, vamos
criar um painel que ser adicionado ao frame da classe GuiMenuPrincipal.

146

ERJ_Java_8.indb 146 31/03/2015 16:41:23


Interfaces Grficas com Swing

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

Mtodos definidos em MouseListener:


Interface: mousePressed mtodo executado quando o boto do mouse pressionado sobre um componente;
MouseListener
mouseClicked mtodo executado quando o boto do mouse solto sobre um componente;
mouseEntered mtodo executado quando o ponteiro do mouse entra na rea de um componente;
Evento:
MouseEvent mouseExited mtodo executado quando o ponteiro do mouse sai da rea de um componente;
mouseReleased mtodo executado quando o mouse solto sobre um componente.

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

ERJ_Java_8.indb 147 31/03/2015 16:41:23


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 8.3 A classe GuiBotao

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

ERJ_Java_8.indb 148 31/03/2015 16:41:24


Interfaces Grficas com Swing

ff Linha 47: adiciona o Exemplo 8.3 ao container do Exemplo 8.2 (GuiMenuPrincipal).


ff Linha 48: valida o container por meio do mtodo validate e todos os componentes que esto den-
tro dele, no caso apenas o painel guiBotao.
A Figura 8.4 apresenta a janela obtida com a execuo do Exemplo 8.3. Se o boto Mensagem for
pressionado, uma mensagem impressa na tela. Na tentativa de clicar sobre o boto Teimoso, ele se
mover e o usurio no conseguir clicar nele.

Figura 8.4 Janela do Exemplo 8.3.

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.

8.4 Incluso de caixas de opo


As caixas de opo so criadas a partir da classe JCheckBox e permitem representar uma opo
que est ativada (true) ou desativada (false). As caixas de opo so utilizadas para exibir vrias opes
dentre as quais o usurio pode optar por selecionar nenhuma, uma ou vrias delas. Como exemplo pr-
tico de utilizao, suponha que o usurio precise selecionar todos os idiomas que ele domina (ingls,
portugus, espanhol etc.). Ele poderia selecionar quais e quantos forem necessrios.

149

ERJ_Java_8.indb 149 31/03/2015 16:41:24


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

O Exemplo 8.4 demonstra a funcionalidade do JCheckBox.


Exemplo 8.4 Listagem da classe GuiCaixaOpcao

150

ERJ_Java_8.indb 150 31/03/2015 16:41:24


Interfaces Grficas com Swing

Funcionalidades comentadas do Exemplo 8.4:


ff Linha 6: declara os dois objetos ckIngles e ckInformatica como sendo do tipo JCkeckBox.
ff Linhas 15 e 16: criam os dois objetos com a caixa desmarcada e com um texto associado.
ff Linhas 33 a 38: adicionam o evento de ao para o boto btMarcar. Quando o usurio pressionar
esse boto, as duas caixas de opo sero marcadas por meio do mtodo setSelected. Ao passar
true como parmetro, as caixas de opo sero marcadas.
ff Linhas 39 a 44: idem ao anterior, porm, ao passar false como parmetro, as caixas de opo so
desmarcadas.
ff Linhas 45 a 56: adicionam o evento de ao para o boto btVerificar. Quando o usurio clicar nesse
boto, ser apresentada em tela uma mensagem com o estado das caixas de opo. O mtodo
isSelected retorna true ou false, dependendo do estado de cada caixa.
Voc pode testar esse exemplo de maneira independente usando a classe CarregaFrame apresen-
tada anteriormente, ou a partir da classe GuiMenuPrincipal. Para carregar usando o menu, voc deve
adicionar um item ao menu Exemplos da classe GuiMenuPrincipal obedecendo s seguintes instrues:
ff Declare um objeto chamado miCaixaOpcao do tipo JMenuItem (junto com miBotao).
ff No mtodo inicializarComponentes, crie o objeto miCaixaOpcao, abaixo de miBotao:

ff Adicione o objeto miCaixaOpcao ao objeto mnExemplos, abaixo de miBotao:

ff Ao final do mtodo definirEventos (antes da chave de encerramento do mtodo), crie um evento


para miCaixaOpcao:

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.

Figura 8.5 Janela do Exemplo 8.4.

151

ERJ_Java_8.indb 151 31/03/2015 16:41:25


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

8.5 Incluso dos botes de rdio


Os botes de rdio so criados a partir da classe JRadioButton e, diferentemente dos JCheckBox,
permitem que apenas uma entre vrias opes seja escolhida pelo usurio. Os botes de rdio devem
sempre ser agrupados em um ButtonGroup para cada conjunto de botes de rdio a ser inserido no
painel. por meio de ButtonGroup que o usurio s consegue selecionar um dos botes que pertenam
ao mesmo grupo. Se os botes no forem agrupados, o usurio pode selecionar mais de uma opo
(funcionando da mesma forma que JCheckBox).
O Exemplo 8.5 demonstra a funcionalidade do JRadioButton.
Exemplo 8.5 Listagem da classe GuiRadio

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

ERJ_Java_8.indb 152 31/03/2015 16:41:25


Interfaces Grficas com Swing

Funcionalidades comentadas do Exemplo 8.5:


ff Linha 7: declara os dois objetos rbMasculino e rbFeminino como sendo do tipo JRadioButton.
ff Linha 8: declara o objeto buttonGroup como sendo do tipo ButtonGroup.
ff Linhas 18 e 20: criam os dois objetos do tipo JRadioButton com um texto associado.
ff Linhas 21 a 23: criam um objeto do tipo buttonGroup e adicionam os dois objetos (rbMasculino e
rbFeminino) a ele.
ff Linha 28: define que o boto de rdio rbMasculino seja selecionado por meio do mtodo setSelected.
ff Linha 38: verifica se o boto de rdio rbMasculino est selecionado por meio do mtodo isSelected.
Em caso positivo, apresenta a mensagem correspondente (linha 39).
ff Linha 40: idem ao anterior para o boto de rdio rbFeminino.

O Exemplo 8.5 apresenta uma janela na


qual o usurio escolhe entre duas opes por
meio de botes de rdio. Cada boto emite
em tela um resultado diferente: Masculino
ou Feminino. Esse exemplo 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. Figura 8.6 Janela do Exemplo 8.5.

8.6 Mais sobre Labels


Como j visto anteriormente, para incluso de texto em frames (ou em painis) usada a classe
JLabel, que pode ser usada para inserir um texto, uma imagem, ou ainda os dois ao mesmo tempo, sepa-
rados por vrgula. Para abrigar imagens num JLabel usada a classe ImageIcon, da mesma forma que foi
usada para inserir uma imagem num boto.
O Exemplo 8.6 demonstra a utilizao da classe JLabel para incluir textos e figuras em um painel.
Exemplo 8.6 A classe GuiLabel

153

ERJ_Java_8.indb 153 31/03/2015 16:41:26


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas do Exemplo 8.6:


ff Linha 5: contm a declarao dos objetos da classe JLabel que sero usados para armazenar texto
e imagens.
ff Linhas 8 a 10: contm a implementao do mtodo construtor da classe GuiLabel. Observa-se
que o construtor invoca apenas o mtodo inicializarComponentes, uma vez que a manipulao de
eventos no ser tratada neste exemplo.
ff Linha 13: define que o gerenciador de layout usado no painel ser do tipo GridLayout. Isso signifi-
ca que a rea do painel ser dividida em uma grade de quatro linhas e uma coluna (4,1) em que os
componentes sero inseridos. Essa diviso apenas virtual, no aparece nenhuma linha dividin-
do as clulas.
ff Linha 15: define a cor de fundo do painel utilizando o mtodo setBackground. Os nmeros que apa-
recem dentro dos parnteses referem-se ao padro RGB (Red-Green-Blue) e definem as tonalidades
das cores vermelha, verde e azul. Os nmeros para a tonalidade podem variar de 0 (mnimo) a 255
(mximo) e sua mistura forma uma cor especfica. Neste caso, a mistura gera um tipo de cor verde.
ff Linhas 16 e 19: inicializam os objetos label a partir de um texto e alinhamentos diferentes. Esse
alinhamento definido por meio de constantes inteiras predefinidas pela linguagem (JLabel.LEFT
que equivale a zero, JLabel.CENTER que equivale a um e JLabel.RIGHT que equivale a dois).
Quando o alinhamento no for especificado, o default esquerda.
ff Linha 17: define a cor da fonte do objeto label1 por meio do mtodo setForeground. Da esquerda
para a direita essa declarao pode ser interpretada assim: para o objeto label1 utilize a cor de
fonte (setForeground) branca (Color.white).
ff Linha 18: contm a inicializao do objeto label2 usando o objeto imageIcon1. Observe que, da
mesma forma que ocorre com o texto, um objeto do tipo Label pode ser inicializado com uma ima-
gem. Assim, o objeto label2 ter uma imagem atrelada a ele, e no um texto.
ff Linha 21: contm a inicializao do objeto label4 como um texto e uma imagem ao mesmo tempo.
ff Linha 22: realiza a formatao do texto do objeto label4 por meio do mtodo setFont, definindo
que ser utilizada a fonte Serif, em negrito (Font.BOLD) e com tamanho 20.
ff Linhas 24 a 27: contm o mtodo add utilizado para adicionar os diversos objetos ao frame. Os
objetos so inseridos no frame na ordem em que aparecem. A ordem em que os objetos so inse-
ridos importante para sua correta disposio no painel. Ao usar o add(), os objetos so inseridos
linha a linha (sempre de cima para baixo). Neste exemplo a grade possui apenas uma coluna; caso
existissem mais colunas, o preenchimento seria realizado da seguinte forma: linha1_coluna1,
linha1_coluna2, linha2_coluna1, linha2_coluna2 e assim sucessivamente. Portanto, o preenchimen-
to do painel acontece sempre de cima para baixo (linhas) e da esquerda para a direita (colunas).
A Figura 8.7 demonstra os resultados obtidos com a execuo do Exemplo 8.6. Ele no possui ne-
nhuma funcionalidade, apenas serve para demonstrar a incluso de texto e imagem numa janela. Ele
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.

154

ERJ_Java_8.indb 154 31/03/2015 16:41:26


Interfaces Grficas com Swing

Figura 8.7 Janela do Exemplo 8.6.

8.7 Incluso de listas de seleo


As listas de seleo so objetos que possibilitam a escolha de um ou vrios valores armazenados em
uma lista de opes. Essa lista manipulada a partir da classe JList. Para utilizao e melhor desempenho
das listas de seleo, torna-se necessrio realizar alguns procedimentos, conforme a listagem a seguir:
1. Declarar um objeto para instanciar a classe JList.
2. Declarar um objeto que conter a lista das opes e adicionar a ele todas as opes.
3. Inicializar o objeto do item 1 com o objeto do item 2.
4. Criar um painel de rolagem.
5. Adicionar o objeto do item 1 ao painel de rolagem.
A Tabela 8.8 apresenta um resumo dos mtodos mais usados da classe JList.
Tabela 8.8 Resumo dos mtodos da classe JList

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

ERJ_Java_8.indb 155 31/03/2015 16:41:26


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 8.7 A classe GuiLista

156

ERJ_Java_8.indb 156 31/03/2015 16:41:27


Interfaces Grficas com Swing

Funcionalidades comentadas do Exemplo 8.7:


ff Linha 8: contm a declarao do objeto liDesconto da classe JList que ser usado como uma lista,
armazenando valores de descontos para serem calculados.
ff Linha 9: contm a declarao do objeto spLista da classe JScrollPane que ser usado para rolar a
lista de opes. Isso necessrio porque uma classe JList no possui internamente uma maneira
de rolar os itens. Voc ver que nossa lista possui a altura de apenas trs itens, mas possui cinco
itens. Para visualizar os dois outros itens necessrio rolar a lista, e isso feito por meio do painel
de rolagem.
ff Linha 18: contm a declarao de um array de Strings chamado liDescontoItems que ser adicio-
nado ao JList. Esse array deve ser formado por todos os elementos (opes) que a lista ter, sepa-
rados por vrgula.
ff Linha 22: realiza a criao e inicializao do objeto liDesconto. Sua lista contm as strings arma-
zenadas no array liDescontoItems.
ff Linha 24: realiza a criao do painel de rolagem a partir da lista. Nesse caso, a lista est sendo co-
locada dentro do objeto spLista.
ff Linha 29: define o posicionamento e as dimenses do painel de rolagem. Isso necessrio porque
a prpria barra ser adicionada ao painel (linha 35).
ff Linhas 40 a 70: implementam o evento de ao para o boto calcular.
ff Linhas 42: verifica se a caixa de texto tfValor est vazia. Em caso positivo, devolve o foco para
a caixa tfValor (quando o boto Calcular pressionado, o foco passado ao boto) por meio
da linha 43 e retorna para a tela do usurio (linha 44). Mesmo que o usurio pressione o boto
Calcular, esse cdigo faz com que o cursor permanea na caixa Valor enquanto ela estiver vazia.
ff Linha 46: inicia o processo de clculo do valor. Esse clculo foi adicionado estrutura try-catch
para tratar erros de digitao, se o usurio fornecer um valor no numrico, por exemplo. Nesse
caso, o ideal seria trabalharmos com uma mscara para impedir a digitao de valores no num-
ricos. Isso ser visto mais frente neste captulo.
ff Linha 48: verifica se existe algum item da lista selecionado por meio do mtodo getSelectedIn-
dex, que retorna o valor -1 caso no exista nenhum ndice selecionado. Se isso ocorrer quando o
boto Calcular for pressionado, ser emitida uma mensagem em tela alertando o usurio e o cl-
culo ser interrompido por meio do retorno (linha 50) interface do usurio.
ff Linha 52: assume inicialmente que o desconto ser de 10%, atribuindo o valor 0,9 varivel des-
conto. A letra f ao lado do valor numrico faz com que esse valor seja considerado do tipo float.
ff Linha 53: caso o segundo item da lista esteja selecionado, atribui o valor 0,8f varivel desconto
(isso equivale a 20%). O mesmo ocorre para as linhas 55 a 61 para outros valores de desconto.
ff Linha 62: realiza o clculo do desconto e o armazena na caixa de texto tfValorDesconto. O uso
das aspas necessrio apenas para manter a compatibilidade de tipos entre o valor armazenado e
a caixa de texto.
ff Linhas 63 a 67: emite uma mensagem de alerta ao usurio caso seja fornecido um valor invlido
e retorna o foco para a caixa de texto tfValor.
A Figura 8.8 demonstra o resultado da execuo do Exemplo 8.7. Ele apresenta uma janela na qual
o usurio fornece um valor, seleciona um item da lista referente ao desconto a ser aplicado sobre esse
valor e pressiona o boto Calcular. O resultado ser o valor digitado menos o desconto selecionado. O
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.

157

ERJ_Java_8.indb 157 31/03/2015 16:41:27


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 8.8 Janela do Exemplo 8.7.

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

Funcionalidades comentadas do Exemplo 8.8:


ff Linha 8: contm a declarao do objeto dlm da classe DefaultListModel.
ff Linha 19: contm a criao do objeto dlm. Nesse momento a lista est vazia.
ff Linhas 20 a 22: adiciona dez elementos ao objeto dlm por meio de um lao de repetio. A cada
posio percorrida, um novo item adicionado. Ao trmino do lao, os itens so nomeados como
Foto1, Foto2,...,Foto10.
ff Linha 23: cria a lista lsFotos a partir dos elementos definidos em dlm, ou seja, a lista ser criada
com todos os elementos existentes em dlm.
ff Linhas 34 a 39: contm a implementao do evento de mudana de seleo do item da lista. Isso
realizado por meio da interface ListSelectionListener que define o mtodo valueChanged. Esse
mtodo ser acionado toda vez que o usurio selecionar um item da lista; no caso, um item pre-
sente no objeto lsFotos.
ff Linha 36: cria um objeto chamado imagem1 do tipo ImageIcon. Observe que o arquivo ter um
nome como Foto1 ou Foto2 etc., dependendo do item da lista que estiver selecionado. Para
que as imagens aparea na tela, necessrio que exista uma pasta chamada Imagens a partir da
pasta na qual seu exemplo est sendo executado e contendo todos os arquivos das fotos, ou seja,
deve existir a pasta c:\Java8\Imagens e os arquivos das fotos dentro dela. Veja a Figura 8.9.
ff Linha 37: define a imagem que ser apresentada em tela por meio do mtodo setIcon da classe
ImageIcon.

158

ERJ_Java_8.indb 158 31/03/2015 16:41:27


Interfaces Grficas com Swing

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.

Figura 8.9 Janela do Exemplo 8.8.

159

ERJ_Java_8.indb 159 31/03/2015 16:41:28


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

8.8 Incluso do JComboBox


O componente JComboBox funciona praticamente da mesma forma que o JList, ou seja, permite a
seleo de um (ou mais) item. No entanto existem diferenas em seus mtodos e propriedades.
Tabela 8.10 Resumo dos mtodos da classe JComboBox

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

ERJ_Java_8.indb 160 31/03/2015 16:41:28


Interfaces Grficas com Swing

Funcionalidades comentadas do Exemplo 8.9:


ff Linha 5: declara o objeto cbEstados a partir da classe JComboBox.
ff Linha 16: contm a declarao de um array de Strings chamado cbEstadosItems que ser adicio-
nado ao objeto cbEstados. Esse array deve ser formado por todos os elementos (opes) que o
combo ter, separados por vrgula, no caso todos os estados desejados.
ff Linha 17: realiza a criao e a inicializao do objeto cbEstados a partir dos elementos definidos
em cbEstadosItems.
ff Linhas 29 a 35: implementam o evento de ao para o objeto btMostrar. Toda vez que o usurio
clicar nesse boto ser emitida uma mensagem em tela contendo o ndice e o texto selecionados.
ff Linha 32: apresenta o ndice selecionado atualmente em cbEstados por meio do mtodo
getSelectedIndex.
ff Linha 33: apresenta o texto selecionado atualmente em cbEstados por meio do mtodo
getSelectedItem.
A Figura 8.10 exibe os resultados obtidos com a execuo do Exemplo 8.9. A tabela mostra to-
das as opes possveis de seleo do combo. 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.

Texto Selecionado ndice Selecionado

Esprito Santo 0

Minas Gerais 1

Rio de Janeiro 2

So Paulo 3

Figura 8.10 Resultados da execuo do Exemplo 8.9.

8.9 Incluso de reas de texto


As reas de texto geradas a partir da classe JTextArea so semelhantes s caixas de texto, porm
permitem manipular diversas linhas de texto ao mesmo tempo. Um mtodo construtor disponvel na
classe JTextArea :

JTextArea(<String>,<n de linhas iniciais>,<dimenso>)

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

ERJ_Java_8.indb 161 31/03/2015 16:41:28


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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() Cria uma rea de texto

JTextArea(int,int) Cria uma rea de texto de acordo com o nmero de linhas e colunas especificadas

JTextArea(String) Cria uma rea de texto de acordo com o texto especificado

Cria uma rea de texto de acordo com o texto, o nmero de linhas e o nmero de colunas
JTextArea(String,int, int)
especificadas

getColumns() Obtm o comprimento ou colunas da rea de texto em caracteres

getRows() Obtm a largura ou linhas da rea de texto em caracteres

getSelectedText() Obtm o texto selecionado na rea de texto

setColumns() Define o comprimento ou colunas da rea de texto

setRows() Define a largura ou linhas da rea de texto

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

O Exemplo 8.10 demonstra a utilizao da classe JTextArea.


Funcionalidades comentadas do Exemplo 8.10:
ff Linha 6: contm a declarao do objeto taTexto da classe JTextArea.
ff Linha 9: contm a declarao da constante esttica novaLinha, cujo contedo o caractere de
nova linha. Essa varivel ser usada para quebrar uma linha dentro do objeto taTexto.
ff Linha 19: cria o objeto taTexto com cinco linhas e vinte colunas. Na verdade, nesse caso a inicia-
lizao desnecessria, visto que no estamos usando gerenciador de layout e o tamanho de ta-
Texto ser definido por meio do mtodo setBounds. Voc ver que a rea de texto aparece com
mais de cinco linhas e vinte colunas.
ff Linha 21: cria o boto btLimpar com a imagem borracha.jpg.
ff Linha 22: adiciona o objeto taTexto ao painel de rolagem scrollPane. O objetivo do painel de rola-
gem o mesmo de quando usado no JList. No caso, o painel de rolagem permite visualizar outras
linhas quando no existir mais espao na rea.
ff Linhas 32 a 38: implementam o evento de ao para a caixa tfCampo. Esse evento ser gerado
quando o usurio pressionar a tecla ENTER com o cursor dentro dessa caixa.
ff Linha 34: seleciona o texto da caixa tfCampo por meio do mtodo selectAll.
ff Linha 35: adiciona a taTexto o texto presente na caixa tfCampo por meio do mtodo append.
Insere tambm uma quebra de linha com a constante novaLinha.
ff Linhas 39 a 44: implementam o evento de ao para o boto btLimpar. Ao pressionar o boto, so
limpos os contedos de taTexto e tfCampo.

162

ERJ_Java_8.indb 162 31/03/2015 16:41:28


Interfaces Grficas com Swing

Exemplo 8.10 A classe GuiAreaDeTexto

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.

Figura 8.11 Janela do Exemplo 8.10.

163

ERJ_Java_8.indb 163 31/03/2015 16:41:29


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

8.10 Incluso de caixas de dilogo


A incluso de caixas de dilogo realizada por meio da classe JOptionPane, que apresenta diversas
janelas diferentes: que fazem uma pergunta, que avisam o usurio ou fornecem uma mensagem qual-
quer. Essas janelas representam um modo de comunicao com o usurio, possibilitando passar uma
informao ou obter respostas. Existem quatro tipos padro de caixas de dilogo, cujos detalhes so
tratados individualmente nas descries que se seguem. Para abrir as caixas de dilogo, basta invocar
os mtodos estticos da classe JOptionPane:
ff showMessageDialog caixa de dilogo que apresenta uma mensagem, possibilitando acrescentar
cones de alerta ao usurio.
ff showConfirmDialog alm de emitir uma mensagem, possibilita ao usurio responder a uma per-
gunta.
ff showInputDialog alm de emitir uma mensagem, permite a entrada de um texto.
ff showOptionDialog caixa de dilogo que abrange os trs tipos anteriores.
Vamos apresentar alguns exemplos para demonstrar as funcionalidades desses mtodos. No abor-
daremos o mtodo showInputDialog, uma vez que ele j foi muito usado em exemplos anteriores do livro.

8.10.1 O mtodo showMessageDialog


O mtodo showMessageDialog utilizado para mostrar ao usurio alguma informao e no re-
torna nenhum tipo de valor de resposta. Essa caixa de dilogo pode apresentar um cone referente ao
tipo de mensagem (pergunta, informao, alerta, erro ou definido pelo usurio) ou no apresentar nada,
apenas a mensagem na tela sem cone. Sua sintaxe a seguinte:

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

Definido pelo usurio INFORMATION_MESSAGE,<cone>

Vazio (somente mensagem) PLAIN_MESSAGE

164

ERJ_Java_8.indb 164 31/03/2015 16:41:29


Interfaces Grficas com Swing

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

ERJ_Java_8.indb 165 31/03/2015 16:41:30


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas do Exemplo 8.11:


ff Linhas 16 e 17: definem o array cbCaixasItens do tipo String que contm os nomes das opes
que sero apresentadas ao usurio.
ff Linha 18: cria o objeto cbCaixas a partir do array descrito no item anterior.
ff Linhas 24 a 54: implementam o cdigo referente ao evento de ao para o objeto cbCaixas. Esse
mtodo ser chamado quando o usurio selecionar uma das opes desse objeto.
ff Linha 26: seleciona o item escolhido no objeto cbCaixas por meio do mtodo getSelectedIndex.
O contedo retornado por esse mtodo usado para selecionar uma das opes definidas pela
estrutura switch-case, isto , se o valor de getSelectedIndex for zero, as linhas 28 e 29 so execu-
tadas; se o valor for um, as linhas 32 e 33 so executadas e assim por diante.
A Figura 8.12 demonstra os resultados obtidos com a execuo do Exemplo 8.11. Ele contm
uma lista com seis opes. Dependendo da escolha do usurio, uma caixa de dilogo aberta com
uma mensagem e cone especficos. 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.

Figura 8.12 Janela do Exemplo 8.11.

8.10.2 O mtodo showConfirmDialog


As caixas de dilogo de confirmao possibilitam ao usurio responder a algum questiona-
mento por meio dos botes Yes, No e Cancel. Uma vez apresentada na tela, o usurio escolhe uma
das opes, e, dependendo do boto clicado, retornado um valor inteiro pertencente classe
JOptionPane: YES_OPTION = 0, NO_OPTION = 1 e CANCEL_OPTION = 2. Portanto, esse valor
usado para conhecer qual dos botes foi clicado pelo usurio.
Existem trs tipos de caixa de dilogo de confirmao: as que apresentam os botes Yes e No
(YES_NO_OPTION ou 0), as que apresentam os botes Yes, No e Cancel (YES_NO_CANCEL_OPTION
ou 1) e as que apresentam os botes Ok e Cancel (OK_CANCEL_OPTION ou 2). A sintaxe do mtodo
showConfirmDialog a seguinte:

int resposta = JOptionPane.showConfirmDialog(Component,<mensagem>, <ttulo da mensagem>,


<botes presentes>,< tipo de mensagem>).

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

ERJ_Java_8.indb 166 31/03/2015 16:41:30


Interfaces Grficas com Swing

Exemplo 8.12 A classe GuiDialogoConfirmacao

Funcionalidades comentadas do Exemplo 8.12:


ff Linhas 17 a 19: criam os botes de rdio que permitiro ao usurio escolher o tipo de caixa de
dilogo desejada.
ff Linhas 20 a 23: adicionam todos os botes de rdio a um grupo. O leitor j deve estar familiariza-
do com isso, pois esse recurso j foi usado em exemplos anteriores.
ff Linhas 35 a 53: implementam o cdigo referente ao evento de ao para o objeto btMostrar.
Como o leitor j sabe, esse mtodo chamado quando o usurio clica no boto.
ff Linha 37: declara a varivel resp que ser usada para armazenar o valor referente ao boto
pressionado na caixa de dilogo.

167

ERJ_Java_8.indb 167 31/03/2015 16:41:30


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 8.13 Janela do Exemplo 8.12.

8.10.3 O mtodo showOptionDialog


As caixas de dilogo de opo so geradas a partir do mtodo showOptionDialog e so mais com-
plexas que as anteriores. Elas so capazes de combinar todos os recursos j vistos nas outras caixas de
dilogo. Sua sintaxe a seguinte:

int resposta = (null,<mensagem>,<ttulo da mensagem>,<botes presentes>, <tipo de


mensagem>,<cone>,<array de objetos>,<seleo padro>)

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

ERJ_Java_8.indb 168 31/03/2015 16:41:31


Interfaces Grficas com Swing

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

Funcionalidades comentadas do Exemplo 8.13:


ff Linhas 24 a 32: implementam o cdigo referente ao evento de ao para o objeto btAbrir. Quando
o usurio clicar sobre o boto, ser carregada a caixa de dilogo definida nas linhas 27 a 29.
ff Linha 26: declara e inicializa o array escolha do tipo String contendo os dois elementos que se-
ro usados na caixa de dilogo.
ff Linhas 27 a 29: definem o estilo da caixa de dilogo de acordo com a estrutura apresentada no in-
cio desta seo, com destaque para a linha 29 que contm o cone a ser apresentado, o array es-
colha e o boto que aparecer selecionado (definido por escolha[0], isto , o boto Masculino).
A Figura 8.14 demonstra os resultados obtidos com a execuo do Exemplo 8.13. Observe a pre-
sena do cone usado na caixa de dilogo juntamente com os dois botes Masculino e Feminino. 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.

169

ERJ_Java_8.indb 169 31/03/2015 16:41:31


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 8.14 Janela do Exemplo 8.13.

8.11 Incluso de barras de rolagem


As barras de rolagem so componentes que possibilitam o controle de um valor numrico, com-
preendido entre um valor mnimo e um mximo. Existem trs formas diferentes de mudar o valor da
barra de rolagem:
ff Por meio das setas das extremidades: so utilizadas para incrementar ou decrementar valores
de pequena quantidade (de um em um por default).
ff Pelo intervalo no meio: utilizado para incrementar ou decrementar valores em uma quantidade
maior (de dez em dez por default).
ff Caixa no meio: sua posio utilizada para mostrar onde o valor corrente est localizado dentro
do intervalo dos valores. Ao mover essa barra com o mouse, ocorre uma mudana absoluta no va-
lor com base na posio da caixa dentro da barra de rolagem.
A sintaxe para criar uma barra de rolagem em Java :

JScrollBar(<orientao>,<valor inicial>,<intervalo do meio>,<valor mnimo>,valor


mximo>).

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

ERJ_Java_8.indb 170 31/03/2015 16:41:31


Interfaces Grficas com Swing

(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

ERJ_Java_8.indb 171 31/03/2015 16:41:32


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas do Exemplo 8.14:


ff Linha 4: este exemplo apresenta uma maneira de formatar nmeros por meio da classe
NumberFormat. Por isso torna-se necessrio importar essa classe pertencente ao pacote java.text.
ff Linha 6: declara o objeto scrollBar1 como sendo do tipo JScrollBar.
ff Linha 16: cria e inicializa o objeto scrollBar1 de acordo com a estrutura apresentada no incio des-
ta seo.
ff Linhas 28 a 36: implementam o cdigo referente ao evento de ajuste para o objeto scrollBar1 por
meio da interface AdjustmentListener que especifica o mtodo adjustmentValue Changed, exe-
cutado quando o usurio clica sobre a barra de rolagem, alterando seu valor.
ff Linha 30: define o texto do objeto lbPolegadas por meio do mtodo setText a partir do valor atual
da barra de rolagem e usando o mtodo getValue, portanto o mtodo getValue permite obter o
valor atual da barra de rolagem.
ff Linha 31: declara e cria o objeto nf a partir da classe NumberFormat, que permite definir com
quantas casas decimais um determinado nmero ser formatado.
ff Linhas 32 e 33: definem a quantidade mnima e mxima de casas decimais a serem usadas no ob-
jeto nf. Isso feito por meio dos mtodos setMinimumFractionDigits e setMaximumFraction-
Digits respectivamente.
ff Linha 34: declara e inicializa a varivel cm com o valor da barra de rolagem multiplicado por
2.54. Esse valor o correspondente em centmetros para uma polegada.
ff Linha 35: define o valor em centmetros para o objeto lbCentimetros por meio do mtodo
setText. Contm tambm o uso do mtodo format para formatar o valor armazenado em cm.
O valor ser formatado com duas casas conforme definido nas linhas 32 e 33 para o objeto nf.
A Figura 8.15 demonstra os resultados obtidos com a execuo do Exemplo 8.14. Aparece o valor
correspondente em centmetros na medida em que o usurio selecionar um valor para a polegada. 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.

Figura 8.15 Janela do Exemplo 8.14.

8.12 Incluso de barras de progresso


Muitas vezes, a execuo de um programa leva certo tempo para ser concluda. Nesse caso, talvez
seja importante adicionar uma imagem que informe o andamento do processo ao usurio. Na criao de
sistemas sempre importante prover feedback ao usurio, ou seja, ele precisa estar informado sobre o
que acontece durante a execuo do sistema. Exemplos triviais sobre isso so: o processo de download
na Internet e a instalao de programas. Em casos como esses, podemos utilizar a barra de progresso.
A Tabela 8.14 mostra um resumo dos mtodos mais utilizados da classe JProgressBar.

172

ERJ_Java_8.indb 172 31/03/2015 16:41:32


Interfaces Grficas com Swing

Tabela 8.14 Resumo dos mtodos da classe JProgressBar

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

Vejamos o Exemplo 8.15.


Exemplo 8.15 A classe GuiBarraProgresso

Funcionalidades comentadas do Exemplo 8.15:


ff Linha 5: declara o objeto pbInstalar como sendo do tipo JProgressBar.
ff Linha 13: cria o objeto pbInstalar.
ff Linhas 26 a 30: implementam o cdigo referente ao evento de ao para o objeto btAumenta.
Quando o usurio clicar nesse boto, o valor da barra de rolagem ser incrementado em cinco.
ff Linha 28: contm dois mtodos importantes da classe JScrollBar: setValue que define o valor
para a barra e getValue que retorna o valor atual da barra.
ff Linhas 31 a 35: idem s linhas 26 a 30 para o objeto btDiminui, porm decrementam em cinco o
valor da barra de rolagem.

173

ERJ_Java_8.indb 173 31/03/2015 16:41:32


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 8.16 Janela do Exemplo 8.15.

8.13 Gerenciadores de layout


Os gerenciadores de layout tm a funo de definir o layout a ser usado num componente grfico,
como um painel ou um frame, isto , o gerenciador permite dividir o componente em regies que abri-
garo outros componentes. Dependendo do gerenciador usado, criada uma diviso diferente. Esta
seo no pretende esgotar o assunto, tampouco apresentar todos os tipos de gerenciadores. Sero
abordados os gerenciadores FlowLayout, GridLayout e BorderLayout, mas existem ainda outros no
tratados no livro. Na grande maioria dos exemplos apresentados neste captulo no utilizamos nenhum
gerenciador de layout (layout nulo), mas j usamos o gerenciador de grade (GridLayout). Conforme j
apresentado, para inserir um componente em outro usado o mtodo add.

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.

Figura 8.17 Disposio dos objetos com o FlowLayout.

174

ERJ_Java_8.indb 174 31/03/2015 16:41:33


Interfaces Grficas com Swing

A sintaxe utilizada para a definio do layout de fluxo a seguinte:

setLayout(new FlowLayout([Alinhamento, Espaamento_horizontal,


Espaamento_vertical]));

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.

Figura 8.18 Uso de espaamento entre os objetos.

A Tabela 8.15 mostra os diversos mtodos do tipo construtor disponveis de FlowLayout.


Tabela 8.15 Mtodos do tipo construtor de FlowLayout

Mtodo Funo

Cria um layout padro: alinhamento centralizado e


FlowLayout()
espaamentos entre objetos com cinco unidades

Cria um layout com o alinhamento fornecido e espa-


FlowLayout(int)
amentos entre objetos com cinco unidades

Cria um layout com o alinhamento, espaamento


FlowLayout(int,int,int)
horizontal e espaamento vertical fornecidos

175

ERJ_Java_8.indb 175 31/03/2015 16:41:33


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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:

setLayout(new GridLayout([Nmero_de_linhas, Nmero_de_colunas,


Espaamento_horizontal, Espaamento_vertical]));

Figura 8.19 Redimensionamento automtico dos botes no GridLayout.

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.

Figura 8.20 Uso de espaamento 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

ERJ_Java_8.indb 176 31/03/2015 16:41:33


Interfaces Grficas com Swing

A Tabela 8.16 mostra os diversos mtodos do tipo construtor disponveis de GridLayout.


Tabela 8.16 Mtodos do tipo construtor de GridLayout

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.

Figura 8.21 Redimensionamento automtico dos botes no BorderLayout.

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:

setLayout(new BorderLayout([Espaamento_horizontal, Espaamento_vertical]));

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

ERJ_Java_8.indb 177 31/03/2015 16:41:33


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 8.22 Uso de algumas regies no BorderLayout.

A Tabela 8.17 mostra os diversos mtodos do tipo construtor disponveis de BorderLayout.


Tabela 8.17 Mtodos do tipo construtor de BorderLayout

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

No apresentamos ainda nenhum exemplo prtico que envolva os diferentes gerenciadores de


layout. Isso feito em seguida na prxima seo.

8.14 Incluso de abas


A incluso de abas (ou guias) permite agrupar diversas telas num s componente. Essa caracters-
tica possvel utilizando a classe JTabbedPane, que permite ao usurio escolher diferentes grupos de
componentes clicando numa aba que contm um ttulo e/ou um cone. A Tabela 8.18 mostra um resumo
dos mtodos mais utilizados da classe JTabbledPane.
Tabela 8.18 Resumo dos mtodos da classe JTabbledPane

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

ERJ_Java_8.indb 178 31/03/2015 16:41:33


Interfaces Grficas com Swing

(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

Funcionalidades comentadas do Exemplo 8.16:


ff Linha 5: declara o objeto tpAbas como sendo do tipo JTabbletPane.
ff Linha 6: declara e cria o array botoes contendo 15 elementos do tipo JButton. Esses botes sero
usados para exemplificar o uso dos gerenciadores de layout.
ff Linhas 14 e 15: criam todos os elementos do array botoes contendo o texto Boto1,
Boto2,...Boto14.
ff Linha 17: declara e cria o painel painel1 com o layout de grade contendo cinco linhas e uma coluna.
ff Linhas 18 e 19: adicionam os elementos de ndice 0 a 4 do array botoes ao painel painel1.
ff Linha 21: declara e cria o painel painel2 com o layout de fluxo.
ff Linhas 22 e 23: adicionam os elementos de ndice 5 a 9 do array botoes ao painel painel2.
ff Linha 25: declara e cria o painel painel3 com o layout de regies.
ff Linhas 26 a 30: adicionam cinco botes ao objeto painel3, cada um numa regio.
ff Linha 31: cria o objeto tpAbas.

179

ERJ_Java_8.indb 179 31/03/2015 16:41:34


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 8.23 Janela do Exemplo 8.16.

8.15 Incluso de frames internos


O leitor j sabe que para a criao de frames usada a classe JFrame. Da mesma forma, para a
criao de um frame interno usada a classe JInternalFrame. Um frame interno um objeto leve que
possui muitas das caractersticas de um frame comum, tais como redimensionamento da janela, botes
de maximizar e minimizar, ttulo da janela, entre outros.
Para usar um frame interno, deve ser definida uma dimenso; caso contrrio, ele possuir dimen-
so zero e se tornar invisvel. Para isso podem ser usados os mtodos setSize ou setBounds. preciso
especificar tambm a localizao do frame interno; seno, a localizao default ser (0,0). Isso pode ser
feito por meio dos mtodos setLocation ou setBounds.
A Tabela 8.19 mostra um resumo dos mtodos mais utilizados da classe JInternalFrame.
Tabela 8.19 Resumo dos mtodos da classe JInternalFrame

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

ERJ_Java_8.indb 180 31/03/2015 16:41:34


Interfaces Grficas com Swing

1. Na linha 6, substitua a classe Container por JDesktopPane.


2. Retire a linha 19 e adicione duas linhas:

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

Funcionalidades comentadas do Exemplo 8.17:


ff Linha 3: importa a classe JInternalFrame que ser usada no exemplo.
ff Linha 4: o exemplo GuiFrameInterno estende por meio da herana a classe JInternalFrame.
ff Linha 12: define a dimenso do frame interno por meio do mtodo setSize.
ff Linha 13: define que ser possvel redimensionar o frame passando o valor true ao mtodo
setResizable.
ff Linha 14: indica que ser possvel fechar o frame passando o valor true ao mtodo setClosable.
ff Linha 15: define que ser possvel maximizar o frame passando o valor true ao mtodo setMaximizable.
ff Linha 16: indica que ser possvel minimizar o frame passando o valor true ao mtodo setMinimizable.
ff Linha 17: define a cor de fundo laranja para o frame interno por meio do mtodo setBackground.
A execuo do Exemplo 8.17 pode ser vista na Figura 8.24. Observe a presena dos botes Minimizar,
Maximizar e Fechar. A janela se inicia com uma dimenso fixa, mas o usurio pode redimension-la por
meio do mouse. Ele 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.

Figura 8.24 Janela do Exemplo 8.17.

181

ERJ_Java_8.indb 181 31/03/2015 16:41:34


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

8.16 Incluso de grades


Esta seo descreve o uso de grades por meio da classe JTable, um componente que permite mostrar
e editar uma tabela de duas dimenses. O estudo da classe JTable relativamente extenso (existem mais
de 130 mtodos nessa classe). Como sempre, no livro, vamos focar apenas as funcionalidades mais usadas.
A Tabela 8.20 fornece um resumo dos mtodos mais utilizados da classe JTable.
Tabela 8.20 Resumo dos mtodos da classe JInternalFrame

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)

Funcionalidades comentadas da Listagem 1 do Exemplo 8.18:


ff Linha 3: importa diversas classes do pacote javax.swing.table. As classes usadas sero comenta-
das nos trechos de cdigo seguintes.
ff Linha 4: importa a classe TitledBorder do pacote javax.swing.border, a qual ser usada para adi-
cionar uma borda com ttulo a um painel.
ff Linha 7: importa a classe DecimalFormat do pacote java.text que ser usada para formatar n-
meros com casas decimais.
ff Linhas 9 a 14: declaram todos os componentes usados no exemplo e que j foram estudados ante-
riormente. Nossa aplicao utiliza os seguintes componentes: dois painis, dois botes, uma barra
de rolagem, uma tabela, cinco labels e cinco caixas de texto.

182

ERJ_Java_8.indb 182 31/03/2015 16:41:34


Interfaces Grficas com Swing

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)

Funcionalidades comentadas da Listagem 2 do Exemplo 8.18:


ff Linha 34: o campo total no deve ser editado pelo usurio. Para isso, a caixa de texto tfTotal de-
sabilitada enviando-se false ao mtodo setEnabled.
ff Linha 35: define que o alinhamento da caixa de texto tfTotal ser direita. Isso realizado pas-
sando a constante JTextField.RIGHT ao mtodo setHorizontalAlignment.
ff O restante das linhas conhecido do leitor e dispensa maiores comentrios.
A Listagem 3 apresenta mais um trecho do mtodo inicializarComponentes.
Exemplo 8.18 A classe GuiPedido (Listagem 3: linhas 38 a 57)

183

ERJ_Java_8.indb 183 31/03/2015 16:41:35


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas da Listagem 3 do Exemplo 8.18:


ff No h muito a comentar sobre este trecho, pois contm cdigos muito usados em exemplos an-
teriores. Destaque para a linha 52, que cria o painel pnPrincipal, que abriga todos os componentes
da aplicao.
A Listagem 4 apresenta mais um trecho do mtodo inicializarComponentes.
Exemplo 8.18 A classe GuiPedido (Listagem 4: linhas 58 a 81)

Funcionalidades comentadas da Listagem 4 do Exemplo 8.18:


ff Linha 65: cria o painel pnTable com o gerenciador BorderLayout.
ff Linha 66: define uma borda para o painel pnTable a partir do mtodo setBorder. Essa borda ter o
ttulo Itens do Pedido.
ff Linhas 72 e 73: declaram e criam o objeto tableModel a partir da classe DefaultTableModel, que
serve como um modelo a partir do qual a tabela ser criada. Na linha 73 o objeto tableModel re-
cebe um array de strings contendo os nomes das colunas que sero usadas na tabela. O nmero
zero, ao final da linha, indica que inicialmente a tabela no ter nenhuma linha.
ff Linhas 74 a 79: redefinem o mtodo isCellEditable da classe DefaultTableModel. O objetivo es-
tabelecer quais clulas da tabela sero editveis pelo usurio. No exemplo, foi definido que a colu-
na 3 (a coluna total, j que a numerao das colunas inicia a partir do zero) no ser editvel, isto
, o usurio no conseguir alterar seu valor. O ideal seria no permitir a alterao em nenhuma
coluna, mas assim o fizemos para servir de exemplo. Observe que o mtodo isCellEditable recebe
linha e coluna como argumento, tornando possvel controlar o acesso a todas as clulas da grade.
ff Linha 75: como o objetivo apenas travar a edio da coluna total, verificamos se o usurio est
tentando editar a coluna 3. Em caso positivo, retornado o valor false (linha 76); caso contrrio,
retornado true na linha 78.
ff Linha 81: cria o objeto table a partir das caractersticas definidas no objeto tableModel.
A Listagem 5 apresenta o ltimo trecho do mtodo inicializarComponentes.

184

ERJ_Java_8.indb 184 31/03/2015 16:41:35


Interfaces Grficas com Swing

Exemplo 8.18 A classe GuiPedido (Listagem 5: linhas 82 a 103)

Funcionalidades comentadas da Listagem 5 do Exemplo 8.18:


ff Linha 82: declara e cria o objeto alinhaDireita a partir da classe DefaultTableCellRenderer que
serve para estabelecer caractersticas de alinhamento para as clulas da tabela.
ff Linha 83: indica o alinhamento direita para o objeto alinhaDireita por meio do mtodo setHori-
zontalAlignment usando a constante RIGHT da classe SwingConstants.
ff Linhas 84, 86, 89 e 92: definem a largura de cada coluna da tabela por meio do mtodo setPre-
ferredWidth. Observe que a numerao das colunas se inicia em zero. A leitura da linha 84, da es-
querda para a direita, pode ser interpretada como: para o objeto table retorne todas as colunas
(getColumnModel), em seguida retorne a coluna produto (getColumn(0)) e defina como largura
preferencial (setPreferredWidth) o valor 150.
ff Linhas 85, 87, 90 e 93: definem que no ser permitido realizar o redimensionamento das colu-
nas por meio do mtodo setResizable.
ff Linhas 88, 91 e 94: indicam que o alinhamento das clulas das colunas 1 a 3 ser direita por
meio do mtodo setCellRenderer.
ff Linha 95: define que no ser permitido reorganizar as colunas da tabela (com o arrastar e soltar
do mouse) por meio do mtodo setReorderingAllowed. O default permitir a reorganizao.
ff Linha 96: define que as colunas da tabela no sero redimensionadas automaticamente caso
o tamanho dos caracteres exceda a largura da coluna. Isso realizado por meio do mtodo
setAutoResizeMode usando a constante AUTO_RESIZE_OFF da classe JTable. O default permi-
tir o redimensionamento.
ff Linha 97: define o objeto table como contedo do painel de rolagem scrollTable por meio do m-
todo setViewportView. Esse mtodo faz com que o painel de rolagem entre em sincronismo com
o objeto table e sempre seja atualizado quando o contedo deste for modificado.
ff Linha 98: adiciona o objeto scrollTable ao painel pnTable.
ff Linha 100: adiciona o painel pnTable ao painel principal pnPrincipal.
Com isso terminamos a insero dos componentes grficos da interface. O prximo passo especi-
ficar o cdigo do mtodo definirEventos. Veja a Listagem 6 do Exemplo 8.18.

185

ERJ_Java_8.indb 185 31/03/2015 16:41:36


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Funcionalidades comentadas da Listagem 6 do Exemplo 8.18:


ff Linhas 105 a 119: contm o controle do evento de ao para o boto btAdicionar. Esse trecho
ser executado sempre que o usurio inserir um item no pedido.
ff Linhas 107 e 108: verificam se as caixas de texto tfProduto, tfQuantidade e tfPrecoUnitario es-
to preenchidas com algum valor. Caso alguma delas no esteja preenchida, emitem um alerta
para o usurio e cancelam a incluso do item do pedido (linhas 109 e 110).
ff Linha 112: contm a declarao e criao do objeto dtm da classe DefaultTableModel a partir do
contedo atual do objeto table, ou seja, o dtm ser inicializado com o mesmo contedo da tabe-
la. Esse objeto permite inserir uma nova linha na tabela, isto , adicionar um novo item ao pedido.
ff Linhas 113 a 115: adicionam uma nova linha tabela por meio do mtodo addRow.
ff Linha 116: contm a chamada ao mtodo limparCampos. Esse mtodo ainda no foi criado, e ser
mostrado na prxima listagem. Seu objetivo limpar as caixas de texto referentes ao item do pe-
dido e colocar o foco (o cursor) na caixa de texto tfProduto. Dessa forma, toda vez que um item
for inserido na grade, as caixas de texto do item sero limpas, preparando a interface para uma
nova insero.
ff Linha 117: contm a chamada ao mtodo calcularTotal, que tambm no foi criado ainda. Ele ser
mostrado na prxima listagem. Seu objetivo calcular o total do pedido considerando o novo item
que est sendo adicionado.
ff Linhas 120 a 129: contm o controle do evento de ao para o boto btRemover. Esse trecho ser
executado quando o usurio remover um ou mais itens do pedido.
ff Linha 122: cria um array chamado linhas, que contm o ndice de todas as linhas selecionadas
atualmente do objeto table. Isso feito por meio do mtodo getSelectedRows da classe JTable.
ff Linha 123: o mesmo que a linha 112.
ff Linha 124: define um lao de repetio que percorrer todas as linhas do objeto table, isto , to-
das as linhas atuais presentes na grade.
ff Linha 125: remove todas as linhas da tabela cujo ndice esteja armazenado no array linhas.
ff Linha 127: o mesmo que a linha 117, ou seja, toda vez que um ou mais itens forem removidos, o
clculo do total deve ser refeito.
Exemplo 8.18 A classe GuiPedido (Listagem 6: linhas 104 a 130)

186

ERJ_Java_8.indb 186 31/03/2015 16:41:36


Interfaces Grficas com Swing

Com isso terminamos a implementao do mtodo definirEventos. A Listagem 7 a ltima do


Exemplo 8.18 e contm a implementao dos mtodos calcularTotal e limparCampos.
Exemplo 8.18 A classe GuiPedido (Listagem 7: linhas 131 a 149)

Funcionalidades comentadas da Listagem 7 do Exemplo 8.18:


ff Linhas 132 a 141: contm a implementao do mtodo calcularTotal, que realiza a soma dos valo-
res dos itens de pedido e mostra o resultado na caixa de texto tfTotal.
ff Linha 134: faz um lao de repetio da primeira at a ltima linha da tabela, isto , permite reali-
zar a leitura de todos os itens que aparecem na grade.
ff Linha 135: a cada iterao do lao, armazena o valor referente ao total do item na varivel va-
lor. Isso realizado por meio do mtodo getValueAt que retorna o contedo de uma clula da
tabela e para isso possui dois parmetros (linha, coluna), ou seja, ele recebe o nmero da linha e
o nmero da coluna cuja leitura do valor ele deve realizar. Nesse caso, a coluna sempre ser a 3
(referente ao valor total do item), no entanto a linha ser varivel em funo do item do pedido.
Dessa forma, a cada iterao do lao, uma nova clula lida (0,3), (1,3), (2,3) e assim sucessiva-
mente, dependendo da quantidade de itens do pedido.
ff Linha 136: o valor total do item que consta na clula da grade aparece formatado com um ponto
na casa do milhar e uma vrgula na parte decimal (exemplo: 1.234,56). Esse valor est armazena-
do como uma string e precisa ser convertido para ser possvel realizar a soma dos valores. O que
mostramos uma forma possvel para resolver esse problema. Em primeiro lugar vamos retirar
o ponto (.). Isso realizado por meio do mtodo replace substituindo o ponto por vazio, isto , o
ponto ser retirado. Considerando o exemplo, caso o contedo da varivel valor seja 1.234,56,
ento, ao executar a linha 136, o novo contedo ser 1234,56. Mesmo assim, o valor ainda no
pode ser convertido em nmero, j que a linguagem Java entende o ponto (.) como casa decimal. A
linha 137 resolve esse problema.
ff Linha 137: realiza a troca da vrgula pelo ponto (.) no contedo da varivel valor. Seguindo o
mesmo exemplo do item anterior, o novo contedo da varivel valor ser 1234.56. Com esse
formato, agora sim possvel realizar a converso de string em nmero.
ff Linha 138: acumula na varivel total o valor de todos os itens do pedido.
ff Linha 140: apresenta na caixa de texto tfTotal o valor total referente soma de todos os itens do
pedido, formatando-o de acordo com o objeto df (j estudado anteriormente).
ff Linhas 143 a 148: contm a implementao do mtodo limparCampos que limpa as caixas de tex-
to tfProduto (linha 144), tfPrecoUnitario (linha 146), guarda o valor 1 na caixa de texto tfQuan-
tidade (linha 145), considera que a quantidade 1 a mais comum e concede o foco caixa tfPro-
duto por meio do mtodo requestFocus.

187

ERJ_Java_8.indb 187 31/03/2015 16:41:37


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 8.25 Janela do Exemplo 8.18.

8.17 Incluso de mscaras


Numa aplicao real muito comum o uso de campos com mscaras previamente definidas. Alm de
facilitar a digitao, o uso de mscaras evita que o usurio digite caracteres indevidos, como, por exemplo,
digitar uma letra num local onde deveria ser digitado um nmero. Em resumo, o uso de mscaras facilita,
traz diversas vantagens, e seu uso deve ser incentivado, mesmo em aplicaes mais simples. Esta seo
apresenta algumas das mscaras mais comuns que podem ser encontradas na maioria das aplicaes.
Para que o contedo dos campos seja restrito a valores, nmero de caracteres e/ou formatos espe-
cficos, pode ser utilizada a classe MaskFormatter. Para criar uma mscara para digitao do cdigo de
endereamento postal (CEP), por exemplo, podemos utilizar a sintaxe:

MaskFormatter msCep = new MaskFormatter(##.###-###);

188

ERJ_Java_8.indb 188 31/03/2015 16:41:37


Interfaces Grficas com Swing

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:

JFormattedTextField tfCep = new JFormattedTextField(msCep);

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.

Tabela 8.21 Resumo dos mtodos da classe JFormattedTextField

Mtodo Funo

getValue() Retorna o ltimo valor vlido presente na mscara

setValue() Define o valor a ser formatado, de acordo com o padro atual de formatao

getFormatter() Retorna o AbstractFormatter que usado na formatao do valor atual

setFormatter() Define o AbstractFormatter atual

invalidEdit() Chamado quando o usurio insere um valor invlido

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

ERJ_Java_8.indb 189 31/03/2015 16:41:37


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 8.19 A classe GuiMascara

190

ERJ_Java_8.indb 190 31/03/2015 16:41:38


Interfaces Grficas com Swing

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.

Figura 8.26 Janela do Exemplo 8.19.

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.

Exerccios para prtica da linguagem Java

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.

Figura 8.27 Tela de execuo do Exerccio 8.1.

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.

Figura 8.28 Tela de execuo do Exerccio 8.2.

191

ERJ_Java_8.indb 191 31/03/2015 16:41:38


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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%.

Figura 8.29 Tela de execuo do Exerccio 8.3.

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.

Figura 8.30 Tela de execuo do Exerccio 8.4.

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.

Figura 8.31 Tela de execuo do Exerccio 8.5.

192

ERJ_Java_8.indb 192 31/03/2015 16:41:38


Interfaces Grficas com Swing

Material de apoio

Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.

Seu prximo passo

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

ERJ_Java_8.indb 193 31/03/2015 16:41:38


Captulo

9
Controle de Eventos

Objetivos deste captulo


99Enumerar algumas classes receptoras de evento.
99Demonstrar os principais eventos envolvidos na elaborao de uma aplicao.
99Fornecer conhecimentos para que o leitor possa desenvolver uma GUI mais aprimorada.
99Apresentar as relaes existentes entre as classes receptoras e seus mtodos para trata-
mento dos 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.

9.2 Classes receptoras de evento


Conforme apresentado no captulo anterior, quando uma janela precisa gerar certo evento,
necessrio implementar uma interface, que nada mais do que uma classe receptora de eventos.
Cada objeto (ou cada classe) pode implementar quantos receptores de evento forem necessrios.
Um boto, por exemplo, pode reconhecer quando o mouse clicado, quando solto, quando entra
na rea do boto, quando sai da rea do boto e assim por diante.
Cada classe receptora de eventos trata um evento diferente. A Tabela 9.1 apresenta alguns dos
principais eventos disponveis do pacote swing que so tratados neste captulo.

194

ERJ_Java_8.indb 194 31/03/2015 16:41:39


Controle de Eventos

Tabela 9.1 Algumas classes receptoras de evento do pacote swing

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.

9.3 Mtodos para manipulao de eventos


Para associar um evento a um objeto qualquer, necessrio utilizar um mtodo. Alguns dos mto-
dos mais comuns do pacote swing so apresentados na Tabela 9.2.
Tabela 9.2 Alguns mtodos para registro de componentes do pacote swing

Mtodo Alguns componentes grficos que podem us-lo

addActionListener() JButton, JCheckBox, JComboBox, JTextField e JRadioButton

addItemListener() JButton, JCheckBox, JComboBox, JRadioButton

addDocumentListener() JTexttField, JTextArea

addFocusListener() Todos os componentes do swing

195

ERJ_Java_8.indb 195 31/03/2015 16:41:39


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Mtodo Alguns componentes grficos que podem us-lo

addAdjustmentListener() JScrollBar

addMouseListener() Todos os componentes do swing

addMouseMotionListener() Todos os componentes do swing

addKeyListener() Todos os componentes do swing

addWindowListener() JWindow e JFrame

addComponentListener() Todos os componentes do swing

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

Interface/Evento Mtodos a serem declarados Disparados quando


ActionListener O mouse clicado no componente, ou quando
actionPerformed
ActionEvent pressionada a tecla Enter
AdjustmentListener
adjustmentValueChanged O valor de um componente alterado
AdjustmentEvent
componentHidden Um componente torna-se oculto
ComponentListener componentMoved Um componente movido
ComponentEvent componentResized Um componente redimensionado
componentShown Um componente se torna visvel
insertUpdate Uma insero realizada no componente
DocumentListener
removeUpdate Uma remoo realizada no componente
DocumentEvent
changedUpdate Um atributo do componente alterado
FocusListener focusGained Um componente recebe o foco
FocusEvent focusLost Um componente perde o foco
Uma tecla pressionada sobre um componente
keyPressed Uma tecla solta sobre um componente
KeyListener
keyReleased Uma tecla Unicode, isto , uma tecla que possui um cdigo
KeyEvent relacionado, pressionada sobre um componente. As teclas
keyTyped
SHIFT, ALT, CTRL, direcionais, Insert, Delete, teclas de
funo, entre outras, no executam esse mtodo
O boto do mouse pressionado sobre um componente
mousePressed
O boto do mouse pressionado e solto sobre um
mouseClicked
MouseListener componente
mouseEntered
MouseEvent O ponteiro do mouse entra na rea de um componente
mouseExited
O ponteiro do mouse sai da rea de um componente
mouseReleased
O mouse solto sobre um componente
O ponteiro do mouse se move sobre um componente
MouseMotionListener mouseMoved
Enquanto o ponteiro do mouse arrastado sobre o
MouseEvent mouseDragged
componente

(continua)

196

ERJ_Java_8.indb 196 31/03/2015 16:41:39


Controle de Eventos

(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.

Figura 9.1 A janela do Exemplo 9.1.

197

ERJ_Java_8.indb 197 31/03/2015 16:41:39


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 9.1 A janela do Exemplo 9.1 (Listagem 1: linhas 1 a 64)

198

ERJ_Java_8.indb 198 31/03/2015 16:41:40


Controle de Eventos

Exemplo 9.1 A janela do Exemplo 9.1 (Listagem 2: linhas 65 a 128)

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

ERJ_Java_8.indb 199 31/03/2015 16:41:42


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

ERJ_Java_8.indb 200 31/03/2015 16:41:42


Controle de Eventos

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.

Exerccios para prtica da linguagem Java

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.

Figura 9.2 Tela de execuo do Exerccio 9.1.

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.

Figura 9.3 Tela de execuo do Exerccio 9.2.

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.

Figura 9.4 Tela de execuo do Exerccio 9.3.

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.

Figura 9.5 Tela de execuo do Exerccio 9.4.

201

ERJ_Java_8.indb 201 31/03/2015 16:41:42


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 9.6 Tela de execuo do Exerccio 9.5.

Material de apoio

Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.

Seu prximo passo

Este captulo abordou os principais eventos relacionados ao desenvolvimento de aplicaes em Java.


Com os conhecimentos adquiridos nos Captulos 8 e 9 o leitor j capaz de construir a maioria das
aplicaes. O prximo captulo destaca a manipulao de data e hora, itens muito utilizados na maioria
das aplicaes.

202

ERJ_Java_8.indb 202 31/03/2015 16:41:42


Captulo

10
Manipulao de Data e Hora

Objetivos deste captulo


99Demonstrar os principais mtodos para o manuseio de data e hora.
99Fornecer subsdios para criar pginas que exibem mensagens de forma dinmica.
99Apresentar novas classes para manipulao de data e hora inseridas na verso 8 do Java.

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

ERJ_Java_8.indb 203 31/03/2015 16:41:43


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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:

Nome-da-classe <nome do objeto> = new Date();

As sees e os exemplos seguintes pretendem diferenciar as funcionalidades dessas classes.

10.1 Uso da classe Date


Para declarar e inicializar um objeto a partir da classe Date, a sintaxe pode ser:

Date <nome do objeto> = new Date();

Exemplo: Date data = new Date();

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

ERJ_Java_8.indb 204 31/03/2015 16:41:43


Manipulao de Data e Hora

Exemplo 10.1 Uso de getTime

As funcionalidades do Exemplo 10.1 so:


ff Linha 9: armazena o nmero de milissegundos equivalentes a um dia na constante de nome
MILI_SEGUNDOS_POR_DIA.
ff Linha 35: a varivel tempo recebe o nmero de milissegundos decorridos desde 1970 at
o momento em que o objeto agora foi criado por meio do mtodo getTime. Isso ocorre quando o
boto Mostrar for pressionado pelo usurio.
ff Linha 36: apresenta uma maneira de acrescentar dez dias a uma outra data j definida. Isso feito so-
mando a quantidade de milissegundos de uma data j criada e o nmero de milissegundos referente a
dez dias. No exemplo, o objeto novaData recebe o que j est armazenado no objeto agora (agora.
getTime()) + 10 dias (MILI_SEGUNDOS_POR_DIA * 10). A linha 41 mostra essa data em tela.
ff Linhas 37 a 41: realizam a impresso de diversos valores, como a quantidade de milissegundos, a
quantidade de dias, a quantidade de meses e de anos, todos esses valores decorridos desde 1970.
Observe que o clculo no preciso, pois nem todos os meses possuem 30 dias, assim como nem
todo ano possui 365 dias.
A Figura 10.1 apresenta os resultados obtidos com a execuo do Exemplo 10.1.

205

ERJ_Java_8.indb 205 31/03/2015 16:41:44


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 10.1 Execuo do Exemplo 10.1.

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.

A Tabela 10.2 mostra alguns mtodos da classe java.util.Date.


Tabela 10.2 Resumo dos mtodos da classe Date

Mtodo Funo Retorno


after(Date d) Verifica se a data posterior data presente em d boolean
before(Date d) Verifica se a data anterior data presente em d boolean
equals(Date d) Verifica se a data igual data presente em d boolean
getTime() Fornece o nmero de milissegundos decorridos desde 1 de janeiro de 1970, 00:00:00 long
setTime(long t) Define no objeto Date o nmero de milissegundos armazenados em t void
toString() Converte o objeto Date em tipo String String

10.2 Uso da classe DateFormat


A classe Date, estudada no item anterior, no fornece um mecanismo de controle sobre a forma-
tao de uma data e no permite converter uma string com informaes sobre uma data em um objeto
Date. Essas funes cabem classe DateFormat, que permite apresentar a data com diferentes for-
mataes, dependendo das necessidades de utilizao, tornando sua visualizao mais agradvel aos
usurios. Diferentes pases e usurios preferem visualizar a data com formatos diferentes. Um usurio
norte-americano pode preferir ver February 11, 2015, enquanto no Brasil as pessoas esto mais acos-
tumadas a 11 de fevereiro de 2015 ou 11/02/2015. Alm disso, DateFormat pode criar uma data a
partir de uma string fornecida.
Ao criar um objeto a partir da classe DateFormat, ele conter informao a respeito de um formato
particular no qual a data ser exibida.
Os prximos exemplos aproveitam a estrutura do Exemplo 10.1. Em todos eles voc deve alterar
apenas o cdigo referente ao boto btMostrar. A cada exemplo, talvez seja necessrio tambm acres-
centar algum import especfico classe utilizada. Observe a listagem do boto btMostrar referente ao
Exemplo 10.2.

206

ERJ_Java_8.indb 206 31/03/2015 16:41:44


Manipulao de Data e Hora

Exemplo 10.2 O uso do DateFormat

Reforando, adicione o import java.text.DateFormat ao Exemplo 10.1 e modifique o cdigo do


boto btMostrar de acordo com a listagem anterior. A seguir, salve a classe com um nome diferente
para manter a verso anterior.
Funcionalidades comentadas do Exemplo 10.2:
ff Linha 36: declara o objeto dateFormat do tipo DateFormat que ser usado para formatar a
data. Em seguida, define um formato por meio do mtodo getDateInstance. Ao invocar o mtodo
getDateInstance, deve ser passado um nmero inteiro que define o estilo de formatao. Para fa-
cilitar o trabalho do programador, a classe DateFormat fornece algumas constantes definidas com
nomes sugestivos, conforme indica o exemplo (SHORT, MEDIUM, LONG e FULL).
Nesse caso, utilizamos a constante MEDIUM da classe DateFormat que define o formato da
data dd/mm/yyyy, como, por exemplo, 11/02/2015. Voc pode testar as demais formata-
es: SHORT (exemplo: 11/02/15), LONG (exemplo: 11 de Fevereiro de 2015) e FULL (exemplo:
Quarta, 11 de Fevereiro de 2015).
ff Linha 38: formata o contedo do objeto agora por meio do mtodo format. A formatao aplica-
da depende da constante usada na criao do objeto do tipo DateFormat.
A Figura 10.2 mostra os resultados obtidos com a execuo do Exemplo 10.2.

Figura 10.2 Execuo do Exemplo 10.2.

A Tabela 10.3 apresenta alguns mtodos da classe DateFormat.


Tabela 10.3 Resumo dos mtodos da classe DateFormat

Mtodo Funo Retorno


format(Date d) Formata a data em uma string de acordo com o estilo utilizado String
getInstance() Retorna uma data e hora de acordo com o estilo SHORT DateFormat
getDateInstance() Retorna uma data de acordo com o estilo de formatao local DateFormat
getTimeInstance() Retorna um horrio de acordo com o estilo de formatao local Date
parse(String s) Converte a string s em tipo Date Date

10.3 Uso da classe SimpleDateFormat


A classe SimpleDateFormat permite criar formatos alternativos para a formatao de datas e ho-
ras, dependendo das necessidades do desenvolvedor, ou seja, essa classe possibilita expandir as capaci-
dades da classe DateFormat. Para que o prprio desenvolvedor crie seu formato de data/hora, ele deve
recorrer ao uso de um pattern.

207

ERJ_Java_8.indb 207 31/03/2015 16:41:44


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Caractere Descrio Formato Exemplos


G designador de era Text AD
y ano Year 2010
M ms do ano Month July; 07
w semana do ano Number 15
W semana do ms Number 3
D dia do ano Number 234
d dia do ms Number 5
F dia da semana no ms Number 2
E dia da semana Text Tuesday
a am/pm Text PM
H hora do dia (0-23) Number 0
k hora do dia (1-24) Number 23
K hora em am/pm (0-11) Number 2
h hora em am/pm (1-12) Number 5
m minuto da hora Number 10
s segundos do minuto Number 30
S milissegundos Number 978
z fuso horrio Text BRST

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

Funcionalidades comentadas do Exemplo 10.3:


ff Linha 38: declara a String formato com o pattern (modelo) a ser usado na formatao. Observe
o significado do par de caracteres usados: dd (dois dgitos para o dia), MM (dois dgitos para o
ms), yyyy (quatro dgitos para o ano), hh (hora), mm (minuto), ss (segundos). Voc pode testar

208

ERJ_Java_8.indb 208 31/03/2015 16:41:44


Manipulao de Data e Hora

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.

Figura 10.3 Execuo do Exemplo 10.3.

A Tabela 10.5 descreve alguns mtodos da classe SimpleDateFormat.


Tabela 10.5 Resumo dos mtodos da classe SimpleDateFormat

Mtodo Funo Retorno


applyPattern (String p) Aplica um pattern data, conforme definido na String p void
toPattern() Fornece o pattern que est sendo usado no formato da data String

10.4 Uso da classe Calendar


A classe Calendar oferece mecanismos adequados para a realizao de clculos com datas ou para
a identificao das propriedades de uma data, como, por exemplo, para identificar o dia da semana, o dia
do ms etc. Para isso, a classe Calendar converte um tipo Date armazenado nela em uma srie de cam-
pos. Ela possui mtodos para recuperar (get) ou armazenar (set) os valores correspondentes a datas e
horas, por meio de um argumento fornecido que identifica o campo a ser manipulado. Por exemplo, para
recuperar o nmero do ano, pode ser usada a sintaxe get(Calendar.YEAR). Nesse caso, a sintaxe define
que o campo a ser manipulado o ano (YEAR) da data.
Os principais campos usados pela classe Calendar so mostrados na Tabela 10.6. A coluna Campo
corresponde ao nome da propriedade usada por Calendar, e a coluna Descrio apresenta um breve
significado de cada campo.
Tabela 10.6 Campos usados na classe Calendar

Campo Descrio (em valores inteiros)


DAY_OF_MONTH Dia do ms (1 a 31)
DAY_OF_WEEK Dia da semana (0=domingo, 6=sbado)
Semana do ms (1 a 5) corrente. Diferente em relao a
DAY_OF_WEEK_IN_MONTH
WEEK_OF_MONTH porque considera apenas a semana cheia
DAY_OF_YEAR Dias decorridos no ano corrente
HOUR Hora do dia (manh ou tarde) (0 a 11)
HOUR_OF_DAY Hora do dia (0 a 23)
MILLISECOND Milissegundos em relao ao segundo corrente
MINUTE Minutos em relao hora corrente
MONTH Ms em relao ao ano corrente
(continua)

209

ERJ_Java_8.indb 209 31/03/2015 16:41:44


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

(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

Funcionalidades comentadas do Exemplo 10.4:


ff Linha 36: cria o objeto calendario a partir da classe Calendar e o inicializa com as configuraes
regionais da mquina do usurio.
ff Linha 37: atribui ao objeto calendario o contedo (data e hora) armazenado no objeto agora.
ff Linha 38: recupera o nmero do dia armazenado no objeto calendario (o mesmo que o objeto
agora) por meio do mtodo get(Calendar.DATE) e o atribui varivel dia.
ff Linha 39: recupera o nmero do ms armazenado no objeto calendario por meio do mtodo
get(Calendar.MONTH) e o atribui varivel mes.
ff Linha 40: recupera o nmero do ano armazenado no objeto calendrio por meio do mtodo
get(Calendar.YEAR) e o atribui varivel ano.

210

ERJ_Java_8.indb 210 31/03/2015 16:41:45


Manipulao de Data e Hora

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.

Figura 10.4 Tela de execuo do Exemplo 10.4.

As funcionalidades da classe Calendar permitem a criao de pginas que exibem informaes de


maneira dinmica, dependendo da combinao de certas condies de data e hora. O Exemplo 10.5
retorna uma mensagem diferente, dependendo do momento em que a classe executada. Imagine uma
pessoa acessando um determinado site da Internet. Quando a pgina abre, uma saudao mostrada
de acordo com o horrio em que foi acessada. Para testar, mantenha os imports da classe anterior e
apenas altere o evento do boto btMostrar que aparece na listagem do Exemplo 10.1.
Exemplo 10.5 Mensagens dinmicas

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

Mtodo Funo Retorno


Funo aritmtica para objetos Date que adiciona o valor inteiro ao campo
add(int field, int valor) void
(field) determinado
Verifica se o tempo (data e hora) do objeto x (pode ser
after(Object x) boolean
Calendar ou outro tipo) superior ao armazenado no objeto Calendar
(continua)

211

ERJ_Java_8.indb 211 31/03/2015 16:41:46


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

(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

10.5 Clculos com data


A classe Calendar, conforme citado, oferece mecanismos teis para a realizao de clculos com
datas ou para a identificao das propriedades de uma data, como, por exemplo, para identificar o dia da
semana, o dia do ms em relao ao ano etc. O clculo que envolve datas muito comum em aplicaes
comerciais. Exemplos:
1. Um cliente compra um produto e realiza seu pagamento em seis vezes, a partir de uma data qual-
quer, de 20 em 20 dias. Como descobrir qual a data decorrida aps 20 dias de uma data?
2. Voc quer descobrir quantos dias j viveu. Como possvel contar os dias, desde a data de seu
nascimento at hoje?
Exemplo 10.6 O uso da classe Calendar (clculos com data)

212

ERJ_Java_8.indb 212 31/03/2015 16:41:46


Manipulao de Data e Hora

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

ERJ_Java_8.indb 213 31/03/2015 16:41:46


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 10.5 Tela de execuo do Exemplo 10.6.

10.6 Novidades do Java 8


A verso 8 do Java trouxe diversas novidades na manipulao de data e hora. A Tabela 10.8 apre-
senta comentrios sobre as principais alteraes.
Tabela 10.8

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

ERJ_Java_8.indb 214 31/03/2015 16:41:46


Manipulao de Data e Hora

Exemplo 10.7 Data e hora com Java 8 parte 1

Figura 10.6 Sada do


Exemplo 10.7 parte 1.

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.

Exemplo 10.7 Data e hora com Java 8 parte 2

Figura 10.7 Sada do


Exemplo 10.7 parte 2.

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.

Exemplo 10.7 Data e hora com Java 8 parte 3

Figura 10.8 Sada do


Exemplo 10.7 parte 3.

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.

Exemplo 10.7 Data e hora com Java 8 parte 4

Figura 10.9 Tela de execuo


do Exemplo 10.7 parte 4.

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

ERJ_Java_8.indb 215 31/03/2015 16:41:47


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 10.7 Data e hora com Java 8 parte 5

Figura 10.10 Tela de execuo


do Exemplo 10.7 parte 5.
A sexta parte do Exemplo 10.7 (linhas 33 a 35) mostra como possvel calcular a diferena de
tempo entre dois instantes (do trecho anterior). Na linha 33 o objeto duracao recebe a diferena
de tempo entre os instantes inicio e fim. A linha 34 armazena essa durao em milissegundos, e a linha
35 apresenta essa diferena em tela. Observe o resultado na Figura 10.11.

Exemplo 10.7 Data e hora com Java 8 parte 6

Figura 10.11 Tela de execuo


do Exemplo 10.7 parte 6.
A stima e ltima parte do Exemplo 10.7 (linhas 36 a 41) mostra como possvel manipular datas
e horas considerando-se o fuso horrio. As linhas 36 e 37 criam os fusos de So Paulo e New York por
meio da classe ZoneId. As linhas 38 e 39 criam dois objetos contendo a data e hora desses dois fusos, e
as linhas 40 e 41 imprimem essas informaes em tela. Observe o resultado na Figura 10.12.

Exemplo 10.7 Data e hora com Java 8 parte 7

Figura 10.12 Sada do Exemplo 10.7 parte 7.

Exerccios para prtica da linguagem Java

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.

Figura 10.13 Tela de execuo do Exerccio 10.1.

2. Elabore uma classe que mostre na tela a diferena em horas entre dois fusos horrios quaisquer,
conforme exibido na Figura 10.14.

Figura 10.14 Tela de execuo do Exerccio 10.2.

216

ERJ_Java_8.indb 216 31/03/2015 16:41:48


Manipulao de Data e Hora

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.

Figura 10.15 Tela de execuo do Exerccio 10.3.

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.

Figura 10.16 Tela de execuo do Exerccio 10.4.

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.

Figura 10.17 Tela de execuo do Exerccio 10.5.

Material de apoio

Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo seguinte:
<http://editoraerica.com.br/>.

217

ERJ_Java_8.indb 217 31/03/2015 16:41:48


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Seu prximo passo

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

ERJ_Java_8.indb 218 31/03/2015 16:41:48


Captulo

11
Diretrios e Arquivos

Objetivos deste captulo


99Apresentar o funcionamento bsico da manipulao de diretrios.
99Demonstrar os passos necessrios para o armazenamento de arquivos no formato texto.
99Demonstrar a importncia do armazenamento e da recuperao de dados.
99Apresentar a utilizao da classe FileDialog.

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

ERJ_Java_8.indb 219 31/03/2015 16:41:48


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

11.2 Criao de diretrios


Esta seo apresenta a criao de diretrios por meio de exemplos prticos. Quando um sistema
manipula arquivos (imagens, sons, vdeos, pdf ou qualquer outro tipo de arquivo), ser necessrio ar-
mazenar esses arquivos em pastas no servidor. Dessa forma, antes de armazenar um arquivo, sua pasta
correspondente deve existir. Considere que um site da Internet chamado loja armazena arquivos em
diferentes pastas, conforme apresenta a Figura 11.1.

Figura 11.1 Simulao do diretrio de um site.

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

Funcionalidades comentadas do Exemplo 11.1:


ff Linha 5: cria uma varivel chamada dir do tipo File (arquivo) que recebe como parmetro a locali-
zao do diretrio que ser criado, nesse caso c:/loja.
ff Linhas 6 a 8: verificam se esse diretrio no existe (linha 7). Caso no exista, criado (linha 8) por
meio do mtodo mkdir (abreviao de make directory).
ff Linhas 9 a 24: utilizam a mesma sintaxe das linhas anteriores para criao dos demais diretrios,
sempre passando como parmetro o local e nome onde o diretrio ser criado.
ff Uma observao importante na criao de diretrios se refere permisso. Apesar de no es-
tarmos tratando disso em nosso exemplo, para criar um diretrio voc precisa ter permisso

220

ERJ_Java_8.indb 220 31/03/2015 16:41:49


Diretrios e Arquivos

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.

11.3 Consulta em diretrios


Um diretrio pode conter arquivos de diversos formatos ou outros subdiretrios. Em algumas apli-
caes torna-se necessrio conhecer quais arquivos residem num deteminado diretrio. No Exemplo
11.2, o usurio fornece um diretrio e todo o seu contedo listado em tela.
Exemplo 11.2 A classe ListaDiretorio

Funcionalidades comentadas do Exemplo 11.2:


ff Linha 6: cria uma varivel do tipo string chamada path que recebe o caminho do diretrio forneci-
do pelo usurio.
ff Linha 8: cria uma varivel chamada dir, do tipo File (arquivo) que armazena o caminho do diret-
rio a ser pesquisado (path).
ff Linha 9: verifica se o contedo existente no caminho fornecido um diretrio.
ff Linha 11: cria o array s a partir do retorno do mtodo list. Todos os nomes dos arquivos existentes
no diretrio sero armazenados no array (um em cada ndice).
ff Linhas 11 a 14: criam um lao de repetio que apresenta em tela o nome de todos os arquivos pre-
sentes no diretrio pesquisado e armazenados no array s.

11.4 Excluso de diretrios


Assim como uma aplicao precisa criar diretrio, s vezes torna-se necessrio realizar sua exclu-
so. A excluso de diretrios possui um problema adicional, pois seu contedo pode conter desde um
nico arquivo at uma rvore enorme de subdiretrios. J que a quantidade de arquivos e subdiretrios
pode variar bastante, como podemos resolver esse problema? Uma possvel soluo utilizar a recur-
sividade, isto , uma maneira de fazer com que o mtodo que exclui o arquivo seja chamado n vezes,
dependendo da quantidade de arquivos. O Exemplo 11.3 apresenta um possvel cdigo que implementa
a recursividade.

221

ERJ_Java_8.indb 221 31/03/2015 16:41:49


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 11.3 A classe ExcluiDiretorio

Funcionalidades comentadas do Exemplo 11.3:


ff Linha 5: cria uma varivel do tipo File chamada dir que armazena o endereo do diretrio. Em
nosso exemplo o diretrio c:/loja, mas poderia ser um diretrio fornecido pelo usurio. Muito
CUIDADO com a execuo desse exemplo em sua mquina, pois ele apaga uma pasta! Jamais tes-
te esse exemplo passando uma pasta importante presente em sua mquina, crie apenas diretrios
temporrios para teste.
ff Linhas 7 e 8: verificam se o contedo do caminho fornecido um diretrio. Em caso positivo, exe-
cuta a linha 8, que chama o mtodo excluirFilhos, passando o diretrio a ser excludo.
ff Linhas 20 a 34: antes de excluir uma pasta necessrio verificar se ela est vazia, isto , se possui
outros arquivos ou diretrios dentro dela. A linha 20 declara o mtodo excluirFilhos, recebendo
como parmetro um File, isto , o diretrio a ser excludo. A linha 22 armazena a relao de arqui-
vos presentes no diretrio a ser excludo, e a linha 23 inicia um for para percorr-lo, item por item.
Na linha 24 ocorre a chamada recursiva, ou seja, o mtodo excluirFilhos chama a si prprio nova-
mente. Dessa forma, as linhas 23 a 31 excluem todos os arquivos presentes no diretrio. J a linha
33 exclui o diretrio desejado, agora vazio.
ff Assim como na criao de diretrios, a excluso tambm s ser permitida se voc tiver permis-
so para isso. Caso exista algum arquivo (ou subdiretrio) armazenado nele, ser necessrio apa-
gar todos os arquivos e subdiretrios antes de realizar sua excluso. Alm disso, se voc tentar
excluir um diretrio que possui um arquivo aberto por outro processo, provavelmente no ser
possvel realizar sua excluso.

11.5 Leitura e gravao


Esta seo apresenta de forma prtica o armazenamento e a recuperao de um arquivo texto.
Existem diversas classes que podem ser usadas para realizar esse processo. A forma apresentada utiliza
a classe BufferedReader para a leitura do arquivo e a classe PrintWriter para a gravao.

222

ERJ_Java_8.indb 222 31/03/2015 16:41:50


Diretrios e Arquivos

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

Funcionalidades comentadas do Exemplo 11.4:


ff Linha 8: declara os atributos da classe pessoa, todos como pblicos. Para faciltiar nosso exemplo,
poderiam ser privados, mas seria necessrio criar os mtodos get e set para cada atributo, aumen-
tando o tamanho de nosso exemplo.
ff Linha 9: especifica o mtodo ler que recebe o caminho do arquivo a ser lido (por meio do par-
metro path) e retorna um objeto do tipo Pessoa. Internamente, o mtodo preenche um objeto e o
retorna na linha 17. Caso o arquivo no seja localizado, ser retornado null, isto , um objeto nulo,
sem contedo. Esse mtodo ser chamado pela classe CadastroComArquivoTexto quando o usu-
rio pressionar o boto Abrir.
ff Linhas 11 e 12: contm o cdigo necessrio para a abertura e leitura de um arquivo texto. Na li-
nha 11 o objeto br criado a partir da classe BufferedReader. O objeto tenta abrir o arquivo cujo
caminho foi solicitado ao usurio na linha 12. Caso haja sucesso na abertura do arquivo, o cursor
fica posicionado na primeira linha.
ff Linhas 13 a 15: so responsveis por ler o contedo do arquivo texto, linha a linha, por meio do
mtodo readLine, e armazen-lo nas caixas de texto correspondentes ao cdigo, nome e e-mail.
Cada vez que o mtodo readLine executado, uma linha do arquivo lida e o cursor posicionado
automaticamente na prxima linha.

223

ERJ_Java_8.indb 223 31/03/2015 16:41:51


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

ERJ_Java_8.indb 224 31/03/2015 16:41:51


Diretrios e Arquivos

Exemplo 11.5 A classe CadastroComArquivoTexto (Listagem 2 linhas 62 a 95)

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.

Figura 11.2 O Exemplo 11.5 executado.

225

ERJ_Java_8.indb 225 31/03/2015 16:41:52


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

ERJ_Java_8.indb 226 31/03/2015 16:41:52


Diretrios e Arquivos

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

ERJ_Java_8.indb 227 31/03/2015 16:41:53


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 11.6 A classe EditorDeTexto (Listagem 2 - linhas 53 a 101)

Figura 11.3 O Exemplo 11.6 executado.

228

ERJ_Java_8.indb 228 31/03/2015 16:41:54


Diretrios e Arquivos

Funcionalidades comentadas do Exemplo 11.6:


ff Linha 11: declara dois objetos (fdAbrir e fdSalvar) da classe FileDialog, usada na criao de caixas
de dilogo para manipulao de arquivos.
ff Linha 43: inicializa o objeto fdAbrir como uma caixa de dilogo com o ttulo Abrir arquivo para a
leitura de arquivos (FileDialog.LOAD).
ff Linha 44: inicializa o objeto fdSalvar como uma caixa de dilogo com o ttulo Salvar arquivo para
a gravao de arquivos (FileDialog.SAVE).
ff Linha 63: invoca a abertura da caixa de dilogo de gravao passando true ao mtodo setVisible.
ff Linhas 64 a 66: no momento de realizar a gravao do arquivo, aberta uma caixa de dilogo.
Para descobrir o arquivo escolhido pelo usurio, utilizado o mtodo getFile. Caso o usurio no
tenha escolhido nenhum arquivo ou se pressionou o boto Cancelar da caixa de dilogo, o m-
todo getFile retorna null, o que provoca o encerramento do mtodo actionPerformed por meio
de return e, consequentemente, a no gravao do arquivo. Caso contrrio, o caminho e o nome
do arquivo so armazenados na varivel nomeDoArquivo pelos mtodos getDirectory e getFile,
conforme a linha 67.
ff Linhas 68 a 70: contm o cdigo necessrio para a gravao do arquivo texto. Na linha 68 ini-
cializado out como um objeto da classe FileWriter, apontando para a varivel nomeDoArquivo
que contm o arquivo escolhido, ou digitado pelo usurio. Na linha 69 todo o contedo do objeto
taTexto armazenado no arquivo pelo mtodo write. Na linha 70 o arquivo fechado.
ff Linha 80: invoca a abertura da caixa de dilogo de leitura enviando true ao mtodo setVisible.
ff Linhas 81 a 83: idnticas s linhas 64 a 66, com exceo de que elas so executadas quando o usu-
rio pressionar o boto Abrir.
ff Linha 85: inicializa in como um objeto da classe FileReader apontando para a varivel nomeDoAr-
quivo que contm o arquivo escolhido ou digitado pelo usurio.
ff Linhas 87 a 91: realizam a leitura de todo o arquivo texto e o armazenam na varivel s. No proces-
so de leitura de um arquivo usando a classe FileReader, por meio do mtodo read, cada caractere
lido como um valor inteiro. Quando o final do arquivo for encontrado, retornado o valor -1. Na
linha 87 l-se o primeiro caractere do arquivo por meio do mtodo read. Na linha 88 verificado
se o ponteiro j se encontra no final do arquivo, ou seja, enquanto i for diferente de -1, o arquivo
lido caractere a caractere (linha 90). Na linha 89, cada caractere lido e convertido no tipo char,
sendo acumulado na String s. Dessa forma, realiza-se o processo de leitura do primeiro ao ltimo
caractere do arquivo texto escolhido.
ff Linha 92: o arquivo armazenado na varivel s copiado no TextArea taTexto.
Apesar de simples, os Exemplos 11.1 e 11.2 representam os aspectos mais importantes na mani-
pulao de arquivos texto e devem servir como incio de aprendizado dos operadores de fluxo. Existem
outros formatos de arquivo que podem ser manipulados em Java, mas no apresentados aqui.

Exerccios para prtica da linguagem Java

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

ERJ_Java_8.indb 229 31/03/2015 16:41:54


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 11.6 Tela de execuo do Exerccio 11.3.

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

ERJ_Java_8.indb 230 31/03/2015 16:41:55


Diretrios e Arquivos

Seu prximo passo

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

ERJ_Java_8.indb 231 31/03/2015 16:41:55


Captulo

12
Manipulao de Banco de Dados com Java

Objetivos deste captulo


99Demonstrar os fundamentos bsicos para a manipulao de banco de dados com Java.
99Apresentar as tcnicas para navegao em registros.
99Apresentar a sintaxe de comandos SQL usados em Java.
99Apresentar a utilizao da classe FileDialog.

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

ERJ_Java_8.indb 232 31/03/2015 16:41:55


Manipulao de Banco de Dados com Java

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.

12.2 A criao do banco de dados


Os procedimentos seguintes consideram as etapas bsicas para a criao do banco de dados por
meio do MySQL. Caso haja alguma dvida, consulte a Seo 1.3 do Apndice A.
1. Abra o MySQL a partir do boto Iniciar: Iniciar/Todos os Programas/MySQL/MySQL Command
Line Client. Fornea a senha do MySQL. No caso do Windows 8, no lugar de Todos os Programas
considere o item Aplicativos.
2. Crie um banco de dados com o nome banco: create database banco.
3. Crie uma tabela com o nome filmes usando a sintaxe em SQL seguinte: create table filmes (codigo
varchar(5) primary key, titulo varchar(35), genero varchar(8), produtora varchar(15), datacompra date).
Ao ser criada, a tabela deve ter a estrutura apresentada na Tabela 12.1.
Tabela 12.1 Tabela de filmes

Nome do campo Tipo de dados Tamanho


CODIGO (PK) Varchar 5
TITULO Varchar 35
GENERO Varchar 8
PRODUTORA Varchar 15
DATACOMPRA Date

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

ERJ_Java_8.indb 233 31/03/2015 16:41:55


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

12.3 A definio do driver para conexo


Para acessar um banco de dados por meio de Java, necessrio carregar um driver especfico do
banco de dados (o driver nada mais do que um pacote contendo classes em Java). Existem diferentes
verses para os drivers, ainda que considerando o mesmo fabricante. Na maioria dos casos, necessrio
baixar o driver de um site da Internet e adicionar o seu caminho varivel de ambiente CLASSPATH ou
copiar o driver mysql-conector-java-5.1.8-bin.jar (disponvel no site da Editora rica) na pasta ext de
seu diretrio Java: java\jre8\lib\ext. Para garantir que o pacote seja encontrado em tempo de desen-
volvimento, copie esse mesmo arquivo na pasta do jdk: jdk1.8.0_11\jre\ lib\ext. As principais IDEs de
desenvolvimento (Netbeans e Eclipse) j integram o driver de conexo ao MySQL em suas bibliotecas.
A seguir apresentado o cdigo a ser adicionado ao programa Java para o carregamento do driver,
considerando diversos tipos de bancos de dados, ou seja, dependendo do banco a ser acessado, neces-
srio carregar um driver diferente. Em Java, o driver carregado na memria por meio da sintaxe Class.
forName(pacote.nome-do-driver).
ff No Access

Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);

ff No MySQL

Class.forName(com.mysql.jdbc.Driver);

ff No Oracle

Class.forName(oracle.jdbc.driver.OracleDriver);

ff No Microsoft SQL Server 2000

Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);

ff No Microsoft SQL Server 2005/2008/2012

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);

12.4 A criao da aplicao em Java


Conforme citado anteriormente, para criar uma aplicao que realiza a manipulao de banco de
dados, necessrio incluir instrues no programa para carregar um driver de comunicao com o
banco de dados, nesse caso com o MySQL. Para facilitar a compreenso, a manipulao do banco de da-
dos ser executada em duas partes: a primeira vai realizar apenas a conexo com o banco e a segunda,
a manipulao do banco em si.

234

ERJ_Java_8.indb 234 31/03/2015 16:41:55


Manipulao de Banco de Dados com Java

12.4.1 A conexo com o banco de dados


Ao executar o programa do Exemplo 12.1, enviada uma mensagem indicando o sucesso ou no da
conexo ao banco de dados.
Exemplo 12.1 A classe Conecta.java

Funcionalidades comentadas do Exemplo 12.1:


ff Linha 2: importa as classes do pacote sql necessrias manipulao do banco de dados por meio
dos comandos SQL.
ff Linha 6: contm a declarao de uma String do tipo final, isto , uma constante chamada DRIVER
que contm o nome do driver que ser usado para a conexo ao banco de dados.
ff Linha 7: possui a declarao da constante URL contendo outros parmetros necessrios cone-
xo do banco de dados: jdbc:mysql (padro para o MySQL), o endereo em que o banco est lo-
calizado (localhost), a porta de comunicao do MySQL (3306) e o nome do banco de dados (no
caso, mysql, um banco exemplo da prpria instalao).
De forma geral, a estrutura de uma URL contm:
ff driver-da-oracle: trata-se do driver jdbc, responsvel por fazer a conexo ao banco de dados.
ff driver-de-terceiros: varia em funo do banco de dados a ser conectado. Pode ser odbc, mys-
ql, oracle, sqlserver, postgresql etc.
ff caminho-da-fonte-de-dados: trata-se do path em que a fonte de dados est localizada.
Quando o arquivo local, o endereo no obrigatrio. Normalmente o caminho inclui nome
de servidores, como, por exemplo, //localhost ou //servidor-da-empresa.
ff porta: logo aps o caminho pode ser definida uma porta de comunicao, como, por exemplo,
//localhost:3306/ ou //servidor-da-empresa:1433/.
ff Nome do banco de dados: no exemplo anterior o nome do banco de dados foi mysql.
ff Linha 9: carrega o driver que ser usado pela aplicao Java para realizar a comunicao com o
banco de dados, no caso declarado na linha 6. Observe que Class.forName est inserido em um
bloco try-catch. Caso o driver no possa ser carregado (provavelmente por no ter sido localizado
na mquina), ocorre a exceo ClassNotFoundException (linha 13), que envia uma mensagem de
alerta (linha 14).
ff Linha 10: estabelece uma conexo por meio do objeto connection usando a String URL defini-
da na linha 7. Essa linha tambm est inserida em um bloco try-catch. Caso a conexo no pos-
sa ser realizada por qualquer motivo, ocorre a exceo SQLException (linha 16), que envia uma

235

ERJ_Java_8.indb 235 31/03/2015 16:41:56


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

12.4.2 A consulta ao banco de dados por meio da linguagem SQL


Uma maneira possvel de acessar um banco de dados em Java por meio da linguagem SQL. Essa
uma forma simples de manipular dados usando a linguagem Java. Em aplicaes mais robustas comum
utilizar frameworks especficos que ocultam detalhes das operaes em banco de dados. Na poca em
que o livro foi escrito, um dos frameworks mais usados era o Hibernate (http://www.hibernate.org/),
cuja descrio ultrapassa os objetivos desta obra. Assim, dadas a simplicidade e a popularidade, ser
usada a linguagem SQL em diversos exemplos que envolvem o acesso a banco de dados.
O Exemplo 12.2 acrescenta cdigo ao exemplo anterior, 12.1, mantendo os cdigos para a conexo
ao banco de dados, demonstrando os procedimentos necessrios para realizar a consulta por meio de
comandos em SQL. O exemplo utiliza o banco de dados com a tabela de Filmes preenchida (de acordo
com o banco de dados localizado no site da Editora rica). O Exemplo 12.2 fornece como resultado uma
tela com a relao de filmes que possuem cdigo superior a 03120 e inferior a 03140, de acordo com
as instrues SQL. O exemplo parte do princpio de que o leitor possui algum conhecimento em SQL,
uma vez que seu estudo no objetivo deste livro, mas sim demonstrar como usar instrues em SQL
em uma aplicao Java.
As funcionalidades do Exemplo 12.2 so:
ff Linha 11: cria o script de comandos em SQL que ser usado na consulta ao banco de dados e o
armazena na String sql. Um ponto a observar o uso do caractere de interrogao (?), que ser
substitudo por parmetros durante a execuo da classe. A seguir vamos explicar melhor isso.
ff Linha 12: cria um objeto chamado statement a partir da interface PreparedStatement que possibili-
ta a execuo de um script SQL pela conexo realizada com o banco de dados, chamada connection.
ff Linhas 13 e 14: cada um dos parmetros usados no script em SQL deve ser passado ao obje-
to statement por meio de mtodos apropriados. Existem diversos mtodos que podem ser usa-
dos, dependendo do tipo de valor a ser enviado ao statement, por exemplo: setInt, setDouble,
setString etc. No caso, os dois parmetros so do tipo String, j que a tabela de Filmes possui o atri-
buto cdigo 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 13, usamos os parmetros 1 (referente pri-
meira interrogao da linha 11) e 03120 (referente ao contedo que ser colocado no lugar do ca-
ractere de interrogao). Na linha 14, usamos os parmetros 2 (referente segunda interrogao da
linha 11) e 03140 (referente ao contedo que ser colocado no lugar do caractere de interroga-
o). Voc ver que o caractere de interrogao ser muito usado em diversos exemplos, isto , sem-
pre que for necessrio passar um valor para um script em SQL. Assim, a instruo SQL definida nas
linhas 12 e 13 ser transformada em SELECT codigo, titulo FROM Filmes WHERE codigo > 03120
and codigo < 03140 ORDER BY codigo. As palavras destacadas em maisculas fazem parte da sin-
taxe em SQL, mas podem ser escritas em minsculas tambm, no h diferena.

236

ERJ_Java_8.indb 236 31/03/2015 16:41:56


Manipulao de Banco de Dados com Java

Exemplo 12.2 A classe ConsultaFilmes.java

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

ERJ_Java_8.indb 237 31/03/2015 16:41:56


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 12.1 Tela de execuo do Exemplo 12.2.

12.4.3 Criao de uma classe genrica para conexo ao banco


Apesar de os Exemplos 12.1 e 12.2 funcionarem corretamente, eles no utilizam as melhores pr-
ticas de programao. De acordo com os fundamentos da orientao a objetos, o ideal desenvolver
sistemas reaproveitando cdigos de programao. No caso, a melhor soluo desenvolver uma classe
genrica para conexo ao banco de dados. Dessa forma, sempre que uma classe necessitar de conexo
ao banco de dados, ela pode utilizar os servios dessa classe. A listagem a seguir apresenta uma classe
chamada BD.java.
Exemplo 12.3 BD.java (classe genrica para acesso a banco de dados)

238

ERJ_Java_8.indb 238 31/03/2015 16:41:57


Manipulao de Banco de Dados com Java

As funcionalidades da classe BD.java so:


ff Linha 4: contm a declarao do objeto pblico connection que pode ser utilizado por outras classes.
ff Linhas 5 a 9: contm todas as constantes j citadas anteriormente e que so usadas para realizar
a conexo com o banco de dados.
ff Linha 14: possui a definio de um mtodo getConnection, que realiza a conexo ao banco de da-
dos definido na linha 6 e retorna true caso a conexo seja realizada com sucesso, ou false caso a
conexo falhe.
ff Linhas 15 a 27: contm instrues j comentadas em exemplos anteriores.
ff Linha 28: contm a definio de um mtodo chamado close que realiza o encerramento do objeto
connection. Essa operao tambm pode gerar um erro, por isso deve ser inserida dentro da es-
trutura try-catch.
A classe BD.java ser usada em todos os exemplos seguintes deste captulo, portanto ela
deve estar no mesmo pacote do exemplo corrente, no caso o pacote cap12. No prximo exemplo
(ConsultaFilmesComBD) utilizamos a classe BD.java para fazer a conexo com o banco, simplificando o
cdigo do Exemplo 12.2.
Exemplo 12.4 ConsultaFilmesComBD

As funcionalidades da classe ConsultaFilmesComBD.java so:


ff Linha 5: declara e cria o objeto bd a partir da classe BD.
ff Linha 6: chama o mtodo getConnection para realizar a conexo ao banco de dados. Como j dis-
semos, 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 do programa prossiga a partir

239

ERJ_Java_8.indb 239 31/03/2015 16:41:58


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

12.4.4 Outros exemplos de instrues em SQL


Este item apresenta alguns exemplos de sintaxe de instrues SQL que podem ser usadas num pro-
grama desenvolvido em Java para consulta a banco de dados.
Para que o leitor possa praticar as instrues em SQL expostas, fornecido um exemplo
(Consulta SQL.java) que recebe o comando em um campo texto e demonstra o resultado da pes-
quisa numa grade criada a partir da classe JTable. A tela de execuo do exemplo ConsultaSQL
apresentada na Figura 12.2. O usurio digita uma instruo SQL na primeira caixa de texto e pres-
siona o boto Executar. Todas as instrues apresentadas apontam para a tabela de Filmes, a qual
possui muitos registros, servindo aos objetivos. O cdigo do exemplo ConsultaSQL apresentado
em seguida. No se esquea de que, para execut-lo, so necessrios a classe BD.java e o banco de
dados no formato MySQL disponvel no site da Editora.
Exemplo 12.5 ConsultaSQL (Listagem 1 linhas 1 a 43)

240

ERJ_Java_8.indb 240 31/03/2015 16:41:58


Manipulao de Banco de Dados com Java

Exemplo 12.5 ConsultaSQL (Listagem 2 linhas 44 a 90)

Figura 12.2 O exemplo ConsultaSQL em execuo.

241

ERJ_Java_8.indb 241 31/03/2015 16:41:59


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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).

12.5 Movimentao em registros e recuperao de contedo


Como j citado anteriormente, a interface PreparedStatement usada para enviar instrues
SQL para bancos de dados e o resultado armazenado e manipulado por meio de um objeto do tipo
ResultSet. Os dados ficam armazenados no ResultSet como se fossem uma tabela, permitindo nave-
gar pelas linhas, isto , realizar operaes como prximo, anterior, primeiro, ltimo etc. Isso ficar mais
claro no prximo exemplo.
Considere a seguinte declarao:

ResultSet rs = statement.executeQuery();

242

ERJ_Java_8.indb 242 31/03/2015 16:41:59


Manipulao de Banco de Dados com Java

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.

12.5.1 Criao de uma aplicao para navegao em registros


Este item apresenta uma aplicao que implementa as definies discutidas nos pargrafos ante-
riores. O Exemplo 12.3 manipula toda a tabela de Filmes do banco de dados Banco, criando um am-
biente grfico para o usurio (GUI) em que existem os tradicionais botes de navegao, que movimen-
tam os registros para a frente, para trs, para o primeiro e para o ltimo. Alm desses, tambm so
inseridos um boto para pular dez registros adiante e outro para voltar dez registros, conforme apre-
senta a Figura 12.3.

Figura 12.3 O Exemplo 12.6 em execuo.

O cdigo do Exemplo 12.6 mostrado em seguida. No se esquea de que necessrio utilizar a


classe BD.java.

243

ERJ_Java_8.indb 243 31/03/2015 16:42:00


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 12.6 A classe NavegaFilmes.java (Listagem 1 linhas 1 a 22)

Exemplo 12.6 A classe NavegaFilmes.java (Listagem 2 linhas 23 a 76)

244

ERJ_Java_8.indb 244 31/03/2015 16:42:01


Manipulao de Banco de Dados com Java

Exemplo 12.6 A classe NavegaFilmes.java (Listagem 3 linhas 77 a 147)

245

ERJ_Java_8.indb 245 31/03/2015 16:42:02


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 12.6 A classe NavegaFilmes.java (Listagem 4 linhas 148 a 173)

Funcionalidades comentadas do Exemplo 12.6:


ff Linha 70: tenta fazer a conexo ao banco de dados por meio do mtodo getConnection. Se no for
possvel realizar a conexo, o programa ser encerrado pela linha 72.
ff Linha 74: invoca o mtodo carregarTabela que carrega todos os registros da tabela de Filmes no
objeto resultSet.
ff Linha 75: invoca o mtodo atualizarCampos que invocado em vrios pontos do cdigo. Sua fun-
o atualizar as caixas de texto da interface grfica a partir da posio do objeto resultSet.
ff Linhas 77 a 86: definem o evento para o boto btProximo. Quando o usurio pressionar esse
boto, aparecer nas caixas de texto da interface o contedo do prximo registro. Para executar
essa ao usado o mtodo next (linha 81) do objeto resultSet.
ff Linhas 87 a 95: definem o evento para o boto btAnterior. Quando o usurio pression-lo, apa-
recer nas caixas de texto da interface o contedo do registro anterior. Para executar essa ao
usado o mtodo previous (linha 90) do objeto resultSet.
ff Linhas 96 a 104: indicam o evento para o boto btPrimeiro. Quando o usurio pressionar esse
boto, aparecer nas caixas de texto da interface o contedo do primeiro registro da tabela. Para
executar essa ao usado o mtodo first (linha 99) do objeto resultSet.
ff Linhas 105 a 113: especificam o evento para o boto btUltimo. Quando o usurio pression-lo,
aparecer nas caixas de texto da interface o contedo do ltimo registro da tabela. Para executar
essa ao usado o mtodo last (linha 108) do objeto resultSet.
ff Linhas 114 a 122: definem o evento para o boto btMais10. Quando o usurio pressionar esse
boto, aparecer nas caixas de texto da interface o contedo do dcimo registro posterior ao re-
gistro corrente. Para executar essa ao usado o mtodo relative (linha 117) com o contedo 10.
Isso faz com que o ponteiro do resultSet se movimente dez registros frente.
ff Linhas 123 a 135: indicam o evento para o boto btMenos10. Quando o usurio pression-lo, apa-
recer nas caixas de texto da interface o contedo do dcimo registro anterior ao registro corren-
te. Para executar essa ao usado o mtodo relative (linha 127) com o contedo -10. Isso faz com
que o ponteiro do resultSet se movimente dez registros para trs. A linha 126 verifica se a posio
atual do cursor maior que 10. Isso necessrio para evitar que o valor do ponteiro seja < 0 e haja

246

ERJ_Java_8.indb 246 31/03/2015 16:42:02


Manipulao de Banco de Dados com Java

problemas de apresentao em tela do contedo do registro; se o ponteiro for posicionado antes


da posio 0 (-8, por exemplo), o contedo das caixas de texto ficar em branco. Para compreender
melhor, comente a linha 126 e execute a classe. A seguir pressione o boto Prximo duas vezes e de-
pois o boto Menos10. Observe que o contedo das caixas de texto fica em branco. Para evitar esse
problema, a linha 129 fora o posicionamento do ponteiro no primeiro registro.
ff Linhas 136 a 146: definem o evento para o boto btSair e realizam o fechamento dos objetos usa-
dos na manipulao do banco de dados.
ff Linhas 148 a 156: carregam o objeto resultSet com todos os registros existentes na tabela de
Filmes por meio do script select * from filmes (linha 149). Aps a execuo da linha 150 o objeto
resultSet contm todos os registros da tabela de Filmes.
ff Linhas 157 a 172: contm as declaraes do mtodo atualizarCampos, responsvel por copiar o
contedo armazenado no registro do objeto resultSet para as caixas de texto do formulrio. A li-
nha 159 usada para realizar o reposicionamento do ponteiro, caso ele ultrapasse o ltimo regis-
tro (isAfterLast). Isso ocorre, por exemplo, quando o usurio est visualizando o ltimo registro
da tabela e pressiona o boto btProximo. Como no existe prximo aps o ltimo registro, o pon-
teiro fica posicionado aps a ltima linha da tabela. Se isso ocorrer, o usurio no ver nenhum
contedo nas caixas de texto, j que no existe o que ser exibido. Por esse motivo, quando o pon-
teiro se posicionar aps a ltima linha, necessrio fazer com que ele retorne para a ltima linha,
conforme definido na linha 160 (mtodo last). O mesmo processo, porm para o primeiro registro,
controlado pelas linhas 162 (isBeforeFirst) e 163 (mtodo first). As linhas 165 a 169 copiam o
contedo do registro do objeto resultSet para as caixas de texto.

12.6 A criao de uma aplicao de cadastro


A primeira coisa que todos desejam (e necessitam) criar uma aplicao de cadastro. A seguir apre-
sentamos um exemplo mais bem elaborado, seguindo o paradigma da orientao a objetos. Trata-se de
um cadastro de filmes que utiliza trs classes (mais a classe BD). Observe na Figura 12.4 o diagrama
de classes correspondente ao exemplo.
Pelo diagrama de classes da Figura 12.4 podemos observar que a classe GuiCadastroFilmes (nossa
tela que contm o mtodo main, isto , nossa aplicao) utiliza a classe FilmesDAO, que, por sua vez,
utiliza as outras duas classes (Filmes e BD). Vamos descrever resumidamente a funo de cada classe.
ff BD: j usada em diversos exemplos anteriores e responsvel pela conexo ao banco de dados.
ff Filmes: contm os atributos escolhidos para a tabela de Filmes, os quais so os mesmos presentes
na tabela de Filmes. Todos os atributos so privados e por isso necessitam dos mtodos get/set
que no aparecem na figura.
ff FilmesDAO: possui diversos atributos e dois mtodos. O mtodo localizar responsvel por
pesquisar um filme no banco de dados a partir do cdigo. J o mtodo atualizar realiza opera-
es de incluso, alterao ou excluso na tabela de Filmes.
ff GuiCadastroFilmes: trata-se do frame usado para realizar a interao com o usurio, isto ,
trata-se da tela que o usurio utilizar para realizar todas as operaes pertinentes ao cadastro.
Lembre-se de que apenas essa classe executvel.
Maiores detalhes sero fornecidos juntamente com a listagem do cdigo de cada classe. Esse
exemplo abrange as principais funes exigidas em uma aplicao comercial, contemplando insero,
excluso, atualizao e localizao de registros na tabela. A aplicao do Exemplo 12.7 pode ser visua-
lizada na Figura 12.5. Ela funciona da seguinte maneira:

247

ERJ_Java_8.indb 247 31/03/2015 16:42:02


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Figura 12.4 Classes usadas no Exemplo 12.7.

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

ERJ_Java_8.indb 248 31/03/2015 16:42:02


Manipulao de Banco de Dados com Java

ff Para encerrar a aplicao, o usurio pressiona o boto Sair.

Figura 12.5 Execuo da classe GuiCadastroFilmes do Exemplo 12.7.

A seguir apresentada a listagem da classe Filmes do Exemplo 12.7.


Exemplo 12.7 A classe Filmes.java

Funcionalidades comentadas da classe Filmes do Exemplo 12.7:


ff A classe Filmes contm apenas os atributos correspondentes s colunas da tabela de Filmes do
banco de dados e os mtodos get e set para acessar e definir o valor desses atributos.
ff Linha 3: so criados os atributos da classe Filme. Todos os atributos foram definidos com visibili-
dade privada, exigindo a presena dos mtodos get e set para manipulao do contedo a partir
de outras classes.
ff Linhas 4, 10, 16, 22 e 28: indicam os mtodos get para ler o valor de cada atributo.
ff Linhas 7, 13,19, 25 e 31: definem os mtodos set para armazenar o valor de cada atributo.

249

ERJ_Java_8.indb 249 31/03/2015 16:42:03


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 12.7 A classe FilmesDAO.java

250

ERJ_Java_8.indb 250 31/03/2015 16:42:04


Manipulao de Banco de Dados com Java

Funcionalidades comentadas da classe FilmesDAO do Exemplo 12.7:


ff Essa classe possui dois mtodos, um para localizar um filme a partir de seu cdigo e outro para
executar instrues de manuteno na tabela, isto , operaes de incluso, alterao e excluso.
ff Linha 4: declara um objeto chamado filme que ser criado a partir da classe Filmes, isto , a
classe FilmesDAO utilizar a os servios oferecidos pela classe Filme.
ff Linha 5: similar linha anterior, considerando o objeto bd.
ff Linhas 9 a 11: declaram diversas constantes estticas que permitem identificar a operao a ser
realizada pelo mtodo atualizar. Por exemplo, se receber o parmetro de nmero 1, significa que
ser realizada a operao de incluso e assim respectivamente.
ff Linha 17: declara o mtodo localizar responsvel por procurar um determinado filme a partir do
cdigo. Esse mtodo retorna um tipo booleano para informar se o filme foi encontrado (true) ou
no (false).
ff Linha 18: define as instrues em SQL a serem executadas. O cdigo do filme a ser localizado
inserido no lugar do caractere de interrogao (linha 21).
ff Linhas 22 a 28: executa a busca pelo filme. Caso ele seja encontrado, o objeto resultSet contm uma
linha (um registro) e o mtodo next (linha 23) posiciona o ponteiro no primeiro (e nico) registro. As
linhas 24 a 28 transferem o contedo do filme localizado para o objeto filme e a linha 29 retorna
true, informando que o filme foi encontrado. Caso o filme no seja encontrado, o trecho a partir da
linha 24 gera um erro que faz com que a execuo passe para a linha 30 e, consequentemente, exe-
cuta a linha 31 retornando false, ou seja, indicando que o filme no foi localizado.
ff Linha 34: declara o mtodo atualizar, responsvel por executar uma instruo SQL de ao
(incluso, alterao e excluso).
ff Linhas 37 a 44: operao de incluso. Recebem o comando SQL da linha 38 responsvel por cap-
turar os valores presentes no objeto filmes e o inserem na tabela Filme.
ff Linhas 45 a 53: operao de alterao. Recebem o comando SQL da linha 46 responsvel por alte-
rar um registro j existente na tabela, cujo contedo est armazenado no objeto filmes.
ff Linhas 54 a 58: operao de excluso. Por meio do comando SQL da linha 55 realizam a excluso
do registro da tabela filmes cujo cdigo est armazenado no objeto filmes.
ff Linha 59: efetiva fisicamente no banco de dados a operao selecionada pelo usurio.
Independentemente da operao escolhida (incluso, alterao ou excluso), essa linha ser exe-
cutada com a instruo sql correspondente operao.

251

ERJ_Java_8.indb 251 31/03/2015 16:42:04


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 12.7 A classe GuiCadastroFilmes.java (Listagem 1 linhas 1 a 72)

252

ERJ_Java_8.indb 252 31/03/2015 16:42:05


Manipulao de Banco de Dados com Java

Exemplo 12.7 A classe GuiCadastroFilmes.java (Listagem 2 linhas 73 a 126)

253

ERJ_Java_8.indb 253 31/03/2015 16:42:06


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 12.7 A classe GuiCadastroFilmes.java (Listagem 3 linhas 127 a 186)

Funcionalidades comentadas da classe GuiCadastroFilmes do Exemplo 12.7:


ff Linha 9: observe que GuiCadastroFilmes utiliza a classe FilmesDAO explicada anteriormente.
ff Linha 67: cria o objeto filmes a partir da classe FilmesDAO que ser usado em muitos pontos da
classe.
ff Linha 68: tenta realizar a conexo com o banco de dados e, caso no seja possvel, encerra a apli-
cao na linha 70.
ff Linhas 73 a 125: definem todos os eventos da interface com o usurio.

254

ERJ_Java_8.indb 254 31/03/2015 16:42:07


Manipulao de Banco de Dados com Java

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.

Exerccios para prtica da linguagem Java

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

ERJ_Java_8.indb 255 31/03/2015 16:42:07


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 12.6 Tela de execuo do Exerccio 12.1.

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.

Figura 12.7 Grade com a tabela de Usurios.

Material de apoio

Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.

Seu prximo passo

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

ERJ_Java_8.indb 256 31/03/2015 16:42:08


Captulo

13
JSP - Java Server Pages

Objetivos deste captulo


99Fornecer uma viso geral sobre a linguagem JSP e sua relao com pginas em HTML.
99Introduzir a utilizao do servidor Apache Tomcat.
99Mostrar alguns exemplos prticos de aplicaes cliente/servidor para a Internet.
99Demonstrar o que deve ser feito para duas aplicaes conversarem entre si.

13.1 Introduo ao JSP


Poderamos descrever diversos detalhes e conceitos sobre JSP (Java Server Pages), mas va-
mos focar apenas no essencial. Por meio dessa linguagem possvel gerar contedo dinmico em
pginas da Internet. A sintaxe do JSP a mesma da linguagem Java, portanto, o cdigo que voc
aprendeu ao longo do livro pode ser usado. No entanto, o cdigo do JSP inserido numa pgina
Web, podendo ser adicionado a uma pgina em HTML (HyperText Markup Language). Portanto, JSP
Java, mas executado num servidor e visualizado por meio de um software navegador. Existem
diversos servidores que suportam o JSP, dentre os quais se destacam: Tomcat, GlassFish, JBoos,
entre outros. Dessa forma, o JSP necessita de um servidor para funcionar. A Seo 13.2 apresenta
a instalao do Tomcat.
Uma pgina JSP possui extenso .jsp e consiste em uma pgina com codificao HTML e Java,
inserida entre as tags <% e %>, denominada scriptlets. A sequncia de execuo de uma pgina em
JSP a seguinte: quando um usurio acessa uma pgina em JSP na Internet, o servidor interpreta a
pgina e gera uma pgina em HTML, retornando o resultado de sua solicitao do cliente. A pgina
interpretada pelo servidor em tempo real, compilando o contedo JSP em bytecodes.
A estrutura de um documento JSP dividida em partes: cabealho (tipicamente configuraes
e imports), declaraes (mtodos, atributos etc.) e corpo (o contedo que ser transformado em
HTML). Um documento em JSP pode combinar diversos elementos e tecnologias associadas. Alm
do HTML, uma pgina em JSP pode incluir contedo em CSS (Cascating Style Sheets), Javascript,
classes em Java (tipicamente chamados de javabeans), cdigo Java puro, XML e quaisquer outros
elementos includos em pginas HTML.

257

ERJ_Java_8.indb 257 31/03/2015 16:42:08


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 13.1 Execuo do Exemplo 13.1.

13.2 Instalao do Tomcat


Existem duas formas de utilizar o Tomcat: integrado a uma ferramenta de desenvolvimento ou
como um processo separado rodando no sistema operacional. Se voc estiver usando o Eclipse, o

258

ERJ_Java_8.indb 258 31/03/2015 16:42:09


JSP - Java Server Pages

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.

13.2.1 O Tomcat como um processo independente


Os passos seguintes descrevem como instalar o Tomcat de maneira independente. Isso interes-
sante quando voc j tem projetos prontos e deseja realizar sua execuo sem utilizar uma ferramenta
de desenvolvimento. Esse processo tambm necessrio se voc quiser integrar o Tomcat ao NetBeans.
Quando este livro foi escrito, o Apache Tomcat estava na verso 8.0.15 e encontrava-se disponvel
no endereo http://Tomcat.apache.org/download-80.cgi. A Figura 13.2 ilustra as opes de download
disponveis. No caso, foi utilizada a opo destacada: Windows Service Installer.

Figura 13.2 Opes de download do Tomcat.

Ao fazer o download dessa opo, carregado o arquivo apache-Tomcat-8.0.15.exe. D um duplo


clique nesse arquivo para iniciar o processo de instalao e aceite as configuraes default em todas
as telas apresentadas. O Tomcat instalado no diretrio C:\Arquivos de programas\Apache Software
Foundation\Tomcat 8.0, o qual conhecido como CATALINA_HOME.
Para que uma Servlet seja executada, necessrio que o Tomcat seja inicializado. Se voc instalou o
Tomcat com todas as opes default, isso j deve ter ocorrido; caso contrrio, para inicializar o Tomcat,
faa o seguinte:
ff Acesse o menu Iniciar do Windows.
ff Clique no item Todos os programas.
ff Clique no item Apache Tomcat 8.0.
ff Clique no item Monitor Tomcat. No Windows 7 talvez seja necessrio clicar com o boto direito
do mouse e clicar na opo Executar como administrador. No Windows 8, clique em Aplicativos
e no item Apache Tomcat 8.0.
Surge o cone do Tomcat na barra de status do Windows, localizada no canto inferior direito da tela.
O cone mostra que o Tomcat est em execuo. Caso seja necessrio, pressione o boto direito sobre o
cone e escolha Start service para inicializar o Tomcat. Surge uma janela com o ttulo Apache Commons
Daemon Service Manager, que apresenta o processo de inicializao do servidor. Quando a janela fechar,
o Tomcat estar pronto para ser usado. Observe que o cone muda de estilo, agora com um tringulo
verde representando o Tomcat em execuo. Lembramos que, dependendo do SO que voc estiver uti-
lizando, essas etapas podem variar.
Uma vez que o Apache Tomcat esteja inicializado, abra uma janela do browser e digite o endereo
http://localhost:8080. Deve aparecer a janela de abertura do Tomcat. Se isso no ocorrer, o proces-
so de inicializao deve ter falhado. Tente inicializar o Tomcat novamente. Outra forma de acessar o
servidor por meio do endereo http://127.0.0.1:8080. Esses dois endereos citados se referem ao

259

ERJ_Java_8.indb 259 31/03/2015 16:42:09


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

13.2.2 Integrando o Tomcat ao NetBeans


Agora que voc j possui o Tomcat instalado na mquina, vamos realizar sua integrao ao
NetBeans. Siga estes passos:
1. Com o NetBeans aberto, clique no menu janela e selecione o submenu servios (Ctrl +F5).
2. Clique com o boto direito do mouse emservidores, em seguida adicione servidor... Abrir uma
Janela para adicionar umainstncia de servidor.
3. Em servidor, selecione: Apache Tomcat.
4. Em nome do servidor, digite: Apache-Tomcat-8 e clique no botoprximo>.
5. Em detalhes da Instalao e do Logon deve ser definido o diretrio do servidor e da base do
CATALINA (opcional) onde seu Apache Tomcat 8est instalado. Siga estes passos:
a. Localizao do Servidor: copie e cole o diretrio onde o Apache Tomcat est instalado, no nos-
so caso: C:\Arquivos de programas\Apache Software Foundation\apache-Tomcat-8.0.15\
b. ConfiguraodaBase do CATALINA: idem anterior.
c. Insira as credenciais de usurio do Apache Tomcat: Nome de usurio (qualquer um) e Senha
(qualquer senha), e marque o checkbox criar usurio caso no exista.
d. Clique no boto Finalizar.
6. Com isso, o ApacheTomcat vai aparecer instalado na Aba Servios do NetBeans.

13.3 Exemplos com JSP


Antes de criarmos exemplos em JSP, vamos criar um projeto. Caso esteja usando o Eclipse, consulte
o Apndice B para criar um novo projeto e salte para a Seo 13.3.1.
Caso esteja usando o NetBeans, faa o seguinte:
ff Com o NetBeans aberto, clique no menu Arquivo e em Novo Projeto...
ff No painel Categorias, escolha Java Web e em Projetos selecione Aplicao Web. Clique no boto
Prximo. Esses passos podem ser vistos na Figura 13.3.

Figura 13.3 Criao de Projeto web na IDE NetBeans.

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

ERJ_Java_8.indb 260 31/03/2015 16:42:09


JSP - Java Server Pages

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.

Figura 13.4 Criao de Projeto web na IDE NetBeans.

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.

Vamos fornecer uma viso geral do conjunto de pastas e ar-


quivos criados para que o leitor possa entender o papel de cada
elemento:
ff A pasta java8 se refere ao caminho principal para acesso ao
site que estamos desenvolvendo. Ela contm toda a estrutu-
ra de nosso site e todos os arquivos necessrios ao funciona-
mento da aplicao. Trata-se, portanto, da pasta do projeto.
ff A pasta Pginas Web abriga todos os arquivos de cdigo-
-fonte (.html e .jsp), alm de duas pastas adicionais: META-INF
e WEB-INF.
ff Na pasta Pacote de Cdigos-fonte so armazenados os
Figura 13.5 Estrutura do
cdigos-fonte das classes em Java (.java). Posteriormente ar-
Projeto Web na IDE NetBeans.
mazenaremos classes nessa pasta.
ff A pasta Bibliotecas contm pacotes (.jar) usados pelo projeto. No caso esto aparecendo os pa-
cotes do JDK e do servidor Tomcat. Outros pacotes externos podem ser adicionados nessa pasta.
ff A pasta Arquivos de Configurao mostra o arquivo MANIFEST, responsvel por armazenar as confi-
guraes gerais de execuo da aplicao, entre outros arquivos XML tambm para configurao.
ff Outros detalhes da estrutura do projeto so apresentados mais frente.

13.3.1 Exemplos de aplicaes JSP


Agora que seu ambiente de desenvolvimento j est devidamente configurado, vamos elaborar al-
guns exemplos. O Exemplo 13.2 apresenta um lao de repetio que controla o valor numrico aplicado
tag H (H1, H2, ...,H6). Utilizando sua ferramenta de desenvolvimento, adicione a pgina do Exemplo 13.2
ao projeto. No NetBeans os arquivos JSP devem ser armazenados na pasta Paginas Web, e no Eclipse,
na pasta WebContent. Para criar um arquivo JSP pelo NetBeans, clique com o boto direito do mouse
sobre o projeto - Novo - JSP. Surgir uma tela para inserir o nome do arquivo, digite o nome e clique em
Finalizar. A pgina jsp ser criada na pasta Paginas Web (veja Figura 13.6). Para criar um arquivo JSP
pelo Eclipse, no menu project Explorer, clique com o boto direito do mouse sobre o projeto New
JSP File, surgir uma tela. Em File Name insira o nome do arquivo e clique em Finish. A pgina JSP ser
criada na pasta WebContent (veja Figura 13.7).

261

ERJ_Java_8.indb 261 31/03/2015 16:42:09


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 13.6 Criao de pgina JSP no NetBeans.

Figura 13.7 Criao de pgina JSP no Eclipse.

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

Funcionalidades comentadas do Exemplo 13.2:

262

ERJ_Java_8.indb 262 31/03/2015 16:42:10


JSP - Java Server Pages

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.

Figura 13.8 Execuo do Exemplo 13.2.

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

Funcionalidades comentadas do Exemplo 13.3:


ff Linhas 1 e 2: realizam o import das classes SimpleDateFormat e Date, utilizadas no projeto.
ff Linha 12: realizando a interpretao da linha da direita para a esquerda, temos: criada uma ins-
tncia da data atual presente no servidor, formatado com a mscara dd que convertida para
inteiro e armazenada na varivel dia. O mesmo ocorre com as linhas 13 e 14 para o ms e ano.
ff Linhas 18 a 20: mostram na tela os valores atribudos a cada varivel. Observe como a JSP pode
ser inserida no documento HTML e como possvel resgatar o valor de uma varivel por meio do
sinal de igual (=).

263

ERJ_Java_8.indb 263 31/03/2015 16:42:11


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

A Figura 13.9 apresenta o resultado da execuo do Exemplo 13.3.

Figura 13.9 Execuo do Exemplo 13.3.

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

Funcionalidades comentadas do Exemplo 13.4:


ff Linha 11: cria uma instncia de Calendar chamada calendar contendo a data e hora atuais do servidor.
ff Linha 12: pega a hora atual armazenada em calendar em formato inteiro.
ff Linhas 14 a 24: analisam o valor atribudo varivel horaAtual e armazenam um valor diferente
na varivel men, dependendo do valor da hora do dia. Dessa forma, dependendo do perodo do
dia, uma mensagem diferente aparecer na tela.
A Figura 13.10 apresenta o resultado da execuo do Exemplo 13.4.

Figura 13.10 Execuo do Exemplo 13.4.

13.4 Aplicao cliente servidor


As sees anteriores mostraram como executar pginas em JSP diretamente, sem o recebimento
de valores. Os exemplos mostraram como usar a linguagem JSP embutida em pginas HTML, e voc

264

ERJ_Java_8.indb 264 31/03/2015 16:42:11


JSP - Java Server Pages

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).

13.4.1 Aplicao cliente


A aplicao cliente pode ser uma pgina HTML, uma applet (aplicaes Java que rodam num nave-
gador), uma aplicao de um smartphone, ou ainda qualquer aplicao que utilize o protocolo TCP/IP.
Vamos realizar a comunicao de um formulrio escrito em HTML com a pgina JSP.
Ser criado um arquivo HTML que simula uma pesquisa com dados sobre pessoas, permitindo a
digitao de cinco dados: nome, email, sexo, reas de interesse e estado civl. Esses dados so enviados
ao servidor, que se responsabiliza pelo tratamento adequado deles. Para que esses dados sejam rece-
bidos, necessrio que o arquivo HTML possua um apontamento indicando para onde os dados sero
enviados. Isso definido na propriedade action da tag <form>.
Outro ponto importante o nome dos dados a serem enviados. Cada dado enviado necessita estar
atrelado a um nome como se fosse o de uma varivel de programa. Esse nome definido pela proprie-
dade name dos objetos. No exemplo, o campo nome identificado pela palavra p_nome, o campo
sexo pela palavra p_sexo e assim por diante. O nome dessas palavras extremamente importante,
pois sero usados internamente na pgina em JSP. Para evitar problemas de comunicao entre a apli-
cao cliente e a servidora, vamos padronizar esses nomes usando letras minsculas.
A listagem do Exemplo 13.5 apresenta nosso formulrio. A criao de uma pgina HTML pela fer-
ramenta de desenvolvimento idntica pgina JSP, tanto para o NetBeans como para o Eclipse. A
nica diferena o tipo do arquivo (HTML no lugar de JSP). Crie a pgina com o nome de pesquisa.html
e edite seu cdigo de acordo com a listagem do Exemplo 13.5.
Exemplo 13.5 O formulrio pesquisa.html

Funcionalidades comentadas do Exemplo 13.5:


ff Linha 5: define o incio do fomulrio, a pgina que receber os dados do formulrio (no caso rece-
be.jsp) e o mtodo de transmisso dos dados (post).
ff Linhas 6 e 7: definem as caixas de texto do formulrio. Observe os nomes dos parmetros
(p_nome e p_email) que sero recebidos pela pgina JSP.
ff Linhas 8 e 9: definem os botes de rdio masculino e feminino, com a opo masculino marcada
previamente (checked).

265

ERJ_Java_8.indb 265 31/03/2015 16:42:11


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

ff Linhas 10 a 12: definem os botes checkbox Romance, Aventura e Fico.


ff Linhas 13 a 17: Definem a seleo de p_civil, em que o usurio pode selecionar o seu estado civil,
podendo escolher entre Solteiro, Casado ou Vivo.
ff Linha 18: define o tipo submit, um boto que envia os dados do formulrio para a pgina JSP defi-
nida na linha 5 pelo atributo action.
ff Linha 19: define o tipo reset, um boto que limpa todos os campos do formulrio e retorna os de-
mais componentes ao valor original.
A Figura 13.11 apresenta a execuo da aplicao cliente (pesquisa.html):

Figura 13.11 Execuo do Exemplo 13.5.

13.4.2 Aplicao servidora


A aplicao servidora responsvel por receber os dados do formulrio do item anterior, armazen-
-los em um arquivo texto e emitir uma mensagem ao usurio, gerando uma nova pgina em HTML, indi-
cando o sucesso ou no do recebimento dos dados.
Nesse ponto, vamos elaborar o Exemplo 13.6 da aplicao servidora (o arquivo JSP). Crie a pgina JSP
com o nome recebe.jsp e clique em Finalizar. Edite o arquivo de acordo com a listagem do Exemplo 13.6.
Exemplo 13.6 A pgina recebe.jsp

266

ERJ_Java_8.indb 266 31/03/2015 16:42:12


JSP - Java Server Pages

Funcionalidades comentadas do Exemplo 13.6:


ff Linhas 1 e 2: definem o cabealho da pgina JSP.
ff Linha 4: define o cabealho e o ttulo da pgina HTML.
ff Linhas 7 a 9: declaram as variveis nome, email e sexo, que recebem os valores provenientes do
formulrio HTML. Para isso usado request.getParameter. Observe que os nomes dos parme-
tros devem ser exatamente iguais aos usados no formulrio HTML (definidos nos atributos name:
p_nome, p_email e p_sexo).
ff Linhas 10 a 12: definem as variveis check1, check2 e check3 que recebem como parmetro os
valores dos checkbox p_ck1, p_ck2 e p_ck3, definidos na pgina html.
ff Linha 13: define a varivel civil que recebe o estado civil da pessoa, selecionado por meio da sele-
o (select) p_civil definida na pgina html.
ff Linhas 14 em diante: mostram em tela os valores recebidos.
ff importante resaltar que esse exemplo apenas didtico, visto que permite visualizar os dados
recebidos do formulrio HTML, isto , permite demonstrar a comunicao existente entre uma
aplicao cliente e uma aplicao servidora.
A Figura 13.12 apresenta a execuo da aplicao servidora.

Figura 13.12 Execuo do Exemplo 13.6 correspondente ao envio dos dados da Figura 13.11.

13.5 Uso de classes em pginas JSP


Uma classe em Java pode ser consumida (usada) por uma pgina em JSP. Dessa forma, uma classe
passa a fornecer servios para as pginas. Essa prtica tem sido bastante usada no mercado por algu-
mas razes. Vamos citar apenas as principais:
ff Dividir o sistema em camadas: o sistema pode ser organizado em camadas, cada qual com suas
responsabildiades. Como citamos no Captulo 12, a diviso em camadas permite dividir os ele-
mentos de sistema em funo de suas atribuies. De maneira bastante simplista, o papel das p-
ginas JSP apenas apresentar as informaes (camada View) e as classes em Java se encarregam
de regras de negcio e acesso a banco de dados (camada Model).
ff Dividir as reponsabilidades da equipe: cada vez mais comum que o desenvolvimento de pro-
jetos utilize equipes multidisciplinares, profissionais com diferentes aptides. Ao dividir as fun-
es de um projeto, programadores podem desenvolver classes em Java e profissionais de design
podem criar pginas JSP que consomem servios dessas classes. Assim, um designer no precisa
conhecer detalhes muito tcnicos de cdigos Java, visto que apenas ir utilizar funcionalidades
desenvolvidas pelos programadores.
Um padro criado pela Sun, desde o desenvolvimento do Java, para a criao de classes reutiliz-
veis (consumveis por outras classes), chamado de JavaBeans. Basicamente, um bean uma classe
Java escrita de acordo com uma conveno. No temos o objetivo de estudar JavaBeans, vamos apenas
demonstrar como uma pgina JSP pode utilizar classes previamente desenvolvidas, sem a preocupao
da nomenclatura usada em beans.
Nesse ponto vamos utilizar a classe BD (criada no Captulo 12) para conexo ao banco de dados.
Ela ser usada em conjunto com uma pgina em JSP. Para executar o exemplo a seguir, necessrio que
voc tenha a tabela de filmes no MySQL, conforme descrito no Captulo 12. Execute os procedimentos
que se seguem:

267

ERJ_Java_8.indb 267 31/03/2015 16:42:12


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura 13.13 Estrutura geral do projeto no NetBeans.

5. Crie a pgina do Exemplo 13.7 a seguir com o nome consulta.jsp.


Exemplo 13.7 A pgina consulta.jsp

Funcionalidades comentadas do Exemplo 13.7:

268

ERJ_Java_8.indb 268 31/03/2015 16:42:13


JSP - Java Server Pages

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.

Figura 13.14 Execuo do Exemplo 13.8.

269

ERJ_Java_8.indb 269 31/03/2015 16:42:13


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exerccios para prtica da linguagem Java

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.

Figura 13.15 Telas de execuo do Exerccio 13.1.

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.

Figura 13.16 Telas de execuo do Exerccio 13.2.

270

ERJ_Java_8.indb 270 31/03/2015 16:42:13


JSP - Java Server Pages

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.

Figura 13.17 Telas de execuo do Exerccio 13.3.

Material de apoio

Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.

Seu prximo passo

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

ERJ_Java_8.indb 271 31/03/2015 16:42:14


Captulo

14
Criao de Servlets

Objetivos deste captulo


99Apresentar conceitos e exemplos do uso de Servlets.
99Diferenciar Servlets de pginas JSP.
99Demonstrar as operaes elementares de Servlets na Internet.

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

ERJ_Java_8.indb 272 31/03/2015 16:42:14


Criao de Servlets

14.2 Servlets e JSP


Como voc ver, Servlets e pginas JSP funcionam de forma muito semelhante a pginas que usam
linguagem PHP, ASP, Python, entre outras. Apesar de Servlets e JSP desenvolverem praticamente o mesmo
papel, eles so elementos distintos com algumas diferenas. Vamos descrever as principais diferenas:
ff Servlet uma classe em Java, pginas JSP misturam cdigo Java, marcadores em HTML e diversos
elementos que podem atuar em conjunto com HTML (CSS, Javascript etc.).
ff Enquanto Servlets possuem extenso .java, os arquivos JSP possuem a extenso .jsp. Alm dis-
so, Servlets ficam compilados no servidor desde o primeiro acesso (.class). Ao acessar uma pgina
JSP, ela compilada e gerada sua Servlet correspondente, ou seja, arquivos em JSP so trans-
formados em Servlets. Isso ocorre apenas no primeiro acesso, pois a partir do segundo acesso a
Servlet correspondente ao arquivo JSP j existir no servidor.
ff Servlets so mais indicadas para realizar controle da aplicao, enquanto pginas JSP so mais in-
dicadas para prover contedo ao usurio. Numa arquitetura em camadas (MVC, por exemplo), as
Servlets fariam parte da camada Controler, ao passo que as pginas JSP fariam parte da camada
View. Por essas caractersticas, uma Servlet pode ser usada para controlar o carregamento de di-
ferentes pginas JSP.
ff Pelo fato de Servlets conterem cdigo Java, seu desenvolvimento est mais relacionado a progra-
madores, enquanto as pginas JSP podem ser mais indicadas para pessoal de design.
ff Tanto Servlets quanto pginas JSP so usadas para responder a solicitaes de aplicaes cliente.
Descrevemos as caractersticas mais comuns entre Servlets e pginas em JSP, porm nada impede
que uma Servlet funcione como pgina JSP ou vice-versa.Na prxima seo vamos iniciar o desenvol-
vimento com Servlets.

14.3 Criao de Servlets


Assim como em outros pontos do livro, vamos mostrar como criar uma Servlet pelo NetBeans e
pelo Eclipse. Estamos considerando que voc j possui um projeto chamado java8, criado no captulo
anterior. Crie um pacote chamado cap14 para armazenar as Servlets que sero criadas neste captulo.
Para criar uma Servlet pelo NetBeans, selecione o pacote cap14, clique com o boto direito do
mouse e selecione Novo Servlet... Em Nome da classe digite o nome do Servlet digiteTesteServlet.
Clique no boto Finalizar. No Eclipse o processo o mesmo.
Ao criar uma Servlet ser gerado um cdigo padro contendo diversas linhas. A listagem do
Exemplo 14.1 apresenta o cdigo da Servlet gerado pelo NetBeans. importante citar que o cdigo
apenas sugerido, a maior parte dele no obrigatria, dependendo das funes que a Servlet realizar.
O prprio cabealho da Servlet contm comentrios dizendo que voc pode modificar esse template (o
modelo do cdigo gerado). Perceba que existem diversos imports que permitem, principalmente, que a
Servlet realize operaes de entrada e sada, impresso em tela e comunicao HTTP.
Outros pontos importantes presentes na listagem do Exemplo 14.1 so:
ff Linha 18: contm a anotao @WebServlet que possui dois atributos: name (o nome da Servlet) e
a urlPatterns (define os endereos (URL) a partir do qual a Servlet pode ser acessada).
ff Linha 19: contm o nome da Servlet. Como dissemos anteriormente, uma Servlet deve estender a
classe HttpServlet.
ff Linha 29: processRequest um mtodo que recebe as requisices (request) de aplicaes cliente
e emite a resposta (response) correspondente. Na verdade, as requisies chegam nos mtodos
doGet e doPost (descritos a seguir), que transferem a execuo para o mtodo processRequest.
ff Linhas 34 a 42: contm o cdigo HTML gerado pela Servlet e que ser usado como sada de dados,
isto , so as informaes que sero disponibilizadas ao usurio por meio do software navegador.

273

ERJ_Java_8.indb 273 31/03/2015 16:42:14


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 14.1 A Servlet Teste

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

ERJ_Java_8.indb 274 31/03/2015 16:42:15


Criao de Servlets

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.

Exemplo 14.2 Incluir.html

275

ERJ_Java_8.indb 275 31/03/2015 16:42:16


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Funcionalidades do exemplo ServletFilmesIncluso:


ff Linhas 2 a 8: definem os imports utilizados pelo Servlet.
ff Linha 10: define a URL por meio da qual a Servlet ser acessada. Como s ser usada uma URL
no h a necessidade de inserir o atributo urlPatterns citado anteriormente.
ff Linhas 16 a 19: implementam o mtodo doGet. Caso uma aplicao cliente envie dados via GET
ele ser transferido para o mtodo doPost por meio da linha 18.
ff Linha 20: contm a definio do mtodo doPost.
ff Linha 27: demonstra como instanciar um objeto numa Servlet. No caso instanciado um objeto
da classe FilmesDAO. Essa classe contm os mtodos necessrios para manipular operaes no
banco de dados (incluso, alterao, excluso etc.).
ff Linhas 35: realiza a incluso do filme por meio do mtodo atualizar existente na classe FilmesDAO.
A Figura 14.2 apresenta o retorno da Servlet aps a incluso.

276

ERJ_Java_8.indb 276 31/03/2015 16:42:16


Criao de Servlets

Figura 14.2 Retorno da Servlet de incluso.

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.

Figura 14.3 Formulrio de Localizao.

Exemplo 14.4 localizar.html

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

ERJ_Java_8.indb 277 31/03/2015 16:42:17


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Exemplo 14.5 ServletFilmesLocaliza.java

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

ERJ_Java_8.indb 278 31/03/2015 16:42:17


Criao de Servlets

Figura 14.4 Filme localizado para edio.

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

ERJ_Java_8.indb 279 31/03/2015 16:42:18


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura 14.5 Formulrio de Excluso.

Exemplo 14.7 excluir.html

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

ERJ_Java_8.indb 280 31/03/2015 16:42:19


Criao de Servlets

14.5 Publicar uma aplicao na Web


Para criar uma aplicao e disponibiliz-la no Tomcat, seja numa mquina local ou remota, existe
a necessidade de seguir um conjunto de passos e realizar uma srie de configuraes. Qualquer erro
nesse processo pode comprometer o funcionamento da aplicao e desanimar o leitor quanto a sua
execuo. Atualmente, esse processo feito automaticamente pelas IDEs de desenvolvimento, que,
alm de automatizarem o processo, ajudam a evitar erros, aumentando a produtividade. Assim, acha-
mos mais conveniente disponibilizar os exemplos deste captulo em um arquivo chamado java8.war.
Ele contm toda a estrutura necessria para a criao do contexto web (um conjunto de pastas) de
nossa aplicao, alm das configuraes necessrias para o ambiente. Trata-se do projeto completo
criado no Captulo 13 e que envolve tambm os exemplos do Captulo 14. O leitor pode baixar o arquivo
java8.war do site da Editora rica.
Se preferir, o leitor pode gerar o arquivo .war da sua prpria aplicao, criada no decorrer do
Captulo 13 ou do 14. No NetBeans selecione a pasta do projeto (java8), clique com o boto direito
do mouse sobre ela - Construir. Pronto, o arquivo .war ser gerado na pasta raiz do projeto, dentro da
pasta chamada dist (distribuio). No Eclipse, selecione a pasta do projeto (java8), clique no menu File e
uma nova janela se abrir. Selecione a pasta Web WAR file clique em Next. Em Browse... selecione o
local onde deseja salvar o arquivo - clique no boto Finish.
Para testar a publicao da aplicao, o Tomcat (ou outro servidor Java) deve estar instalado e fun-
cionando corretamente.
Observe os procedimentos a seguir:
1. Baixe o arquivo java8.war do site da Editora rica e copie-o na pasta webapps do Tomcat. Voc
pode seguir esse mesmo procedimento para o .war criado por voc, atentando que a descrio
aqui apresentada com base no .war disponibilizado pela Editora.
2. Inicialize o Tomcat (se ele ainda no estiver inicializado).

Figura 14.6 Estrutura de pastas da aplicao Web.

3. Aguarde alguns segundos e verifique que, automaticamente, o Tomcat descompacta o arquivo


java8.war e cria um conjunto de pastas e arquivos, semelhante ao apresentado na Figura 14.6. A
pasta java8 a pasta do projeto, a pasta cap13 contm as classes criadas no Captulo 13, e o mes-
mo ocorre com a pasta cap14.
4. Com isso j possvel testar todos os exemplos que foram descritos nos Captulos 13 e 14. Por
exemplo, abra o browser e ento digite o endereo http://localhost:8080/cap14/incluir.html. Isso
deve fazer com que o formulrio referente ao arquivo incluir.html aparea em tela.

281

ERJ_Java_8.indb 281 31/03/2015 16:42:19


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Exerccios para prtica da linguagem Java

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.

Figura 14.7 Tela de execuo do Exerccio 1.

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

ERJ_Java_8.indb 282 31/03/2015 16:42:19


Criao de Servlets

Figura 14.8 Tela de execuo do Exerccio 2.

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.

Figura 14.9 Tela de execuo do Exerccio 3.

283

ERJ_Java_8.indb 283 31/03/2015 16:42:19


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Material de apoio

Exerccios semelhantes aos aqui apresentados podem ser visualizados no endereo a seguir:
<http://editoraerica.com.br/>.

284

ERJ_Java_8.indb 284 31/03/2015 16:42:20


Bibliografia

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/.

Consulta a sites (novembro de 2014)


Java World: http://www.javaworld.com/
JavaRanch: http://www.javaranch.com/
Portal Java e GUJ (Brasil): http://www.guj.com/
Oracle: http://www.oracle.com/us/technologies/java/overview/index.html
http://www.oracle.com/technetwork/java/index.html
http://www.oracle.com/technetwork/java/javaee/overview/index.html

285

ERJ_Java_8.indb 285 31/03/2015 16:42:20


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Marcas Registradas

Todos os nomes registrados, marcas registradas ou direitos de uso citados neste livro pertencem
aos seus respectivos proprietrios.

286

ERJ_Java_8.indb 286 31/03/2015 16:42:20


Apndice

A
NetBeans e MySQL

Objetivos deste apndice


99Fornecer uma viso geral de uma das principais ferramentas de desenvolvimento em Java:
a IDE NetBeans.
99Apresentar uma introduo ao uso do sistema gerenciador de banco de dados MySQL.
99Demonstrar os elementos fundamentais envolvidos no desenvolvimento de um projeto
para ambiente Internet.

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.

A.1 Download e instalao do NetBeans


O NetBeans uma ferramenta gratuita que pode ser baixada de https://netbeans.org/downloads.
Ao entrar no site, so apresentadas vrias opes de download, como pode ser visto na Figura A.1.

287

ERJ_Java_8.indb 287 31/03/2015 16:42:20


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura A.1 Opes de download do NetBeans.

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

ERJ_Java_8.indb 288 31/03/2015 16:42:21


NetBeans e MySQL

Figura A.2 Caminho de instalao do NetBeans.

5. Na prxima janela, conforme a Figura A.3, so configuradas a instalao do servidor Glassfish e


a JDK para o servidor. Assim como na tela anterior, deve ser definido o caminho de instalao do
servidor e pressionado o boto Prximo.

Figura A.3 Instalao do servidor GlassFish.

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

ERJ_Java_8.indb 289 31/03/2015 16:42:21


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

leitor deseje receber informaes sobre futuras verses do NetBeans e outros itens relacionados,
mantenha a opo marcada.

Figura A.4 Final do processo de instalao.

8. Pressione o boto Finalizar para encerrar a instalao.


Antes de iniciarmos um projeto pelo NetBeans vamos realizar a instalao do sistema gerencia-
dor de banco de dados MySQL, ferramenta fundamental para nossos objetivos, j que o projeto
prev acesso a banco de dados.

A.2 Download e instalao do MySQL


Vamos iniciar pelo download e instalao do MySQL, um dos produtos pertencentes Oracle e
um dos sistemas gerenciadores de banco de dados mais indicados e usados mundialmente, haja vista
sua alta performance, alm de ser opensource. O MySQL possui duas verses atualmente, a MySQL
Community Server (Licena GPL, designada para o software livre) e a MySQL Enterprise Subscription (pro-
prietria e com custo). Evidentemente, apenas com fins didticos utilizaremos a verso livre.
Para realizar o processo de download do MySQL, abra seu navegador Internet, ento visite o site
http://dev.mysql.com/downloads/, selecione a plataforma e pressione o boto download correspon-
dente. Conforme citado, vamos trabalhar com a verso livre (MySQL Community Server). O MySQL est
disponvel em diversas plataformas (Windows, Linux, Mac etc.). Escolha o link referente plataforma
que voc usa em sua mquina (32 ou 64 bits) e realize o download. Quando este livro foi escrito, o
MySQL Community Server estava na verso 5.6.20. A Figura A.5 apresenta a seleo para download da
verso Windows (x86, 64-bit) MySQL Installer MSI.
O site apresenta duas opes de download: mysql-installer-web-community-5.6.20.0 e mysql-ins-
taller-community-5.6.20.0. Escolha a segunda (verso community) e clique em Download.
Quando o processo de download encerrar, voc receber em sua mquina um arquivo com o nome
parecido com mysql-installer-community-5.6.20.0, dependendo da plataforma e da verso atual
do MySQL. A seguir, apresentamos o processo de instalao do MySQL considerando a plataforma
Windows. Siga estes passos:

290

ERJ_Java_8.indb 290 31/03/2015 16:42:22


NetBeans e MySQL

Figura A.5 Download do MySQL.

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

ERJ_Java_8.indb 291 31/03/2015 16:42:22


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura A.6 Escolha do tipo de configurao.

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.

Figura A.7 Definio da senha de root.

292

ERJ_Java_8.indb 292 31/03/2015 16:42:23


NetBeans e MySQL

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.

Figura A.8 Acesso ao MySQL pelo prompt de comando.

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.

A.3 A criao do banco de dados


O banco de dados que ser usado em nosso projeto extremamente simples; contm apenas uma
tabela, a de usurios. Como j dissemos, existem duas maneiras de acessar o MySQL: pelo prompt de
comando ou com o uso de uma ferramenta grfica. Vamos apresentar essas duas maneiras nas Sees
A.3.1 (pelo prompt) e A.3.2 (pelo NetBeans). Para criar o banco de dados, siga os procedimentos descri-
tos em uma dessas duas sees.

A.3.1 Por meio do prompt de comando


O acesso por meio do prompt a maneira mais simples de manipular o MySQL, a forma padro desde
as primeiras verses da ferramenta. Para manipular o MySQL desse modo, siga estes procedimentos:
1. Acesse o MySQL pelo caminho no Windows 7: boto Iniciar Todos os Programas MySQL
MySQL 5.6 MySQL Command Line Client. No Windows 8: clique no boto Iniciar pressione
a seta para aplicativos - MySQL 5.6 Command Line Client. Em Enter password fornea a senha de-
finida durante o processo de instalao do MySQL, no caso 123456. Se aparecer mysql> na linha
de prompt, significa que a senha foi digitada corretamente e o MySQL est pronto para ser usado.
2. Digite o script create database empresa; (no esquea o ponto e vrgula no final da linha) e pres-
sione a tecla Enter. O banco de dados empresa ser criado.
3. Digite o comando use empresa; e pressione a tecla Enter. Deve aparecer a mensagem Database
changed. Isso faz com que o MySQL passe a utilizar o banco de dados empresa.

293

ERJ_Java_8.indb 293 31/03/2015 16:42:23


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

A.3.2 Por meio do NetBeans


Esta seo realiza exatamente o mesmo processo da seo anterior, porm apresenta a manipula-
o do banco de dados por meio do NetBeans. Se voc j criou o banco de dados e a tabela de acordo
com a seo anterior, sugerimos que exclua os dois antes de prosseguir nesta seo, pois no ser pos-
svel criar o mesmo banco de dados, tampouco a mesma tabela, dentro do mesmo banco. Para excluir
o banco de dados empresa e, consequentemente, a tabela usuario, acesse o MySQL pelo prompt, con-
forme apresentado na seo anterior, e digite drop database empresa;. Isso exclui o banco de dados e
voc pode cri-lo novamente nesta seo.
Para acessar o MySQL por meio do NetBeans, acompanhe os procedimentos a seguir:
1. Clique no boto Iniciar do Windows 7 e selecione NetBeans e NetBeans IDE. Caso utilize o
Windows 8 clique no boto Iniciar - pressione a seta para aplicativos - NetBeans IDE 8.0. Ao abrir
o NetBeans, clique na aba Servios (localizada na janela esquerda e parte superior).
2. Selecione o item Banco de dados, pressione o boto direito do mouse sobre ele e escolha
Registrar servidor MySQL... Surge a janela mostrada na Figura A.9. Ento defina todas as configu-
raes e pressione o boto OK.
3. Ao pressionar o boto OK, aparece o item (chamado de n) Servidor MySQL na janela de servios
do NetBeans contendo os bancos de dados atuais armazenados no MySQL. Isso pode ser visto na
Figura A.10. No caso o MySQL j est iniciado e conectado, mas, dependendo da mquina em que
o leitor realizar esse processo, talvez seja necessrio efetuar a conexo. Se for esse o caso, pres-
sione o boto direito do mouse sobre o n Servidor MySQL e escolha Conectar (ou iniciar, se o
MySQL no tiver iniciado automaticamente).

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

ERJ_Java_8.indb 294 31/03/2015 16:42:23


NetBeans e MySQL

Figura A.11 Opo Criar banco de dados.

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.

Figura A.12 Caixa de dilogo Criar banco de dados MySQL.

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.

Figura A.15 Criao da tabela usuarios.

295

ERJ_Java_8.indb 295 31/03/2015 16:42:24


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura A.16 Adicionando a coluna login.

Figura A.17 Adicionando a coluna password.

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.

Figura A.18 A tabela usuarios criada.

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.

A.4 A criao de um projeto


As aplicaes Java so armazenadas em locais especficos chamados de projetos. Seja qual for o tipo
de tecnologia usado (Java Web, JavaEE, JavaME etc.), existe a necessidade de criar um projeto para abri-
gar todos os arquivos envolvidos na soluo. Vamos considerar a criao de um projeto Java Web relativa-
mente simples usando banco de dados MySQL, mas que servir para apresentar as funcionalidades bsi-
cas do NetBeans. Nosso pequeno projeto contempla o uso de classes em Java, de pginas em HTML e JSP.

296

ERJ_Java_8.indb 296 31/03/2015 16:42:24


NetBeans e MySQL

Para criar o projeto, acompanhe os procedimentos a seguir:


1. Abra o NetBeans e no menu Arquivo escolha Novo projeto..., selecione a categoria Java Web e em
Projetos selecione Aplicao Web. Veja a Figura A.19.

Figura A.19 Criao de um projeto Java Web no NetBeans.

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.

Figura A.20 Definio do nome e da localizao do projeto.

3. Pressione o boto Prximo. Surge a janela da Figura A.21, que permite definir o servidor Web que
ser usado no projeto.

Figura A.21 Configurao do servidor a ser usado no projeto.

297

ERJ_Java_8.indb 297 31/03/2015 16:42:25


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura A.22 Escolha de frameworks.

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.

Figura A.24 Editor do cdigo-fonte.

298

ERJ_Java_8.indb 298 31/03/2015 16:42:25


NetBeans e MySQL

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.

Figura A.25 A estrutura do arquivo index.jsp.

Figura A.26 Arquivo index.jsp apresentado no navegador Chrome.

O endereo localhost:8080/login/ apresentado na barra de endereos do navegador pode ser


assim definido:
ff localhost: endereo local do servidor Glassfish; pode ser substitudo por 127.0.0.1.
ff 8080: nmero da porta de comunicao do servidor.
ff login: endereo do site definido durante a criao do projeto pelo NetBeans.
Neste ponto o projeto foi criado e j est preparado para ser usado em ambiente Internet. Na pr-
xima seo vamos adicionar os diversos arquivos usados em nosso projeto.

A.5 Adio dos arquivos ao projeto


Para adicionar as classes e outros arquivos usados no projeto voc precisa fazer o download do
material disponibilizado no site da Editora rica. A tabela a seguir apresenta a relao dos arquivos a
serem usados e um resumo da funo de cada um deles no projeto. A Figura A.27 mostra a janela do
NetBeans com todos os arquivos que sero adicionados ao projeto.
Arquivos e suas funes no projeto
ff abresessao.jsp: pgina em JSP responsvel por abrir uma sesso de usurio no site.
ff index.jsp: arquivo que simula a pgina principal de um site.
ff login.html: pgina em HTML que contm o formulrio em que o usurio digita seus dados para
login.

299

ERJ_Java_8.indb 299 31/03/2015 16:42:25


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

Figura A.27 A estrutura 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

ERJ_Java_8.indb 300 31/03/2015 16:42:25


NetBeans e MySQL

Figura A.28 Criao do pacote de cdigo-fonte.

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.

Figura A.29 Criao do pacote br.pro.sergio.beans.bd.

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.

Figura A.30 A classe BD adicionada ao projeto.

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

ERJ_Java_8.indb 301 31/03/2015 16:42:26


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Figura A.31 Adio de um arquivo JAR ao projeto.

Figura A.32 O conector do MySQL adicionado ao projeto.

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.

Figura A.33 Conexo ao banco de dados executada com sucesso.

302

ERJ_Java_8.indb 302 31/03/2015 16:42:27


NetBeans e MySQL

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.

Figura A.34 Criao do pacote de cdigo-fonte br.pro.sergio.beans.seguranca.

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.

Figura A.38 Caixas de mensagem para insero de um usurio.

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

ERJ_Java_8.indb 303 31/03/2015 16:42:27


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura A.39 Script em SQL para seleo de usurios.

Figura A.40 O registro inserido.

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.

Figura A.41 A classe Usuario TestaLogar adicionada ao projeto.

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.

Figura A.42 Caixas de mensagem para login do usurio.

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.

Figura A.43 A classe Usuario TestaExcluir adicionada ao projeto.

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

ERJ_Java_8.indb 304 31/03/2015 16:42:27


NetBeans e MySQL

Figura A.44 Caixas de mensagem para excluso do usurio.

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.

Figura A.45 O arquivo login.html adicionado ao projeto.

Figura A.46 O arquivo abresessao.jsp adicionado ao projeto.

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.

Figura A.47 A execuo do arquivo login.html.

305

ERJ_Java_8.indb 305 31/03/2015 16:42:28


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura A.48 O arquivo verificasessao.jsp adicionado ao projeto.

Figura A.49 O arquivo index.jsp adicionado ao projeto.

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

ERJ_Java_8.indb 306 31/03/2015 16:42:28


NetBeans e MySQL

Figura A.50 A execuo dos arquivos index.jsp e verificasessao.jsp.

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

ERJ_Java_8.indb 307 31/03/2015 16:42:28


Apndice

B
Eclipse, TomCat e MySQL

Objetivos deste apndice


99Fornecer uma viso geral sobre a IDE Eclipse e sua integrao com o TomCat.
99Apresentar um exemplo de enquete com o banco de dados MySQL e a gerao de grficos.
99Demonstrar os elementos fundamentais envolvidos no desenvolvimento de um projeto
usando o Eclipse.

Eclipse um IDE (Integrated Development Environment), isto , um ambiente integrado para


o desenvolvimento de aplicaes Java, porm suporta vrias outras linguagens a partir de plu-
ginscomoC/C++, PHP, ColdFusion, Python,Scala,Android etc. A ferramenta foi desenvolvida em
Javae segue o modeloopen sourcededesenvolvimento de software. Este apndice apresenta uma
breve introduo de algumas das funcionalidades da ferramenta que podem ajudar na execuo
dos exemplos constantes no livro. O estudo completo dessa IDE, envolvendo todas as suas carac-
tersticas e funcionalidades, demandaria mais de um livro para ser executado.
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 Eclipse. Apesar de pequeno,
contempla a base de conhecimento necessria para criar aplicaes Java por meio do Eclipse. Voc
pode tambm assistir um vdeo no youtube disponvel no endereo http://youtu.be/yOftgd8Eays.
Quando este livro foi escrito, o Eclipse estava no codinome Luna e na verso de projeto 4.4.
Provavelmente o leitor vai usar uma verso mais recente. Mas isso no deve representar nenhum
problema, j que as funcionalidades bsicas devem permanecer as mesmas e o leitor no ter difi-
culdade em manipular a ferramenta.

B.1 Download e instalao do Eclipse


O Eclipse uma ferramenta gratuita que pode ser baixada de https://www.eclipse.org/
downloads/. Ao entrar no site, so apresentadas vrias opes de download, como pode ser
visto na Figura B.1.

308

ERJ_Java_8.indb 308 31/03/2015 16:42:28


Eclipse, TomCat e MySQL

Figura B.1 Opes de download do Eclipse.

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.

Figura B.2 Definio do workspace no Eclipse.

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

ERJ_Java_8.indb 309 31/03/2015 16:42:29


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

B.2 A criao do banco de dados


O banco de dados que ser usado em nosso projeto extremamente simples; contm apenas uma
tabela, chamada enquete. Para criar o banco de dados e a tabela, ser usado o script a seguir:

create dabatase meubanco;


use meubanco;
create table enquete (
votos1 int,
votos2 int,
votos3 int,
votos4 int,
votos5 int
);
insert into enquete values (0,0,0,0,0);

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;

B.3 A criao de um projeto


As aplicaes Java so armazenadas em locais especficos chamados projetos. Seja qual for o tipo de
tecnologia usado (Java Web, JavaEE, JavaME etc.), existe a necessidade de criar um projeto para abrigar
todos os arquivos envolvidos na soluo. Vamos considerar a criao de um projeto Java Web relativa-
mente simples usando banco de dados MySQL, mas que servir para apresentar as funcionalidades b-
sicas do Eclipse. Nosso pequeno projeto contempla o uso de classes em Java, de pginas em HTML e JSP.
Para criar o projeto, acompanhe os procedimentos a seguir:
1. Abra o Eclipse e no menu File escolha New Dynamic Web Project. Veja a Figura B.3.

Figura B.3 Criao de um projeto Java Web no Eclipse.

310

ERJ_Java_8.indb 310 31/03/2015 16:42:29


Eclipse, TomCat e MySQL

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.

Figura B.4 Definio do nome e da localizao do projeto.

3. Mantenha todas as configuraes sugeridas e pressione o boto Finish. O projeto ser criado com
a estrutura semelhante da Figura B.5.

Figura B.5 Estrutura de um projeto Web.

Vamos apresentar uma viso geral sobre as principais janelas existentes no Eclipse e que esto
relacionadas diretamente com os exemplos apresentados no livro.

311

ERJ_Java_8.indb 311 31/03/2015 16:42:30


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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.

Figura B.6 Editor do cdigo-fonte.

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.

Figura B.7 Arquivo enquete.html apresentado no navegador Chrome.

312

ERJ_Java_8.indb 312 31/03/2015 16:42:30


Eclipse, TomCat e MySQL

O endereo http://localhost:8080/enquete.html apresentado na barra de endereos do navegador


pode ser assim definido:
ff localhost: endereo local do servidor TomCat; pode ser substitudo por 127.0.0.1.
ff 8080: nmero da porta de comunicao do servidor.
ff enquete.html: endereo de uma pgina definido durante a criao do projeto pelo Eclipse.
Neste ponto o projeto foi criado e j est preparado para ser usado em ambiente Internet. Na pr-
xima seo vamos adicionar os diversos arquivos usados em nosso projeto.

B.4 Adio dos arquivos ao projeto


Para adicionar as classes e outros arquivos usados no projeto voc precisa fazer o download do
material disponibilizado no site da Editora rica. A tabela a seguir apresenta a relao dos arquivos
a serem usados e um resumo da funo de cada um deles no projeto. A Figura B.8 mostra a janela do
Eclipse com todos os arquivos que sero adicionados ao projeto.
Arquivos e suas funes no projeto
ff BD.java: classe usada para realizar a conexo ao banco de dados.
ff Enquete.txt: arquivo texto com o script do banco de dados a ser criado no MySQL.
ff Enquete.java: classe responsvel por fazer a incluso e a seleo de votos armazenados na tabela
do MySQL.
ff enquete.html: pgina em HTML que contm o formulrio onde o usurio pode selecionar seu
personagem favorito e votar nele.
ff enquete.jsp: pgina em JSP responsvel por validar os dados se inseri-los no banco de dados.
ff grfico.jsp: arquivo que mostra o grfico dos resultados parciais das votaes em cada personagem.
ff mysql-connector: driver usado para a conexo do Java ao MySQL.

Figura B.8 A estrutura do projeto enquete.

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

ERJ_Java_8.indb 313 31/03/2015 16:42:30


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Acompanhe os procedimentos seguintes:


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 Project
da janela Explorer do Eclipse, clique com o boto direito na pasta src e escolha a opo New
Package. Veja a Figura B.9.

Figura B.9 Criao do pacote.

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.

Figura B.10 Criao do pacote banco.

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.

Figura B.11 A classe BD adicionada ao projeto.

314

ERJ_Java_8.indb 314 31/03/2015 16:42:31


Eclipse, TomCat e MySQL

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.

Figura B.12 Diversos arquivos JAR adicionados ao projeto.

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.

Figura B.13 Conexo ao banco de dados executada com sucesso.

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

ERJ_Java_8.indb 315 31/03/2015 16:42:31


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

banco, adicionaremos a classe Enquete a um novo pacote chamado enquete. Crie esse pacote
conforme a Figura B.14

Figura B.14 Criao do pacote enquete.

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.

Figura B.15 Classes e pginas adicionadas ao projeto.

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.

Figura B.16 Visualizar voto computado.

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

ERJ_Java_8.indb 316 31/03/2015 16:42:31


Eclipse, TomCat e MySQL

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

Figura B.17 Grfico de barras.

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

Figura B.18 Grfico de linhas.

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

Figura B.19 Grfico de barras 3D.

317

ERJ_Java_8.indb 317 31/03/2015 16:42:32


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

Resultado da Votao

Super Homem

Wolverine

Batman

Hulk

Homem de Ferro

Figura B.20 Grfico de pizza.

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

ERJ_Java_8.indb 318 31/03/2015 16:42:32


ndice remissivo

{ ... }, 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

java_8_17.indd 319 01/04/2015 09:28:41


Java 8 Ensino Didtico: Desenvolvimento e Implementao de Aplicaes

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

java_8_17.indd 320 01/04/2015 09:28:41

Você também pode gostar