Laboratório Java OO

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 155

Java Orientado a Objeto

www.3way.com.br

Laboratrios

Java OO | Laboratrios

ndice
Lab 1 | Introduo a Linguagem Java .....................................................8
Exerccio 1 | Instalar JDK 7 ...........................................................................................................8 1.1 | Fazendo Download do JDK 7 .............................................................................................8 1.2 | Instalao do JDK em ambiente Windows .......................................................................9 1.3 | Instalao do JDK em ambiente Linux ...........................................................................13 Exerccio 2 | Escrever, compilar e executar programa Hello World usando ferramentas de linha de comando ..........................................................................................................................15 2.1 |Montar e executar o programa Java HelloWorld, usando o comando javac e java ....................15 2.2 | Usar o compilador Java, comando javac .......................................................................................18 2.3 | Usar o interpretador Java, comando java .......................................................................19

Lab 2 | Java Bsico................................................................................22


Exerccio 1 | Declarar, Inicializar, Imprimir variveis...................................................................22 1.1 | Montando e executando o programa ImprimirVariavel usando comando javac and java .......................................................................................................................................22 Exerccio 2 | Operador Condicional .............................................................................................24 Exerccio 3 | Mdia numrica .......................................................................................................25 Exerccio 4 | Encontre o maior nmero .......................................................................................26

Lab 3 | Estruturas de Controle Java.......................................................27


Exerccio 1 | Estrutura de controle if/else ....................................................................................27 1.1 | Refazer programa MediaNumerica.java do Lab1 adicionando opo de entrada de usurio com JoptionPane ........................................................................................................27 1.2 | Construir um segundo exemplo de uso de if/else ...........................................................29 Exerccio 2 | Lao For ...................................................................................................................30 www.3way.com.br

Java OO | Laboratrios
Exerccio 3 | Lao While/Do-While ..............................................................................................31 3.1 | Lao while e a classe java.util.Scanner. so usado neste exemplo ..................................31 3.2 | Lao do-while ..................................................................................................................32

Lab 4 | Vetores e Matrizes em Java .......................................................34


Exerccio 1 | Construindo Arrays de Primitivos Inteiros .............................................................34 1.1 | Usando arrays unidimensionais de inteiros ....................................................................34 1.2 | Usando arrays bidimensionais de inteiros ......................................................................35 1.3 | Busca maior valor ............................................................................................................36 Exerccio 2 | Construindo Arrays de Objetos String 36 1.1 | Usando arrays unidimensionais de String .......................................................................36

Lab 5 | Usando Objetos em Java ...........................................................38


Exerccio 1 | Criando uma instncia de objeto de uma classe usando a palavra chave new (20 minutos) .................................................................................................................................38 1.1 | Criando objetos da classe String ......................................................................................38 1.2 | Criando objetos da classe Integer ....................................................................................39 Exerccio 2 | Mtodos estticos e mtodos de instncia (no - esttico) .....................................39 Exerccio 3 | Argumentos de mtodos passado por valor e por referncia .................................42 3.1 | Passagem de parmetros por valor .................................................................................42 3.2 | Passagem de parmetros por referncia .........................................................................43 Exerccio 4 | Escopo de variveis .................................................................................................43 4.1 | Um programa que demonstra escopo de variveis .........................................................44 4.2 | Um programa que usa trs tipos de variveis ................................................................45 Exerccio 5 | Casting de tipos primitivos e classe Wrapper ..........................................................45

www.3way.com.br

Java OO | Laboratrios
5.1 | Casting de tipos primitivos ..............................................................................................45 5.2 | Convertendo primitivos para classes Wrapper ...............................................................46 Exerccio 6 | Comparando objetos ................................................................................................47 Exerccio 7 | mtodo getClass() e o operador instanceof ............................................................48 7.1 | Usando mtodo getClass() ...............................................................................................49 7.2 | Usando operador instanceOf .......................................................................................... 49

Lab 6 | Criando suas prprias classes ....................................................51


Exerccio 1 | Definindo e usando classes ......................................................................................52 1.1 | Definindo a nova classe Conta.java ..................................................................................52 Exerccio 2 | Membros estticos ...................................................................................................55 2.1 | Criando aplicativos que usam variveis estticas ...........................................................55 2.2 | Criando aplicativos que usam mtodos estticos ...........................................................57 Exerccio 3 | Sobrecarga ...............................................................................................................57 3.1 | Adicionando mtodos sobrecarregados ..........................................................................57 Exerccio 4 | Construtores ............................................................................................................61 4.1 | Definindo mltiplos construtores numa classe ...............................................................61 Exerccio 5 | Referncia this .....................................................................................................62 5.1 Invoque mtodos com this ..............................................................................................62

Lab 7 | Herana .....................................................................................67


Exerccio 1 | Construindo programas que criam classes atravs .................................................67 Exerccio 2 | Invocando construtores com palavra chave super .................................................69 Exerccio 3 | Type Casting e Polimorfismo ...................................................................................69 Exerccio 4 | Palavra chave final em classes e mtodos ..............................................................69 www.3way.com.br

Java OO | Laboratrios
Lab 8 | Interfaces e Classes Abstratas ....................................................71
Exerccio 1 | Classes Abstratas ......................................................................................................71 Exerccio 2 | Interface como um tipo ............................................................................................72

Lab 9 | Excees ....................................................................................75


Exerccio 1 | Criando excees .................................................................................................... 75 Exerccio 2 | Usando excees ......................................................................................................76

Lab 10 | Generics ..................................................................................77


Exerccio 1 | Construindo uma classe Genrica ............................................................................77

Lab 11 | Colees ...................................................................................79


Exerccio 1 | UML e Colees ........................................................................................................79 Exerccio 2 | Usando coleo Set ..................................................................................................82 2.1 | Descartando elementos duplicados com HashSet ..........................................................82 2.2 | Classificando os elementos com TreeSet ........................................................................84 Exerccio 3 | Usando coleo List .................................................................................................85 Exerccio 4 | Usando coleo Map ................................................................................................86 4.1 | Usando HashMap ............................................................................................................87 4.2 | Usando TreeMap .............................................................................................................88 Exerccio 5 | Ordenando e Comparando Objetos nas Colees ...................................................89

Lab 12 | Manipulando arquivos ............................................................90


Exerccio 1 | Manipulando arquivos em java ...............................................................................90

Lab 13 |Threads ....................................................................................92


Exerccio 1 | Herdando a classe Thread .......................................................................................92 1.1 | O mtodo start() sem o construtor da subclasse .............................................................92 www.3way.com.br

Java OO | Laboratrios
1.2 | O mtodo start() est no construtor da subclasse ...........................................................93 Exerccio 2 | Implementando Interface Runnable ......................................................................94 2.1 | Iniciando fora do construtor da classe que implementa Runnable ................................94 2.2 | Iniciando dento do construtor da classe que implementa Runnable .............................95 Exerccio 3 | Sincronizando threads..............................................................................................96 3.1 | Threads no sincronizados ..............................................................................................96 3.2 | Sincronizando threads atravs de mtodos ....................................................................98 3.3 | Sincronizando threads atravs de sentenas ...............................................................98

Lab 14 | Criando GUI com Swing ........................................................ 100


Exerccio 1 | Desenvolver janela swing .......................................................................................100 Exerccio 2 | Manipulao de eventos com Java Swing..............................................................106

Projeto | Criando Aplicao Orientada a Objeto + Swing......................110


1 | Descrio do Problema ...........................................................................................................110 2 | Criao do projeto ...................................................................................................................111 3 | Prototipao Crie as telas de acordo com os prottipos. Utilize o windowBuilder ...........112 4 | Aes de tela ...........................................................................................................................115 4.1. Figura 5 - Tela inicial do sistema Banco .........................................................................115 4.2. Figura 6 - Tela Manter Clientes (JInternalFrame) ........................................................ 115 4.3. Figura 7 - Tela Operaes Bancarias (JInternalFrame) .................................................115 4.4. Figura 8 - Tela Abrir Conta (JDialog) ............................................................................ 116 4.5. Figura 8 - Tela Transferncia (JDialog) .........................................................................116 5 |Passo a Passo do cdigo fonte do sistema ...............................................................................116 5.1. Dao Data Access Object ................................................................................................116 www.3way.com.br

Java OO | Laboratrios
5.2. Figura 5 - Tela inicial do sistema Banco .........................................................................117 5.3. Figura 6 - Tela Manter Clientes ......................................................................................121 5.4. Figura 7 - Tela Operaes Bancarias ..............................................................................130 5.5. Figura 8 - Tela Abrir Conta ............................................................................................143 5.6. Figura 9 - Tela Transferncia entre Contas ...................................................................146

Tutorial ...............................................................................................151
Instalando e configurando WindowBuilder Pro no Eclipse para desenvolver aplicativos Swing ...151

www.3way.com.br

Java OO | Laboratrio 1
Lab 1 | Introduo a Linguagem Java
Neste laboratrio faremos Instalao do Java Development Kit, em ambiente Windows ou Linux. E escreveremos nosso primeiro programa em Java, o mais famoso programa do mundo.

Exerccios
Exerccio 1: Instalar JDK 7.0 (30 minutos) Exerccio 2: Escrever, compilar e rodar um programa HelloWorld em Java usando ferramentas da linha de comando (30 minutos)

Exerccio 1 | Instalar JDK 7


1.1 | Fazendo Download do JDK 7
Para voc baixar o JDK(Java Development Kit), acesse o link no site da ORACLE: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Nesta pgina, voc tem a opo de baixar o JDK, JRE, Documentao, Cdigo Fonte e outras.

www.3way.com.br

Java OO | Laboratrio 1
Clique em Download (Java Plataform JDK 7u25) como mostra a figura acima. 1. Voc ser redirecionado para a pgina abaixo.

1. Habilite o download aceitando os termos da licena. Accept License Agreement 2. Escolha sua plataforma SO: Windows para plataforma Windows, por exemplo, e click em Download. 3. Selecione sua plataforma SO na coluna de Download, para iniciar o download

1.2 | Instalao do JDK em ambiente Windows


Para instalar o JDK no Windows, primeiro baixe-o no site da Oracle, um simples arquivo executvel que contm o Wizard de instalao. 1. D um clique duplo no arquivo jdk-<verso>-windows-<arquitetura>.exe, e espere at ele entrar no wizard de instalao.

www.3way.com.br

Java OO | Laboratrio 1
2. Nesta tela Clique em Next.

3. Agora devemos selecionar quais recursos instalaremos junto com o java (Ferramentas de desenvolvimento, o cdigo fonte e o prprio java), e onde ele ser instalado (marque esse caminho porque usaremos ele mais pra frente), deixe como est e clique em Next.

4. O processo de instalao iniciar.

www.3way.com.br

10

Java OO | Laboratrio 1
5. Este passo s ser executado caso voc ainda no tenha instalado o JRE na sua mquina. Agora ele comear a instalar o JRE(Java Runtime Environment). Assim como o JDK, ele tambm tem algumas opes. Deixe como est e clique em Next.

6. O processo de instalao da JRE(Java Runtime Environment) iniciar. 7. Agora seu JDK est instalado. Clique em Finish.

8. Agora vamos criar as Variveis de Ambiente. Clique com o boto direito em cima do cone Meu Computador e selecione a opo Propriedades.

www.3way.com.br

11

Java OO | Laboratrio 1
9. Clique em Configuraes avanadas do sistema.

10. Agora escolha a aba Avanado e depois clique no boto Variveis de Ambiente.

11. Nesta tela voc ver na parte de cima, as variveis de ambiente do usurio corrente, e embaixo, as variveis de ambiente do computador, que serve para todos os usurios. Clique no boto Novo da parte de baixo. 12. Agora em Nome da Varivel digite JAVA_HOME e em Valor da Varivel digite o Caminho que voc anotou no passo 3, ou seja, o caminho que foi instalado o JDK.

www.3way.com.br

12

Java OO | Laboratrio 1
Provavelmente vai estar em C:\Program Files\Java\jdk1.7.0_25, ou um caminho parecido com este dependendo da verso que foi instalado. Depois clique em OK.

13. Agora no vamos criar outra varivel e sim alterar, para isso procure a varivel PATH, ou Path, e clique no boto Editar.

14. No altere o nome da varivel e no altere, apague os dados nela informados! Deixe como est e adicione no final do valor ;%JAVA_HOME%\bin, no esquea do ponto-e-vrgula no incio, assim voc est adicionando mais um caminho sua varivel Path. 15. Agora abra o prompt e digite javac -version para mostrar a verso do Java Compiler e algumas opes, caso no aparea reveja os passos e confira se no esqueceu ou pulou nenhum deles e se o caminho colocado nas variveis esto corretos.

1.3 | Instalao do JDK em ambiente Linux

1. Baixe o pacote de instalao para Linux chamado Linux self-extracting file, assim o arquivo que voc baixar ter a extenso .bin.

www.3way.com.br

13

Java OO | Laboratrio 1
2. Abra um terminal e faa login como root (comando su). 3. Crie um diretrio chamado /java na raiz do seu sistema (mkdir /java)

4. Copie o arquivo que voc baixou para o diretrio /Java (cp /<caminho do arquivo>/ jdk-<verso>-linux.bin /java) 5. Execute o arquivo (sh jdk<verso>-linux.bin)

6. Aparecer na sua tela um acordo de instalao, aperte a tecla Q para ir at o final do documento e depois escreva yes para aceitar o contrato. Feito isso ele comear a descompactar o JDK em um diretrio que ele cria, chamado jdk<verso>. 7. Vamos agora criar as variveis de ambiente, edite o arquivo, use um editor de sua preferncia, altere seu arquivo .bashrc ou .bash_profile (depende da sua distribuio e sua preferncia) ou ainda /etc/bash.bashrc, considerando que voc no tem privilgios de super usurio, faa:
> ~/bashrc > vi ~/bashrc

Adicione as seguintes linhas no final do arquivo, substituindo <verso> pela verso que foi instalado do JDK:
JAVA_HOME=/java/jdk<verso> PATH=$PATH:/$JAVA_HOME/bin CLASSPATH=.export JAVA_HOME PATH CLASSPATH

8. Execute o comando source ~/.bashrc 10. Abra um terminal e teste o Java Compiler executando o comando javac -version

11. A sada dever ser parecida com a apresentada abaixo, se no aparecer reveja os passos e confira se foi feito tudo corretamente, inclusive o caminho dos diretrios.
javac 1.7.0_25 javac: no source files Usage: javac <options> <source files> where possible options include: .....

www.3way.com.br

14

Java OO | Laboratrio 1
Exerccio 2 | Escrever, compilar e executar programa Hello World usando ferramentas de linha de comando
O objetivo de exerccio promover uma experincia completa como ciclo de desenvolvimento de programas em Java escrever, compilar e executar um programa java to simples quanto possvel usando as ferramentas de linha de comando do seu JDK. Se voc j programou em linguagens como C, C++ ou Pascal (o tradicional, no a IDE Delphi), ver que h pequenas diferenas. Em Java o compilador que chamado javac compila o arquivo de cdigo fonte Java em um arquivo binrio chamado de bytecode que pode ser executado em qualquer plataforma compatvel com Java, isto prov a portabilidade dos programas em Java. O bytecode so os arquivos *.java compilados para serem executados, so os arquivos com extenso *.class . 1. Montar e executar o programa Java HelloWorld, usando o comando javac e java 2. Usar o compilador Java, comando javac 3. Usar o interpretador Java, comando java

2.1 |Montar e executar o programa Java HelloWorld, usando o comando javac e java
1. Crie um diretrio onde voc vai colocar os programas em Java que voc escrever
>mkdir c:\myjavaprograms >cd \myjavaprograms

2. Escreva o cdigo de HelloWorld.java usando o editor de sua preferncia, pode textpad ou notepad no Windows; vi, gedit. Veja o gabarito do programa na Listagem-0.1 abaixo. Nestes primeiros exemplos interessante que voc digite e tenha experincia com alguns erros compilao.
public class HelloWorld { /** *Aplicao Hello World */ public static void main( String[] args ){ // Imprime cadeia de caracteres Hello world na tela System.out.println(Hello, world);

Listagem -0.1: HelloWorld.java

www.3way.com.br

15

Java OO | Laboratrio 1
Anatomia do Cdigo:

3. Compile HelloWorld.java usando o compilador javac. O compilador javac foi instalado com seu J2SE SDK. Ele est no diretrio %JAVA_HOME%\bin (Windows) ou $JAVA_HOME/bin (Linux). O resultado da compilao ser a criao do arquivo HelloWorld.class.
> javac HelloWorld.java


file

Problema #1: se voc receber a mensagem de erro abaixo


> HelloWorld.java javac is not recognized as an internal or external command, operable program or batch

Isto significa que %JAVA_HOME%\bin para Windows ou $JAVA_HOME/bin para Linux, no est configurada corretamente. Voc pode tentar colocando C:\Program Files\Java\jdk1.7.0_25\bin\ javac HelloWorld.java (para Windows) se quiser continuar sem configurar as variveis de ambiente. Soluo: Sugiro que voc reveja o passo 9 do item 1.2 (para windows) ou passo 7 do item 1.3 (para Linux), do exerccio 1. 4. Certifique-se de que o arquivo HelloWorld.class foi criado. O arquivo HelloWorld.class contm a representao bytecode da classe HelloWorld.
> dir HelloWorld.class

(para windows)

ou

www.3way.com.br

16

Java OO | Laboratrio 1
> dir HelloWorld.class

(para linux)

6. Rode o programa HelloWorld usando o comando java. O comando java inicia a Mquina Vitual Java e executa o programa HelloWorld deste exemplo. Um programa em java pode ter mltiplas classes e um conjunto de bibliotecas de classes . Neste exemplo, o programa HelloWorld possui uma nica classe chamada HelloWorld.class. O comando java o Interpretador Java.
>java HelloWorld HelloWorld world

Problema #2: Se voc receber a mensagem de erro


>java HelloWorld Exception in thread main java.lang.UnsupportedClassVersionError: HelloWorld (Unsupported major.minor version 49.0)

possvel que voc tenha compilado seu programa com uma verso diferente da que esteja tentando execut-lo. Soluo: certifique que sua varivel de ambiente PATH esteja corretamente configurada para o diretrio de instalao da verso apropriada do seu JDK. Sugiro que voc reveja o passo 9 do item 1.2 (para windows) ou passo 7 do item 1.3 (para Linux), do exerccio 1. Problema #3: Se voc receber a mensagem de erro
>java HelloWorld Exception in thread main java.lang.NoClassDefFoundError: HelloWorld

Provavelmente sua varivel de ambiente CLASSPATH no est corretamente configurada com o diretrio corrente. Soluo: tente usar o comando java -classpath . HelloWorld (H um ponto . aps o -classpath). Voc ver mais sobre a classpath posteriormente.
>java -classpath . HelloWorld

7. Modifique HelloWorld.java como mostra a Listagem-0.2 abaixo.


public class HelloWorld { /** * Comentario: * Primeiro programa em Java */ public static void main( String[] args ){ // tambem e um comentario // Imprime cadeia de caracteres Hello world na tela System.out.println(Ol Java); //modifique para imprimir mais System.out.println(Meu primeiro programa Java); } }
Listagem-0.2: HelloWorld.java modificado

www.3way.com.br

17

Java OO | Laboratrio 1
8. Compile e execute o programa. Observe a nova mensagem mostrada.
>javac HelloWorld.java >java HelloWorld Ol Java Meu primeiro programa Java

2.2 | Usar o compilador Java, comando javac


Neste passo voc aprender como usar algumas opes do compilador javac.

1. Mostrar as opes do compilador javac usando a opo help:


> javac -help Usage: javac <options> <source files> where possible options include: -g Generate all debugging info -g:none Generate no debugging info -g:{lines,vars,source} Generate only some debugging info -nowarn Generate no warnings -verbose Output messages about what the compiler is doing -deprecation Output source locations where deprecated APIs are used -classpath <path> Specify where to find user class files -cp <path> Specify where to find user class files -sourcepath <path> Specify where to find input source files -bootclasspath <path> Override location of bootstrap class files -extdirs <dirs> Override location of installed extensions -endorseddirs <dirs> Override location of endorsed standards path -d <directory> Specify where to place generated class files -encoding <encoding> Specify character encoding used by source files -source <release> Provide source compatibility with specified release -target <release> Generate class files for specific VM version -version Version information -help Print a synopsis of standard options -X Print a synopsis of nonstandard options -J<flag> Pass <flag> directly to the runtime system

2. Execute o comando javac com a opo -verbose


>javac -verbose HelloWorld.java [parsing started HelloWorld.java] [parsing completed 516ms] [search path for source files: [.]] [search path for class files: [C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar,C:\ Program Files\Java\jdk1.7.0_25\jre\lib\jsse.jar, C:\Program Files\Java\jdk1.7.0_25\jre\ lib\jce.jar, C:\Program Files\Java\jdk1.7.0_25\jre\lib\charsets.jar,C:\Program Files\ Java\jdk1.7.0_25\jre\lib\ext\dnsns.jar, C:\Program Files\Java\jdk1.7.0_25\jre\lib\ext\ localedata.jar, C:\Program Files\Java\jdk1.7.0_25\jre\lib\ext\sunjce_provider.jar, C:\ Program Files\Java\jdk1.7.0_25\jre\lib\ext\sunpkcs11.jar, .]] [loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/lang/Object.class)] [loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/lang/String.class)] [checking HelloWorld] [loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/lang/System.class)]

www.3way.com.br

18

Java OO | Laboratrio 1
[loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/io/PrintStream.class)] [loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/io/FilterOutputStream. class)] [loading C:\Program Files\Java\jdk1.7.0_25\jre\lib\rt.jar(java/io/OutputStream.class)] [wrote HelloWorld.class] [total 1141ms]

3. Experincia com erros de compilao. Modifique o programa HelloWorld.java como mostra a Listagem-0-3 abaixo. A mudana causa um erro de sintaxe a palavra-chave static est incorretamente digitada como statict.
public class HelloWorld { /** * Comentario: * Primeiro programa em Java */ public statict void main( String[] args ){ // tambem e um comentario // Imprime cadeia de caracteres na tela System.out.println(Meu primeiro program Java); } }
Listagem -0.3: Cdigo contento erro de sintaxe

Compile HelloWorld.java with javac. Observe os erros


>javac HelloWorld.java HelloWorld.java:6: <identifier> expected public statict void main( String[] args ){ ^ HelloWorld.java:12: ; expected } ^ 2 errors

Remova o erro de sintaxe que voc introduziu no cdigo e recompile-o.

2.3 | Usar o interpretador Java, comando java

Neste passo voc aprender como usar algumas opes do interpretador java. Voc pode pensar no comando como sua Java Virtual Machine. 1. Mostrar o uso da informaes de ajuda do comando java com a opo -help ou -? .
>java -help Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the client VM -server to select the server VM

www.3way.com.br

19

Java OO | Laboratrio 1
-hotspot is a synonym for the client VM [deprecated] The default VM is client. -cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> A ; separated list of directories, JAR archives, and ZIP archives to search for class files. -D<name>=<value> set a system property -verbose[:class|gc|jni] enable verbose output -version print product version and exit -version:<value> require the specified version to run -showversion print product version and continue -jre-restrict-search | -jre-no-restrict-search include/exclude user private JREs in the version search -? -help print this help message -X print help on non-standard options -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] enable assertions -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] disable assertions -esa | -enablesystemassertions enable system assertions -dsa | -disablesystemassertions disable system assertions -agentlib:<libname>[=<options>] load native agent library <libname>, e.g. -agentlib:hprof see also, -agentlib:jdwp=help and -agentlib:hprof=help -agentpath:<pathname>[=<options>] load native agent library by full pathname -javaagent:<jarpath>[=<options>] load Java programming language agent, see java.lang.instrument

2. Execute o comando java com a opo -verbose


>java -verbose HelloWorld [Opened C:\Program Files\Java\jre1.7.0_25\lib\rt.jar] [Opened C:\Program Files\Java\jre1.7.0_25\lib\jsse.jar] [Opened C:\Program Files\Java\jre1.7.0_25\lib\jce.jar] [Opened C:\Program Files\Java\jre1.7.0_25\lib\charsets.jar] [Loaded java.lang.Object from shared objects file] [Loaded java.io.Serializable from shared objects file] [Loaded java.lang.Comparable from shared objects file] [Loaded java.lang.CharSequence from shared objects file] [Loaded java.lang.String from shared objects file] [Loaded java.lang.reflect.GenericDeclaration from shared objects file] [Loaded java.lang.reflect.Type from shared objects file] [Loaded java.lang.reflect.AnnotatedElement from shared objects file] [Loaded java.lang.Class from shared objects file] [Loaded java.lang.Cloneable from shared objects file] [Loaded java.lang.ClassLoader from shared objects file] [Loaded java.lang.System from shared objects file] [Loaded java.lang.Throwable from shared objects file]

www.3way.com.br

20

Java OO | Laboratrio 1
[Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded .... [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded [Loaded This is [Loaded [Loaded java.lang.Error from shared objects file] java.lang.ThreadDeath from shared objects file] java.lang.Exception from shared objects file] java.lang.RuntimeException from shared objects file] java.security.ProtectionDomain from shared objects file] java.security.AccessControlContext from shared objects file] java.lang.ClassNotFoundException from shared objects file] java.lang.LinkageError from shared objects file] java.lang.NoClassDefFoundError from shared objects file] java.lang.ClassCastException from shared objects file] java.lang.ArrayStoreException from shared objects file] java.lang.VirtualMachineError from shared objects file] sun.net.www.URLConnection from shared objects file] sun.net.www.protocol.file.FileURLConnection from shared objects file] java.net.ContentHandler from shared objects file] java.net.UnknownContentHandler from shared objects file] sun.net.www.MessageHeader from shared objects file] java.io.FilePermission from shared objects file] java.io.FilePermission$1 from shared objects file] java.io.FilePermissionCollection from shared objects file] java.security.AllPermission from shared objects file] java.security.UnresolvedPermission from shared objects file] java.security.BasicPermissionCollection from shared objects file] java.security.Principal from shared objects file] java.security.cert.Certificate from shared objects file] HelloWorld from file:/C:/myjavaprograms/] my first Java program! java.lang.Shutdown from shared objects file] java.lang.Shutdown$Lock from shared objects file]

3. Execute o comando java com a opo -version. Observe que o nmero da verso do JDK instalada mostrado.
>java -version java version 1.7.0_25 Java(TM) SE Runtime Environment (build 1.7.0_25-b17) Java HotSpot(TM) 64-Bit Client VM (build 23.25-b01 , mixed mode)

www.3way.com.br

21

Java OO | Laboratrio 2
Lab 2 | Java Bsico
O objetivo deste laboratrio para voc se habituar com bsico da programao Java, com a forma de declarar e usar variveis, como usar operadores condicional. Exerccios Exerccio 1: Declarar, Inicializar, Imprimir Variveis (30 minutos) Exerccio 2: Operador Condicional (30 minutos) Exerccio 3: Mdia numrica (15 minutos) Exerccio 4: Encontre o maior nmero (15 minutos) Durao prevista: 90 minutos

Exerccio 1 | Declarar, Inicializar, Imprimir variveis


Neste exerccio voc ir aprender como declarar e inicializar uma varivel. Voc tambm vai aprender a modificar e imprimir o contedo da varivel.

1.1 | Montando e executando o programa ImprimirVariavel usando comando javac and java.
1. V para seu diretrio de trabalho, onde voc est escrevendo seus programas Java.
> cd \myjavaprograms

