Laboratório Java OO
Laboratório Java OO
Laboratório Java OO
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
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
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
Java OO | Laboratrios
Lab 8 | Interfaces e Classes Abstratas ....................................................71
Exerccio 1 | Classes Abstratas ......................................................................................................71 Exerccio 2 | Interface como um tipo ............................................................................................72
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
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)
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
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.
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. 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);
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
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
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
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
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
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
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
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
// pega estado do aluno. estado = ( grau >= 60 ) ? Aprovado : Reprovado; // Imprime estado System.out.println(estado); } }
Listagem 1.3 OperadorCondicional.java
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);
} }
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);
} }
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
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)
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:
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:
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
} }
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:
3. Modifique o programa anterior, Listagem-3.2, substituindo as estruturas if/else pela switch. 4. Compile e execute.
// 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)) {
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:
import java.text.DecimalFormat;
www.3way.com.br
31
Java OO | Laboratrio 3
import java.util.Scanner; public class TestaWhile {
// 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 )) {
total += valorNota;
// Usa DecimalFormat para formatar valor // double com 2 casas decimais DecimalFormat doisDigitos = new DecimalFormat(0.00); System.out.println(A mdia : + doisDigitos.format(media));
2. Neste programa a classe Scanner usada para capturar entrada de dados do teclado que for digitada na console.
www.3way.com.br
32
Java OO | Laboratrio 3
import java.text.DecimalFormat; import java.util.Scanner; public class TestaDoWhile {
// 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)
// 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
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
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.
// 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.
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(...)
// 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.
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()
// 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);
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);
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.
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);
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.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));
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.
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.
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.
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
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.
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);
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);
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));
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
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);
3. Modifique o programa para criar uma instncia de objeto da classe java.util.Date e mostre informaes desta classe.
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.
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)
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.
// 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
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
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.
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
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
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
Exerccio 4 | Construtores
1. Usando mltiplos construtores 2. Encadeando construtores com o mtodo this()
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
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
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);
} }
// 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)
public class Pessoa { private String nome; private String telefone; private String endereco; public Pessoa() {} public Pessoa( String nome ) { } this.nome = nome;
//get e set
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 ) {
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
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
} }
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)
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(); }
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
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
}
Listagem 7.6 Imprime extrato Conta corrente.
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)
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().
// 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
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)
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));
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)
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. 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() {
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>();
// 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);
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.
// 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();
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();
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)
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();
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
// 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++) {
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.
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
// 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();
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);
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); } }
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.
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); } }
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)
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
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
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
2 | Criao do projeto
1. Crie trs projetos Java e os respectivos pacotes conforme a figura 3 abaixo: - Banco-Modelo - Banco-Servico - Banco-SwingWeb
www.3way.com.br
111
Caso voc no tenha desenvolvido anteriormente a classe, crie no pacote conforme a imagem abaixo.
www.3way.com.br
112
www.3way.com.br
113
www.3way.com.br
114
- 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.
- 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.
- 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
- A tabela (JTable) listar todas as transaes feitas naquela conta, depsitos, saques e transferncias.
- 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.
- 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.
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
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
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
/** * 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
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
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();
} }
/** * 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();
www.3way.com.br
120
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.
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
} 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
/** * 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
/**
* 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
www.3way.com.br
125
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);
www.3way.com.br
126
www.3way.com.br
127
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();
www.3way.com.br
128
service.excluir(cliente); limpar();
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();
JOptionPane.showMessageDialog(null, Cliente atualizado com sucesso!); } catch (CamposObrigatoriosException ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } finally { } } }); } atualizaDadosTabela();
www.3way.com.br
129
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
@Override public void remover(Conta entidade) {} @Override public Collection<Conta> consultar(Conta entidade) { } return null;
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
} }
/** * 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
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
/** * 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)) {
/** * 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) {
/** * Mtodo responsvel por retornar instancia de ContaDao * * @return */ public ContaDao getDao() { } } return dao;
Listagem 17 ContaService.java
www.3way.com.br
134
@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
/** * 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
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
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
} }
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
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();
www.3way.com.br
140
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());
www.3way.com.br
141
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
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
www.3way.com.br
143
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
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
} }
/** * 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();
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
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
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
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) {
} 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
} }
www.3way.com.br
150
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