2. Escreva a classe ImprimirVariavel.java, usando editor de texto, por exemplo textpad, vi, gedit ou qualquer editor, como mostrado abaixo na Listagem -1.1.
public class ImprimirVariavel { public static void main(String[] args) {

// Variavel valor do tipo int (primitivo), inicializado com 10 int valor = 10;
// Variavel x do tipo char primitivo, inicializada com caracter A

char x; x = A;

// Mostra o valor da variavel valor na saida padrao System.out.println(valor); // Mostra o valor da variavel x na saida padrao System.out.println(O valor de x= + x); } }
Listagem 1.1 : ImprimirVariavel.java

www.3way.com.br

22

Java OO | Laboratrio 2
3. Compile o arquivo ImprimirVariavel.java usando o compilador javac. O comando javac foi instalado junto com J2SE SDK no Laboratrio 0. Est localizado no diretrio %JAVA_HOME%\ bin (Windows) ou $JAVA_HOME/bin (Linux). O resultado da compilao ser a criao do arquivo ImprimirVariavel.class. >javac ImprimirVariavel.java 4. Execute o progama ImprimirVariavel usando o comando java. O comando java inicia a Java VM e executa o programa. Um programa Java pode se constituir de mltiplas classes Java e de um conjunto de bibliotecas. Neste exemplo, o programa ImprimirVariavel contm apenas uma classe simples chamada de ImprimirVariavel.class. Voc deve perceber que o comando java o interpretador Java. >java ImprimirVariavel 10 O valor de x=A 5. Modifique ImprimirVariavel.java como mostra a Listagem-1.2 abaixo. Voc adicionar uma varivel do tipo primitivo double, nomeada como media e mostrar o seu valor.
public class ImprimirVariavel { public static void main(String[] args) {

// Variavel valor do tipo int (primitivo), inicializado com 10 int valor = 10; // Variavel x e do tipo char primitivo, inicializada com caracter A char x; x = A; // Variavel media do tipo double double media = 11; // Mostra o valor da variavel valor na saida padrao System.out.println(valor); // Mostra o valor da variavel x na saida padrao System.out.println(O valor de x= + x); // Mostra o valor da variavel media na saida padrao System.out.println(O valor de media= + media); } }
Listagem -1.2: ImprimirVariavel.java modificado

www.3way.com.br

23

Java OO | Laboratrio 2
7. Compile e execute o programa. Observe que uma nova mensagem mostrada. >javac ImprimirVariavel.java >java ImprimirVariavel 10 O valor de x=A O valor de media =11.0

Exerccio 2 | Operador Condicional


Neste exerccio voc vai escrever um programa que usa o operador condicional ( ? ). 1. Crie uma nova classe pblica nomeada como OperadorCondicional dentro do arquivo OperadorCondicional.java
public class OperadorCondicional { public static void main(String[] args) {

// Declara e inicializa duas variveies, uma varivel do tipo String


// chamado estado e a outra varivel chamada grau do // tipo primitivo int String estado = ;

int grau = 80;

// pega estado do aluno. estado = ( grau >= 60 ) ? Aprovado : Reprovado; // Imprime estado System.out.println(estado); } }
Listagem 1.3 OperadorCondicional.java

2. Compile e execute o programa.

3. Modifique o programa adicionando as seguintes linhas de cdigo no local apropriado, compile e rode o programa.
int salario = 100000;

Imprima Voc est rico! se salario maior que 50000, ou Voc pobre! caso contrrio.

www.3way.com.br

24

Java OO | Laboratrio 2
Exerccio 3 | Mdia numrica
1. Escreva, compile e execute o programa a baixo. Este programa deve calcular a mdia numrica entre trs nmeros inteiros e imprimi-los na tela.
public class MediaNumerica { public static void main(String[] args) { //declara numeros inteiros int 1num = 10; int Num2 = 20; char nmero$3 = 45; //retorna a media numerica dos tres numeros // e salva-o na variavel media int mdia = (1num+num2+nmero$3)/3; //imprime na sada padro System.out.println(numero 1 = System.out.println(numero 2 = System.out.println(numero 3 = System.out.println(media = + +1num) , num2); num3); mdia);

} }

Listagem 1.4 MediaNumerica.java

2. O programa contm alguns erros, voc deve identific-los com a ajuda do compilador. Ao compilar voc receber mensagens como abaixo, mostrando o nome do programa a linha onde ocorreu o erro e a mensagem de erro. Corrija o programa e execute.
MediaNumerica.java:7: not a statement int 1num = 10; ^ MediaNumerica.java:7: ; expected int 1num = 10; ^ MediaNumerica.java:13: ) expected int mdia = (1num+num2+nmero$3)/3; ^ MediaNumerica.java:16: ) expected System.out.println(numero 1 = +1nums)

3. Modifique o programa para calcular a mdia entre quatro nmeros inteiros e imprima a mdia.

www.3way.com.br

25

Java OO | Laboratrio 2
Exerccio 4 | Encontre o maior nmero
1. Crie uma nova classe no pblica nomeada como MaiorValor dentro do arquivo MaiorNumero.java.
class MaiorValor { /** Construtor para criar uma nova instancia de MaiorValor */ public MaiorValor() { } /** * @param args argumentos de linha de comando */ public static void main(String[] args) { //declare os numeros int num1 = 10; int num2 = 23; int num3 = 5; int max = 0; //determina o maior numero max = (num1>num2)?num1:num2; max = (max>num3)?max:num3; //imprimindo System.out.println(numero 1 = +num1); System.out.println(numero 2 = +num2); System.out.println(numero 3 = +num3); System.out.println(O maior numero = +max);

} }

Listagem 1.5 Programa maior numero

2. Escreva, compile e execute o programa da Listagem-1.5 com os comandos:


> javac MaiorNumero.java > java MaiorValor

Por que isto funcionou? Qual a diferena como os outros programas? 3. Modifique o programa para que a classe MaiorValor seja pblica, alterando a declarao da classe e tente compilar.
public class MaiorValor{...}

4. Seu compilador deve ter emitido uma mensagem de erro como abaixo:
MaiorNumero.java:4: class MaiorValor is public, should be declared in a file named MaiorValor. java public class MaiorValor { ^ 1 error

MaiorValor.java. E agora, resolveu, compilou?

Voc consegue resolver? Ento tente colocar o nome do arquivo igual ao nome classe,

www.3way.com.br

26

Java OO | Laboratrio 3
Lab 3 | Estruturas de Controle Java
Neste laboratrio faremos uso das estruturas de controle de Java. Durao prevista: 60 minutos

Exerccios
Exerccio 1: Estrutura de controle if/else (20 minutos) Exerccio 2: Lao for (20 minutos) Exerccio 3: Lao while (20 minutos)

Exerccio 1 | Estrutura de controle if/else


1. Primeiro programa com if/else 2. Segundo programa com if/else

1.1 | Refazer programa MediaNumerica.java do Lab1 adicionando opo de entrada de usurio com JoptionPane.
1. Escrever, compilar e executar a Listagem-3.1, MediaNota.java, como segue a baixo:

import javax.swing.JOptionPane; public class MediaNota {


public static void main(String[] args) {

int notaIPD = 0; int notaIngles = 0; int notaFisica = 0; double media = 0; // Recebe dados do showInputDialog String snota;

snota = JOptionPane.showInputDialog(Nota IPD entre 0 e 100!); notaIPD = Integer.parseInt(snota); snota = JOptionPane.showInputDialog(Nota Ingls entre 0 e 100!); notaIngles = Integer.parseInt(snota); snota = JOptionPane.showInputDialog(Nota Fsica entre 0 e 100); notaFisica = Integer.parseInt(snota);
// Calcula mdia media = ( notaIPD + notaIngles + notaFisica ) / 3; // Realiza controle if & else if (media >= 60) {

www.3way.com.br

27

Java OO | Laboratrio 3
JOptionPane.showMessageDialog(null, Estrelinhas! Sua media e + media); } else { JOptionPane.showMessageDialog(null, Sem estrelinha! Sua media e + media); } } }Listagem 3.1 MediaNota.java

2. Compile e rode o programa, janelas de entrada de dados aparecero para voc digitar as trs notas conforme imagens abaixo:

Figura 3.1 Caixa Dialogo entre com nota IPD

Figura 3.2 Caixa Dialogo entre com nota Ingls

Figura 3.3 Caixa Dialogo entre com nota Fsica

Figura 3.4 Caixa Dialogo Mensagem com resultado

www.3way.com.br

28

Java OO | Laboratrio 3
3. Modifique o programa como pede abaixo: - se mdia maior que 90 ento mostre Estrela dourada! Sua mdia xxx.0 - se mdia maior que 50 e menor que 90 ento mostre Estrela prateada! Sua mdia - se mdia menor que 50 ento mostre No ganha estrela! Sua mdia xxx.0

xxx.0

1.2 | Construir um segundo exemplo de uso de if/else


1. Escrever, compilar e executar a Listagem-3.2, NumeroExtenso.java, como segue a baixo:

import javax.swing.JOptionPane; public class NumeroExtenso {


public static void main(String[] args) {

String msg = ; int input = 0;


// Pega literal numrico de entrada e converte para int input = Integer.parseInt(JOptionPane.showInputDialog(Entre numero entre 1 e 10)); // Configura varivel msg com string equivalente a entrada if(input == 1) msg = um; else if(input == 2) msg = dois; else if(input == 3) msg = tres; else if(input == 4) msg = quatro; else if(input == 5) msg = cinco; else if(input == 6) msg = seis; else if(input == 7) msg = sete; else if(input == 8) msg = oito; else if(input == 9) msg = nove; else if(input == 10) msg = dez; else msg = Numero Invalido; // Mostra nmero por extenso JOptionPane.showMessageDialog(null, msg);

} }
Listagem 3.2 NumeroExtenso.java

www.3way.com.br

29

Java OO | Laboratrio 3
2. Compile e rode o programa, surgir uma janela de entrada de dados onde voc deve digitar um nmero, veja figuras:

Figura 3.5 Entrada de dados literal numrico

Figura 3.6 Mensagem

3. Modifique o programa anterior, Listagem-3.2, substituindo as estruturas if/else pela switch. 4. Compile e execute.

Exerccio 2 | Lao For


1. Escrever, compilar e executar a Listagem-3.3, TestaFor.java, como segue a baixo:

import javax.swing.JOptionPane; public class TestaFor {


public static void main(String[] args) {

// Declare e inicialize um array de String chamado nomes. String nomes[] = { Beth, Bianca, Luis, Bela, Nico, Ilza, Geronimo, Rafa}; // Esta string ser procurada dentro do array String procuraNome = JOptionPane.showInputDialog(Digite \Ilza\ ou \sem nome\!); // Declara e inicializa um varivel boolean acheiNome. boolean acheiNome = false; // // // // // // Procura no array de String usando o for. O nomes.length retorna o tamanho do array. Este for compara cada elemento do array com o valor de procuraNome que do tipo String. O mtodo equals(...) da classe String usado para comparar Pense a respeito de voc no poder utilizar nomes[i] == procuraNome como lgica de comparao aqui

www.3way.com.br

30

Java OO | Laboratrio 3
for (int i = 0; i < nomes.length; i++) { if (nomes[i].equals(procuraNome)) {

acheiNome = true; break; } }


// Mostra o resultado if (acheiNome)

JOptionPane.showMessageDialog(null, procuraNome + encontrado!); else JOptionPane.showMessageDialog(null, procuraNome + no encontrado!); } }


Listagem 3.3 TestaFor.java

2. Compile e execute o programa, surgir janela de entrada de dados onde voc deve digitar um Nome como Ilza ou sem nome, veja figuras abaixo:

Figura 3.7 Procurar Bela

Figura 3.8 Nome procurado foi encontrado

Exerccio 3 | Lao While/Do-While


1. Primeiro programa com while 2. Segundo programa com do-while

3.1 | Lao while e a classe java.util.Scanner. so usado neste exemplo


1. Escrever, compilar e executar a Listagem-3.4, TestaWhile.java, como segue a baixo:

import java.text.DecimalFormat;

www.3way.com.br

31

Java OO | Laboratrio 3
import java.util.Scanner; public class TestaWhile {

public static void main(String args[]) {

// declara variveis inteiras int contadorNota, valorNota, total; // declara varivel media double double media;

total = 0; contadorNota = 1;

// Classe Scanner utilizada para ler entrada de dados digitado pelo usurio Scanner leitor = new Scanner(System.in);

System.out.println(Entre com 4 notas inteiras, ou valor negativo para sair); System.out.println(Digite nota( + contadorNota + ) :);
// l o que o usurio digitou e converte para um int valorNota = leitor.nextInt(); // Testa antes de entrar se valorNota que foi digitado maior que um while (( valorNota > -1 )) {

if (contadorNota >= 4){ break;

total += valorNota;

} contadorNota++; System.out.println(Digite nota( + contadorNota + ) :); valorNota = leitor.nextInt(); }


if (( contadorNota > 0 ) && ( valorNota > 0 )) {

media = (double) total / contadorNota;

// Usa DecimalFormat para formatar valor // double com 2 casas decimais DecimalFormat doisDigitos = new DecimalFormat(0.00); System.out.println(A mdia : + doisDigitos.format(media));

} else { System.out.println(No inseriu nota ou leitura interrompida!); } System.exit(0); } }


Listagem 3.4 TestaWhile.java

2. Neste programa a classe Scanner usada para capturar entrada de dados do teclado que for digitada na console.

3.2 | Lao do-while


1. Escrever, compilar e executar a Listagem-3.5, TestaDoWhile.java, como segue a baixo, para implementar a mesma lgica do exemplo anterior usando lao do-while:

www.3way.com.br

32

Java OO | Laboratrio 3
import java.text.DecimalFormat; import java.util.Scanner; public class TestaDoWhile {

public static void main(String args[]) {

// declara variveis inteiras int contadorNota, valorNota, total; // declara varivel media double double media;

total = 0; contadorNota = 1;

// Classe Scanner utilizada para ler entrada de dados digitado pelo usurio Scanner leitor = new Scanner(System.in); System.out.println(Entre com 4 notas inteiras, ou valor negativo para sair); // Testa antes de entrar se valorNota digitado maior que um do { System.out.println(Digite nota( + contadorNota + ) :); // l o que o usurio digitou e converte para um int valorNota = leitor.nextInt(); total = total + valorNota; contadorNota++; } while (( valorNota > -1 ) && ( contadorNota < 5 )); if (( contadorNota > 0 ) && ( valorNota > 0 )) { media = (double) total / --contadorNota; // Usa DecimalFormat para formatar valor double com 2 casas decimais DecimalFormat doisDigitos = new DecimalFormat(0.00); System.out.println(A mdia : + doisDigitos.format(media)); } else { System.out.println(No inseriu nota ou leitura interrompida!); } System.exit(0); } }
Listagem 3.5 TestaDoWhile.java

2. Perceba a diferena entre os controles while e do-while, o primeiro testa, forando uma leitura adiantada para depois executar o trecho de cdigo, o segundo executa primeiro as instrues e s testa ao final se deve continuar a repetir as instrues.

www.3way.com.br

33

Java OO | Laboratrio 4
Lab 4 | Vetores e Matrizes em Java
Neste laboratrio construiremos e executaremos exemplos de programas que usam arrays em Java, tambm conhecidos como matrizes e vetores. Durao prevista: 90 minutos

Exerccios Exerccio 1: Construindo arrays de primitivos inteiros (40 minutos) Exerccio 2: Construindo arrays de objetos String (50 minutos)

Exerccio 1 | Construindo Arrays de Primitivos Inteiros


1. Usando arrays unidimensionais de inteiros 2. Usando arrays bidimensionais de inteiros 3. Busca maior valor

1.1 | Usando arrays unidimensionais de inteiros


1. Escreva, compile e execute a Listagem-4.1, UniArr ay.java, preste bastante ateno aos comentrios.

public class UniArray { public static void main(String[] args) {

// Declara e cria um array de int com tamanho 10 int[] idades = new int[10]; // Imprime o valor de cada elemento do array for (int i = 0; i < idades.length; i++) { System.out.print(idades[i]); } } }
Listagem 4.1 UniArray.java

2. Compile e execute o programa, veja o resultados


0000000000

3. Antes do lao for que imprime os valores modifique o programa UniArray.java, crie outro lao for para inicializar os elementos do array idades de modo que cada entrada fique como na sequncia: idades[0]=31, idades[1]=32 ... idades[n]=N e assim por diante.

www.3way.com.br

34

Java OO | Laboratrio 4
1.2 | Usando arrays bidimensionais de inteiros
1. Escreva, compile e execute a Listagem-4.2, BiDArray.java, preste bastante ateno aos comentrios.

public class BiDArray { public static void main(String[] args) {

// Declara e cria um array de duas dimenses de int com tamanho 10x5 int[][] idades = new int[10][5]; // Mostra numero de linhas e colunas System.out.println(idades.length = + idades.length); //linhas System.out.println(idades.length[1] = + idades[1].length); //colunas // Imprime o valor de cada elemento do array for (int i = 0; i < idades.length; i++) { System.out.println(\n Linha inicio + i); for (int j = 0; j < idades[i].length; j++) { idades[i][j] = i * j; System.out.print(idades[i][j] + ); } } } }
Listagem 4.2 BiDArray.java

2. Compile e execute o programa, veja o resultado:


idades.length =10 idades.length[1] =5 Linha 0 0 0 0 0 0 Linha 1 0 1 2 3 4 Linha 2 0 2 4 6 8 Linha 3 0 3 6 9 12 Linha 4 0 4 8 12 16 Linha 5 0 5 10 15 20 Linha 6 0 6 12 18 24 Linha 7 0 7 14 21 28 Linha 8 0 8 16 24 32 Linha 9 0 9 18 27 36

3. Crie um programa TriDArray.java que declara um array tridimensional de inteiros e inicialize cada clula com um nmero crescente comeando de 1000, 1001, 1002 ... N, assim por diante.

www.3way.com.br

35

Java OO | Laboratrio 4
1.3 | Busca maior valor
1. Escreva, compile e execute a Listagem-4.3, MaiorNumero.java, preste bastante ateno aos comentrios.
import javax.swing.JOptionPane; public class MaiorNumero { public static void main(String[] args) {

int[] num = new int[10]; int contador; int max = 0; int numerostotal = 3; // Pede ao usurio para digitar nmeros for (contador = 0; contador < numerostotal; contador++) { num[contador] = Integer.parseInt(JOptionPane.showInputDialog(Entre com nmeros at + numerostotal + no total)); // verifica se o nmero digitado maior que max if (( contador == 0 ) || ( num[contador] > max )) max = num[contador]; } // Mostra o maior nmero. JOptionPane.showMessageDialog(null, O maior nmero + max); } }
Listagem 4.3 MaiorNumero.java

2. Compile e execute o programa e veja o resultado. 3. Modifique o programa para achar o menor nmero e mostr-lo.

Exerccio 2 | Construindo Arrays de Objetos String


1. Usando arrays unidimensionais de String

1.1 | Usando arrays unidimensionais de String


1. Escreva, compile e execute a Listagem-4.4, DiasDaSemana.java, preste bastante ateno aos comentrios.
public class DiasDaSemana { public static void main(String[] args) {

// Declara e inicializa um array de String contendo os dias da semana String[] dias = { Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado }; // Mostra dias da semana com lao forEach/Enhenced for Java 5.0 System.out.println(Mostra dias da Semana usando lao For-Each); for (String str : dias) System.out.print(str + );

www.3way.com.br

36

Java OO | Laboratrio 4
// Declara e inicializa um array de String contendo os dias da semana em Ingls // veja que para cada elemento voc cria um objeto do tipo usado pelo array String[] days = new String[7]; days[0] = new String(Sunday); days[1] = new String(Monday); days[2] = new String(Tuesday); days[3] = new String(Wednesday); days[4] = new String(Thursday); days[5] = new String(Friday); days[6] = new String(Saturday); // imprime a traducao de portugues-ingles dos dias da semana System.out.println(\nPORTUGUES - INGLES); for (int i = 0; i < dias.length; i++) { System.out.println(dias[i] + - + days[i]); } } }
Listagem 4.4 DiasDaSemana.java

3. Crie um programa como o anterior, que contenha um nico array bidimensional de String, onde cada linha contenha a String em Portugus e em Ingls do dia da semana, como exemplo dias[0][0]=Segunda, dias[0][1]=Monday ..., e assim por diante.

www.3way.com.br

37

Java OO | Laboratrio 5
Lab 5 | Usando Objetos em Java
Neste laboratrio faremos uso de objetos Java, objetos de bibliotecas bsica, reforando experincia de programao em Java e outros conceitos bsicos como invocao de mtodos (de classe e de instncia), classes bsicas do pacote java.lang.

Durao prevista: 160 minutos Exerccios

Exerccio 1: Criando uma instncia de objeto de uma classe usando a palavra chave new (20 minutos) Exerccio 2: Mtodos estticos e mtodos de instncia (no - esttico) (20 minutos) Exerccio 3: Argumentos passado por valor e por referncia (20 minutos) Exerccio 4: Escopo de variveis (20 minutos) Exerccio 5: Coeso de tipos primitivos e classe Wrapper (30 minutos) Exerccio 6: Comparando objetos (30 minutos) Exerccio 7: Mtodo getClass() e o operador instanceof (20 minutos)

Exerccio 1 | Criando uma instncia de objeto de uma classe usando a palavra chave new (20 minutos)
1.1 | Criando objetos da classe String
1. Usando sua IDE ou editor de arquivo crie um arquivo ClasseEObjeto.java com base na Listagem-2.1 abaixo. Estude o cdigo prestando muita ateno aos comentrios.
public class ClasseEObjeto { public static void main(String[] args) { } }
Listagem 2.1 ClasseEObjeto.java

// Para criar uma instncia de uma classe use a palavra chave new // Por exemplo, para criar uma instncia da classe String // procedemos como segue String strObjeto1 = new String(Este objeto e uma instncia da classe String); System.out.println(estado da instncia de strObjeto1 = + strObjeto1); // A classe String e uma classe especial que permite a criao de uma // instncia pela atribuio de um literal string. Nenhuma outra classe // em java permite este tipo de criao. Alm disso para cada literal // string e criada uma nica instncia desta string String strObjeto2 = Este objeto uma instncia da classe String; System.out.println(estado da instncia de strObjeto2 = + strObjeto2);

www.3way.com.br

38

Java OO | Laboratrio 5
2. Compile e execute o programa ClasseEObjeto.java, observe o resultado da execuo:
estado da instncia de strObjeto1 = Este objeto uma instncia da classe String estado da instncia de strObjeto2 = Este objeto uma instncia da classe String

3. Modifique o programa ClasseEObjeto.java para criar outra instncia da classe String contendo o literal string Eu sou outra instncia da classe String e imprimir seu estado usando o mtodo System.out.println(...)

1.2 | Criando objetos da classe Integer


1. Com base no programa ClasseEObjeto.java, modifique o programa para criar um objeto da classe Integer (classe Wrapper do tipo primitivo int) cujo valor 20, veja na Listagem-2.2.
public class ClasseEObjeto { public static void main(String[] args) { } }
Listagem 2.2 ClasseEObjeto.java criando objeto Interger

// Para criar uma instncia de uma classe use a palavra chave new // Por exemplo, para criar uma instncia da classe String // procedemos como segue String strObjeto1 = new String(Este objeto e uma instncia da classe String); System.out.println(estado da instncia de strObjeto1 = + strObjeto1); // A classe String e uma classe especial que permite a criao de uma // instncia pela atribuio de um literal string. Nenhuma outra classe // em java permite este tipo de criao. Alm disso para cada literal // string e criada uma nica instncia desta string String strObjeto2 = Este objeto uma instncia da classe String; System.out.println(estado da instncia de strObjeto2 = + strObjeto2); // cria uma instncia de objeto da classe Integer Integer intObjeto1 = new Integer(20); System.out.println(estado da instncia de intObjeto1 = + intObjeto1);

2. Modifique o programa anterior para criar e imprimir uma instncia da classe Double e imprimir seu estado.

Exerccio 2 | Mtodos estticos e mtodos de instncia (no esttico)


Neste exerccio, voc aprender como invocar mtodos estticos (de classe) e noestticos (de instncia) de uma classe. Para invocar mtodos estticos usamos a seguinte forma:
<Nome da Classe>.<Nome do mtodo esttico>

www.3way.com.br

39

Java OO | Laboratrio 5
por exemplo,
Integer.parseInt(25); // parseInt um mtodo esttico da classe Integer

Um mtodo no-esttico (instncia) de uma classe s pode ser invocado a partir de uma instncia do objeto da classe usando a seguinte forma:
<Nome da instncia de uma classe>.<Nome do mtodo no-esttico>

por exemplo,
String str = new String(Brazil com z); //cria instncia do objeto str.charAt(0); //chama mtodo de instncia charAt()

//da classe String atravs da instncia do objeto

1. Crie o programa MetodosInstanciaEEstatico.java com base na Listagem-2.3 a abaixo.


public class MetodosInstanciaEEstatico { public static void main(String[] args) { // Cria duas instncias da classe String String strInst1 = new String(Sou uma instncia de objeto da classe String); String strInst2 = Viva com paixo!; // Invoca o mtodo de instncia charAt() // atravs das instncias da classe String char x = strInst1.charAt(2); char y = strInst2.charAt(1); char z = strInst2.charAt(0); System.out.println(O 3.o caracter da strInst1 = + x); System.out.println(O 2.o caracter da strInst2 = + y); System.out.println(O 1.o caracter da strInst2 = + z);

// Invoca o mtodo de instncia equalsIgnoreCase(...) boolean b = strInst1.equalsIgnoreCase(strInst2); String strInst3 = b ? Sim : No; System.out.println(As variveis strInst1 + e strInst2 tem o mesmo + conjunto de caracteres? + strInst3); // Invoca um mtodo esttico, valueOf (int i), da classe String int i = 23; String strInst4 = String.valueOf(i); System.out.println(valor de strInst4 = + strInst4); } }
Listagem 2.3 MetodoInstanciaEEstatico.java

// Voc j usou o mtodo esttico parseInt() da classe // Integer no exerccio anterior // Agora cria uma instncia de objeto da classe String String strInst5 = new String(34); int ii = Integer.parseInt(strInst5); System.out.println(valor de ii = + ii);

2. Compile, rode o programa e observe o resultado.

www.3way.com.br

40

Java OO | Laboratrio 5
3. Modifique o programa MetodosInstanciaEEstatico.java para que o mesmo contenha as instrues abaixo no final do mtodo main().
// O seguinte codigo ira gerar erro de compilacao // uma vez que ele tentara invocar um metodo de instancia // atraves do nome da classe. Corrija o este erro de compilacao char f = String.charAt(2);

4. Compile o programa. O seguinte erro ser gerado pelo compilador:


Cannot make a static reference to the non-static method charAt(int) from the type String

5. Corrija o erro de compilao e novamente compile e execute o programa.

6. Como vou saber se um mtodo qualquer na biblioteca de Java esttico ou de instncia? A resposta : consulte a documentao da API Java (http://docs.oracle.com/javase/6/docs/ api/java/lang/String.html#charAt(int) e veja se o mtodo em questo possui em sua assinatura a palavra chave static. Veja na figura:

7. Acrescente o trecho de cdigo abaixo, Listagem-2.4, no programa anterior. Consulte na documentao da API se os mtodos so estticos ou de instncia e faa a correta invocao do mtodo.
// mtodo endsWith() String str = Hello; System.out.println( str.endsWith( slo ) ); // mtodo floor() System.out.println( Math.floor(3.14)); // mtodo isDigit() System.out.println( 0= + Character.isDigit(0)); System.out.println( A= +Character.isDigit(A));
Listagem 2.4 Identifique quais mtodos so de classe ou de instncia

www.3way.com.br

41

Java OO | Laboratrio 5
Exerccio 3 | Argumentos de mtodos passado por valor e por referncia
Neste exerccio, voc ira praticar o conceito da passagem de parmetro por valor. Note que os parmetros de tipos primitivos so passados o valor, enquanto parmetros do tipo referncia so passados a referncia. Um array considerado um tipo referncia mesmo que os valores armazenados nele sejam de um tipo primitivo.

3.1 | Passagem de parmetros por valor

1. Escreva, compile e execute a Listagem-2.5, TestaPassagemValor.java, preste bastante ateno aos comentrios.
public class TestaPassagemValor { public static void main(String[] args) { } int i = 10; // Imprime valor de i System.out.println(inicia mtodo main e i = + i); // Chama mtodo test, que est definido abaixo // e passa valor inteiro como um parmetro. Uma vez que // int um tipo primitivo, este argumento e passado // por valor. test(i); // imprime o valor de i, note que valor de i no muda System.out.println(termina o mtodo main e i = + i);

// Mtodo esttico na classe public static void test(int j) { } }


Listagem 2.5 Passagem de parmetro por valor

System.out.println(inicia mtodo test e j = + j); // muda valor parmetro i j = 33; System.out.println(termina mtodo test e j = + j);

2. Modifique TestaPassagemValor.java como segue abaixo e execute a classe.

2.1. Passe um segundo parmetro de tipo primitivo para o mtodo test, exemplo test(int j, int k) - voc pode escolher qualquer parmetro de tipo primitivo (tal como long ou boolean). 2.2. Atribua um valor ao segundo parmetro antes de chamar o mtodo test(...). E mude o valor do parmetro passado dentro do mtodo test(...), como voc fez com o primeiro parmetro na Listagem-2.5 acima. 2.3. Modifique os mtodos System.out.println(...) para indicar os valores do primeiro parmetro e do segundo parmetro.

www.3way.com.br

42

Java OO | Laboratrio 5
3.2 | Passagem de parmetros por referncia
1. Escreva, compile e execute a Listagem-2.6, TestaPassagemReferencia.java, preste bastante ateno aos comentrios.
import java.util.Arrays; public class TestaPassagemReferencia { public static void main(String[] args) { } // criando um array de inteiros int[] i = { 10, 20, 30 }; // Imprime valor de i System.out.println(inicia metodo main e i = + Arrays.toString(i)); // Chama mtodo test que est definido abaixo, // e passa por referncia o array de inteiro como um parmetro. // Uma vez que um array do tipo referncia, // este argumento e passado // por referncia. test(i); // imprime o valor de i. Note que o valor de i no muda System.out.println(termina o mtodo main e i = + Arrays.toString(i));

// Mtodo esttico na classe public static void test(int[] j) { } }


Listagem 2.6 Passagem de parmetros por referncia

System.out.println(inicia mtodo test e j = + Arrays.toString(j)); // muda valor do parmetro i j[0] = 33; j[1] = 66; System.out.println(termina mtodo test e j = + Arrays.toString(j));

2. Observe que a classe utiliza o mtodo toString() da classe java.util.Arrays para podermos imprimir o conjunto de elementos do array, apesar de ainda no termos visto arrays em Java o exerccio demonstra bem o conceito. 3. bom saber que a referncia tratada como um tipo primitivo, a final ele simplesmente armazena o endereo de um objeto, logo a referncia passada por valor. Pense nisso.

Exerccio 4 | Escopo de variveis


Neste exerccio, voc praticar o conceito de escopo de varivel. Voc tambm aprender como declarar trs tipos de variveis: varivel esttica, varivel de instncia e a varivel local.

www.3way.com.br

43

Java OO | Laboratrio 5
4.1 | Um programa que demonstra escopo de variveis
1. Escreva, compile e execute a Listagem-2.7, EscopoDeVariavel.java, preste bastante ateno aos comentrios.
public class EscopoDeVariavel { public static void main(String[] args) {

int var1 = 10; if (var1 < 100) { int var2 = 20; } else { int var2 = 21; } // Acesso a var1 permitido, ento no h erro de compilao. System.out.println(valor de var1 = + var1); // Acesso a var2 no permitido, ento erro de compilao ser gerado System.out.println(valor de var2 = + var2); } }
Listagem 2.7 Escopo de varivel

2. Observe que haver um erro de compilao. Isto era esperado porque voc est tentando ter acesso a varivel var2 e ela foi declarada dentro das { } do bloco if/else, ento o escopo de acesso somente dentro das { } e no pode usada fora de seu escopo. 3. Modifique EscopoDeVariavel.java, como mostra a Listagem-2.8. Observe os comentrios.
public class EscopoDeVariavel { public static void main(String[] args) { int var1 = 10; // var2 agora esta definida em todo escopo do metodo main int var2 = 15;

if (var1 < 100) { // int var2 = 20; var2 = 20; } else { // int var2 = 21; var2 = 21; } } }
Listagem 2.8 EscopoDeVariavel.java modificado

// Acesso a var1 permitido, ento no h erro de compilao. System.out.println(valor de var1 = + var1); // Acesso a var2 agora permitido, no h erro de compilao System.out.println(valor de var2 = + var2);

www.3way.com.br

44

Java OO | Laboratrio 5
4. Compile e execute o programa modificado.

4.2 | Um programa que usa trs tipos de variveis

1. Escreva, compile e execute a Listagem-2.9, TresTiposDeVariaveis.java, preste bastante ateno aos comentrios.
public class TresTiposDeVariaveis { // Exemplo de varivel esttica static String staticVariable = Varivel de classe, ou esttica; // Exemplo de varivel de instncia String instanceVariable = varivel de instncia; public static void main(String[] args) { } String localVariable = varivel local; System.out.println(Varivel esttica = + staticVariable); System.out.println(Varivel de instncia = + instanceVariable); System.out.println(Varivel local = + localVariable);

}
Listagem 2.9 TresTiposDeVariaveis.java

2. Observe que variveis de instncia no podem ser referenciadas dentro de um contexto esttico, o mtodo main() esttico. 3. Comente a linha de cdigo contendo o erro, compile e execute o programa. 4. Pense em outra forma de resolver este problema se for necessrio acessar a varivel de instncia instanceVariable.

Exerccio 5 | Casting de tipos primitivos e classe Wrapper


Neste exerccio, voc praticar a moldagem (casting) de tipos primitivos e como converter primitivos s classes de empacotamento (Wrapper) correspondentes e vice versa. Casting de tipos de referncia sero exercitados em outro laboratrio. 1. Casting de tipos primitivos. 2. Convertendo primitivos para classes Wrapper.

5.1 | Casting de tipos primitivos


1. Escreva, compile e execute a Listagem-2.10, CastingPrimitivos.java, preste bastante ateno aos comentrios.
public class CastingPrimitivos { public static void main(String[] args) {

// casting implicito exemplo 1 int numInt = 10;

www.3way.com.br

45

Java OO | Laboratrio 5
double numDouble = numInt; System.out.println(int + numInt + e implicitamente moldado para double + numDouble); // casting implicito exemplo 2 int numInt1 = 3; int numInt2 = 2; double numDouble2 = numInt1 / numInt2; System.out.println(numInt1/numInt2 + numInt1 / numInt2 + e implicitamente moldado para + numDouble2); // casting explicito exemplo 1 double valDouble = 10.12; int valInt = (int) valDouble; System.out.println(double + valDouble + e explicitamente moldado para int + valInt); // casting explicito exemplo 2 double x = 10.2; int y = 2; int resultado = (int) ( x / y ); System.out.println(x/y + x / y + e explicitamente moldado para int + resultado); } }
Listagem 2.10 CastingPrimitivos.java

2. Compile e execute o programa, veja o resultados:


int 10 e implicitamente moldado para double 10.0 numInt1/numInt2 1 e implicitamente moldado para 1.0 double 10.12 e explicitamente moldado para int 10 x/y 5.1 e explicitamente moldado para int 5

Em (1) e (2) ocorre uma converso explicita dos tipos, ou seja, o Java o faz automaticamente. Em (2) ocorre uma diviso de nmeros inteiros resultado em um nmero inteiro que transformado em double. J em (3) h uma diviso de inteiro/double resultando em um double. Neste caso dizemos que est ocorrendo uma promoo numrica ou um alargamento do tipo.

3. Modifique o programa para fazer casting dos tipos long ->byte, float->short, int-> char.

5.2 | Convertendo primitivos para classes Wrapper


1. Escreva, compile e execute a Listagem-2.10, CastingPrimitivos.java, preste bastante ateno aos comentrios.
public class PrimitivaParaWrapper { public static void main(String[] args) { // cria uma instncia de objeto Integer Integer intObjeto = new Integer(7801); // Converte de Integer para primitivo int usando mtodo intValue() int intPrimitiva = intObjeto.intValue(); System.out.println(int intPrimitiva = + intPrimitiva); // Usando mtodo esttico da classe empacotadora Integer // para converter uma String para o tipo primitivo int String strInt = 65000; int intConvertida = Integer.parseInt(strInt);

www.3way.com.br

46

Java OO | Laboratrio 5
} }
Listagem 2.10 PrimitivaParaWrapper.java, converte de primitivos para empacotadora e vsv

System.out.println(int intConvertida = + intConvertida); // Converte int primitivo para tipo Integer Integer intObjeto2 = new Integer(intConvertida); System.out.println(Integer intObjeto2 = + intObjeto2);

2. Compile e rode o programa, observe e procure entender o resultado.

3. Modifique o programa da Listagem-2.10 para criar uma varivel do tipo Long e convert-la em seu tipo primitivo long, depois mostre seu valor. 4. Em Java 5.0 estas converses ocorrem implicitamente, pois agora h o recurso de Autobox (empacotar) e AutoUnbox (desempacotar). Modifique a Listagem-2.10 para que fique como na Listagem-2.11. Perceba como isso torna menos burocrtico o processo de converso de primitivos para Wrapper e vice-versa.
public class AutoBoxUnbox { public static void main(String[] args) { } }
Listagem 2.11 - AutoBoxUnbox.java

// cria uma instncia de objeto Integer, autobox Integer intObjeto = 7801; // Converte de Integer para primitivo int, auto-unbox int intPrimitiva = intObjeto; System.out.println(int intPrimitiva = + intPrimitiva); // Usando mtodo esttico da classe empacotadora Integer // para converter uma String para o tipo Integer, autobox String strInt = 65000; Integer intConvertida = Integer.parseInt(strInt); System.out.println(int intConvertida = + intConvertida); // Converte Integer para primitivo int, autoUnbox int intPrimitiva2 = intConvertida; System.out.println(Integer intObjeto2 = + intPrimitiva2);

Exerccio 6 | Comparando objetos


1. Escreva, compile e execute a Listagem-2.12, TestaIgualdadeObjeto.java, preste bastante ateno aos comentrios.
public class TestaIgualdadeObjeto { public static void main(String[] args) { // Declara duas variveis do tipo String, str1 e str2 String str1, str2; // Inicializando as variveis. Note que as variveis contem // ponteiros para instncia de mesmo objeto atual. str1 = Viver sem Deus...no viver!;

www.3way.com.br

47

Java OO | Laboratrio 5
} }
Listagem 2.12 TestaIgualdadeObjeto.java

str2 = str1; // Mostra o valor das variveis str1 e str2 System.out.println(String1: + str1); System.out.println(String2: + str2); // A notao ==, quando e usada com variveis de referncia, // se retornar true significa que as variveis apontam para // mesma instncia de um objeto, e se false no, so referencias diferentes // Checa se str1 e str2 so o mesmo objeto para as duas variveis // apontando para mesma instncia de um objeto do tipo String System.out.println(Mesmo objeto? + ( str1 == str2 )); // Reinicializa varivel str2. Ela agora aponta para um nova // instncia de objeto String str2 = new String(str1); // Mostra valor das variveis str1 e str2 System.out.println(String1: + str1); System.out.println(String2: + str2); // Checa novamente se str1 e str2 so os mesmos // objetos para as duas variveis // apontando para mesma instncia de um objeto do tipo String System.out.println(Mesmo objeto? + ( str1 == str2 )); // Checa se str1 e str2 tem o mesmo valor System.out.println(Mesmo valor? + str1.equals(str2));

2. Compile e execute o programa.

3. Crie um programa como da Listagem-2.12 para criar e comparar dois objetos da classe Integer. 4. String so objetos especiais em Java, podemos criar instncias de objetos apenas atribuindo um literal a uma varivel do tipo String, exemplo:
String str1 = Viver sem Deus...no viver!; String str2 = Viver sem Deus...no viver!;

Alm disso, cada objeto String criado desta forma apontam para mesma instncia do objeto, ou seja qualquer literal String igual ao anterior apontar para o mesmo objeto. Modifique o programa da Listagem-2.12 para demonstrar essa propriedade

Exerccio 7 | mtodo getClass() e o operador instanceof


Neste exerccio, voc usar o mtodo do getClass() da classe Object para encontrar uma instncia de um objeto fora da classe. Voc aprender tambm como usar o operador instanceOf para testar se uma instncia de objeto qualquer de um tipo particular de classe. 1. Usando mtodo getClass() 2. Usando operador instanceOf

www.3way.com.br

48

Java OO | Laboratrio 5
7.1 | Usando mtodo getClass()
1. Escreva, compile e execute a Listagem-2.13, TestaGetClass.java, preste bastante ateno aos comentrios.
public class TesteGetClass { public static void main(String[] args) { } }
Listagem 2.13 TestaGetClass.java

// Cria instncia de objeto String String str1 = A vida e para ser vivida... com Deus!; // Encontrar informao externa de uma instncia de String // via mtodo getClass(). Note que ele retorna uma instncia // de objeto da classe Class Class str1Class = str1.getClass(); System.out.println(A classe de str1 e uma instncia de + str1Class); // O nome da classe da instncia de objeto Class. String str1ClassName = str1Class.getName(); System.out.println(Nome da classe e + str1ClassName); // Cria instncia de objeto Integer Integer int1 = new Integer(34); // Encontrar informao externa de uma instncia de Integer // via mtodo getClass(). Note que ele retorna uma instncia // de objeto da classe Class Class int1Class = int1.getClass(); System.out.println(A classe de int1 uma instncia de + int1Class); // O nome da classe da instncia de objeto Class. String int1ClassName = int1Class.getName(); System.out.println(Nome da classe + int1ClassName);

2. Monte, compile e execute.

3. Modifique o programa para criar uma instncia de objeto da classe java.util.Date e mostre informaes desta classe.

7.2 | Usando operador instanceOf


1. Escreva, compile e execute a Listagem-2.14, TestaInstanceOf.java, preste bastante ateno aos comentrios.
public class TestaInstanceOf { public static void main(String[] args) { // Criar objeto String String str1 = Aprenda Java em Dez anos!; Integer int1 = new Integer(40);

www.3way.com.br

49

Java OO | Laboratrio 5
} }
Listagem 2.14 TestaInstanceOf.java

// Checa se str1 do tipo String usando operador instanceof. // Checa tambm se do tipo Object. boolean b1 = str1 instanceof String; System.out.println(str1 String: + b1); boolean b2 = str1 instanceof Object; System.out.println(str1 Object: + b2); // Checa se int1 do tipo Integer usando operador instanceof. // Checa tambm se do tipo Object. b1 = int1 instanceof Integer; System.out.println(int1 do tipo Integer: + b1); b2 = int1 instanceof Object; System.out.println(int1 Object: + b2); b2 = int1 instanceof Number; System.out.println(int1 do tipo Number: + b2);

2. Consultando a documentao da API Java, voc vai observar que classe Integer uma classe filha da classe java.lang.Number, e que esta filha de java.lang.Object. Por isto o teste de int1 instanceof Number retorna true.

3. Modifique o programa para criar uma instncia de objeto da classe Long e mostre que o objeto do tipo Object, Number e da prpria classe Long.

www.3way.com.br

50

Java OO | Laboratrio 6
Lab 6 | Criando suas prprias classes
Neste laboratrio voc ir aprender a criar e usar suas prprias classes. A patir deste laboratrio os exerccios dos prximos laboratrios possuem dependncias, ento deve ser feito todos os exerccios, no pule nenhum exerccio porque ir precisar das classes que sero criadas e das alteraes dos mtodos soliticadas. Lei atentamente os comentrios nos cdigos citados, eles so importantes para voc entender o que est fazendo ou para qual utilidade do cdigo. O projeto destes laboratrios a partir deste chegar ao final do curso com uma aplicao completa representando o sistema de um banco ou empresa que trabalha com dinheiro e vrias contas para armazenar os saldos. muito importante que seja feito os exerccios corretamente para que a aplicao no tenha comportamentos estranhos. Em caso de dvida para resolver um exerccio consulte o instrutor para a melhor soluo ou para descobrir o erro. Apesar de a ferramenta sugerir o que deve ser feito para resolver alguns erros de compilao, se voc no sabe ou no entende a soluo proposta, ento no a faa e tome cuidado com a importao de classes de pacotes diferente do solicitado. O diagrama abaixo mostra como ficar a parte de modelo do projeto, onde um cliente ter UMA ou vrias CONTAS, uma CONTA de apenas uma AGNCIA e uma AGNCIA de um banco, agora lendo o contrrio, um BANCO no tem nenhuma ou tem vrias AGNCIAS, uma AGNCIA no tem nenhuma ou tem vrias CONTAS, uma CONTA no tem nenhum ou tem vrios clientes.

Figura 5.1 Diagrama UML para aplicao Banco

www.3way.com.br

51

Java OO | Laboratrio 6
Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse. Durao prevista: 80 minutos Exerccios Exerccio 1: Definindo e usando classes ( 20 minutos) Exerccio 2: Membros estticos (10 minutos) Exerccio 3: Sobrecarga (20 minutos) Exerccio 4: Construtores (10 minutos) Exerccio 5: referencia this (20 minutos)

Exerccio 1 | Definindo e usando classes


1. Criando uma classe Conta.java, que representa uma conta de banco.

1.1 | Definindo a nova classe Conta.java


1. Crie um novo projeto com o nome Banco e crie sua classe para que fique conforme a especificao UML abaixo.

Figura 5.1 Diagrama UML classe Conta

import java.util.Date; public class Conta { private private private private }


Listagem 5.1 Conta.java

int numero; String titular; double saldo; Date dataAbertura;

2. Crie os mtodos getters e setters para todos os atributos da classe Conta.java conforme exemplo abaixo:
public int getNumero() { return numero; }

www.3way.com.br

52

Java OO | Laboratrio 6
public void setNumero(int numero) { this.numero = numero; }

3. Crie a classe ContaService.java com os mtodos depositar(), sacar() e transferir() conforme o cdigo na Listagem-5.2.

Figura 5.2 Diagrama UML classe ContaService

public class ContaService { public void depositar(Conta contaDestino, double valor) {

// credita na conta e debita no caixa contaDestino.setSaldo(contaDestino.getSaldo() + valor); } public void sacar(Conta contaSaque, double valor) {

// debita na conta e credita no caixa contaSaque.setSaldo(contaSaque.getSaldo() - valor); } public void transferir(Conta contaSaque, double valor, Conta contaDestino) {

// transfere valor da conta para conta destino this.sacar(contaSaque, valor); this.depositar(contaDestino, valor); } }
Listagem 5.2 Classe ContaService.java

4. Agora crie uma nova classe TestaConta.java para fazer uso da classe Conta.java e testarmos os seus mtodos conforme abaixo:
import java.util.Scanner; public class TestaConta { public static void main(String[] argv) {

// objeto para ler dados da console, captura o que for digitado Scanner c = new Scanner(System.in); // declara e inicializa saldo com valor digitado pelo usurio System.out.println(Digite o saldo inicial da conta); double saldoConta = c.nextDouble(); // declara e inicializa o numero da conta digitado pelo usurio System.out.println(Digite o numero da conta); int numeroConta = c.nextInt();

www.3way.com.br

53

Java OO | Laboratrio 6
// Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta ContaService operacoesConta = new ContaService(); // cria uma instncia da classe Conta Conta conta1 = new Conta(); // altera valor dos atributos da instncia da classe Conta conta1.setNumero(numeroConta); conta1.setSaldo(saldoConta); // Nova instncia de Conta para transferncia Conta conta2 = new Conta(); // Nova instncia de Conta para transferncia Conta conta3 = new Conta(); // Mostra dados da instncia da classe Conta System.out.println(O numero da Conta1 : + conta1.getNumero()); System.out.println(O saldo da Conta1 : + conta1.getSaldo()); // chamada ao mtodo depositar para adicionar saldo da conta System.out.println(Ser creditado 100 reais na conta ); operacoesConta.depositar(conta1, 100.00); System.out.println(Saldo da Conta1 : + conta1.getSaldo()); // chamada ao mtodo sacar para debitar no saldo da conta System.out.println(Ser debitado 56.43 reais na conta ); operacoesConta.sacar(conta1, 56.43); System.out.println(Saldo da Conta : + conta1.getSaldo()); System.out.println(Saldo da Conta 1 : + conta1.getSaldo()); System.out.println(Saldo da Conta 2 : + conta2.getSaldo()); System.out.println(Saldo da Conta 3 : + conta3.getSaldo()); // chamada ao mtodo tranferir para retirar o valor de conta1 para conta2 System.out.println(Transferir 50.00 de conta 1 para conta2 ); operacoesConta.transferir(conta1, 50.00, conta2); System.out.println(Saldo da Conta 1 : + conta1.getSaldo()); System.out.println(Saldo da Conta 2 : + conta2.getSaldo()); System.out.println(Saldo da Conta 3 : + conta3.getSaldo()); } }
Listagem 5.3 Classe TestaConta.java

4. Modifique sua classe para criar uma terceira instncia da classe Conta.java em sua classe TestaConta.java como o nome da varivel conta3 e transfira 100,23 da varivel conta2 para conta3. Mostre o saldo de cada conta antes e depois da transferncia. 5. Configure o campo dataAbertura de Conta.java para armazenar a data de criao da instncia, ou seja, quando for instanciado o objeto Conta.java deve ser atribudo a data do sistema operacional para a varivel e mostre o valor do atributo na tela aps a ser instanciado o objeto para cada varivel na classe TestaConta.java. Dica: Deve ser alterado o construtor da classe para possuir este comportado evitando que seja criada uma instncia e no seja atribudo um valor para o atributo dataAbertura.

www.3way.com.br

54

Java OO | Laboratrio 6
Exerccio 2 | Membros estticos
1. Usando variveis estticas 2. Usando mtodos estticos

2.1 | Criando aplicativos que usam variveis estticas


1. Crie uma classe de UtilData.java, esta classe ser uma classe utilitria para podermos manipular datas no projeto, ela define variveis estticas que representam os nomes dos dias da semana em Portugus. Crie a classe para que fique conforme a Listagem-5.4, UtilData.java.
import java.util.Calendar; import java.util.Date; public class UtilData { // DiaDaSemana que representa Domingo static int DOMINGO = Calendar.SUNDAY; // DiaDaSemana que representa Segunda-Feira static int SEGUNDA = Calendar.MONDAY; // DiaDaSemana que representa Tera-Feira static int TERA = Calendar.TUESDAY; // DiaDaSemana que representa Quarta-Feira static int QUARTA = Calendar.WEDNESDAY; // DiaDaSemana que representa Quinta-Feira static int QUINTA = Calendar.THURSDAY; // DiaDaSemana que representa Sexta-Feira static int SEXTA = Calendar.FRIDAY; // DiaDaSemana que representa Sbado static int SBADO = Calendar.SATURDAY; // MesDoAno que representa Janeiro int JANEIRO = Calendar.JANUARY; // MesDoAno que representa Fevereiro int FEVEREIRO = Calendar.FEBRUARY; // MesDoAno que representa Maro int MARO = Calendar.MARCH; // MesDoAno que representa Abril int ABRIL = Calendar.APRIL; // Dia do Ms static int DiaDoMes = Calendar.DAY_OF_MONTH; // Dia da semana static int DiaDaSemana = Calendar.DAY_OF_WEEK; // Mtodo esttico annimo. As instrues dentro deste bloco // esttico so executadas quando a classe carregada, // ou seja, somente uma vez. static { System.out.println(Entrando no bloco esttico.); Date data = Calendar.getInstance().getTime(); System.out.println(Saindo do mtodo esttico data = + agora(data));

www.3way.com.br

55

Java OO | Laboratrio 6
} // mtodo esttico que retorna o valor da data formatado como String static String agora(Date data) { } return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);

// mtodo de instncia // Formata uma data no formato dd/mm/aaaa hh:mm String DDMMAAAAHHMM(Date data) { } }
Listagem 5.4 Classe Data.java, membros estticos

return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);

2. Agora crie outra classe ExemploVariavelEstatica.java conforme Listagem-5.5. Observe o uso das variveis estticas, veja os comntrios.
public class ExemploVariavelEstatica { public static void main(String[] args) { } }
Listagem 5.5 ExemploVarivelEsttica.java

// Acessando variveis estaticas da // veja que voc no precisou criar System.out.println(Dia da semana System.out.println(Dia da semana System.out.println(Dia da semana System.out.println(Dia da semana

classe UtilData uma instncia da classe UtilData + UtilData.DOMINGO); + UtilData.SEGUNDA); + UtilData.QUARTA); + UtilData.SBADO);

// Acesso a varivel de instncia data da classe UtilData // Voc tem que criar uma instncia da classe antes de voc poder acessar seu valor. UtilData data = new UtilData(); System.out.println(Mes do ano + data.JANEIRO); System.out.println(Mes do ano + data.FEVEREIRO); System.out.println(Mes do ano + data.ABRIL); System.out.println(Mes do ano + data.MARO); // A varivel esttica pode ser acessada por varivel de instncia de objeto System.out.println(Dia da Semana + data.DiaDaSemana); data.DiaDaSemana = 3; System.out.println(Mudou Dia da Semana + data.DiaDaSemana); // Variveis estticas podem sem acessada de mltiplas instncias UtilData data2 = new UtilData(); System.out.println(instancia 1 Dia do Mes + UtilData.DiaDoMes); System.out.println(instancia 2 Dia do Mes + data2.DiaDoMes); data2.DiaDoMes = 20; System.out.println(instancia 1 Mudou Dia do Mes + UtilData.DiaDoMes); System.out.println(instancia 2 Mudou Dia do ms + data2.DiaDoMes);

3. Agora modifique a classe UtilData.java para que os membros no estticos (Janeiro,Fevereiro, etc) se tornem estticos.

www.3way.com.br

56

Java OO | Laboratrio 6
4. Modifique a Listagem-5.5 para imprimir os valores dos novos membros estticos que voc modificou no exerccio anterior.

2.2 | Criando aplicativos que usam mtodos estticos


1. Observe a Listagem-5.6, ela apresenta o uso de mtodos estticos, compile o programa e veja as notas da compilao.
import java.util.Date; public class ExemploMetodoEstatico { public static void main(String[] args) { } }
Listagem 5.6 ExemploDeMetodosEstaticos.java

Date data = new Date(); // Invocando metodo estatico da classe UtilData, nao preciso instanciar a classe UtilData System.out.println(UtilData.agora(data)); // Metodo esttico pode ser invocado por uma instancia da classe UtilData UtilData idata = new UtilData(); System.out.println(idata.agora(data)); // Metodo de instancia so pode ser invocado por uma instancia System.out.println(idata.DDMMAAAAHHMM(data)); // Metodos de instancia nao podem ser invocados diretamente ocorre erro de compilacao UtilData.DDMMAAAAHHMM(data);

2. Modifique a listagem anterior de modo a corrigir o erro de compilao e poder executar o programa. Voc ter que alterar o modificador de acesso de alguns mtodos da classe UtilData.java e alterar a referncia a chamada de um mtodo na classe ExemploDeMetodoEstaticos.java.

Exerccio 3 | Sobrecarga
1. Mtodos sobrecarregados

3.1 | Adicionando mtodos sobrecarregados


1. Modifique a classe ContaService.java conforme abaixo, observe as duas verses do mtodo transferir() apresentadas abaixo.
public class ContaService { public void depositar(Conta contaDestino, double valor) { } // credita na conta e debita no caixa contaDestino.setSaldo(contaDestino.getSaldo() + valor);

public void sacar(Conta contaSaque, double valor) {

www.3way.com.br

57

Java OO | Laboratrio 6
} // debita na conta e credita no caixa contaSaque.setSaldo(contaSaque.getSaldo() - valor);

// Para no implementar a mesma regra duplicado este mtodo chama o segundo transferir // e informa o limite com valor zero para representando que no possui saldo. public void transferir(Conta contaSaque, double valor, Conta contaDestino) { } // transfere valor da conta para a conta destino transferir(contaSaque, valor, contaDestino, 0);

// Sobrecarga do mtodo com argumentos diferentes, quando for invocado este mtodo // dever ser informado um valor para limite (cheque especial) que ser adicionado ao // saldo da conta para verificar se pode ocorrer a transferncia. public void transferir(Conta contaSaque, double valor, Conta contaDestino, double limite) { if (( contaSaque.getSaldo() + limite ) < valor) { System.out.print(Saldo insuficiente para esta operao); return; } // transfere valor da conta para conta destino this.sacar(contaSaque, valor); this.depositar(contaDestino, valor); } }
Listagem 5.7 Mtodos sobrecarregado

2. Execute a classe TestaConta.java para testar se ir executar corretamente.

3. Para testar a execuo dos dois mtodos transferir da classe ContaService.java que foram criados crie a classe SobrecargaTransferir.java confome abaixo:
public class SobrecargaTransferir { public static void main(String[] argv) { // Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta ContaService operacoesConta = new ContaService(); // cria uma instncia da classe Conta Conta conta1 = new Conta(); // configura instncia da classe Conta conta1.setNumero(1234567890); conta1.setSaldo(500.00); // cria nova instancia de Conta para tranferencia Conta conta2 = new Conta(); conta2.setSaldo(50.00); // cria nova instancia de Conta para tranferencia Conta conta3 = new Conta(); System.out.println(Transferir 400.00 de conta 1 para conta2 ); // tranferindo valor de conta1 para conta2 utilizando transferencia sem limite operacoesConta.transferir(conta1, 400.00, conta2); System.out.println(Saldo da Conta 1: + conta1.getSaldo());

www.3way.com.br

58

Java OO | Laboratrio 6
} }
Listagem 5.8 Usando mtodos sobrecarregados

System.out.println(Saldo da Conta 2: + conta2.getSaldo()); System.out.println(Saldo da Conta 3: + conta3.getSaldo()); // tranferindo valor de conta1 para conta2 utilizando transferencia com limite operacoesConta.transferir(conta1, 200.00, conta2, 300); System.out.println(Saldo da Conta 1: + conta1.getSaldo()); System.out.println(Saldo da Conta 2: + conta2.getSaldo()); System.out.println(Saldo da Conta 3: + conta3.getSaldo());

4. Crie uma terceira instncia da classe Conta.java com nome da varivel conta3 na Listagem-5.8 e transfira 100.00 com e sem limite de conta2 para conta3. Mostre o saldo de cada conta antes e depois de cada transferncia, usando os mtodos sobrecarregados. 5. Modifique a classe UtilData.java como mostrado abaixo. Perceba que foi alterado o tipo das variveis data para Calendar e definido mtodos utilitrios para retornar o valor respectivo de uma data e para retornar uma data baseado nor argumentos passados.
import java.util.Calendar; import java.util.Date; public class UtilData { // representa Domingo static final int DOMINGO = Calendar.SUNDAY; // Segunda-Feira static final int SEGUNDA = Calendar.MONDAY; // Tera-Feira static final int TERA = Calendar.TUESDAY; // Quarta-Feira static final int QUARTA = Calendar.WEDNESDAY; // Quinta-Feira static final int QUINTA = Calendar.THURSDAY; // Sexta-Feira static final int SEXTA = Calendar.FRIDAY; // Sbado static final int SBADO = Calendar.SATURDAY; // Constri uma data representando agora public static Date data() { } return Calendar.getInstance().getTime();

// Constri uma data representando um dado dia. // Para efetuar comparaes entre datas, hora ser 00:00:00.0 (0 horas, 0 minutos, 0 segundos, 0 milissegundos) public static Calendar data(int dia, int mes, int ano) { } return data(dia, mes, ano, 0, 0, 0);

www.3way.com.br

59

Java OO | Laboratrio 6
// Constri uma data representando um dado dia e hora. // Para permitir comparaes de datas, os milissegundos da data so zerados. public static Calendar data(int dia, int mes, int ano, int hora, int min, int seg) { } Calendar data = Calendar.getInstance(); data.set(ano, --mes, dia, hora, min, seg); data.set(Calendar.MILLISECOND, 0); return data;

// Retorna uma data com dia, mes e ano passado como String e formato como argumento public static Calendar data(String data) { return data(Integer.valueOf(data.split(/)[0]), Integer.valueOf(data.split(/)[1]), Integer.valueOf(data.split(/)[2])); } public static Date getDate(Calendar data) { } return data.getTime();

// Formata uma data no formato dd/mm/aaaa public static String DDMMAAAA(Date data) { } return new java.text.SimpleDateFormat(dd/MM/yyyy).format(data);

// Formata uma data no formato dd/mm/aaaa hh:mm public static String DDMMAAAAHHMM(Date data) { } return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);

// mtodo esttico que retorna o valor da data formatado como String public static String agora(Date data) { } return new java.text.SimpleDateFormat(dd/MM/yyyy HH:mm).format(data);

// Retorna o Ano correspondente a esta data public int getAno(Date data) { } final Calendar calendario = Calendar.getInstance(); calendario.setTime(data); return calendario.get(Calendar.YEAR);

// Retorna o ms correspondendo a esta data. public int getMes(Date data) { } final Calendar calendario = Calendar.getInstance(); calendario.setTime(data); return calendario.get(Calendar.MONTH);

// Retorna o dia correspondendo a esta data. public int getDia(Date data) { final Calendar calendario = Calendar.getInstance(); calendario.setTime(data);

www.3way.com.br

60

Java OO | Laboratrio 6
} return calendario.get(Calendar.DAY_OF_MONTH);

// Acrescenta um nmero de dias data. public void somarDia(Date data, int numDias) { } }
Listagem 5.9 UtilData.java com sobrecarga de contrutores

final Calendar calendario = Calendar.getInstance(); calendario.setTime(data); calendario.add(Calendar.DAY_OF_MONTH, numDias);

Exerccio 4 | Construtores
1. Usando mltiplos construtores 2. Encadeando construtores com o mtodo this()

4.1 | Definindo mltiplos construtores numa classe


1. Crie um construtor na classe Conta.java que receba como argumento o nome do titular e o nmero da conta e armazene esses valores nas suas respectivas variveis e armazene o valor 0 (zero) no atributo saldo conforme abaixo:

// construtor com dois parametros public Conta( String nome, int nconta ) {

numero = nconta; titular = nome; saldo = 0.0; // Conta em reais e zerada }

2. Tnhamos definido que todo objeto da classe Conta.java ao ser criado deve ser atribudo a data de abertura conforme construtor padro criado. Para que no seja necessrio reescrevermos esta regra de negcios vamos fazer com que ao ser chamado o construtor com nome e numero de conta, este construtor automaticamente invoque o construtor que atribui a data de criao com this() conforme abaixo.

public Conta( String nome, int nconta ) { this(); numero = nconta; titular = nome; saldo = 0.0; // Conta em reais e zerada }

3. Crie a classe TestaConstrutor.java para criar duas variveis de Conta.java, cada uma utilizando um construtor que foi criado e imprima a data de abertura.

www.3way.com.br

61

Java OO | Laboratrio 6
Exerccio 5 | Referncia this
1. Invocando mtodos com this 2. this como parmetro

5.1 Invoque mtodos com this


1. Nossa classe ContaService.java precisa registrar o histrico de transaes (dbito, crdito), para ficar mais dinmico precisamos de uma classe que armazene as informao das transaes. Ento crie o enum EnumTipoTransacao.java e a classe Transacao.java como abaixo Listagem-5.10: Arrume os importes para as classes dos pacotes corretos.
public enum EnumTipoTransacao { SAQUE, DEPOSITO, TRANSFERENCIA; } import java.util.Calendar; public class Transacao { private Date data; private Conta contaDebito; private Conta contaCredito; private double valor; private String descricao; private EnumTipoTransacao tipoTransacao; public Transacao( Date data, Conta contaDebito, Conta contaCredito, Double valor, String descricao, EnumTipoTransacao tipoTransacao ) { this.data = data; this.contaDebito = contaDebito; this.contaCredito = contaCredito; this.valor = valor; this.descricao = descricao; this.tipoTransacao = tipoTransacao; }

//get e set public String toString() { if (EnumTipoTransacao.TRANSFERENCIA == getTipoTransacao()) {

return Transacao data + UtilData.DDMMAAAAHHMM(getData()) + , conta debito + getContaDebito().getNumero() + , conta credito + getContaCredito().getNumero() + , valor + getValor() + , descricao -> + getDescricao(); } else if (EnumTipoTransacao.DEPOSITO == getTipoTransacao()) {

return Deposito data + UtilData.DDMMAAAAHHMM(getData()) + , conta + getContaCredito().getNumero() + , valor + getValor() + , descricao -> + getDescricao(); } else if (EnumTipoTransacao.SAQUE == getTipoTransacao()) {

www.3way.com.br

62

Java OO | Laboratrio 6
return Saque data + UtilData.DDMMAAAAHHMM(getData()) + , conta + getContaCredito().getNumero() + , valor + getValor() + , descricao -> + getDescricao(); } return Nenhum tipo de transao; } }
Listagem 5.10 Classe Transao.java

2. Modificaremos nossa classe Conta.java afim de mantermos o histrico de transaes, ser criado uma varivel do tipo ArrayList para guardar uma lista de transaes ocorridas na conta.
import java.util.ArrayList; import java.util.Calendar; public class Conta { private int numero; private String titular; private Date dataAbertura; private double saldo; private ArrayList movimento; // construtor padro da classe Conta que define a data de criao da conta e inicializa o array de transacao public Conta() { } dataAbertura = UtilData.data(); movimento = new ArrayList();

// construtor com dois parametros public Conta( String nome, int nconta ) { } this(); numero = nconta; titular = nome; saldo = 0.0; // Conta em reais e zerada

// INSIRA OS MTODOS GETTERS E SETTERS }


Listagem 5.11 Classe Conta

3.Modifique a classe ContaService.java inserindo os mtodos para manter o histrico de transaes conforme abaixo Listagem-5.12.
public class ContaService { public void depositar(Conta contaDestino, double valor) { // credita na conta e debita no caixa contaDestino.setSaldo(contaDestino.getSaldo() + valor);

www.3way.com.br

63

Java OO | Laboratrio 6
this.historicoTransacao(null, contaDestino, valor, deposito na conta + contaDestino. getNumero(), EnumTipoTransacao.DEPOSITO); } public void sacar(Conta contaSaque, double valor) { // debita na conta e credita no caixa contaSaque.setSaldo(contaSaque.getSaldo() - valor);

this.historicoTransacao(null, contaSaque, valor, saque na conta + contaSaque. getNumero(), EnumTipoTransacao.DEPOSITO); } // mtodo sobrecarregado, transfere dados desta conta (this) para outra public boolean transferir(Conta contaSaque, double valor, Conta contaDestino) { return transferir(contaSaque, valor, contaDestino, transferencia para conta + contaDestino.getNumero()); } // mtodo sobrecarregado, transfere valor desta conta (this) para outra conta e registra a transao public boolean transferir(Conta contaSaque, double valor, Conta contaDestino, String descr) { if (contaSaque.getSaldo() - valor >= 0) { this.debito(contaSaque, valor); this.credito(contaDestino, valor);

this.historicoTransacao(contaSaque, contaDestino, valor, descr, EnumTipoTransacao. TRANSFERENCIA); return true;

} else { return false;

} }

// subtrai valor do saldo protected void debito(Conta contaOperacao, double valor) { } // adiciona valor ao saldo protected void credito(Conta contaOperacao, double valor) { } // cria um objeto transao e registra adicionando no movimento da conta protected void historicoTransacao(Conta contaDebito, Conta contaCredito, double valor, String descr, EnumTipoTransacao tipoTransacao) { Transacao transacao = new Transacao(UtilData.data(), contaDebito, contaCredito, valor, descr, tipoTransacao); if (contaDebito != null) { contaOperacao.setSaldo(contaOperacao.getSaldo() + valor); contaOperacao.setSaldo(contaOperacao.getSaldo() - valor);

www.3way.com.br

64

Java OO | Laboratrio 6
contaDebito.getMovimento().add(transacao); } contaCredito.getMovimento().add(transacao); } } Listagem 5.12 Classe Conta

4. Observe como fazemos uso da referncia this no mtodo transferir(), neste caso queremos evidenciar o uso dos mtodos pelo prprio objeto. Como so objetos da mesma classe dizemos que h um auto-relacionamento. Perceba que todas operaes que podem ser realizadas por ContaService.java agora esto sendo direcionadas internamente pelos mtodos invocados para o mtodo transferir que registra o histrico de Transao no atributo movimento. 5. Crie a classe MovimentoContaCaixa.java como definida abaixo para testarmos se o histrico de transaes esta sendo gravado corretamente.
public class MovimentoContaCaixa { public static void main(String[] args) { // Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta ContaService operacoesConta = new ContaService(); // cria conta caixa Conta caixa = new Conta(ContaCaixa, 0); caixa.setSaldo(100000);

Conta correntista1 = new Conta(Hinfe Liz, 1001); // faz deposito operacoesConta.depositar(correntista1, 1000); Conta correntista2 = new Conta(ZILEF DAVIDA, 1002); // faz deposito, transferir para conta caixa operacoesConta.depositar(correntista2, 2000); // Mostra saldo correntista 1 System.out.println(correntista1 saldo = + correntista1.getSaldo()); // Mostra saldo correntista 2 System.out.println(correntista2 saldo = + correntista2.getSaldo());

if (operacoesConta.transferir(correntista1, 100.00, correntista2)) { System.out.println(transferencia ok); } else { System.out.println(nao pode transferir !); } // Mostra saldo correntista 1 System.out.println(correntista1 saldo = + correntista1.getSaldo()); // Mostra saldo correntista 2 System.out.println(correntista2 saldo = + correntista2.getSaldo()); // faz saque operacoesConta.sacar(correntista2, 120.00); System.out.println(saque ok);

www.3way.com.br

65

Java OO | Laboratrio 6
} }
Listagem 5.13 MovimentoContaCaixa.java

// Mostra saldo correntista 2 System.out.println(correntista2 saldo = + correntista2.getSaldo()); // mostra movimento correntista 1 System.out.println(correntista1.getMovimento()); // mostra movimento correntista 2 System.out.println(correntista2.getMovimento());

www.3way.com.br

66

Java OO | Laboratrio 7
Lab 7 | Herana
Herana um dos conceitos mais importantes em Programao Orientada a Objeto juntamente com Encapsulamento e Polimorfismo. Basicamente herana permite o reuso de cdigo, j que uma sub-classe (classe filha) pode usar as propriedade e mtodos definidos na super classe (classe pai). O objetivo deste laboratrio permitir que voc entenda os conceitos de herana em Java. Estaremos reutilizando muito dos exerccios anteriores, portanto classes citadas neste laboratrio cuja listagem no esteja presente aqui porque voc j possui o cdigo como resultado de outros laboratrios. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse. Durao prevista: 90 minutos Exerccios Exerccio 1: Construindo programas que criam classes com herana (30 minutos) Exerccio 2: Invocando construtores com palavra chave super (20 minutos) Exerccio 3: Type Casting (20 minutos) Exerccio 4: Palavra chave final em classes e mtodos (20 minutos)

Exerccio 1 | Construindo programas que criam classes atravs


1. Neste exerccio vamos construir uma classe Pessoa.java, onde Pessoa ser a classe pai das demais classes que ir herdar suas caractersticas.

Figura 6.1 Diagrama UML classe Pessoa

public class Pessoa { private String nome; private String telefone; private String endereco; public Pessoa() {} public Pessoa( String nome ) { } this.nome = nome;

//get e set

public void ImprimeNome() {


System.out.println(O nome da pessoa : + nome); } }
Listagem 6.1 classe Pessoa.

www.3way.com.br

67

Java OO | Laboratrio 7
2. Crie a classe Cliente.java abaixo, perceba que ela extends da classe Pessoa.java, isso porque ele uma Pessoa, mas possui algumas caractersticas distintas.
public class Cliente extends Pessoa{ private String cpf; private String rg; public Cliente() { } public Cliente(String cpf) { this.cpf = cpf; } //get e set }
Listagem 6.2 classe Cliente herdando caractersticas de Pessoa.

3. Altere a classe TesteHeranca.java conforme abaixo, compile e execute o programa, veja o resultados.
public class TesteHeranca { public static void main(String[] args) { } }
Listagem 6.3 classe TesteHeranca

// cria uma pessoa Pessoa pessoa = new Pessoa(); pessoa.setNome(Fulano de tal); // Mostra toString() metodo sobrescrito na classe Cliente pessoa.ImprimeNome(); // cria um cliente Cliente cliente = new Cliente(); cliente.setNome(Fulano de tal); cliente.setCpf(999.999.999-99); // Mostra toString() metodo sobrescrito de Pessoa dentro da classe Cliente cliente.ImprimeNome(); // metodo de acesso a atributo presente no objeto Pessoa cliente.setTelefone((99)9999-9999); // Mostra toString() metodo sobrescrito de Pessoa dentro da classe Cliente cliente.ImprimeNome();

www.3way.com.br

68

Java OO | Laboratrio 7
Exerccio 2 | Invocando construtores com palavra chave super
1. Modifique a Listagem-6.2, adicionando o trecho de cdigo abaixo para sobrepor o construtor da superclasse Pessoa.java em Cliente.java, observe o uso do mtodo super() para referenciar um construtor da classe Pessoa.java a ser invocado.
// construtores public Cliente(String nome, String cpf ) {

super(nome); this.cpf = cpf; }


Listagem 6.4 Usando super em cadeia de contrutores.

2.Modifique a Listagem-6.2, faa override do mtodo ImprimeNome() de modo que deixe claro qual instancia de Pessoa.
@Override public void ImprimeNome() { System.out.println(Nome do cliente : + getNome() + N CPF: + cpf + Seu endereco : + getEndereco()); }
Listagem 6.5 Override mtodo transferir() classe ContaOuro.java

Exerccio 3 | Type Casting e Polimorfismo


1. Modifique a classe TesteHeranca.java conforme Listagem-6.6 para testar a classe Polimorfismo em tempo de execuo e verificar a referncia de instncia de uma varivel.
// referencia subclasse Cliente, upper casting Pessoa pessoaCliente = new Cliente(Ze, 777.777.777-77); // polimorfismo no tempo de execucao pessoaCliente.ImprimeNome(); Cliente pessoaCliente1 = (Cliente) pessoa; //Erro de compilao Pessoa no e tipo de Cliente pessoaCliente1.ImprimeNome();
Listagem 6.6 TesteHeranca.java.

Exerccio 4 | Palavra chave final em classes e mtodos


1. Modifique Listagem-6.2 para no mais permitir herana da classe Cliente.java, usando palavra chave final.

final public class Cliente extends Pessoa {...}

2. Crie e compile nova classe ClienteEspecial.java abaixo para testar se no ser mais permitido uma classe herdar da classe Cliente.java, conseqentemente no sobrepondo o seu comportamento.

public class ClienteEspecial extends Cliente{...}

www.3way.com.br

69

Java OO | Laboratrio 7
Voc ir ver que a classe no compilar porque esta tentando herdar de uma classe que foi atribuda como final. Se voc retirar a declarao final da classe Cliente.java a classe compilar sem erros, mas o correto apagar esta classe ClienteEspecial.java do projeto, este exerccio s para mostrar que no possvel herdar de uma classe atribuda como final. 3. Modifique sua classe Cliente.java resultante do Exerccio 2 item 2, para no permitir override do mtodo ImprimeNome() usando palavra chave final na definio do mtodo.
@Override public final void ImprimeNome() { System.out.println(Nome do cliente : + getNome() + N CPF: + cpf + Seu endereco : + getEndereco()); }
Listagem 6.7 mtodo final

4. Crie e tente compilar classe ClienteDosSonhos.java abaixo.


public class ClienteDosSonhos extends Cliente { public ClienteDosSonhos ( String nome, int cpf ) { super(nome, cpf); } public boolean ImprimeNome() { System.out.println(Esse e o cliente dos sonhos, seu nome : + getNome() + N CPF: + cpf + Seu endereco : + getEndereco());

} }

Listagem 6.8 mtodo final no pode ser override

Voc ir perceber que a classe no compilar porque voc esta tentando sobrepor um mtodo que foi declarado na super classe como final, para que a classe compile corretamente voc pode remover a definio de final do mtodo na super classe ou apagar o mtodo escrito na subclasse. Mas esta classe deve ser excluda do projeto porque este exerccio foi s para mostrar que no possvel reescrever um mtodo declarado como final.

www.3way.com.br

70

Java OO | Laboratrio 8
Lab 8 | Interfaces e Classes Abstratas
Interface uma caracterstica da Linguagem de Programao Java que permite flexibilidade e agilidade no desenvolvimento de aplicaes. Neste laboratrio voc ir explorar o conceito de interfaces e classes abstratas. Ressaltamos que os exemplos deste laboratrio dependem de outras listagens de cdigo desenvolvidas nos laboratrios anteriores. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse. Durao prevista: 50 minutos Exerccios Exerccio 1: Classes Abstratas (25 minutos) Exerccio 2: Interface como um tipo (25 minutos)

Exerccio 1 | Classes Abstratas


1. As classes do projeto Banco precisam de um padro de comportamento que identifique que instancias dessas classes so referentes ao projeto, ser criada uma entidade que ir ser a classe pai de todas as classes do projeto. 2. Crie uma classe EntidadeBanco.java abstrata, nesta crie um mtodo que retorne o identificador da classe, como na Listagem-7.1.
public abstract class EntidadeBanco { public abstract Long getIdentificador(); }
Listagem 7.1 Classe EntidadeBanco.java

3. Agora modifique as classes Pessoa.java, Conta.java e Transacao.java, de forma que essas classes se tornem sub-classe de EntidadeBanco.java. Observao: Como a classe EntidadeBanco.java abstrata contm um mtodo abstrato getIdentificador(), esta te forar a criar um atributo identificador do tipo Long e implementar os mtodos Get e Set. Este procedimento ser feito em todas as classes modificadas.
private Long identificador; @Override public Long getIdentificador() { return identificador; } public void setIdentificador(Long identificador) { this.identificador = identificador; }

www.3way.com.br

71

Java OO | Laboratrio 8
Exerccio 2 | Interface como um tipo
1. Crie a Interface Entidade.java como definida abaixo:
public interface Entidade { Long getIdentificador(); }

Listagem 7.2 Classe Entidade.javA

2. Implemente a classe EntidadeBanco.java de forma que implemente essa interface entidade.


public abstract class EntidadeBanco implements Entidade{...}

3. Crie a Interface IExtrato.java como definida abaixo:


public interface IExtrato { /** * Formata o movimento como string. */ public String formatar() ; }
Listagem 7.3 Interface Extrato

4. Agora crie a classe ExtratoTXT.java que implementa a interface IExtrato.java e implemente o mtodo formartar() conforme abaixo:
import java.util.Iterator; public class ExtratoTXT implements IExtrato { protected Conta conta; public ExtratoTXT(Conta conta) { this.conta = conta; } public String formatar() { String newLine = System.getProperty(line.separator); String resultado = Extrato de conta + newLine; resultado += String.format(%-20.20s, Data) + + String.format(%7.7s, Debito) + + String.format(%7.7s, Credito) + + String.format(%15.15s, Valor) + + String.format(%s, Descricao) + newLine; Iterator it = conta.getMovimento().iterator(); while (it.hasNext()) { Transacao t = (Transacao) it.next(); if(t.getTipoTransacao() == EnumTipoTransacao.TRANSFERENCIA){ resultado += String.format(%-20.20s, UtilData.DDMMAAAAHHMM(t.getData())) + + String.format(%7d, t.getContaDebito().getNumero()) + + String.format(%7d, t.getContaCredito().getNumero()) + + String.format(%15.15s, t.getValor()) +

www.3way.com.br

72

Java OO | Laboratrio 8
+ String.format(%s, t.getDescricao()) + newLine; } } return resultado; } }
Listagem 7.4 ExtratoTXT.java

5. Crie a classe ExtratoHTML.java que implementa a interface IExtrato.java.


import java.util.Iterator; public class ExtratoHTML implements IExtrato { protected Conta conta; public ExtratoHTML( Conta conta ) { } this.conta = conta;

public String formatar() { String newLine = System.getProperty(line.separator); String resultado = <html> + newLine; resultado += <head> + newLine; resultado += <title>Extrato de Conta</title> + newLine; resultado += <style type=\text/css\> + newLine; resultado += <!-- + newLine; resultado += body { font-family: Verdana, Arial,Helvetica, + sans-serif; font-weight: normal; font-variant: normal} + newLine; resultado += .clsIndex { } + newLine; resultado += .clsTitle { background-color: #CCCCCC; + text-align: center } + newLine; resultado += td { font-size: 9pt; font-family: Verdana, Arial, + Helvetica, sans-serif; background-color: #EEEEEE} + newLine; resultado += --> + newLine; resultado += </style> + newLine; resultado += </head> + newLine; resultado += <body> + newLine; resultado += <h2>Extrato de conta</h2> + newLine; resultado += <TABLE CLASS=\clsIndex\> + newLine; resultado += <tr> + newLine; resultado += <TD CLASS=\clsTitle\><B>Data</B></TD> + newLine; resultado += <TD CLASS=\clsTitle\><B>Debito</B></TD> + newLine; resultado += <TD CLASS=\clsTitle\><B>Credito</B></TD> + newLine; resultado += <TD CLASS=\clsTitle\><B>Valor</B></TD> + newLine; resultado += <TD CLASS=\clsTitle\><B>Descricao</B></TD> + newLine; resultado += </tr> + newLine; Iterator it = conta.getMovimento().iterator(); while (it.hasNext()) { Transacao t = (Transacao) it.next(); if(t.getTipoTransacao() == EnumTipoTransacao.TRANSFERENCIA){ resultado += <tr> + newLine; resultado += <TD align=\left\> + UtilData.DDMMAAAAHHMM(t. getData()) + </TD> + newLine; resultado += <TD align=\right\> + t.getContaDebito().getNumero() + </TD> + newLine; resultado += <TD align=\right\> + t.getContaCredito().getNumero() + </TD> + newLine; resultado += <TD align=\right\> + t.getValor() + </TD> +

www.3way.com.br

73

Java OO | Laboratrio 8
newLine; resultado += <TD align=\left\> + t.getDescricao() + </TD> + newLine; resultado += </tr> + newLine; } } resultado += </table> + newLine; resultado += </body> + newLine; resultado += </html> + newLine; return resultado; } }
Listagem 7.5 ExtratoHTML.java

6. Crie a classe ExtratoContaCorrente.java para imprimir as movimentaes da classe Conta.java.


public class ExtratoContaCorrente { public static void main(String[] args) { } // Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta ContaService operacoesConta = new ContaService(); Conta correntista1 = new Conta(Aluno, 1001); Conta correntista2 = new Conta(Professor, 2002); // faz deposito operacoesConta.depositar(correntista1, 1000); // faz transferencia de correntista1 para correntista2 e salva em memoria a transao operacoesConta.transferir(correntista1, 450.00, correntista2); // faz transferencia de correntista1 para correntista2 e salva em memoria a transao operacoesConta.transferir(correntista2, 50.00, correntista1); //IExtrato movimento = new ExtratoTXT(correntista1); //System.out.println(movimento.formatar()); IExtrato movimento1 = new ExtratoHTML(correntista1); System.out.println(movimento1.formatar());

}
Listagem 7.6 Imprime extrato Conta corrente.

7. Modifique a Listagem-7.6, para usando ExtratoHTML.java, Listagem-7.5, no lugar de ExtratoTXT.java.

8. Melhore o extrato imprimindo no cabealho o nome do cliente, numero da conta e data de impresso.
resultado += Titular: + conta.getTitular() + Conta: + conta.getNumero() + + newLine; resultado += Data de Impresso: + UtilData.DDMMAAAAHHMM(UtilData.data()) + + newLine;

www.3way.com.br

74

Java OO | Laboratrio 9
Lab 9 | Excees
Neste laboratrio faremos uso das estruturas de tratamento de erros, usando Exceptions e Assertions. A linguagem de programao Java possui uma estrutura de manipulao de exceo muito bem elaborado, que ajuda os desenvolvedores a separar a lgica de tratamento de excees de sua lgica de negcios. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse. Durao prevista: 60 minutos Exerccios Exerccio 1: Criando excees (30 minutos) Exerccio 2: Usando excees (30 minutos)

Exerccio 1 | Criando excees


1. Quando sacamos e transferimos dinheiro de uma instncia da classe ContaService. java, Laboratrio 5 exerccio 3, item 1, espera-se que o saldo seja suficiente para cobrir a operao, porm pode ocorrer uma situao de exceo, ou seja, situao inesperada. Neste caso podemos usar os mecanismos de controle de exceo em Java para contornar a situao. Veja o cdigo abaixo, nele criamos uma nova classe de exceo SaldoInsuficienteException.java, para indicarmos que no h saldo suficiente para que uma operao saque/transferncia ocorra.
public class SaldoInsuficienteException extends Exception { public SaldoInsuficienteException() { } super(Saldo insuficiente.);

public SaldoInsuficienteException( String mensagem ) { } } super(mensagem);

Listagem 8.1 SaldoInsuficienteException

2. Modifique o mtodo transferir() da classe ContaService.java, como na listagem abaixo, ou seja, quando tentar fazer uma operao em uma conta, que seja necessrio verificar se possui saldo e o saldo for insuficiente, ento aplicao lanar uma exceo.

@Override public boolean transferir(Conta destino, double valor) throws SaldoInsuficienteException{

if (getSaldo() - valor >= 0) { this.debito(valor); destino.credito(valor); historicoTransacao(this, destino, valor, transferencia para conta + destino. getNumero()); return true;

www.3way.com.br

75

Java OO | Laboratrio 9
} else { throw new SaldoInsuficienteException(); } }
Listagem 8.2 Exceo mtodo transferir() classe ContaCorrente.java

3. A compilao da classe ContaService.java ir gerar um erro, isto se deve ao fato do mtodo transferir() usado na sobrecarga como voc j viu necessrio fazer o tratamento da exceo SaldoInsuficienteException. Modifique a classe ContaService.java, no mtodo transferir() para desviar a exceo usando throws na assinatura do mtodo. Faa o mesmo tratamento de exceo para o mtodo sacar().

Exerccio 2 | Usando excees


1. Crie a classe MovimentoContaCorrente.java conforme Listagem-8.3, para testar e manipular a exceo que acabou de ser criada e adicionado ao mtodo transferir().
public class MovimentoContaCorrente { public static void main(String[] args) { // Cria uma instncia de ContaService onde est presente as operaes para Objeto Conta ContaService operacoesConta = new ContaService(); Conta correntista1 = new Conta(Aluno, 1001); Conta correntista2 = new Conta(Aluna, 21); // faz deposito operacoesConta.depositar(correntista1, 100);

// faz Transferencia proibida try { operacoesConta.transferir(correntista1, 600, correntista2); } catch (Exception e) { System.out.println(e.getMessage()); } // faz Transferencia autorizada try { operacoesConta.transferir(correntista1, 99.00, correntista2); } catch (Exception e) { System.out.println(e.getMessage()); } } }
Listagem 8.3 MovimentoContaCorrente

ExtratoTXT movimento = new ExtratoTXT(correntista1); System.out.println(movimento.formatar());

www.3way.com.br

76

Java OO | Laboratrio 10
Lab 10 | Generics
O J2SE 5.0, introduziu vrias extenses linguagem Java. Uma foi de Generics (genericidade), lhe permite abstrao de tipos. O exemplo mais comum so os tipos conteiner, tal como os da hierarquia de classes em Collection. Antes de J2SE 5.0, quando voc extrai um elemento de uma coleo, voc precisa fazer o cast do tipo do elemento armazenado na coleo. Alm de ser inconveniente tambm inseguro. O compilador no checa se o tipo em cast o mesmo do elemento na coleo, ento o cast pode falhar em tempo de execuo. Generics prov uma maneira para voc comunicar o tipo da coleo ao compilador, assim ele poder fazer a checagem em tempo de compilao. Uma vez que o compilador sabe o tipo do elemento da coleo, o compilador pode checar se voc est usando a coleo de forma consistente e pode associar o cast correto aos itens extrados da coleo. Neste laboratrio, voc vai aprender como usar Generics fazendo uma extenso ao modelo de classes utilizado at o momento. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse, com ela os erro de programao vo sendo mostrados imediatamente medida que voc escreve o cdigo. Durao prevista: 70 minutos Exerccios Exerccio 1: Construindo uma classe Genrica (30) Exerccio 2: Generics e subtipagem (40)

Exerccio 1 | Construindo uma classe Genrica


1. A respeito da real necessidade, vamos criar uma nova classe chamada Movimento. java que guardar todos as transaes realizadas em uma Conta.java conforme abaixo na Listagem-9.1.
import java.util.*; /** * Classe que implementa um movimento de transacoes. * Um movimento apenas uma serie de transacoes feitas. * Todas as transacoes devem entrar aqui em ordem cronologica. */ public class Movimento<T> { // uma colecao deve manter a ordem de inserao private ArrayList<T> transacoes; // Construtores /** * Controi um Movimento vazio (sem transacoes). */ public Movimento() { } this.transacoes = new ArrayList<T>();

/** * Adiciona uma transacoes ao movimento.

www.3way.com.br

77

Java OO | Laboratrio 10
*/ public void add(T transacao) { } transacoes.add(transacao);

/** * Fornece um Iterator para varrer as transacoes por data. */ public Iterator<T> getTransacoes() { } }
Listagem 9.1 classe Movimento

return transacoes.iterator();

2. Crie a classe TesteMovimento.java conforme a Listagem-9.2 e veja o uso da nova classe. Ela funciona como um conteiner de um tipo de dados qualquer.
import java.util.Iterator; public class TesteMovimento { public static void main(String[] args) { Movimento<Transacao> m1 = new Movimento<Transacao>(); Movimento<String> m2 = new Movimento<String>();

m1.add(new Transacao(UtilData.data(), new Conta(Fulano, 1000), new Conta(Ciclano, 2000), 0.0, nda, EnumTipoTransacao.TRANSFERENCIA));

// erro compilacao // m1.add(new String(qq coisa)); m2.add(new String(nda de +));

Iterator it; it = m1.getTransacoes(); while (it.hasNext()) System.out.println(it.next()); it = m2.getTransacoes(); while (it.hasNext()) System.out.println(it.next()); } }
Listagem 9.2 - TesteMovimento

3. A nova classe Movimento.java tem muito mais um fim didtico que funcional no contexto da aplicao que voc est desenvolvendo ao longo destes laboratrios. Voc deve excluila aps o termino desse laboratrio.

www.3way.com.br

78

Java OO | Laboratrio 11
Lab 11 | Colees
Neste laboratrio voc exercitar o uso de Collections desenvolvendo aplicaes. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse. Durao prevista: 190 minutos Exerccios Exerccio 1: UML e Colees (60 minutos) Exerccio 2: Usando a coleo Set (30 minutos) Exerccio 3: Usando a coleo List (30 minutos) Exerccio 4: Usando a coleo Map (20 minutos) Exerccio 5: Ordenao, Busca e Manipulao de Dados (20 minutos)

Exerccio 1 | UML e Colees


1. A Figura-10.1 a representao parcial em UML do digrama de classes da aplicao Banco que voc est escrevendo ao realizar os laboratrios. Crie e/ou modifique as classes conforme mostrado s listagens abaixo.

Figura 10.1 Diagrama UML para aplicao Banco

www.3way.com.br

79

Java OO | Laboratrio 11
O diagrama te apresenta as relaes entre as classes, essas relaes so relaes do tipo hasone. Logo, o diagrama nos informa que a classe Banco.java possui nenhuma ou vrias referncias de objetos da classe Agencia.java, que Agencia.java tem zero ou mais referncias de objetos da classe Conta.java, que a classe Conta.java tem zero ou mais referncias de objetos da classe Cliente.java. Essas relaes so denominadas de agregao em UML. Abaixo mostrado um possvel cdigo para esta representao grfica das relaes entre as classes. Observe que a cardinalidade, relao numrica entre instncias de objetos das classes, est sendo implementada para variveis do tipo java.util.Collection. Isto satisfaz o conceito da cardinalidade representada no Diagrama UML. Pense o que seria necessrio fazer se voc tivesse que usar um Array! A classe Collection uma das classes que faz parte do Framework Java Collections, essas classes implementam algoritmos eficientes de busca, insero e remoo de objetos dentro de estruturas que implementam conceitos de Lista, Fila, Mapas e Conjuntos, facilitando o trabalho do programador, que s tem a responsabilidade de escolher a implementao mais adequada para seu programa.
import java.util.Collection; public class Banco extends EntidadeBanco { private Long identificador; private int numero; private String nome; private Collection<Agencia> agencias; //get e set }
Listagem 10.1 Codificao simplificada da classe Banco

import java.util.ArrayList; import java.util.Collection; public class Agencia extends EntidadeBanco { private Long identificador; private String nome; private Banco banco; private Collection<Conta> contas; public Agencia( String nome ) { this.nome = nome; contas = new ArrayList<Conta>(); } }
Listagem 10.2 Codificao simplificada da classe Agencia

www.3way.com.br

80

Java OO | Laboratrio 11
public class Pessoa extends EntidadeBanco { private Long identificador; private String nome; private String telefone; private String endereco; } public class Cliente extends Pessoa { private String cpf; private String rg; }
Listagem 10.3 Codificao simplificada da classe Cliente

public class Conta extends EntidadeBanco { private Long identificador; private int numero; private double saldo; private Date dataAbertura; private Collection<Transacao> transacoes; private Cliente titular; private Agencia agencia; }
Listagem 10.4 Codificao simplificada da classe Conta

2. Modifique a classe Conta.java, para que o campo titular seja do tipo da classe Cliente. java. Modifique tambm os construtores e mtodos da classe que fazem referncia ao campo titular como String alterando para que seja do tipo Cliente.java.

Isto ir gerar erros em outras classes que estava sendo passado o titular como String e agora deve ser um objeto do tipo Cliente.java, mas no se preocupe por enquanto, logo iremos definir uma soluo pratica para resolver esses erros de compilao. 3. Modifique a classe Cliente.java adicionando um construtor com parmetro String para inicializar o atributo nome do tipo String. Agora para resolver os erros de compilao quando utilizado o construtor de Conta(titular, 1) substitua por Conta(new Cliente(titular), 1), com esta alterao voc obedece a regra do construtor passando um cliente como parmetro e ao mesmo tempo criando o objeto Cliente passando para ele o nome que obrigatrio para o construtor da classe Cliente.java.

www.3way.com.br

81

Java OO | Laboratrio 11
Exerccio 2 | Usando coleo Set
A Interface Set herda da Interface Collection e, por definio, probe elementos duplicados dentro da coleo. Todos os mtodos da super-classe esto presentes e nem um novo mtodo foi introduzido. As classes concretas que implementam Set dependem do mtodo equals() do objeto adicionado para checar a igualdade dos objetos adicionados.

O Framework Collection Java fornece duas implementaes de propsito geral para interface Set: HasSet e TreeSet. Com freqncia voc ir usar um HashSet para manter colees sem elementos duplicados. Por razes de eficincia, objetos adicionados numa HashSet necessitam da implementao do mtodo hashCode() de forma que o cdigo de hash seja distribudo adequadamente. Para todo sistema em que voc criar suas prprias classes e desejar armazen-los em um HashSet, lembre-se que voc dever sobrescrever o mtodo hashCode() de Object. A implementao TreeSet til quando voc precisa extrair elementos de uma coleo de uma maneira ordenada. Para que o TreeSet trabalhe corretamente os objetos adicionados devem ser classificveis. O Framework Collection adiciona suporte para elementos que implementam a Interface Comparable, que veremos mais adiante.

2.1 | Descartando elementos duplicados com HashSet


1. Sobreponha (override) o mtodo toString(), retornando o campo nome, na classe Cliente.java.

2. Lembrando que dois objetos so iguais se ob1.equals(ob2) = true ento ob1. hashCode() = ob2.hashCode(), assim os dois mtodos equals() e hashCode() sempre devem ser modificados juntos. Modifique a classe Conta.java, sobrepondo o mtodo equals(), hashCode() e toString() de Object como na listagem abaixo.
/** * Testa a igualdade de um objeto com este */ @Override public boolean equals(Object objeto) { boolean resultado = false; if (( objeto != null ) && ( objeto instanceof Conta )) { Conta c = (Conta) objeto; if (getNumero() == c.getNumero()) { resultado = true; } } return resultado; } /** * Gera cdigo hash para tabelas de epalhamento */ @Override public int hashCode() {

return getNumero(); }

www.3way.com.br

82

Java OO | Laboratrio 11
@Override public String toString() {

return getNumero() + - + getTitular().getNome(); }


Listagem 10.5 Override do mtodo equals() e hashCode()

3. Crie, compile e execute o cdigo abaixo para comprovar que a lista no aceitar registros duplicados somente quando for implementado o equals e hashCode, o override no mtodo toString simplesmente para simplificar o valor a ser mostrado na console. Se quiser fazer um teste no implementado o toString ir notar que a regra de no duplicidade ser mantida mas o valor impresso na console ser desconhecido, ir mostrar o nome da classe concatenado com @ e um nmero.
import java.util.HashSet; public class TesteHashSet { public static void main(String[] args) { } HashSet<Cliente> clientes.add(new // duplicado clientes.add(new clientes.add(new clientes.add(new // duplicado clientes.add(new clientes.add(new clientes.add(new clientes = new HashSet<Cliente>(); Cliente(Jesus)); Cliente(Jesus)); Cliente(Mateus)); Cliente(Maria)); Cliente(Maria)); Cliente(Paulo)); Cliente(Joo));

// imprimir com toString() de Cliente sem override de equals() e hashCode System.out.println(clientes); HashSet<Conta> contas = new HashSet<Conta>(); contas.add(new Conta(new Cliente(Ze), 5)); contas.add(new Conta(new Cliente(Lucas), 2)); contas.add(new Conta(new Cliente(Pedro), 1)); // duplicado o numero da conta contas.add(new Conta(new Cliente(Maria), 1)); contas.add(new Conta(new Cliente(Joao), 0)); contas.add(new Conta(new Cliente(Ana), 4)); // imprimir com override de equals() e hashCode() System.out.println(contas);

}
Listagem 10.6 Testando HashSet com elementos duplicados

Com a execuo do exemplo acima ir perceber que os primeiros registros que ser mantido, os registros que tentou inserir mas que o valor retornou o mesmo de um existente na lista foi ignorado e no adicionados.

www.3way.com.br

83

Java OO | Laboratrio 11
2.2 | Classificando os elementos com TreeSet
1. Crie a classe TesteTreeSet.java conforme abaixo na Listagem-10.7, tente compilar e executar.
import java.util.TreeSet; public class TesteTreeSet { public static void main(String[] args) { } }
Listagem 10.7 Usando TreeSet

TreeSet<Cliente> clientes = new TreeSet<Cliente>(); clientes.add(new Cliente(Jesus)); // duplicado clientes.add(new Cliente(Maria)); clientes.add(new Cliente(Mateus)); clientes.add(new Cliente(Maria)); // duplicado clientes.add(new Cliente(Maria)); clientes.add(new Cliente(Paulo)); clientes.add(new Cliente(Joo)); // imprimir com toString() de Cliente // sem implementar Comparable System.out.println(clientes);

2. Ao executar voc dever ser notificado de que ocorre uma exceo do tipo ClassCastException, isso deve-se ao fato de TreeSet tentar comparar os objetos que esto sendo adicionados atravs do mtodo add(). O mtodo lana essa exceo toda vez que no consegue comparar um objeto inserido na coleo. Para resolver este problema h duas solues: implementar a interface Comparable ou usar um objeto comparador que implemente Comparator atravs do construtor TreeSet(Comparator<? super E> comparator). 3. Modifique a classe Cliente.java para implementar a interface Comparable como segue abaixo e compile e execute novamente a classe TesteTreeSet.java.
import java.util.Vector; public class Cliente implements Comparable<Cliente> { /** * Permite comparaes, usando para classificar */ public int compareTo(Cliente o) { // comparando somente campo nome return getNome().compareTo(o.getNome()); } }
Listagem 10.8 Implementando Comparable

www.3way.com.br

84

Java OO | Laboratrio 11
Exerccio 3 | Usando coleo List
A interface List herda a interface Collection para definir uma coleo ordenada, permitindo elementos duplicados. A interface possui operaes orientadas pela posio, habilidade de trabalhar com somente partes da lista. H duas implementaes de propsito geral na Framework Collection: ArrayList e LinkedList. Qual das duas implementaes utilizar vai depender de suas necessidades especificas. Se voc precisar de suporte para acesso aleatrio, com insero ou remoo de elementos em qualquer parte da lista alm do final desta, ento ArrayList oferece uma implementao mais otimizada. Se com freqncia voc precisar adicionar e remover elementos do meio da lista e s acessar elementos seqencialmente, ento a LinkedList oferece o melhor algoritmo. 1. Crie a classe TesteArrayList.java compile e execute a listagem abaixo:
import java.util.ArrayList; import java.util.List; public class TesteArrayList { public static void main(String[] args) { } }
Listagem 10.9 TesteArrayList

List<String> al = new ArrayList<String>(2); System.out.println(al + , size = + al.size()); // Adiciona itens ao ArrayList al.add(Robaum); al.add(Usurpa); al.add(Omitte); System.out.println(al + , size = + al.size()); // Remove item, usa equals e hashCode al.remove(Usurpa); System.out.println(al + , size = + al.size()); // Checa se a lista contem o elemento especificado Boolean b = al.contains(Omitte); System.out.println(A lista contem Omitte = + b); b = al.contains(Paumdu); System.out.println(A lista contem Paumdu = + b);

2. Modifique sua classe Agncia.java, Listagem-10.10, como segue o cdigo abaixo adicionando os construtores:
import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Agencia { //mantenha os atributos public Agencia( String nome ) {

www.3way.com.br

85

Java OO | Laboratrio 11
} this.nome = nome; contas = new HashSet<Conta>();

public Agencia( String nome, Banco banco ) { } this(nome); this.banco = banco;

Listagem 10.10 Classe Agencia

3. Crie a classe TesteLinkedList.java conforme abaixo, para testar uso de LinkedList.


import java.util.LinkedList; public class TesteLinkedList { public static void main(String[] args) { } }
Listagem 10.11 TesteLinkedList

// Cria LinkedList e adiciona 2 contas. LinkedList<Conta> ll = new LinkedList<Conta>(); ll.add(new Conta(new Cliente(Falula), 1)); ll.add(new Conta(new Cliente(Bolula), 2)); System.out.println(ll + , tamanho = + ll.size()); // Insere novo cliente no inicio e fim da LinkedList. ll.addFirst(new Conta(new Cliente(Zelula), 3)); ll.addLast(new Conta(new Cliente(Solula), 4)); System.out.println(ll); System.out.println(ll.getFirst() + , + ll.getLast()); System.out.println(ll.get(1) + , + ll.get(2)); // Remove o primero e o ultimo ll.removeFirst(); ll.removeLast(); System.out.println(ll); // Adiciona outro cliente na posicao 2 da lista ll.add(1, new Conta(new Cliente(Zoiudinha), 5)); System.out.println(ll); // Substitui objeto no indice 2 ll.set(2, new Conta(new Cliente(Zoiudinha), 5)); System.out.println(ll);

Exerccio 4 | Usando coleo Map


A interface Map no uma extenso da interface Collection. Ao contrrio, a interface Map possui sua prpria hierarquia, mantendo uma associao chave-valor. A interface descreve um mapa de chaves para valores, sem chaves duplicadas, por definio. Os mtodos da interface podem ser vistos como trs conjuntos de operaes: alterao, consultas e vises alternativas.

www.3way.com.br

86

Java OO | Laboratrio 11
As operaes de alterao permitem que voc adicione e remova uma chave-valor de um mapa. Ambos, chave e valor podem ser null. Entretanto voc no deve adicionar um Map nele mesmo como uma chave ou valor. As operaes de consulta permitem que voc verifique o contedo do mapa. Outras operaes lhe permitem trabalhar com um grupo de chaves ou valores da coleo. Uma vez que as chaves no mapa devem ser nicas, voc pode recuperar estas chaves como um Set. E como os valores no necessitam ser nicos, voc pode t-los de volta como um Collection. Em especial, possvel retornar uma coleo Set de elementos que implementa a interface Map atravs do mtodo entrySet(). Cada objeto na coleo um par de chave-valor especifico no Map em questo. Atravs desta coleo, voc pode retornar uma chave ou valor, bem como mudar o valor de cada entrada. Entretanto, o conjunto de entradas se tornar invalido, podendo deixar seu comportamento indefinido, caso o Map em questo, seja modificado sem o uso do mtodo setValue() da interface Map. O Framework Collections prov duas implementaes de propsito geral para interface Map: HashMap e TreeMap. Assim como todas as implementaes, voc vai usar a mais adequada a sua necessidade especifica. Para inserir, remover e localizar elementos no Map, o HashMap sua melhor escolha. Entretanto se voc precisar percorrer as chaves numa ordem classificada, ento TreeMap sua melhor alternativa. Dependendo do aumento de tamanho da coleo, pode ser mais rpido inserir elementos a um HashMap, ento converter o mapa para um TreeMap e desta forma percorrer a coleo ordenada de chaves. O uso de um HashMap requer que a classe dos objetos das chaves adicionadas tenham uma implementao bem definida de hashCode(). Com um TreeMap os elementos adicionados devem ser classificveis.

4.1 | Usando HashMap


1. Modifique a classe Agencia.java sobreponto os mtodos equals, hashCode e toString da classe Object utilizando o seu atributo nome. 2. Crie, compile e execute listagem abaixo.
import java.util.Collection; import java.util.HashMap; import java.util.Set; public class TesteHashMap { public static void main(String[] args) { HashMap<Agencia, Cliente[]> hm = new HashMap<Agencia, Cliente[]>();

// adiciona chave - agencia e valor = array Cliente hm.put(new Agencia(ag01), new Cliente[] { new Cliente(Enricando Cardoso), new Cliente(Inacio Estole), new Cliente(Luiz Ladrum), }); hm.put(new Agencia(ag02), new Cliente[] { new Cliente(Henri Cando), new Cliente(Stolin Lu La), new Cliente(Lara Pio), }); hm.put(new Agencia(ag03), new Cliente[] { new Cliente(Sony Gando), new Cliente(Leiro Pisto), new Cliente(Waga Oubum Du), }); // imprime a colecao System.out.println(hm); // pega as chaves

www.3way.com.br

87

Java OO | Laboratrio 11
Set chaves = hm.keySet(); // imprime as chaves System.out.println(chaves); // pega os valores Collection<Cliente[]> valores = hm.values();

// imprime os valores for (Cliente[] cs : valores) { for (Cliente c : cs) { System.out.println(c); } } } }


Listagem 10.12 Agncias e Clientes

4.2 | Usando TreeMap


1. Para usar um TreeMap necessrio satisfazer o requisito da chave, que deve se comparvel. Como nossa chave no exemplo a classe Agencia.java devemos garantir que ele comparvel. Modifique a classe Agencia.java, redefinindo-a, de forma a implementar a interface Comparable como voc fez para classe Cliente.java. 2. Crie, compile e execute listagem abaixo.
import import import import java.util.Collection; java.util.HashMap; java.util.Set; java.util.TreeMap;

public class TesteTreeMap { public static void main(String[] args) { HashMap<Agencia, Cliente[]> hm = new HashMap<Agencia, Cliente[]>();

// adiciona chave - agncia e valor = array Cliente hm.put(new Agencia(ag01), new Cliente[] { new Cliente(Enricando Cardoso), new Cliente(Inacio Estole), new Cliente(Luiz Ladrum), }); hm.put(new Agencia(ag02), new Cliente[] { new Cliente(Henri Cando), new Cliente(Stolin Lu La), new Cliente(Lara Pio), }); hm.put(new Agencia(ag03), new Cliente[] { new Cliente(Sony Gando), new Cliente(Leiro Pisto), new Cliente(Waga Oubum Du), }); // criando TreeMap TreeMap<Agencia, Cliente[]> tm = new TreeMap<Agencia, Cliente[]>(hm); // imprime a coleo System.out.println(tm); // pega as chaves Set chaves = tm.keySet(); // imprime as chaves

www.3way.com.br

88

Java OO | Laboratrio 11
System.out.println(chaves); // pega os valores Collection<Cliente[]> valores = tm.values();

// imprime os valores for (Cliente[] cs : valores) { for (Cliente c : cs) { System.out.println(c); } } } }


Listagem 10.13 Agncias e Clientes

Exerccio 5 | Ordenando e Comparando Objetos nas Colees


Sabemos agora que a comparao, classificao e outras regras utilizadas nas colees dependem de mtodos a serem sobrescritos e interfaces a serem implementadas. 1. Implemente os mtodos equals(), hashCode() e toString() para as classes Banco. java e Pessoa.java. 2. Implemente a interface Comparable na classe Banco.java e Conta.java.

www.3way.com.br

89

Java OO | Laboratrio 12
Lab 12 | Manipulando arquivos
Neste laboratrio voc exercitar a manipulao de arquivos em Java. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse. Durao prevista: 40 minutos

Exerccios Exerccio 1: Carregar um arquivo .txt, escrever e posteriormente fazer a leitura desse arquivo.(40 minutos)

Exerccio 1 | Manipulando arquivos em java


1. Crie um arquivo .txt na raiz [Windows: C:/teste.txt] [Linux: /home/teste.txt] de seu SO. Faa a leitura do mesmo utilizando objeto File. 2. Utilizando BufferedWriter escreva helloWorld nesse arquivo. 3. Utilizando BufferedReader leia o arquivo.
import import import import import import java.io.BufferedReader; java.io.BufferedWriter; java.io.File; java.io.FileReader; java.io.FileWriter; java.io.IOException;

public class TesteManipulacaoArquivo { public static void main(String[] args) { File arquivo = new File(C:\\teste.txt); try {

if (!arquivo.exists()) { // cria um arquivo (vazio) arquivo.createNewFile(); } // caso seja um diretrio, possvel listar seus arquivos e diretrios File[] arquivos = arquivo.listFiles(); // escreve no arquivo FileWriter fw = new FileWriter(arquivo, true); BufferedWriter bw = new BufferedWriter(fw); bw.write(hello World); bw.newLine(); bw.close(); fw.close(); // faz a leitura do arquivo FileReader fr = new FileReader(arquivo);

www.3way.com.br

90

Java OO | Laboratrio 12
BufferedReader br = new BufferedReader(fr);

// equanto houver mais linhas while (br.ready()) { // l a proxima linha String linha = br.readLine(); // faz algo com a linha System.out.println(linha); } br.close(); fr.close();

} catch (IOException ex) { ex.printStackTrace(); } } }

www.3way.com.br

91

Java OO | Laboratrio 13
Lab 13 |Threads
Neste laboratrio voc far o uso bsico de thread em Java. Exerccios Exerccio 1: Herdando a classe Thread Exerccio 2: Implementando Interface Runnable Exerccio 3: Sincronizando threads

Exerccio 1 | Herdando a classe Thread


1.1 | O mtodo start() sem o construtor da subclasse
1. Crie um projeto Java, depois crie a classe ImprimeNomeThread.java conforme cdigo abaixo.
// Subclass extends Thread class public class ImprimeNomeThread extends Thread { public ImprimeNomeThread( String nome ) { } super(nome);

// Sobrescreve metodo run() da classe Thread. // Este metodo toma a execucao metodo start() for invocado public void run() { System.out.println(metodo run() da thread + this.getName() + e chamado); for (int i = 0; i < 10; i++) {

try { sleep(1000); System.out.println(i + : + this.getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } }

2. Agora vamos adicionar o mtodo main a classe ImprimeNomeThread.java, para que crie execute nossa thread e a inicialize chamando o mtodo start() conforme abaixo.

// Cria instancia de uma classe que e // subclasse da classe Thread public static void main(String[] args) {

System.out.println(Criando instancia de ImprimeNomeThread...); ImprimeNomeThread minhaThread = new ImprimeNomeThread(A); // Inicia thread pela invocacao do metodo start() System.out.println(Chamando metodo start() da thread + minhaThread.getName()); minhaThread.start(); }

www.3way.com.br

92

Java OO | Laboratrio 13
3. Execute o arquivo como aplicao java e fique de olho na console do Eclipse o resultado que ser impresso. Perceba que enquanto eu no encerro o processo ou termine a execuo forada da aplicao, o sistema no ir para de imprimir os valores na console.

1.2 | O mtodo start() est no construtor da subclasse


1. Modifique a thread ImprimeNomeThread.java, adicionado ao construtor a chamada ao mtodo start() conforme abaixo. Esta alterao dispensa a necessidade de aps ser criado o objeto pelo NEW tenha que chamar o mtodo start() para iniciar, ou seja, a thread ser criada e inicializada por uma chamada ao seu construtor.
public ImprimeNomeThread(String nome) { super(nome); //metodo start() dentro do construtor da subclasse start(); }

2. Modifique o mtodo main alterando o cdigo que foi adicionado no exerccio 2 anterior para que fique conforme abaixo e execute novamente a aplicao para ver o que ir acontecer.
// Cria instancia de uma classe que e //subclasse da classe Thread System.out.println(Criando instancia de ImprimeNomeThread...); ImprimeNomeThread pnt1 = new ImprimeNomeThread(A); ImprimeNomeThread pnt2 = new ImprimeNomeThread(B); ImprimeNomeThread pnt3 = new ImprimeNomeThread(C);

www.3way.com.br

93

Java OO | Laboratrio 13

Exerccio 2 | Implementando Interface Runnable


2.1 | Iniciando fora do construtor da classe que implementa Runnable
1. Agora vamos criar uma thred implementado a interface Runnable, crie a classe ImprimeNomeRunnable.java conforme abaixo.
public class ImprimeNomeRunnable implements Runnable { String nome; public ImprimeNomeRunnable( String nome ) { } this.nome = nome;

// implementacao do metodo run() da interface Runnable public void run() { for (int i = 0; i < 10; i++) { // sleep(1000); ERRO de compilao porque no herda Thread System.out.println(i + : + nome); } } }

2. Agora vamos adicionar o mtodo main a classe ImprimeNomeRunnable.java, para que seja criado threads da classe que implementa Runnable.

public static void main(String[] args) { ImprimeNomeRunnable pntr1 = new ImprimeNomeRunnable(RA); Thread t1 = new Thread(pntr1);

www.3way.com.br

94

Java OO | Laboratrio 13
t1.start(); ImprimeNomeRunnable pntr2 = new ImprimeNomeRunnable(RB); Thread t2 = new Thread(pntr2); t2.start();

ImprimeNomeRunnable pntr3 = new ImprimeNomeRunnable(RC); Thread t3 = new Thread(pntr3); t3.start(); }

2.2 | Iniciando dento do construtor da classe que implementa Runnable


1. Vamos alterar a classe ImprimeNomeRunnable.java para iniciar a thread no momento em que for criado o objeto, atravs do construtor, da mesma forma que fizemos anteriormente com a classe que herdava de Thread. Altere a classe para que fique conforme abaixo.
public class ImprimeNomeRunnable implements Runnable { Thread thread; public ImprimeNomeRunnable( String nome ) { } // implementacao do metodo run() da interface Runnable thread = new Thread(this, nome); thread.start();

www.3way.com.br

95

Java OO | Laboratrio 13
public void run() { for (int i = 0; i < 10; i++) { try { thread.sleep(1000); // Agora permitido porque uma thread System.out.println(i + : + thread.getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } }

2. Altere o cdigo que foi adicionado ao mtodo main no exerccio 2 para que fique conforme abaixo, ou seja, sem ter que declarar um objeto do tipo Thread e depois invocar o mtodo start() e execute a aplicao para ver o resultado.

ImprimeNomeRunnable pntr1 = new ImprimeNomeRunnable(RA); ImprimeNomeRunnable pntr2 = new ImprimeNomeRunnable(RB); ImprimeNomeRunnable pntr3 = new ImprimeNomeRunnable(RC);

Exerccio 3 | Sincronizando threads


3.1 | Threads no sincronizados
1. Crie a classe DuasStrings.java que ser utilizada para imprimir valores e para a thread em execuo.

www.3way.com.br

96

Java OO | Laboratrio 13
public class DuasStrings { // este mtodo no est synchronized static void print(String str1, String str2) { System.out.print(str1); try { // interrompe a thread Thread.sleep(500); } catch (InterruptedException ie) { } System.out.println(str2); } }

2. Escreva a nova classe de thread implementando a interface Runnable conforme abaixo.


public class ImprimeStringsThread implements Runnable { Thread thread; String str1, str2; ImprimeStringsThread( String str1, String str2 ) { } this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start();

public void run() { } } DuasStrings.print(str1, str2);

3. Crie a classe abaixo e execute como uma aplicao Java e veja o resultado na console do Eclipse. Este exemplo mostra resultados no desejados uma vez que o thread no foi sincronizado.
public class ThreadNaoSincronizada { public static void main(String[] args) { } } new ImprimeStringsThread(Voce , aqui ?); new ImprimeStringsThread(Muito bem , obrigado!); new ImprimeStringsThread(Como voce , esta?);

www.3way.com.br

97

Java OO | Laboratrio 13
3.2 | Sincronizando threads atravs de mtodos
1. Para sincronizar threads necessrio utilizar synchronized, ento altere a classe DuasString.java conforme cdigo abaixo fazendo com que o mtodo print seja sincronizado.
public class DuasStrings { // este mtodo no est synchronized synchronized static void print(String str1, String str2) { System.out.print(str1); try { // interrompe a thread Thread.sleep(500); } catch (InterruptedException ie) { } } } System.out.println(str2);

2. Crie a classe ThreadSincronizada.java conforme cdigo abaixo, para testar a execuo de Threads sincronizadas e execute a classe como uma Aplicao Java e veja o resultado na console do Eclipse.

3.3 | Sincronizando threads atravs de sentenas


1. Modifique a classe ImprimeStringsThread.java adicionando mais um atributo e um novo construtor, fazendo sobrecarga de construtores na classe, conforme na listagem abaixo:
DuasStrings ds = new DuasStrings(); ImprimeStringsThread(String str1, String str2,DuasStrings ds) {

www.3way.com.br

98

Java OO | Laboratrio 13
this.str1 = str1; this.str2 = str2; this.ds = ds; thread = new Thread(this); thread.start(); }

2. Agora modifique o mtodo run() para que fique conforme o cdigo abaixo:

public void run() { //sincronizando sobre objeto DuasStrings synchronized(ds){ ds.print(str1, str2); } }

3. Execute novamente a classe ThreadSincronizada.java e veja o resultado na console do Eclipse.


www.3way.com.br

99

Java OO | Laboratrio 14
Lab 14 | Criando GUI com Swing
Neste laboratrio ir desenvolver uma interface grfica com eventos que ser construda ao longo deste laboratrio. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse. Durao prevista: 40 minutos Exerccios Exerccio 1: Desenvolver a janela abaixo. (30 minutos)

Exerccio 2: Manipulao de eventos com Java Swing (10 minutos)

Exerccio 1 | Desenvolver janela swing.


1. Crie uma classe chamada Janela que herde as caractersticas da superclasse javax.swing. JFrame. Essa janela deve ter as seguintes caractersticas:
public final class Janela extends JFrame {}

a. O tamanho da Janela deve ser de 400 x 255 pixels b. O ttulo da Janela deve ser Linguagem de Programao II
public Janela() { } setSize(400, 255); setTitle(Linguagem de Programao II);

c. Implemente o mtodo centralizar(), para centralizar a janela na rea de trabalho do usurio. Esse mtodo deve ser chamado dentro do construtor da classe Janela
private void centralizar() { Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Dimension janela = getSize();

www.3way.com.br

100

Java OO | Laboratrio 14
if (janela.height > screen.height) { setSize(janela.width, screen.height); } if (janela.width > screen.width) { setSize(screen.width, janela.height); } setLocation((screen.width - janela.width) / 2, (screen.height - janela.height) / 2); }

d. Para evitar que o usurio redimensione a janela, adicione o cdigo abaixo no construtor da classe Janela:
setResizable(false);

e. Para poder ajustar os componentes livremente na Janela, voc deve definir o gerenciador de Layouts do container JFrame como nulo. Para isso, adicione o cdigo abaixo dentro do construtor da classe Janela:
getContentPane().setLayout(null);

f. Para evitar que a aplicao continue executando aps o usurio clicar no boto fechar da janela, adicione o cdigo abaixo dentro do construtor da classe Janela:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

2. Para executar a classe Janela, adicione um mtodo main() com o seguinte cdigo:

public static void main(String args[]) { Janela janela = new Janela(); janela.setVisible(true); }

3. Crie os seguintes atributos na classe Janela: g. jlAgencia (javax.swing.JLabel): Rtulo do campo agncia h. jtfAgencia (javax.swing.JTextField): Campo de texto para digitar o nmero da agncia i. jlConta (javax.swing.JLabel): Rtulo do campo conta j. jtfConta (javax.swing.JTextField): Campo de texto para digitar o nmero da conta k. jSeparator01 (javax.swing. JSeparator): Separador que vamos utilizar para separar as informaes bancrias das informaes do cliente l. jlNome (javax.swing.JLabel): Rtulo do campo nome m. jtfNome (javax.swing.JTextField): Campo de texto para digitar o nome do cliente n. jlEndereco (javax.swing.JLabel): Rtulo do campo endereo o. jtfEndereco (javax.swing.JTextField): Campo de texto para digitar o endereo do cliente p. jlTelefone (javax.swing.JLabel): Rtulo do campo telefone q. jtfTelefone (javax.swing.JTextField): Campo de texto para digitar o telefone do cliente r. jlCpf (javax.swing.JLabel): Rtulo do campo CPF s. jtfCpf (javax.swing.JTextField): Campo de texto para digitar o CPF do cliente t. jrbCorrente (javax.swing.JRadioButton): Boto de rdio para selecionar contas do tipo Conta Corrente

www.3way.com.br

101

Java OO | Laboratrio 14
u. jrbPoupanca (javax.swing.JRadioButton): Boto de rdio para selecionar contas do tipo Conta Poupana v. bgContas (javax.swing.ButtonGroup): Continer para agrupar os componentes do tipo JRadioButton w. jSeparator02 (javax.swing.JSeparator): Separador que vamos utilizar para separar as informaes do cliente do botes da janela x. jbConsultar (javax.swing.JButton): Boto utilizado para realizar uma consulta nas contas da agncia bancria y. jbAtualizar (javax.swing.JButton): Boto utilizado para atualizar as informaes da conta bancria z. jbFechar (javax.swing.JButton): Boto utilizado para fechar a aplicao

private private private private private private private private private private private private private private private private private private private private JLabel jlAgencia; JTextField jtfAgencia; JLabel jlConta; JTextField jtfConta; JSeparator jSeparator01; JLabel jlNome; JTextField jtfNome; JLabel jlEndereco; JTextField jtfEndereco; JLabel jlTelefone; JTextField jtfTelefone; JLabel jlCpf; JTextField jtfCpf; JRadioButton jrbCorrente; JRadioButton jrbPoupanca; ButtonGroup bgContas; JSeparator jSeparator02; JButton jbConsultar; JButton jbAtualizar; JButton jbFechar;

4. Crie a instncia do componente jlAgencia e configure as seguintes opes: aa. O texto do componente jlAgencia deve ser Cdigo da Agncia: ab. O tamanho do componente jlAgencia deve ser de 110 x 18 pixels. ac. O componente jlAgencia deve ser posicionado no pixel 10 x 10 da janela ad. Adicione o componente jlAgencia no container da Janela
jlAgencia = new JLabel(Cdigo da Agncia:); jlAgencia.setBounds(10, 10, 110, 18); add(jlAgencia);

5. Crie a instncia do componente jtfAgencia e configure as seguintes opes: ae. O tamanho do componente jtfAgencia deve ser de 50 x 20 pixels af. O componente jtfAgencia deve ser posicionado no pixel 125 x 10 da janela ag. Adicione o componente jtfAgencia no container da Janela
jtfAgencia = new JTextField(); jtfAgencia.setBounds(125, 10, 50, 20); add(jtfAgencia);

www.3way.com.br

102

Java OO | Laboratrio 14
5. Crie a instncia do componente jlConta e configure as seguintes opes: ah. O texto do componente jlConta deve ser Nmero da Conta: ai. O tamanho do componente jlConta deve ser de 105 x 18 pixels. aj. O componente jlConta deve ser posicionado no pixel 205 x 10 da janela ak. Adicione o componente jlConta no container da Janela 6. Crie a instncia do componente jtfConta e configure as seguintes opes: al. O tamanho do componente jtfConta deve ser de 60 x 20 pixels am. O componente jtfConta deve ser posicionado no pixel 315 x 10 da janela an. Adicione o componente jtfConta no container da Janela 7. Crie a instncia do componente jSeparator01 e configure as seguintes opes: ao. O tamanho do componente jSeparator01 deve ser de 365 x 10 pixels ap. O componente jSeparator01 deve ser posicionado no pixel 10 x 40 da janela aq. Adicione o componente jSeparator01 no container da Janela
jSeparator01 = new JSeparator(); jSeparator01.setBounds(10, 40, 365, 10); add(jSeparator01);

8. Crie a instncia do componente jlNome e configure as seguintes opes: ar. O texto do componente jlNome deve ser Nome: as. O tamanho do componente jlNome deve ser de 60 x 18 pixels. at. O componente jlNome deve ser posicionado no pixel 10 x 50 da janela au. Alinhe o texto do componente direita.

jlNome.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);

av. Adicione o componente jlNome no container da Janela 9. Crie a instncia do componente jtfNome e configure as seguintes opes: aw. O tamanho do componente jtfNome deve ser de 300 x 20 pixels ax. O componente jtfNome deve ser posicionado no pixel 75 x 50 da janela ay. Adicione o componente jtfNome no container da Janela 10. Crie a instncia do componente jlEndereco e configure as seguintes opes: az. O texto do componente jlEndereco deve ser Endereo: ba. O tamanho do componente jlEndereco deve ser de 60 x 18 pixels. bb. O componente jlEndereco deve ser posicionado no pixel 10 x 75 da janela bc. Alinhe o texto do componente jlEndereco direita.

www.3way.com.br

103

Java OO | Laboratrio 14
bd. Adicione o componente jlEndereco no container da Janela 11. Crie a instncia do componente jtfEndereco e configure as seguintes opes: be. O tamanho do componente jtfEndereco deve ser de 300 x 20 pixels bf. O componente jtfEndereco deve ser posicionado no pixel 75 x 75 da janela bg. Adicione o componente jtfEndereco no container da Janela 12. Crie a instncia do componente jlTelefone e configure as seguintes opes: bh. O texto do componente jlTelefone deve ser Telefone: bi. O tamanho do componente jlTelefone deve ser de 60 x 18 pixels. bj. O componente jlTelefone deve ser posicionado no pixel 10 x 100 da janela bk. Alinhe o texto do componente jlTelefone direita. bl. Adicione o componente jlTelefone no container da Janela 13. Crie a instncia do componente jtfTelefone e configure as seguintes opes: bm. O tamanho do componente jtfTelefone deve ser de 300 x 20 pixels bn. O componente jtfTelefone deve ser posicionado no pixel 75 x 100 da janela bo. Adicione o componente jtfTelefone no container da Janela 14. Crie a instncia do componente jlCpf e configure as seguintes opes: bp. O texto do componente jlCpf deve ser CPF: bq. O tamanho do componente jlCpf deve ser de 60 x 18 pixels. br. O componente jlCpf deve ser posicionado no pixel 10 x 125 da janela bs. Alinhe o texto do componente jlCpf direita. bt. Adicione o componente jlCpf no container da Janela 15. Crie a instncia do componente jtfCpf e configure as seguintes opes: bu. O tamanho do componente jtfCpf deve ser de 300 x 20 pixels bv. O componente jtfCpf deve ser posicionado no pixel 75 x 125 da janela bw. Adicione o componente jtfCpf no container da Janela 16. Crie a instncia do componente jrbCorrente e configure as seguintes opes: bx. O tamanho do componente jrbCorrente deve ser de 111 x 20 pixels by. O componente jrbCorrente deve ser posicionado no pixel 100 x 150 da janela bz. Configure o atalho (alt + c) para o componente jrbCorrente

jrbCorrente.setMnemonic(C);

www.3way.com.br

104

Java OO | Laboratrio 14
ca. Por padro, o radio da Conta Corrente estar selecionado quando o usurio abrir a janela. Para isso, adicione o cdigo abaixo:
jrbCorrente.setSelected(true);

cb. Adicione o componente jrbCorrente no container da Janela 17. Crie a instncia do componente jrbPoupanca e configure as seguintes opes: cc. O tamanho do componente jrbPoupanca deve ser de 118 x 20 pixels cd. O componente jrbPoupanca deve ser posicionado no pixel 225 x 150 da janela ce. Configure o atalho (alt + p) para o componente jrbPoupanca
jrbPoupanca.setMnemonic(P);

cf. Adicione o componente jrbPoupanca no container da Janela 18. Para garantir que apenas um boto radio seja selecionado pelo usurio, temos que agrupar os componentes jrbCorrente e jrbPoupanca em um container do tipo ButtonGroup. Crie a instncia do container bgContas e adicione os componentes jrbCorrente e jrbPoupanca nele.
bgContas = new ButtonGroup(); bgContas.add(jrbCorrente); bgContas.add(jrbPoupanca);

19. Crie a instncia do componente jSeparator02 e configure as seguintes opes: cg. O tamanho do componente jSeparator02 deve ser de 365 x 10 pixels ch. O componente jSeparator02 deve ser posicionado no pixel 10 x 180 da janela ci. Adicione o componente jSeparator02 no container da Janela

20. Crie a instncia do componente jbConsultar e configure as seguintes opes: cj. O tamanho do componente jbConsultar deve ser de 100 x 23 pixels ck. O componente jbConsultar deve ser posicionado no pixel 35 x 190 da janela cl. Configure o atalho (alt + s) para o componente jbConsultar cm. Adicione o componente jbConsultar no container da Janela
jbConsultar = new JButton(Consultar); jbConsultar.setBounds(35, 190, 100, 23); jbConsultar.setMnemonic(S); add(jbConsultar);

21. Crie a instncia do componente jbAtualizar e configure as seguintes opes: cn. O tamanho do componente jbAtualizar deve ser de 100 x 23 pixels co. O componente jbAtualizar deve ser posicionado no pixel 145 x 190 da janela cp. Configure o atalho (alt + a) para o componente jbAtualizar cq. Por padro, o componente jbAtualizar deve ficar desabilitado. Para isso, adicione o cdigo abaixo:
jbAtualizar.setEnabled(false);

www.3way.com.br

105

Java OO | Laboratrio 14
cr. Adicione o componente jbAtualizar no container da Janela 22. Crie a instncia do componente jbFechar e configure as seguintes opes: cs. O tamanho do componente jbFechar deve ser de 100 x 23 pixels ct. O componente jbFechar deve ser posicionado no pixel 225 x 190 da janela cu. Configure o atalho (alt + f) para o componente jbFechar cv. Adicione o componente jbFechar no container da Janela

Exerccio 2 | Manipulao de eventos com Java Swing.


1. Utilizando a janela implementada no exerccio anterior crie os seguintes eventos. 1.1. Utilize o mtodo windowOpened() da interface WindowListener, para exibir a caixa de dilogo abaixo no momento em que o usurio abrir a aplicao. a. b. c. d. e. Dentro do construtor da classe Janela, faa uma chamada ao mtodo addWindowListener(). Esse mtodo adiciona um ouvinte a sua Janela. Dentro do parmetro do mtodo addWindowListener() crie uma classe do tipo java.awt. event.WindowAdapter Dentro da classe WindowAdapter, sobrescreva o mtodo windowOpened() da interface WindowListener Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela. Dentro desse mtodo, voc deve criar uma caixa de dilogo (JOptionPane) para exibir a mensagem na tela. Veja o exemplo abaixo:
addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent evt) { JOptionPane.showMessageDialog(null, Programao Java OO, 3Way NetWorks, JOptionPane.INFORMATION_MESSAGE); } });

1.2. Utilize o mtodo windowClosing() da interface WindowListener, para exibir a caixa de dilogo abaixo no momento em que o usurio fechar a aplicao. a. Dentro da classe WindowAdapter (criada anteriormente),sobrescreva o mtodo windowClosing() da interface WindowListener

b.

Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela onde ser exibida a caixa de dilogo acima.

1.3. A janela contm seis caixas de textos (jtfAgencia, jtfConta, jtfNome, jtfEndereco, jtfTelefone e jtfCpf). No momento em que o usurio ativar algum desses componentes,

www.3way.com.br

106

Java OO | Laboratrio 14
a cor do componente selecionado ser alterado para amarelo. No momento em que o usurio sair do componente, a cor deve voltar a ser branca. Para isso, implemente a lgica abaixo em todos os componentes citados anteriormente. a. Dentro do construtor da classe Janela, aps definir o tamanho e a posio de cada JTextField, faa uma chamada ao mtodo addFocusListener() a partir do componente criado. Esse mtodo adiciona um ouvinte que gerencia os focus do seu componente. Dentro do parmetro do mtodo addFocusListener() crie uma classe do tipo java.awt. event.FocusAdapter Dentro da classe FocusAdapter, sobrescreva o mtodo focusGained() da interface FocusListener Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela. Veja o exemplo abaixo: Dentro desse mtodo, voc deve alterar a cor do componente selecionado pelo usurio: Essa mesma lgica deve ser utilizada para gerenciar quando o componente perde o focus. Dentro da classeFocusAdapter (criada anteriormente), sobrescreva o mtodo focusLost() da interface FocusListener Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela onde ser alterada a cor do componente. O resultado dessa implementao deve ser parecida com o exemplo abaixo:
jtfAgencia.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent evt) { jtfAgencia.setBackground(Color.YELLOW); } @Override public void focusLost(FocusEvent evt) { jtfAgencia.setBackground(Color.WHITE); } });

b. c. d. e. f.

g. h.

1.4. As caixas de textos jtfAgencia, jtfConta, jtfTelefone e jtfCpf so todas numricas. Desse modo, adicione aos componentes uma mscara para permitir que somente caracteres numricos sejam digitados pelo usurio. J que estamos trabalhando com mscaras, vamos formatar o texto digitado pelo usurio. a. A classe que controla as mscaras das caixas de texto ajavax.swing.text.MaskFormatter. A classe MaskFormatter contm um construtor alternativo que recebe uma String com

www.3way.com.br

107

Java OO | Laboratrio 14
a mscara formatada. Por exemplo, para criar uma mscara para o CPF devemos criar o objeto com a String: ###.###.###-## b. A mscara no pode ser aplicada diretamente em objetos do tipo JTextField. Mantenha a declarao das caixas de texto como JTextField, porm as instncias criadas para esses objetos sero do tipo JFormattedTextField (polimorfismo). O componente jtfAgencia deve ter a seguinte mscara:####-# O componente jtfConta deve ter a seguinte mscara: #####-# O componente jtfTelefone deve ter a seguinte mscara: (0xx##) ####-#### O componente jtfCpf deve ter a seguinte mscara: ###.###.###-## O caractere # serve como um coringa, e s pode ser substitudo por um caractere numrico Para utilizar a classe MaskFormatter necessrio fazer o tratamento de exceo do tipo ParseException. Veja um exemplo abaixo:
try { jtfAgencia = new JFormattedTextField(new MaskFormatter(####-#)); } catch (ParseException e) { e.printStackTrace(); }

c. d. e. f. g. h.

1.5. Finalizando essa lista de exerccio, vamos adicionar os eventos paracomponentes do tipo JButton ao nosso projeto. Para isso: a. b. Utilize o mtodo actionPerformed() da interface ActionListener, para controlar os eventos nos botes jbConsultar, jbAtualizar e jbFechar Dentro do construtor da classe Janela, aps definir o tamanho, a posio e o atalho de cada JButton, faa uma chamada ao mtodo addActionListener() a partir do componente criado. Esse mtodo adiciona um ouvinte que gerencia todos os eventos que o usurio pode provocar nos botes a partir do teclado ou do mouse Dentro do parmetro do mtodo addActionListener() crie uma classe do tipo java.awt. event.ActionListener Dentro da classe ActionListener, implemente o mtodo actionPerformed() Dentro desse mtodo, faa uma chamada para qualquer mtodo da classe Janela. Adicione um evento para o componente jbConsultar, que exiba a caixa de dilogo abaixo caso o usurio no preencha ao menos um dos campos jtfAgencia e jtfConta. Veja o exemplo abaixo:

c. d. e. f.

jbConsultar.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(jtfAgencia.getText().equals( - ) || jtfConta.getText().equals( - )){ JOptionPane.showMessageDialog(null, E necessrio informar a agncia e a conta, 3Way NetWorks, JOptionPane.INFORMATION_MESSAGE); } } });

g.

Adicione um evento para o componente jbFechar, que feche a aplicao caso o usurio

www.3way.com.br

108

Java OO | Laboratrio 14
clique no boto Fechar. Para fechar a aplicao, utilize o comando abaixo:
jbFechar.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } });

www.3way.com.br

109

Java OO | Laboratrio Projeto


Projeto | Criando Aplicao Orientada a Objeto + Swing
Neste laboratrio ir desenvolver para aplicao Banco que est sendo construda ao longo deste laboratrio. Sugerimos que estes exemplos sejam feitos com uso da IDE Eclipse.

1 | Descrio do Problema
O Sistema proposto e um sistema que ter um CRUD de clientes, ou seja, incluso, alterao, excluso e listagem de clientes. Cada cliente ter possibilidade de realizar operaes bancarias, tais como: - Saque - Deposito - Transferncia entre contas

O Sistema uma sequencia das atividades realizadas at o momento, utilize da boa prtica de reutilizao de cdigo. O Sistema dever ser modularizado conforme a figura 2 deste documento. Ao final deste documento vai ser anexada a soluo para o problema, porm e de grande importncia que voc tente desenvolver a soluo, esta que ser usada durante todo o curso.

www.3way.com.br

110

Java OO | Laboratrio Projeto


Figura 1 Diagrama UML para aplicao Banco

Figura 2 Diviso de pacotes para aplicao Banco

2 | Criao do projeto
1. Crie trs projetos Java e os respectivos pacotes conforme a figura 3 abaixo: - Banco-Modelo - Banco-Servico - Banco-SwingWeb

Figura 3 Diviso de pacotes e criao de projeto para aplicao Banco

www.3way.com.br

111

Java OO | Laboratrio Projeto


2. Configure as dependncias dos projetos. No build path do projeto Banco-Servico adicione o projeto Banco-Modelo, e no projeto Banco-SwingView adicione Banco-Servico. 3. Copie todas as classes que voc utilizou nos laboratrios e distribua conforme a figura 4.

Caso voc no tenha desenvolvido anteriormente a classe, crie no pacote conforme a imagem abaixo.

Figura 4 Classes do projeto Banco

3 | Prototipao Crie as telas de acordo com os prottipos. Utilize o windowBuilder.

Figura 5 Prototipao tela inicial (Frame)

www.3way.com.br

112

Java OO | Laboratrio Projeto

Figura 6 Prototipao tela Manter Clientes (JInternalFrame)

Figura 7 Prototipao tela Operaes Bancarias (JInternalFrame)

www.3way.com.br

113

Java OO | Laboratrio Projeto

Figura 8 Prototipao tela Abrir Conta (JDialog)

Figura 9 Prototipao tela Transferncia entre contas (JDialog)

www.3way.com.br

114

Java OO | Laboratrio Projeto


4 | Aes de tela

4.1. Figura 5 - Tela inicial do sistema Banco


- Label com o nome do banco e agncia ser definida na classe AgenciaService.java

- Boto Manter clientes instanciar o JInternalFrame de Manter Clientes dentro de um JDesktopPane. - Boto Operaes Bancarias instanciar o JInternalFrame de Operaes Bancarias dentro de um JDesktopPane. Manter a instancia do cliente selecionado para aes do mesmo. - Somente o boto de Manter Clientes estar habilitado, enquanto um cliente no estiver sido selecionado o boto de Operaes bancarias estar desabilitado.

4.2. Figura 6 - Tela Manter Clientes (JInternalFrame)

- O boto (JButton) limpar ter funo de limpar os campos de entrada (JTextField). Sempre estar habilitado. - O boto de salvar ter funo de salvar e validar os dados digitados pelo cliente. A validao vai ser a obrigatoriedade de inserir os valores de nome e CPF, caso estes no sejam inseridos o sistema dever emitir uma mensagem avisando que os campos so de carter obrigatrio. Estar desabilitado quando um cliente for selecionado na lista. - O boto atualizar ter funo de validar e atualizar dados de um determinado cliente selecionado na lista. A validao vai ser a obrigatoriedade de inserir os valores de nome e CPF, caso estes no sejam inseridos o sistema dever emitir uma mensagem avisando que os campos so de carter obrigatrio. Estar habilitado somente quando um cliente for selecionado. - O boto de excluir ter funo de excluir um determinado cliente selecionado na lista. Estar habilitado somente quando um cliente for selecionado. - A tabela (JTable) listar todos os clientes cadastrados do sistema. Ter ao de MouseListener, ou seja quando houver click em algum cliente da tabela devera ocorrer a ao de preenchimento dos campos de acordo com o cliente selecionado. Est funo habilitar o boto de atualizar, excluir e operaes bancarias e desabilitar o boto de salvar.

4.3. Figura 7 - Tela Operaes Bancarias (JInternalFrame)

- Boto de abrir conta ter funo de instanciar e mostrar a tela de abrir conta (JDialog). Caso j exista uma conta para o cliente selecionado o boto ficar desabilitado. - Se houver alguma conta para o cliente, os botes de saque, depsito e transferncia ficaro habilitados. - Boto de Saque ter a ao de abrir um JOptionPane para o usurio informar o valor do saque que deseja fazer. Ao informar o valor ser validado o formato que o usurio inseriu os dados e se h saldo suficiente para ao de saque, assim informando a mensagem de validao. - Boto de Deposito ter a ao de abrir um JOptionPane para o usurio informar o valor

www.3way.com.br

115

Java OO | Laboratrio Projeto


do depsito que deseja fazer. . Ao informar o valor ser validado o formato que o usurio inseriu os dados, assim informando a mensagem de validao.

- Boto de transferncia ter funo de instanciar e mostrar a tela de transferncia (JDialog).

- A tabela (JTable) listar todas as transaes feitas naquela conta, depsitos, saques e transferncias.

4.4. Figura 8 - Tela Abrir Conta (JDialog)


- O boto cancelar ter ao de fechar a janela.

- O boto salvar ter a ao de validar e criar uma conta para o cliente. A validao vai ser a obrigatoriedade de inserir o numero da conta, caso este no seja inserido o sistema dever emitir uma mensagem avisando que o campo de carter obrigatrio.

4.5. Figura 8 - Tela Transferncia (JDialog)


- O boto cancelar ter ao de fechar a janela.

- O boto realizar transferncia ter a ao de validar e realizar a transferncias entre as contas. A validao vai ser a obrigatoriedade dos campos numero de conta destino e valor da transferncia, caso estes no sejam inseridos o sistema dever emitir uma mensagem avisando que os campos so de carter obrigatrio. Outra validao ser de numero de conta inexistente, ou seja, caso no exista uma conta com o numero informado o sistema dever emitir uma mensagem avisando que no existe conta com esse numero. Outra validao ser que o valor de, caso o valor informado no esta de acordo com o formato o sistema devera emitir uma mensagem informando o usurio a informar o valor corretamente.

5 |Passo a Passo do cdigo fonte do sistema


5.1. Dao Data Access Object
- Crie a interface Dao.java conforme a listagem

1 abaixo, todas suas classes Dao implementaro essa interface. Lembre-se de sempre seguir a modelagem UML figura 1 e a ordem de pacotes e projetos conforme a figura 4 deste documento.
package threeway.projeto.service.Dao; public interface Dao<E extends Entidade> { /** * Busca a entidade pelo seu identificador. * * @param identificador da entidade * * @return Entidade pesquisada */ E obter(final Serializable identificador); /** * Altera a entidade. * * @param entidade */ void alterar(final E entidade); /**

www.3way.com.br

116

Java OO | Laboratrio Projeto


* Insere a entidade. * * @param entidade */ void salvar(final E entidade); /** * Remove a entidade. * * @param entidade */ void remover(final E entidade); /** * Consulta os objetos que possuirem os valores dos atributos do objeto informado. * * @param entidade que ser utilizado como parmetro na consulta. * * @return Collection<E> */ Collection<E> consultar(final E entidade); /** * Lista todos os objetos da entidade. * * @return Collection<E> */ Collection<E> listar(); } Listagem 1 Dao.java

5.2. Figura 5 - Tela inicial do sistema Banco

Banco e Agncia do sistema sero estticos, ou seja ser criada uma classe para cada um para criao de instancias estticas para acesso de todo o sistema. As classes sero AgenciaService.java e BancoService.java, siga a figura 4.

import threeway.projeto.modelo.Banco; public class BancoService { public static final Banco bancoSistema() { } } Banco bancoSistema = new Banco(1); bancoSistema.setNome(Banco Java Brasil); return bancoSistema;

Listagem 2 BancoService.java import threeway.projeto.modelo.Agencia; import threeway.projeto.modelo.Banco; public class AgenciaService { public static final Agencia agenciaSistema() { Banco bancoSistema = BancoService.bancoSistema(); Agencia agenciaSistema = new Agencia(3way NetWorks!);

www.3way.com.br

117

Java OO | Laboratrio Projeto


} } agenciaSistema.setBanco(bancoSistema); bancoSistema.getAgencias().add(agenciaSistema); return agenciaSistema;

Listagem 3 AgenciaService.java

Crie a Classe Inicial.java pelo windowBuilder como um JFrame. Utilize o Design do window builder para criar o JFrame conforme o prottipo. Deixe os atributos necessrios com visibilidade para toda a classe. Instancie ClienteService.java e ContaService.java pois estas instancias sero necessrias em outras telas, e assim podem ser passadas por parmetro.

package threeway.projeto.gui; public class Inicial { private ClienteService clienteService = new ClienteService(); private ContaService contaService = new ContaService(); private JFrame frmGereciamentoDeBanco; private JDesktopPane panelInterno; private JInternalFrame frameInterno; private JLabel lblBancoResult; private JLabel lblAgenciaResult; private JButton btnManterClientes; private static JButton btnOperaesBancarias; private static Cliente clienteSelecionado;

} Listagem 4 Inicial.java

Inicialize as variveis pelo mtodo initialize();

/** * Mtodo responsvel por inicializar todos os componentes swing deste frame * */ private void initialize() { frmGereciamentoDeBanco = new JFrame(); frmGereciamentoDeBanco.setResizable(false); frmGereciamentoDeBanco.setTitle(Sistema de Gereciamento de Banco); frmGereciamentoDeBanco.setBounds(100, 100, 800, 600); frmGereciamentoDeBanco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frmGereciamentoDeBanco.getContentPane().setLayout(null); frmGereciamentoDeBanco.setLocationRelativeTo(null); JLabel lblBanco = new JLabel(Banco:); lblBanco.setFont(new Font(Tahoma, Font.BOLD, 14)); lblBanco.setBounds(10, 11, 74, 23); frmGereciamentoDeBanco.getContentPane().add(lblBanco); JLabel lblAgencia = new JLabel(Agncia:); lblAgencia.setFont(new Font(Tahoma, Font.BOLD, 14));

www.3way.com.br

118

Java OO | Laboratrio Projeto


} Listagem 6 Inicial.java mtodo initialize(); lblAgencia.setBounds(10, 45, 74, 23); frmGereciamentoDeBanco.getContentPane().add(lblAgencia); btnManterClientes = new JButton(Manter Clientes); btnManterClientes.setBounds(10, 89, 170, 37); frmGereciamentoDeBanco.getContentPane().add(btnManterClientes); btnOperaesBancarias = new JButton(Operaes Bancarias); btnOperaesBancarias.setBounds(190, 89, 170, 37); btnOperaesBancarias.setEnabled(Boolean.FALSE); frmGereciamentoDeBanco.getContentPane().add(btnOperaesBancarias); lblBancoResult = new JLabel(...); lblBancoResult.setFont(new Font(Tahoma, Font.BOLD, 14)); lblBancoResult.setBounds(94, 11, 480, 20); frmGereciamentoDeBanco.getContentPane().add(lblBancoResult); lblAgenciaResult = new JLabel(...); lblAgenciaResult.setFont(new Font(Tahoma, Font.BOLD, 14)); lblAgenciaResult.setBounds(94, 45, 480, 20); frmGereciamentoDeBanco.getContentPane().add(lblAgenciaResult); JSeparator separator = new JSeparator(); separator.setBounds(10, 79, 764, 11); frmGereciamentoDeBanco.getContentPane().add(separator); panelInterno = new JDesktopPane(); panelInterno.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0))); panelInterno.setBounds(10, 137, 764, 414); frmGereciamentoDeBanco.getContentPane().add(panelInterno); panelInterno.setLayout(null); frameInterno = new JInternalFrame(New JInternalFrame); frameInterno.setBounds(10, 11, 744, 392); panelInterno.add(frameInterno); frameInterno.setVisible(false);

No construtor da classe Inicial.java chame o mtodo initialize() e preencha os label com o resultado da listagem 3 informando a agncia e banco do sistema. Acessando o mtodo esttico da classe AgenciaService.java.

/** * Responsvel pela criao de novas instncias desta classe. */ public Inicial() { } Listagem 6 Inicial.java - Contrutor initialize(); lblAgenciaResult.setText(AgenciaService.agenciaSistema().getNome()); lblBancoResult.setText(AgenciaService.agenciaSistema().getBanco().getNome()); eventoDosBotoes(); // mtodo que adiciona evento aos botes

Crie o mtodo eventoDosBotoes(), onde ser instanciado os eventos dos botes da tela.
/** * Mtodo responsvel por adicionar evento aos botes

www.3way.com.br

119

Java OO | Laboratrio Projeto


* */ public void eventoDosBotoes() { btnOperaesBancarias.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

mostraTelaOperacoesBancarias(); } }); btnManterClientes.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

mostraTelaManterClientes(); } }); } Listagem 7 Inicial.java eventoDosBotoes()

Foi criado os mtodos mostraTelaOperacoesBancarias() e mostraTelaManterClientes(), isso para deixar o cdigo mais organizado e diminuindo a complexidade dos mtodos.
/** * Mtodo responsvel por instanciar e mostrar a tela de Manter Clientes * */ public void mostraTelaManterClientes() { try { JInternalFrame newFrame = new ManterCliente(clienteService); newFrame.setBounds(frameInterno.getBounds()); panelInterno.add(newFrame); newFrame.show();

} catch (ParseException e1) { e1.printStackTrace();

} }

/** * Mtodo responsvel por instanciar e mostrar a tela de Operaes Bancarias * */ public void mostraTelaOperacoesBancarias() { JInternalFrame newFrame = new OperacoesBanco(this.contaService, clienteSelecionado); newFrame.setBounds(frameInterno.getBounds()); panelInterno.add(newFrame); newFrame.show();

} Listagem 8 Inicial.java mostraTelaOperacoesBancarias() e mostraTelaManterClientes()

www.3way.com.br

120

Java OO | Laboratrio Projeto


Repare que no existe os construtores para OperacoesBanco() e ManterCliente(), iremos criar estes a seguir.

Crie o mtodo esttico para mudar habilitar o boto operaes bancarias e setar o objeto cliente para tornar possveis as aes da tela de operaes bancarias.

5.3. Figura 6 - Tela Manter Clientes


Crie a Classe ClienteDao.java implementando a interface Dao<?>. Siga a listagem 9 abaixo.

package threeway.projeto.service.Dao; public class ClienteDao implements Dao<Cliente> { private Collection<Cliente> clientesMemoria = new ArrayList<Cliente>(); @Override public Cliente obter(Serializable identificador) { } return null;

@Override public void alterar(Cliente entidade) { for (Cliente cliente : clientesMemoria) { if (entidade.equals(cliente)) {

clientesMemoria.remove(cliente); clientesMemoria.add(entidade); break; } } } @Override public void salvar(Cliente entidade) { } @Override public void remover(Cliente entidade) { } @Override public Collection<Cliente> consultar(Cliente entidade) { } return null; this.clientesMemoria.remove(entidade); this.clientesMemoria.add(entidade);

@Override public Collection<Cliente> listar() { if (this.clientesMemoria.size() < 1) { Cliente correntista1 = new Cliente(correntista 1, 111.111.111-11);

www.3way.com.br

121

Java OO | Laboratrio Projeto


} } Cliente correntista2 = new Cliente(correntista 2, 222.222.222-22); this.clientesMemoria.add(correntista1); this.clientesMemoria.add(correntista2);

} return this.clientesMemoria;

Listagem 9 ClienteDao.java

Crie a Classe ClienteService.java instanciando um objeto do tipo ClienteDao para acesso aos dados em memoria. Siga a listagem 10 abaixo.

package threeway.projeto.service; public class ClienteService { private ClienteDao dao = new ClienteDao(); /** * Mtodo responsvel por Atualizar entidade cliente * * @param cliente * * @throws CamposObrigatoriosException */ public void atualizar(Cliente cliente) throws CamposObrigatoriosException { } /** * Mtodo responsvel por excluir entidade cliente * * @param cliente */ public void excluir(Cliente cliente) { } /** * Mtodo responsvel por listar todos os clientes * * @return ArrayList<Cliente> */ public ArrayList<Cliente> listarTodosClientes() { } return new ArrayList<Cliente>(this.getDao().listar()); this.getDao().remover(cliente); this.validarCamposObrigatorios(cliente); this.getDao().alterar(cliente);

/** * Mtodo responsvel por salvar a entiade cliente * * @param cliente * * @throws CamposObrigatoriosException */ public void salvar(Cliente cliente) throws CamposObrigatoriosException { this.validarCamposObrigatorios(cliente);

www.3way.com.br

122

Java OO | Laboratrio Projeto


} /** * Mtodo responsvel por validar campos obrigatorios Nome e CPF de cliente * * @param cliente * * @throws CamposObrigatoriosException */ private void validarCamposObrigatorios(Cliente cliente) throws CamposObrigatoriosException { if (cliente == null || cliente.getNome().equals() || cliente.getCpf(). replace(-, ).replace(., ).trim().equals()) { } } throw new CamposObrigatoriosException(); this.getDao().salvar(cliente);

/** * Mtodo responsvel por retornar a instancia de ClienteDao * * @return */ public ClienteDao getDao() { } } Listagem 10 ClienteService.java return dao;

Veja que voc precisar implementar a classe CamposObrigatoriosException.java para tratar a exceo quando o usurio no informar os campos obrigatrios definidos. Siga a listagem 11 abaixo.

package threeway.projeto.service.excecoes; public class CamposObrigatoriosException extends Exception { private static final long serialVersionUID = -5487345156293002556L; /** * Responsvel pela criao de novas instncias desta classe. */ public CamposObrigatoriosException() { } super(Por Favor preencha todos campos obrigtorios!);

/** * Responsvel pela criao de novas instncias desta classe. * * @param mensagem */ public CamposObrigatoriosException( String mensagem ) { } } Listagem 11 CamposObrigatoriosException.java super(mensagem);

www.3way.com.br

123

Java OO | Laboratrio Projeto


Crie a Classe ManterCliente.java pelo windowBuilder como um JInternalFrame. Utilize o Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios com visibilidade para toda a classe.
package threeway.projeto.gui; public class ManterCliente extends JInternalFrame { private ClienteService service; private JTextField tfNome; private JTextField tfEndereco; private JTextField tfRg; private JFormattedTextField ftfCpf; private JFormattedTextField ftfTelefone; private JTable tableClientes; private JButton btnSalvar; private JButton btnAtualizar; private JButton btnExcluir; private JButton btnLimpar; private JPanel panelLista; private Boolean clienteSelecionado = Boolean.FALSE; private Cliente cliente = new Cliente(); } Listagem 12 ManterCliente.java

Inicialize as variveis pelo mtodo initialize(). Siga a listagem 13 abaixo.

/**

* Mtodo responsvel por inicializar componentes da tela * * @throws ParseException */ private void initialize() throws ParseException { setClosable(true); setTitle(Manter Clientes); setBounds(100, 100, 750, 375); getContentPane().setLayout(null);

JPanel panelCad = new JPanel(); panelCad.setBorder(new TitledBorder(UIManager.getBorder(TitledBorder.border), Cadastrar Cliente, TitledBorder.LEADING, TitledBorder.TOP, null, null)); panelCad.setBounds(10, 11, 714, 142); getContentPane().add(panelCad); panelCad.setLayout(null); JLabel lblNome = new JLabel(Nome *:); lblNome.setBounds(10, 24, 91, 14); panelCad.add(lblNome); JLabel lblTelefone = new JLabel(Telefone:); lblTelefone.setBounds(444, 24, 62, 14);

www.3way.com.br

124

Java OO | Laboratrio Projeto


Clientes } Listagem 13 ManterCliente.java initialize() panelCad.add(lblTelefone); JLabel lblEndereo = new JLabel(Endereo:); lblEndereo.setBounds(10, 52, 91, 14); panelCad.add(lblEndereo); JLabel lblRegistroGeral = new JLabel(Registro Geral:); lblRegistroGeral.setBounds(10, 80, 91, 14); panelCad.add(lblRegistroGeral); JLabel lblCpf = new JLabel(CPF *:); lblCpf.setBounds(400, 80, 34, 14); panelCad.add(lblCpf); tfNome = new JTextField(); tfNome.setBounds(111, 21, 311, 20); panelCad.add(tfNome); tfNome.setColumns(10); ftfTelefone = new JFormattedTextField(new MaskFormatter((##)####-####)); ftfTelefone.setBounds(516, 21, 188, 20); panelCad.add(ftfTelefone); tfEndereco = new JTextField(); tfEndereco.setBounds(111, 49, 593, 20); panelCad.add(tfEndereco); tfEndereco.setColumns(10); tfRg = new JTextField(); tfRg.setBounds(111, 77, 202, 20); panelCad.add(tfRg); tfRg.setColumns(10); ftfCpf = new JFormattedTextField(new MaskFormatter(###.###.###-##)); ftfCpf.setBounds(444, 77, 260, 20); panelCad.add(ftfCpf); ftfCpf.setColumns(10); btnSalvar = new JButton(Salvar); btnSalvar.setBounds(417, 108, 89, 23); panelCad.add(btnSalvar); btnAtualizar = new JButton(Atualizar); btnAtualizar.setBounds(516, 108, 89, 23); panelCad.add(btnAtualizar); btnExcluir = new JButton(Excluir); btnExcluir.setBounds(615, 108, 89, 23); panelCad.add(btnExcluir); JLabel lblCamposObrigatrios = new JLabel((*) Campos Obrigatrios); lblCamposObrigatrios.setBounds(10, 117, 174, 14); panelCad.add(lblCamposObrigatrios); btnLimpar = new JButton(Limpar); btnLimpar.setBounds(318, 108, 89, 23); panelCad.add(btnLimpar); panelLista = new JPanel(); panelLista.setBorder(new TitledBorder(UIManager.getBorder(TitledBorder.border), Cadastrados, TitledBorder.LEADING, TitledBorder.TOP, null, null)); panelLista.setBounds(10, 164, 714, 175); getContentPane().add(panelLista); panelLista.setLayout(null);

www.3way.com.br

125

Java OO | Laboratrio Projeto


No construtor da classe ManterCliente.java chame o mtodo initialize() e faa com que receba uma instancia de ClienteService.java.
/** * Responsvel pela criao de novas instncias desta classe. * * @param service * * @throws ParseException */ public ManterCliente( ClienteService service ) throws ParseException { } this.service = service; initialize(); defineEnabledBotoes(); iniciaJTable(); atualizaDadosTabela(); addEventoMouseListenerTabela(); acaoBotaoSalvar(); acaoBotaoLimpar(); acaoBotaoExcluir(); acaoBotaoAtualizar();

Listagem 14 ManterCliente.java construtor()

Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 15 abaixo.
/** * Mtodo responsvel por definir quando os botoes estaro habilitados * */ private void defineEnabledBotoes() { } /** * Mtodo responsvel por adicionar evento de click na tabela de clientes * */ private void addEventoMouseListenerTabela() { tableClientes.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { btnExcluir.setEnabled(clienteSelecionado); btnAtualizar.setEnabled(clienteSelecionado); btnSalvar.setEnabled(!clienteSelecionado); ftfCpf.setEditable(!clienteSelecionado); Inicial.modificaBotaoOperacoes(clienteSelecionado, cliente);

int l = tableClientes.getSelectedRow(); cliente = service.listarTodosClientes().get(l); carregarValores(cliente);

www.3way.com.br

126

Java OO | Laboratrio Projeto


} }); } /** * Mtodo responsvel por carregar os valores de cliente * * @param cliente */ public void carregarValores(Cliente cliente) { } /** * Mtodo responsvel por inicializar componente JTable * */ private void iniciaJTable() { } /** * Mtodo responsvel por atualizar dados da JTable * */ private void atualizaDadosTabela() { tableClientes.setModel(new DefaultTableModel(new Object[][] {}, retornaNomeColunas())); tableClientes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); DefaultTableModel dtm = (DefaultTableModel) tableClientes.getModel(); Cliente cli = new Cliente(); ArrayList<Cliente> listaCliente = service.listarTodosClientes(); Collections.sort(listaCliente); Iterator<Cliente> it = listaCliente.iterator(); while (it.hasNext()) { tableClientes = new JTable(); tableClientes.setModel(new DefaultTableModel(new Object[][] {}, retornaNomeColunas())); tableClientes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tableClientes.setBounds(703, 24, -690, 140); tableClientes.getTableHeader().setReorderingAllowed(false); JScrollPane scrollPane = new JScrollPane(tableClientes); scrollPane.setViewportView(tableClientes); scrollPane.setBounds(10, 24, 694, 140); panelLista.add(scrollPane); ftfCpf.setText(cliente.getCpf()); ftfTelefone.setText(cliente.getTelefone()); tfEndereco.setText(cliente.getEndereco()); tfNome.setText(cliente.getNome()); tfRg.setText(cliente.getRg()); this.clienteSelecionado = Boolean.TRUE; defineEnabledBotoes();

www.3way.com.br

127

Java OO | Laboratrio Projeto


cli = it.next();

dtm.addRow(new Object[] { cli.getNome(), cli.getEndereco(), cli.getTelefone(), cli. getRg(), cli.getCpf() }); } /** * Mtodo responsvel por retornaqr o nome das colunas da tabela clientes * * @return String[] */ private String[] retornaNomeColunas() { } String[] columnNames = new String[5]; columnNames[0] = ( Nome ); columnNames[1] = ( Endereo ); columnNames[2] = ( Telefone ); columnNames[3] = ( RG ); columnNames[4] = ( CPF ); return columnNames; }

/** * Mtodo responsvel por adicionar ao ao boto limpar * */ private void acaoBotaoLimpar() { btnLimpar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

limpar(); clienteSelecionado = Boolean.FALSE; } }); } /** * Mtodo responsvel por adicionar ao ao boto salvar * */ private void acaoBotaoSalvar() { btnSalvar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { defineEnabledBotoes();

try { preencheClienteComCampos();

service.salvar(cliente); JOptionPane.showMessageDialog(null, Cliente salvo com sucesso!); limpar();

} catch (CamposObrigatoriosException ex) {

www.3way.com.br

128

Java OO | Laboratrio Projeto


JOptionPane.showMessageDialog(null, ex.getMessage()); } finally { } } } /** * Mtodo responsvel por adicionar ao ao boto excluir * */ private void acaoBotaoExcluir() { btnExcluir.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { }); atualizaDadosTabela();

service.excluir(cliente); limpar();

clienteSelecionado = Boolean.FALSE; defineEnabledBotoes(); atualizaDadosTabela();

JOptionPane.showMessageDialog(null, Cliente removido com sucesso!); } }); } /** * Mtodo responsvel por adicionar ao ao boto atualizar * */ private void acaoBotaoAtualizar() { btnAtualizar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

try { preencheClienteComCampos();

service.atualizar(cliente); limpar();

clienteSelecionado = Boolean.FALSE; defineEnabledBotoes();

JOptionPane.showMessageDialog(null, Cliente atualizado com sucesso!); } catch (CamposObrigatoriosException ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } finally { } } }); } atualizaDadosTabela();

www.3way.com.br

129

Java OO | Laboratrio Projeto


/** * Mtodo responsvel por recuperar dados do JTextField e setar em cliente * */ public void preencheClienteComCampos() { } /** * Mtodo responsvel por limpar campos JTextField * */ public void limpar() { } Listagem 15 ManterCliente.java mtodos da classe ftfCpf.setText(); ftfTelefone.setText(); tfEndereco.setText(); tfNome.setText(); tfRg.setText(); cliente = new Cliente(); cliente = new Cliente(); cliente.setNome(tfNome.getText()); cliente.setEndereco(tfEndereco.getText()); cliente.setCpf(ftfCpf.getText()); cliente.setRg(tfRg.getText()); cliente.setTelefone(ftfTelefone.getText());

5.4. Figura 7 - Tela Operaes Bancarias

Crie a Classe ContaDao.java implementando a interface Dao<?>. Siga a listagem 16 abaixo. Observe que os mtodos que no sero utilizados no foi implementado, pois os requisitos do sistema no contemplam tais aes.

package threeway.projeto.service.Dao; public class ContaDao implements Dao<Conta> { private Collection<Conta> contasMemoria = new ArrayList<Conta>(); @Override public Conta obter(Serializable identificador) { } return null;

@Override public void alterar(Conta entidade) {} @Override public void salvar(Conta entidade) {

www.3way.com.br

130

Java OO | Laboratrio Projeto


} contasMemoria.add(entidade);

@Override public void remover(Conta entidade) {} @Override public Collection<Conta> consultar(Conta entidade) { } return null;

@Override public Collection<Conta> listar() { } } Listagem 16 ContaDAO.java return contasMemoria;

Modifique a Classe ContaService.java que veio sendo modificada ao longo dos laboratrios realizados, instanciando um objeto do tipo ContaDao para acesso aos dados em memoria e TransacaoService para manipular aes direcionados as transaes efetuadas. Siga a listagem 17 abaixo.

package threeway.projeto.service; public class ContaService { private ContaDao dao = new ContaDao(); private TransacaoService transacaoService = new TransacaoService(); /** * Mtodo responsvel por realizar ao de deposito * * @param contaDestino * * @param valor */ public void depositar(Conta contaDestino, double valor) { contaDestino.setSaldo(contaDestino.getSaldo() + valor);

this.historicoTransacao(null, contaDestino, valor, deposito na conta + contaDestino.getNumero(), EnumTipoTransacao.DEPOSITO); } /** * Mtodo responsvel por realizar ao de saque caso no tenha saldo suficiente e lanado uma exceo * * @param contaSaque * * @param valor * * @throws SaldoInsuficienteException */ public void sacar(Conta contaSaque, double valor) throws SaldoInsuficienteException { if (contaSaque.getSaldo() - valor >= 0) { contaSaque.setSaldo(contaSaque.getSaldo() - valor);

www.3way.com.br

131

Java OO | Laboratrio Projeto


this.historicoTransacao(null, contaSaque, valor, saque na conta + contaSaque.getNumero(), EnumTipoTransacao.SAQUE); } else { throw new SaldoInsuficienteException();

} }

/** * Mtodo responsvel por realizar transferencia entre contas caso no tenha saldo suficiente e lanado uma exceo * * @param contaSaque * * @param valor * * @param contaDestino * * @return boolean true se a transferencia for realizada com sucesso * * @throws SaldoInsuficienteException */ public boolean transferir(Conta contaSaque, double valor, Conta contaDestino) throws SaldoInsuficienteException { return transferir(contaSaque, valor, contaDestino, transferencia para conta + contaDestino.getNumero()); } /** * Mtodo responsvel por realizar transferencia entre contas caso no tenha saldo suficiente e lanado uma exceo * * @param contaSaque * * @param valor * * @param contaDestino * * @param descr * * @return boolean true se a transferencia for realizada com sucesso * * @throws SaldoInsuficienteException * */ public boolean transferir(Conta contaSaque, double valor, Conta contaDestino, String descr) throws SaldoInsuficienteException { if (contaSaque.getSaldo() - valor >= 0) { this.debito(contaSaque, valor); this.credito(contaDestino, valor);

this.historicoTransacao(contaSaque, contaDestino, valor, descr, EnumTipoTransacao.TRANSFERENCIA); } else { throw new SaldoInsuficienteException(); return true;

} }

/** * Mtodo responsvel por realizar debitos na conta * * @param contaOperacao * * @param valor

www.3way.com.br

132

Java OO | Laboratrio Projeto


*/ protected void debito(Conta contaOperacao, double valor) { } /** * Mtodo * * @param * * @param */ protected } /** * Mtodo responsvel por instanciar e gravar historico de transaes * * @param contaDebito * * @param contaCredito * * @param valor * * @param descr * * @param tipoTransacao */ protected void historicoTransacao(Conta contaDebito, Conta contaCredito, double valor, String descr, EnumTipoTransacao tipoTransacao) { Transacao transacao = new Transacao(UtilData.data(), contaDebito, contaCredito, valor, descr, tipoTransacao); if (contaDebito != null) { contaDebito.getTransacoes().add(transacao); responsvel por realizar operaes de credito na conta contaOperacao valor void credito(Conta contaOperacao, double valor) { contaOperacao.setSaldo(contaOperacao.getSaldo() - valor);

contaOperacao.setSaldo(contaOperacao.getSaldo() + valor);

} }

contaCredito.getTransacoes().add(transacao); transacaoService.salvar(transacao);

/** * Mtodo responsvel por salvar entidade conta validando campos obrigatorios * * @param conta * * @throws CamposObrigatoriosException */ public void salvar(Conta conta) throws CamposObrigatoriosException { } /** * Mtodo responsvel por validar campos obrigatorios * * @param conta * * @throws CamposObrigatoriosException */ private void validarCamposObrigatorios(Conta conta) throws CamposObrigatoriosException { this.validarCamposObrigatorios(conta); this.getDao().salvar(conta);

www.3way.com.br

133

Java OO | Laboratrio Projeto


if (conta == null || conta.getTitular() == null || conta.getNumero() == 0) { throw new CamposObrigatoriosException(); } }

/** * Mtodo responsvel por buscar conta pelo cliente * * @param cliente * * @return Conta */ public Conta buscaContaPorCliente(Cliente cliente) { for (Conta conta : getDao().listar()) { if (conta.getTitular().equals(cliente)) {

return conta; } } } return null;

/** * Mtodo responsvel por buscar conta por numero caso nao exista lana exceo de ContaNaoExisteException * * @param numeroConta * * @return Conta * * @throws ContaNaoExisteException */ public Conta buscaContaPorNumero(int numeroConta) throws ContaNaoExisteException { for (Conta conta : getDao().listar()) { if (conta.getNumero() == numeroConta) {

return conta; } } } throw new ContaNaoExisteException();

/** * Mtodo responsvel por retornar instancia de ContaDao * * @return */ public ContaDao getDao() { } } return dao;

Listagem 17 ContaService.java

Crie a Classe TransacaoService.java e TransacaoDao.java conforme a listagem 18 e 19 respectivamente.


package threeway.projeto.service.Dao; public class TransacaoDao implements Dao<Transacao> { private Collection<Transacao> transacoesMemoria = new ArrayList<Transacao>(); @Override

www.3way.com.br

134

Java OO | Laboratrio Projeto


public Transacao obter(Serializable identificador) { } return null;

@Override public void alterar(Transacao entidade) {} @Override public void salvar(Transacao entidade) { } @Override public void remover(Transacao entidade) {} @Override public Collection<Transacao> consultar(Transacao entidade) { return null; } @Override public Collection<Transacao> listar() { } } return transacoesMemoria; this.transacoesMemoria.add(entidade);

Listagem 18 TransacaoDao.java package threeway.projeto.service; public class TransacaoService { TransacaoDao dao = new TransacaoDao(); /** * Mtodo responsvel por retornar instancia de TransacaoDao * * @return TransacaoDao */ public TransacaoDao getDao() { } return dao;

/** * Mtodo responsvel por por salvar a entidade transao * * @param transacao */ public void salvar(Transacao transacao) { } } Listagem 19 TransacaoService.java this.getDao().salvar(transacao);

Veja que voc precisar implementar a classe ContaNaoExisteException.java para tratar a exceo quando o usurio informar um numero de conta que no existe. Siga a listagem 11 abaixo.
package threeway.projeto.service.excecoes; public class ContaNaoExisteException extends Exception{ private static final long serialVersionUID = -2692264935862218672L; /**

www.3way.com.br

135

Java OO | Laboratrio Projeto


* Responsvel pela criao de novas instncias desta classe. */ public ContaNaoExisteException() { } super(Conta no existe.);

/** * Responsvel pela criao de novas instncias desta classe. * * @param mensagem */ public ContaNaoExisteException(String mensagem) { } } Listagem 20 ContaNaoExisteException.java super(mensagem);

Crie a Classe OperacoesBanco.java pelo windowBuilder como um JInternalFrame. Utilize o Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios com visibilidade para toda a classe, observe que alguns atributos esto estticos, isto ocorre porque estes esto sendo acessados por mtodos estticos que os acessam ou modificam sem instanciar a classe. Siga a listagem 21 abaixo.

package threeway.projeto.gui; public class OperacoesBanco extends JInternalFrame { private static Cliente clienteSelecionado; private static ContaService contaService; private static Conta contaCliente; private static JPanel panelDadosConta; private static JTextField tfNumeroConta; private static JTextField tfDtAbertura; private static JTextField tfSaldo; private static JButton btnAbrirConta; private static JButton btnSaque; private static JButton btnDeposito; private static JButton btnTransferencia; private static Boolean contaCriada = Boolean.FALSE; private DialogAbrirConta dialogAbrirConta; private DialogTransferencia dialogTransferencia; private static JTable tableTransacoes; private JPanel panelTransacoes; } Listagem 21 OperacoesBanco.java

www.3way.com.br

136

Java OO | Laboratrio Projeto


Inicialize as variveis pelo mtodo initialize(). Siga a listagem 22 abaixo.
/** * Mtodo responsvel por inicializar componentes da tela * */ private void initialize() { setClosable(true); setBounds(100, 100, 750, 375); setTitle(Operaes Bancarias); getContentPane().setLayout(null); JLabel lblCliente = new JLabel(Cliente:); lblCliente.setFont(new Font(Tahoma, Font.BOLD, 12)); lblCliente.setBounds(13, 25, 46, 23); getContentPane().add(lblCliente); JLabel lblNomeCliente = new JLabel(clienteSelecionado.getNome()); lblNomeCliente.setFont(new Font(Tahoma, Font.BOLD, 12)); lblNomeCliente.setBounds(69, 25, 155, 23); getContentPane().add(lblNomeCliente);

panelDadosConta = new JPanel(); panelDadosConta.setBorder(new TitledBorder(null, Dados da Conta, TitledBorder. LEADING, TitledBorder.TOP, null, null)); panelDadosConta.setBounds(234, 11, 490, 53); getContentPane().add(panelDadosConta); panelDadosConta.setLayout(null); JLabel lblNumero = new JLabel(N :); lblNumero.setBounds(10, 20, 25, 14); panelDadosConta.add(lblNumero); tfNumeroConta = new JTextField(); tfNumeroConta.setEditable(false); tfNumeroConta.setBounds(45, 17, 42, 20); panelDadosConta.add(tfNumeroConta); tfNumeroConta.setColumns(10); JLabel lblSaldo = new JLabel(Saldo:); lblSaldo.setBounds(361, 20, 36, 14); panelDadosConta.add(lblSaldo); JLabel lblDataDeAbertura = new JLabel(Data de Abertura:); lblDataDeAbertura.setBounds(110, 20, 101, 14); panelDadosConta.add(lblDataDeAbertura); tfDtAbertura = new JTextField(); tfDtAbertura.setEditable(false); tfDtAbertura.setBounds(221, 17, 125, 20); panelDadosConta.add(tfDtAbertura); tfDtAbertura.setColumns(10); tfSaldo = new JTextField(); tfSaldo.setEditable(false); tfSaldo.setBounds(394, 17, 86, 20); panelDadosConta.add(tfSaldo); tfSaldo.setColumns(10); btnAbrirConta = new JButton(Abrir Conta); btnAbrirConta.setBounds(293, 80, 101, 37); getContentPane().add(btnAbrirConta); btnSaque = new JButton(Saque); btnSaque.setBounds(504, 80, 90, 37); getContentPane().add(btnSaque); btnDeposito = new JButton(Deposito); btnDeposito.setBounds(404, 80, 90, 37); getContentPane().add(btnDeposito); btnTransferencia = new JButton(Transferncia); btnTransferencia.setBounds(604, 81, 120, 36);

www.3way.com.br

137

Java OO | Laboratrio Projeto


getContentPane().add(btnTransferencia); JSeparator separator = new JSeparator(); separator.setBounds(13, 70, 711, 10); getContentPane().add(separator); JSeparator separator_1 = new JSeparator(); separator_1.setBounds(13, 128, 711, 10); getContentPane().add(separator_1);

panelTransacoes = new JPanel(); panelTransacoes.setBorder(new TitledBorder(null, Historico de Transa\u00E7\u00F5es, TitledBorder.LEADING, TitledBorder.TOP, null, null)); panelTransacoes.setBounds(13, 149, 711, 186); getContentPane().add(panelTransacoes); } Listagem 22 OperacoesBanco.java initialize();

No construtor da classe ManterCliente.java chame o mtodo initialize() e faa com que receba uma instancia de ContaService.java e Cliente.java como parmetros em seu construtor. Siga a listagem 23 abaixo
/** * Responsvel pela criao de novas instncias desta classe. * * @param serviceConta * * @param cliente */ public OperacoesBanco( ContaService serviceConta, Cliente cliente ) { } Listagem 23 OperacoesBanco.java Construtor clienteSelecionado = cliente; contaService = serviceConta; initialize(); verificaExistenciaDeContaParaCliente(); iniciaJTable(); atualizaDadosTabela(); acaoBotaoAbrirConta(); acaoBotaoDeposito(); acaoBotaoSaque(); acaoBotaoTransferencia();

Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 24 abaixo.
/** * Mtodo responsvel por verificar se ja existe conta para o cliente selecionado * */ private void verificaExistenciaDeContaParaCliente() { Conta conta = contaService.buscaContaPorCliente(clienteSelecionado); if (conta != null) { mudaStatusContaCriada(Boolean.TRUE);

www.3way.com.br

138

Java OO | Laboratrio Projeto


} else { mudaStatusContaCriada(Boolean.FALSE); contaCliente = conta;

} }

defineEnabledBotoes(); preenchePanelDescricaoConta();

/** * Mtodo responsvel por adicionar evento ao boto de transferencia, este que chamara o DialogTransferencia[JDialog] * */ private void acaoBotaoTransferencia() { btnTransferencia.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { dialogTransferencia = new DialogTransferencia(contaService, contaCliente); dialogTransferencia.setLocationRelativeTo(null); dialogTransferencia.show(); } }); } /** * Mtodo responsvel por adicionar evento ao boto de saque, este que chamar um JOptionPane para informar o valor do saque * */ private void acaoBotaoSaque() { btnSaque.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

try { Double valorDeposito = Double.parseDouble(JOptionPane. showInputDialog(null, Digite o valor para saque. (formato x00.00), Saque em conta bancria, JOptionPane.QUESTION_MESSAGE)); contaService.sacar(contaCliente, valorDeposito); JOptionPane.showMessageDialog(null, Saque realizado com sucesso!); preenchePanelDescricaoConta(); } catch (SaldoInsuficienteException ex1) { JOptionPane.showMessageDialog(null, ex1.getMessage()); }catch (Exception ex) { JOptionPane.showMessageDialog(null, Algum campo pode ter sido preenchido invlido. Verifique e tente novamente!); } finally { atualizaDadosTabela();

www.3way.com.br

139

Java OO | Laboratrio Projeto


} } }); } /** * Mtodo responsvel por adicionar evento ao boto deposito, este que chamar um JOptionPane para informar o valor do deposito * */ private void acaoBotaoDeposito() { btnDeposito.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

try { Double valorDeposito = Double.parseDouble(JOptionPane. showInputDialog(null, Digite o valor para deposito. (formato x00.00), Depsito em conta bancria, JOptionPane.QUESTION_MESSAGE)); contaService.depositar(contaCliente, valorDeposito); JOptionPane.showMessageDialog(null, Deposito realizado com sucesso!); preenchePanelDescricaoConta(); } catch (Exception ex) { JOptionPane.showMessageDialog(null, Algum campo pode ter sido preenchido invlido. Verifique e tente novamente!); } finally { atualizaDadosTabela(); } } }); } /** * Mtodo responsvel por adicionar evento ao boto de abrir conta, este que chamara o DialogAbrirConta[JDialog] * */ private void acaoBotaoAbrirConta() { btnAbrirConta.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

try { dialogAbrirConta = new DialogAbrirConta(contaService, clienteSelecionado); dialogAbrirConta.setLocationRelativeTo(null); dialogAbrirConta.show(); } catch (ParseException e1) { } } } }); e1.printStackTrace();

/** * Mtodo responsvel por inicializar JTable

www.3way.com.br

140

Java OO | Laboratrio Projeto


* */ private void iniciaJTable() { tableTransacoes = new JTable();

tableTransacoes.setModel(new DefaultTableModel(new Object[][] {}, retornaNomeColunas())); } /** * Mtodo responsvel por retornar nome das colunas da JTable * * @return String[] */ private static String[] retornaNomeColunas() { } String[] columnNames = new String[5]; columnNames[0] = ( Tipo Transao ); columnNames[1] = ( Titular/Conta Crdito ); columnNames[2] = ( Titular/Conta Debito ); columnNames[3] = ( Data ); columnNames[4] = ( Valor ); return columnNames; tableTransacoes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tableTransacoes.setBounds(703, 24, -690, 140); tableTransacoes.getTableHeader().setReorderingAllowed(false); panelTransacoes.setLayout(null); JScrollPane scrollPane = new JScrollPane(tableTransacoes); scrollPane.setViewportView(tableTransacoes); scrollPane.setBounds(10, 21, 691, 154); panelTransacoes.add(scrollPane);

/** * Mtodo responsvel por Atualizar dados da tabela de transaes sempre que alguma transao e feita esse metodo e chamado * */ public static void atualizaDadosTabela() { tableTransacoes.setModel(new DefaultTableModel(new Object[][] {}, retornaNomeColunas())); tableTransacoes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); DefaultTableModel dtm = (DefaultTableModel) tableTransacoes.getModel(); ArrayList<Transacao> listaTransacoes = new ArrayList<Transacao>(); if (contaCliente != null) { listaTransacoes = new ArrayList<Transacao>(contaCliente.getTransacoes());

Collections.sort(listaTransacoes); Iterator<Transacao> it = listaTransacoes.iterator();

www.3way.com.br

141

Java OO | Laboratrio Projeto


while (it.hasNext()) { Transacao tr = it.next(); if (tr.getTipoTransacao() == EnumTipoTransacao.TRANSFERENCIA) {

dtm.addRow(new Object[] { tr.getTipoTransacao(), tr.getContaCredito(). getTitular().getNome() + / + tr.getContaCredito().getNumero(), tr.getContaDebito().getTitular().getNome() + / + tr.getContaDebito().getNumero(), UtilData.DDMMAAAAHHMM(tr.getData()), String.format(%15.15s, tr.getValor()) }); } else { dtm.addRow(new Object[] { tr.getTipoTransacao(), tr.getContaCredito(). getTitular().getNome() + / + tr.getContaCredito().getNumero(), --, UtilData.DDMMAAAAHHMM(tr.getData()), String.format(%15.15s, tr.getValor()) }); } } } /** * Mtodo responsvel por definir se os botes abaixo definidos estaro habilitados ou no * */ public static void defineEnabledBotoes() { } /** * Mtodo responsvel por mudar flag de contaCriada de acordo com a funo executada no sistema * * @param flag */ public static void mudaStatusContaCriada(Boolean flag) { } contaCriada = flag; btnAbrirConta.setEnabled(!contaCriada); btnSaque.setEnabled(contaCriada); btnDeposito.setEnabled(contaCriada); btnTransferencia.setEnabled(contaCriada); panelDadosConta.setVisible(contaCriada);

/** * Mtodo responsvel por recuperar conta de um determinado cliente selecionado * */ public static void recuperaContaCliente() { } /** * Mtodo responsvel por preencher JTextField com os dados do cliente selecionado * */ public static void preenchePanelDescricaoConta() { if (contaCliente != null) { contaCliente = contaService.buscaContaPorCliente(clienteSelecionado); preenchePanelDescricaoConta();

www.3way.com.br

142

Java OO | Laboratrio Projeto


} } tfDtAbertura.setText(UtilData.formataData(contaCliente.getDataAbertura())); tfNumeroConta.setText(contaCliente.getNumero().toString()); tfSaldo.setText(contaCliente.getSaldo().toString());

Listagem 24 OperacoesBanco.java Mtodos

5.5. Figura 8 - Tela Abrir Conta

Crie a Classe DialogAbrirConta.java pelo windowBuilder como um JDialog. Utilize o Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios com visibilidade para toda a classe. Siga a listagem 25 abaixo.
package threeway.projeto.gui; public class DialogAbrirConta extends JDialog { private ContaService service; private Cliente clienteSelecionado; private Conta conta; private JTextField tfDtAbertura; private JTextField tfSaldo; private JComboBox<EnumTipoConta> comboTipoConta; private JTextField tfNumero; private JButton btnCancelar; private JButton btnSalvar; private JLabel lblCamposObrigatrios; } Listagem 25 DialogAbrirConta.java

Inicialize as variveis pelo mtodo initialize(). Siga a listagem 26 abaixo.


/** * Mtodo responsvel por inicializar componentes da tela * * @throws ParseException */ private void initialize() throws ParseException { setModal(true); this.setLocationRelativeTo(null); setTitle(Abertura de Conta); setBounds(100, 100, 300, 250); getContentPane().setLayout(null); JLabel lblNumero = new JLabel(Numero *:); lblNumero.setBounds(10, 39, 80, 14); getContentPane().add(lblNumero); JLabel lblDataDeAbertura = new JLabel(Abertura:); lblDataDeAbertura.setBounds(10, 11, 80, 14);

www.3way.com.br

143

Java OO | Laboratrio Projeto


} getContentPane().add(lblDataDeAbertura); JLabel lblSaldoInicial = new JLabel(Saldo Inicial:); lblSaldoInicial.setBounds(10, 67, 80, 14); getContentPane().add(lblSaldoInicial); JLabel lblTipoDeConta = new JLabel(Tipo de Conta *:); lblTipoDeConta.setBounds(10, 95, 80, 14); getContentPane().add(lblTipoDeConta); tfDtAbertura = new JTextField(); tfDtAbertura.setEditable(false); tfDtAbertura.setBounds(110, 8, 164, 20); getContentPane().add(tfDtAbertura); tfDtAbertura.setColumns(10); btnCancelar = new JButton(Cancelar); btnCancelar.setBounds(175, 166, 99, 35); getContentPane().add(btnCancelar); btnSalvar = new JButton(Salvar); btnSalvar.setBounds(55, 166, 99, 35); getContentPane().add(btnSalvar); JSeparator separator = new JSeparator(); separator.setBounds(10, 153, 264, 2); getContentPane().add(separator); comboTipoConta = new JComboBox<EnumTipoConta>(); comboTipoConta.setBounds(110, 92, 164, 20); getContentPane().add(comboTipoConta); tfNumero = new JTextField(); tfNumero.setBounds(110, 36, 75, 20); getContentPane().add(tfNumero); tfSaldo = new JTextField(); tfSaldo.setBounds(110, 64, 75, 20); getContentPane().add(tfSaldo); tfSaldo.setColumns(10); lblCamposObrigatrios = new JLabel((*) Campos Obrigatrios); lblCamposObrigatrios.setHorizontalAlignment(SwingConstants.RIGHT); lblCamposObrigatrios.setFont(new Font(Tahoma, Font.PLAIN, 11)); lblCamposObrigatrios.setBounds(138, 120, 136, 24); getContentPane().add(lblCamposObrigatrios);

Listagem 26 DialogAbrirConta.java initialize()

No construtor da classe DialogAbrirConta.java chame o mtodo initialize() e faa com que receba uma instancia de ContaService.java e Cliente.java como parmetros em seu construtor. Siga a listagem 27 abaixo.
/** * Responsvel pela criao de novas instncias desta classe. * * @param service * * @param cliente * * @throws ParseException */ public DialogAbrirConta( ContaService service, Cliente cliente ) throws ParseException { this.service = service; this.clienteSelecionado = cliente; this.conta = new Conta();

www.3way.com.br

144

Java OO | Laboratrio Projeto


} initialize(); tfDtAbertura.setText(UtilData.formataData(new Date())); tfSaldo.setText(0); caregaComboTiposConta(); acaoBotaoCancelar(); acaoBotaoSalvar();

Listagem 27 DialogAbrirConta.java Construtor

Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 24 abaixo.
/** * Mtodo responsvel por adicionar evento ao boto salvar * */ private void acaoBotaoSalvar() { btnSalvar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

try { montaObjetoConta();

service.salvar(conta); JOptionPane.showMessageDialog(null, Abertura de conta realizada com sucesso!); OperacoesBanco.recuperaContaCliente(); OperacoesBanco.mudaStatusContaCriada(Boolean.TRUE); OperacoesBanco.defineEnabledBotoes(); setVisible(Boolean.FALSE);

} catch (CamposObrigatoriosException ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } catch (Exception ex1) { JOptionPane.showMessageDialog(null, Algum campo pode ter sido preenchido invlido. Verifique e tente novamente!); } } } });

/** * Mtodo responsvel por adicionar evento ao boto cancelar * */ private void acaoBotaoCancelar() { btnCancelar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

setVisible(Boolean.FALSE); } });

www.3way.com.br

145

Java OO | Laboratrio Projeto


} /** * Mtodo responsvel por carregar combo com o EnumTiposConta * */ private void caregaComboTiposConta() { for (EnumTipoConta tipoConta : EnumTipoConta.values()) { comboTipoConta.addItem(tipoConta);

} }

/** * Mtodo responsvel por montar objeto conta de acordo com os dados que o usuario informar * * @author Wilker Machado * * @throws Exception */ public void montaObjetoConta() throws Exception { EnumTipoConta tipoConta = (EnumTipoConta) comboTipoConta.getSelectedItem();

this.conta = new Conta(this.clienteSelecionado, Integer.parseInt(tfNumero.getText()), tipoConta); this.conta.setSaldo(Double.parseDouble(tfSaldo.getText()));

} Listagem 27 DialogAbrirConta.java Mtodos

5.6. Figura 9 - Tela Transferncia entre Contas

Crie a Classe DialogTransferencia.java pelo windowBuilder como um JDialog. Utilize o Design do window builder para criar conforme o prottipo. Deixe os atributos necessrios com visibilidade para toda a classe. Siga a listagem 21 abaixo.

package threeway.projeto.gui; public class DialogTransferencia extends JDialog { private TransacaoService transacaoService = new TransacaoService(); private ContaService service; private Conta contaCliente; private Conta contaDestino; private JPanel panelDadosConta; private JTextField tfNumeroConta; private JTextField tfDtAbertura; private JTextField tfSaldo; private JTextField tfTitularConta; private JTextField tfNContaDestino; private JTextField tfValorTranferencia; private JButton btnCancelar;

www.3way.com.br

146

Java OO | Laboratrio Projeto


private JButton btnRealizarTransfercia; private JLabel lblCamposObrigatrios; } Listagem 28 DialogTransferencia.java

Inicialize as variveis pelo mtodo initialize(). Siga a listagem 29 abaixo.


/** * Mtodo responsvel por inicializar componentes da tela * */ private void initialize() { setModal(true); this.setLocationRelativeTo(null); setTitle(Transferncia entre contas); getContentPane().setLayout(null); setBounds(100, 100, 520, 270);

panelDadosConta = new JPanel(); panelDadosConta.setBorder(new TitledBorder(null, Dados da Conta, TitledBorder. LEADING, TitledBorder.TOP, null, null)); panelDadosConta.setBounds(10, 11, 484, 77); getContentPane().add(panelDadosConta); panelDadosConta.setLayout(null); JLabel lblNumero = new JLabel(N :); lblNumero.setBounds(10, 20, 25, 14); panelDadosConta.add(lblNumero); tfNumeroConta = new JTextField(); tfNumeroConta.setEditable(false); tfNumeroConta.setBounds(34, 17, 42, 20); panelDadosConta.add(tfNumeroConta); tfNumeroConta.setColumns(10); JLabel lblSaldo = new JLabel(Saldo:); lblSaldo.setBounds(343, 20, 36, 14); panelDadosConta.add(lblSaldo); JLabel lblDataDeAbertura = new JLabel(Data de Abertura:); lblDataDeAbertura.setBounds(97, 20, 101, 14); panelDadosConta.add(lblDataDeAbertura); tfDtAbertura = new JTextField(); tfDtAbertura.setEditable(false); tfDtAbertura.setBounds(208, 17, 125, 20); panelDadosConta.add(tfDtAbertura); tfDtAbertura.setColumns(10); tfSaldo = new JTextField(); tfSaldo.setEditable(false); tfSaldo.setBounds(388, 17, 86, 20); panelDadosConta.add(tfSaldo); tfSaldo.setColumns(10); JLabel lblTitularDaConta = new JLabel(Titular da Conta:); lblTitularDaConta.setBounds(10, 48, 101, 14); panelDadosConta.add(lblTitularDaConta); tfTitularConta = new JTextField(); tfTitularConta.setEditable(false); tfTitularConta.setBounds(121, 45, 353, 20); panelDadosConta.add(tfTitularConta); tfTitularConta.setColumns(10);

JPanel panel = new JPanel(); panel.setBorder(new TitledBorder(null, Dados para Transfer\u00EAncia, TitledBorder. LEADING, TitledBorder.TOP, null, null));

www.3way.com.br

147

Java OO | Laboratrio Projeto


} panel.setBounds(10, 99, 484, 77); getContentPane().add(panel); panel.setLayout(null); JLabel lblNContaDestino = new JLabel(N Conta Destino *:); lblNContaDestino.setBounds(10, 24, 140, 14); panel.add(lblNContaDestino); JLabel lblValorDaTransferencia = new JLabel(Valor da Transferncia *:); lblValorDaTransferencia.setBounds(10, 49, 149, 14); panel.add(lblValorDaTransferencia); tfNContaDestino = new JTextField(); tfNContaDestino.setBounds(160, 21, 86, 20); panel.add(tfNContaDestino); tfNContaDestino.setColumns(10); tfValorTranferencia = new JTextField(); tfValorTranferencia.setBounds(160, 46, 86, 20); panel.add(tfValorTranferencia); tfValorTranferencia.setColumns(10); lblCamposObrigatrios = new JLabel((*) Campos Obrigatrios); lblCamposObrigatrios.setHorizontalAlignment(SwingConstants.RIGHT); lblCamposObrigatrios.setBounds(315, 49, 159, 14); panel.add(lblCamposObrigatrios); btnCancelar = new JButton(Cancelar); btnCancelar.setBounds(343, 187, 151, 33); getContentPane().add(btnCancelar); btnRealizarTransfercia = new JButton(Realizar Transfercia); btnRealizarTransfercia.setBounds(172, 187, 161, 33); getContentPane().add(btnRealizarTransfercia);

Listagem 29 DialogTransferencia.java initialize()

No construtor da classe ManterCliente.java chame o mtodo initialize() e faa com que receba uma instancia de ContaService.java e Conta.java como parmetros em seu construtor. Siga a listagem 30 abaixo.
/** * Responsvel pela criao de novas instncias desta classe. * * @param contaService * * @param contaCliente */ public DialogTransferencia( ContaService contaService, Conta contaCliente ) { } Listagem 30 DialogTransferencia.java Construtor this.service = contaService; this.contaCliente = contaCliente; initialize(); preenchePanelDescricaoConta(); acaoBotaoCancelar(); acaoBotaoRealizarTransferencia();

www.3way.com.br

148

Java OO | Laboratrio Projeto

Crie os mtodos que esto sendo chamados no construtor. Siga a listagem 31 abaixo.
/** * Mtodo responsvel por adicionar evento ao boto de realizar transferencia * */ private void acaoBotaoRealizarTransferencia() { btnRealizarTransfercia.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

try { int numeroConta = Integer.parseInt(tfNContaDestino. getText()); Conta contaDestino = service.buscaContaPorNumero(numeroConta);

double valorTransferemcia = Double. parseDouble(tfValorTranferencia.getText()); service.transferir(contaCliente, valorTransferemcia, contaDestino); OperacoesBanco.atualizaDadosTabela(); OperacoesBanco.preenchePanelDescricaoConta();

JOptionPane.showMessageDialog(null, Transferncia realizada com sucesso!); setVisible(Boolean.FALSE);

} catch (ContaNaoExisteException exConta) { JOptionPane.showMessageDialog(null, exConta.getMessage()); } catch (SaldoInsuficienteException ex1) { JOptionPane.showMessageDialog(null, ex1.getMessage()); } catch (Exception ex) { JOptionPane.showMessageDialog(null, Algum campo pode no ter sido preenchido ou preenchido invlido. Verifique e tente novamente!); } } } /** * Mtodo responsvel por adicionar evento ao boto de cancelar * */ private void acaoBotaoCancelar() { btnCancelar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { });

setVisible(Boolean.FALSE); } }); }

www.3way.com.br

149

Java OO | Laboratrio Projeto


/** * Mtodo responsvel por preencher JPanel com as informaes da contaCliente * */ private void preenchePanelDescricaoConta() { if (contaCliente != null) { tfDtAbertura.setText(UtilData.formataData(contaCliente.getDataAbertura())); tfNumeroConta.setText(contaCliente.getNumero().toString()); tfSaldo.setText(contaCliente.getSaldo().toString()); tfTitularConta.setText(contaCliente.getTitular().getNome());

} }

Listagem 31 DialogTransferencia.java Mtodos

www.3way.com.br

150

Java OO | Laboratrio Tutorial


Tutorial
Instalando e configurando WindowBuilder Pro no Eclipse para desenvolver aplicativos Swing
O WindowBuilder composto por SWT Designer e Swing Designer tornando a criao de aplicaes Java GUI descomplicada, reduzindo com isso o tempo empregado para escrever cdigos. possvel usar ferramentas visuais de design e layout para criar de formas simples, janelas complexas, sendo o cdigo Java gerado automaticamente. Os controles podem ser arrastados e soltos para serem adicionados. Tambm possvel gerenciar os manipuladores de eventos dos componentes e alterar suas propriedades usando um editor visual entre outras opes (THE ECLIPSE FOUNDATION, 2011). Essa ferramenta construdo como um plug-in para o Eclipse e as vrias ferramentas baseadas em Eclipse. Ele constri uma rvore sinttica abstrata (AST) para navegar no cdigo fonte e usa GEF para mostrar e gerir a apresentao visual. O cdigo gerado no requer bibliotecas adicionais personalizados para compilar e executar, podendo ser usado sem ter WindowBuilder Pro instalado. Ele pode ler e escrever praticamente qualquer formato e engenharia reversa inclusive cdigo escrito a mo, suportando a edio do cdigo de forma livre permitindo fazer alteraes em qualquer lugar, e mais, possvel mover, alterar nome e subdividir os mtodos sem nenhum problema(THE ECLIPSE FOUNDATION, 2011). A instalao do WindowBuilder Pro simples. Para efetuar, basta acessar o site da ferramenta e obter o link para usar na ferramenta de instalao do Eclipse. Para isso primeiramente deve se acessar o linkhttps://developers.google.com/java-dev-tools/downloadwbpro?hl=pt-BRe copiar o endereo de acordo com a verso do Eclipse. Depois, basta ir no menu help, clicar em Install New Software e colocar o link conforme figura abaixo:

www.3way.com.br

151

Java OO | Laboratrio
Aps a instalao basta reiniciar o Eclipse que novos componentes iro aparecer na IDE. Com isso j possvel usar as ferramentas. Na figura abaixo e demonstrado como criar a tela principal de uma aplicao Swing.

Como pode ser visto a ferramenta da suporte a outros tipos de interface, mas no tutorial ser abordado apenas o Swing. Com a criao do formulrio principal o Eclipse exibir o cdigo fonte do mesmo. Para que seja possvel trabalhar em modo visual, basta clicar na aba design conforme exibido na Figura abaixo que tambm j traz mais alguns recortes da tela de desenvolvimento.

www.3way.com.br

152

Java OO | Laboratrio
Ao adicionar, por exemplo, um JTextField, a paleta structure exibir as opes que podero ser alteradas do componente. Em sua parte superior a mesma tem cinco botes sendo eles o (1)Show Events que exibe os eventos que podem ser ativados, (2)Goto Definition que leva para o cdigo do componente, (3)Convert Field to local/Convert Local to Field que define se os componentes sero declarados para serem usados apenas localmente no cdigo ou se em todo o escopo da classe, (4) Show advanced properties que exibir as opes avanadas do componente e por fim o boto (5)Restore default value que ir restaurar os valores padres.

Na Figura abaixo exibida a prvia de uma janela criada com WindowBuilder Pro e do lado esquerdo todos seus componentes.

www.3way.com.br

153

Java OO | Laboratrio
Para efetuar a vinculao faz-se necessrio a biblioteca beansbinding-1.2.1.jar que pode ser encontrada em http://download.java.net/maven/2/org/jdesktop/beansbinding/1.2.1/. Aps realizar download do arquivo, necessrio adicion-lo ao CLASSPATH. Para isso pode ser criado uma nova pasta no projeto com nome de lib onde o arquivo colado e feito os procedimentos da Figura abaixo.

Aps adicionar o arquivo ao CLASSPATH basta fechar e abrir o formulrio para que uma nova aba, a Bindings, seja ativada conforme mostrado na Figura abaixo.

www.3way.com.br

154

Java OO | Laboratrio
Nessa aba esto disponveis vrios comandos visuais para configurao dos vnculos como pode ser observado na Figura abaixo.

No campo 1b, sero exibidas as vinculaes criadas que, ao serem selecionadas podero ser alteradas pelos controles do campo 1a. Os controles dos campos 2a e 2b servem para definir como o objeto deve ser tratado, isso muito importante, pois algumas opes s aparecero se for feita a definio correta. Os campos 3a e 3b estabelecem, respectivamente, qual objeto ser o alvo e o modelo. O controle do campo 4 serve para criar a vinculao. Por fim, os campos 5a e 5b, permitem escolher quais propriedades sero vinculadas de ambos os objetos.

www.3way.com.br

155

Você também pode gostar