ecec escola de ciências exatas e da computação curso de … · ecec – escola de ciências...
TRANSCRIPT
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
1
REVISÃO 01
01. O COMPONENTE JOptionPane
A linguagem Java possui o pacote javax.swing que é uma biblioteca que fornece
diversos componentes gráficos para o desenvolvimento de aplicações desktop. Vamos
conhecer, por enquanto, apenas o componente JOptionPane que é responsável por
apresentar janelas de diálogo, tanto para entrada de dados do tipo String quanto para
apresentar mensagens.
Para utilizar JOptionPane é necessário utilizar uma das seguintes declarações de
import:
import javax.swing.JOptionPane; ou import javax.swing.*;
A segunda opção sobrecarrega, sem necessidade, a aplicação com todos os
componentes da biblioteca.
01.01. JANELA DE DIÁLOGO PARA ENTRADA DE DADOS
Formato:
String variável = JOptionPane.showInputDialog(null,mensagem,título,icone);
Onde:
mensagem = String da mensagem que aparecerá junto à caixa de texto
título = título que aparecerá na barra de titulo da janela
icone = valor inteiro variando de 0 a 3 que apresenta um icone informativo
Observe a figura a seguir.
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
2
Figura 01.01
A figura anterior ilustra duas linhas de código: a primeira declara s como String
e a segunda faz s receber o conteúdo resultante da expressão do lado direito do sinal de
atribuição (sinal de = ). A expressão do lado direito é um JOptionPane com
showInputDialog que corresponde a entrada de dados. Note que a String Digite um
nome é a mensagem que aparece junto à caixa de texto de cada uma das janelas de
exemplo. A String Entrada de Dados é o título de cada uma das janelas. O digito 1, no
final da expressão, é a representação de um dos 4 ícones (de 0 a 3) que podem ser
visualizados na janela de diálogo como ilustra a figura anterior. O conteúdo digitado pelo
usuário na caixa de texto da janela é armazenado na string indicada no lado esquerdo
da atribuição após a confirmação do botão OK.
01.02. JANELA DE DIÁLOGO PARA MENSAGENS
Formato:
JOptionPane.showMessageDialog(null,mensagem,título,icone);
Onde:
mensagem = String da mensagem que será apresentada na janela
título = título que aparecerá na barra de titulo da janela
icone = valor inteiro variando de 0 a 3 que apresenta um icone informativo
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
3
Observe a figura a seguir:
A janela da mensagem apresenta apenas o ícone correspondente ao 1 da
expressão do JOptionPane. A mensagem é apresentada em 3 linhas, pois a string s
recebe uma concatenação de conteúdos, conforme está ilustrado no código da figura
anterior.
02. CODIFICAÇÃO DE CLASSES E PACOTES - DICAS
02.1. Sempre mantenha os dados privados. Isso permite evitar modificações indevidas
e torna mais fácil detectar erros.
02.2. Sempre inicialize os dados. Evite que o Java determine os valores padronizados
para seus dados (String = null, inteiro=zero, boolean=false, objetos=null).
02.3. Nem todos os campos necessitam de métodos acessadores e modificadores
02.4. Faça com que os nomes das suas classes, dos seus atributos e dos seus métodos
refletirem suas respectivas responsabilidades.
02.5. Faça com que uma classe tenha forte COESÃO, ou seja, que cumpra o seu
verdadeiro papel no sistema. Classes com várias responsabilidades não são desejáveis.
02.6. Crie suas classes em pacotes específicos dentro da aplicação. O nome de um
pacote deve ser único. A Sun recomenda que você utilize o seu nome de domínio
da Internet ou o nome de domínio da Internet da sua empresa ( que é único )
escrito ao contrário. Em seguida, complemente com um nome de subpacote.
Exemplo: com.material_td2.pucgo.util
03.APLICAÇÃO JAVA
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
4
Qualquer aplicação orientada a objeto possui, geralmente, um programa principal,
através do qual efetua-se a chamada aos demais programas (classes).
Essas chamadas são, na maioria das vezes, instanciações das demais classes.
Considerando que a linguagem de programação seja Java, então o programa principal é o único
programa da aplicação que possui o método main.
Dessa forma, o programa principal ficará encarregado de instanciar as demais classes
(programas) da aplicação e executá-las.
Cada classe instanciada pela classe principal, por outro lado, executará um método em seu
interior que, ao ser finalizado, retornará à linha seguinte no programa principal.
Observe na figura a seguir a instanciação das classes ProgramaA e ProgramaB.
Foram criados objetos para cada um dessas classes no código do ProgramaPrincipal.
Figura 03.01
Assim, suponha que você deseja criar um programa que apresente o nome e os
telefones de uma determinada pessoa, sendo que uma pessoa poderá ter nenhum, um ou vários
telefones.
Para essa hipotética solução, você deverá criar uma classe principal (que denominaremos de
Principal), uma classe Pessoa e uma classe Fones.
A classe Pessoa armazenará os dados de uma determinada pessoa em um determinado
momento no programa.
A classe Fones referencia os telefones da referida pessoa nesse momento específico.
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
5
Como uma Pessoa poderá possuir um, nenhum ou mais de um telefone, teremos que incluir um
atributo na classe pessoa de tal forma que esse atributo deverá ser uma lista específica de
telefones, que denominaremos de listaFones.
Assim, esse atributo deverá ser uma coleção que deve comportar o tipo Fones.
Lembrando que uma coleção (ArrayList, Vector, List e outros) armazena objetos e possui
métodos como add (adiciona elementos na lista), remove (remove certo elemento da lista), size
(que retorna a quantidade de elementos da coleção) e outros, para manipular os seus
elementos.
Observe a representação do diagrama de classes correspondente.
Figura 03.02
O diagrama da anterior destaca alguns relacionamentos entre as classes.
Observe que a classe Pessoa se relaciona com a classe Fones através de uma linha contínua que
representa uma ligação denominada de associação.
Esse é um exemplo de um, entre vários, relacionamentos que podemos ter entre duas ou mais
classes.
No referido diagrama a classe Pessoa se relaciona com a classe Fones de tal forma que uma
pessoa poderá ter nenhum ou vários telefones.
Isso é indicado no relacionamento através da multiplicidade 0..* (ao lado da classe Pessoa).
Além disso, nesse caso, esse relacionamento, denominado de “associação”, possui uma seta
apontando para a classe Fones, indicando que só a classe Pessoa “enxerga” a classe Fones.
Como regra geral, uma associação entre duas classes exige que uma classe encapsule uma
instância da outra classe e vice-versa.
Como a classe Pessoa possui uma associação que aponta para a classe Fones, então apenas a
classe Pessoa terá como atributo uma instância da classe Fones.
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
6
Esse atributo, no entanto será uma coleção de telefones, visto que uma pessoa poderá ter
nenhum ou vários telefones.
Dessa forma, a classe Pessoa possui o atributo listaFones<Fones> do tipo Vector, que, nesse
caso, é uma coleção de objetos do tipo Fones.
Então, de acordo com a figura 03.02, temos os seguintes trechos de código para cada uma das
classes do diagrama:
Código da classe Fones.java
Código da classe Pessoa.java sem getters/setters
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
7
A classe Pessoa possui o atributo listaFones do tipo Vector, que corresponde ao relacionamento
entre as classes Pessoa e Fones.
Código da classe Principal.java
Observe que as outras duas classes (Pessoa e Fones) foram instanciadas dentro do programa
principal.
Observe que foi criada a variável aux, do tipo Vector, para armazenar as instâncias dos telefones
de uma pessoa.
Essa variável, posteriormente, na linha 19, é armazenada no atributo listaFones da class Pessoa.
Observe atentamente o método mostraPessoas. Qualquer dúvida em relação código desse
método, procure o professor.
Como explicado anteriormente, as classes Pessoa e Fones são denominadas de beans, que são
classes que possuem um método construtor vazio e os métodos getXxx e setXxx (denominados
de métodos getters e setters).
O Xxx no nome representa o nome de cada atributo da classe correspondente.
Um método getXxx (denominado de método acessador) retorna o valor do atributo
correspondente.
Um método setXxx (denominado de método modificador) atribui ou altera o conteúdo do
atributo correspondente.
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
8
Considerando que a classe Pessoa, do exemplo anterior, possui os atributos cpf, nome e
listaFones, então ela tem os seguintes métodos getters/setters:
getCpf(), setCpf(), getNome(), setNome(), getListaFones() e setListaFones().
A utilização dos métodos getXxx e setXxx não é um padrão. É apenas uma recomendação dos
profissionais da Sun/Oracle para facilitar o uso de certos frameworks. A classe Pessoa é
considerada um Bean.
04. PROCESSANDO INFORMAÇÕES DE ARQUIVOS
Vamos considerar que você necessite ler informações de um arquivo na linguagem Java.
Para isso, necessita-se de utilizar o import das seguintes bibliotecas do Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
As duas primeiras se relacionam com preparação e leitura de arquivos e a terceira
importação permite tratar exceções através de try/catch.
Um bloco try permite ao programador executar instruções. Caso ocorra algum erro,
este será desviado para o bloco catch. Por enquanto, você não precisa entender detalhes de
try/catch. Isso será visto posteriormente.
Vamos ver um exemplo na prática.
Abra o Eclipse e crie o projeto Java denominado de Arquivo01.
Em seguida, crie o pacote controle.
Em seguida, crie a classe Java Principal.java dentro do pacote controle. Com isso, sua
aplicação terá a seguinte estrutura:
Figura 04.01
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
9
Como já citado anteriormente, é salutar utilizar pacotes em uma aplicação. Cada pacote deve
armazenar classes que possuem uma mesma finalidade dentro da aplicação.
Nesse exemplo, criamos apenas o pacote controle que possui o programa Principal. Para essa
aplicação utilizaremos apenas esse pacote.
Em seguida, utilize o bloco de notas e crie um arquivo com o nome MeuArquivo.txt e insira as
seguintes linhas nesse arquivo:
linha 01
linha 02
linha 03
Fim.
Grave esse arquivo na unidade c do seu computador.
Abra o arquivo Principal.java e digite as seguintes linhas nessa classe.
Observe que o programa utiliza try/catch que permitem o tratamento de erros. O bloco try se
inicia na linha 13 e termina na linha 20.
O bloco catch inicia na linha 22 e termina na linha 23.
Caso ocorra algum erro dentro do bloco try, ocorrerá um desvio para o bloco catch que, no
exemplo, não possui nenhuma instrução.
Não se preocupe com os detalhes de try/catch ainda. Posteriormente explicaremos essas
estruturas com mais detalhes.
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
10
Salve a aplicação e execute-a. Será apresentada uma tela de mensagem semelhante à indicada
a seguir.
Figura 04.02
Observe a saída das informações.
Analise o código e procure compreendê-lo conforme o resultado de saída apresentado pelo
JOptionPane.
Exercício sobre leitura em arquivo texto e complementos.
(O Enunciado será apresentado pelo professor)
05. VALIDAÇÃO DE DADOS
05.01. Introdução
Qualquer Interface Gráfica do Usuário (GUI) necessita de validações. Considere, por
exemplo, uma interface de entrada de dados com o JOptionPane. Neste caso, o usuário irá
digitar em uma caixa de texto alguma informação. No entanto, essa caixa de texto aceita
qualquer tipo de caractere, visto que ela aceita conteúdo String. Assim, se o usuário for
solicitado a digitar uma data, esta deve ser verificada pela aplicação, pois o usuário poderá
digitar uma data inválida como 30/02/2013. Neste caso, o programador deverá estabelecer
validação específica para esse tipo de digitação. O mesmo poderá ocorrer se o usuário for
solicitado para informar apenas dígitos de um CPF. Neste caso, o programador deverá criar uma
validação para verificar se o usuário informou só dígitos para o CPF.
Portanto, uma GUI permite facilidades de interação entre o usuário e o sistema. Por
outro lado, uma GUI necessita de validações específicas para garantir que o usuário informe
dados corretos para que permitam uma atualização confiável no banco de dados.
05.02. Exceções – Uma noção
Uma exceção é uma indicação de um problema que ocorre durante a execução de um
programa. Lançar uma exceção é uma maneira eficaz para indicar que não é capaz de atender a
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
11
uma solicitação de um programa. O não tratamento de uma exceção fará com que o programa
termine imediatamente.
Uma exceção verificada é uma subclasse da classe Exception.
Para se capturar uma exceção em um método deve-se utilizar uma instrução try
combinada com catch, no seguinte formato:
try{
//instruções que serão verificadas
}
catch(Exception e1) {
//informe e se recupere da exceção
}
finally{...}
Quando ocorre uma exceção dentro do bloco try, a execução é então executada dentro
do bloco catch correspondente, pois pode-se ter mais de um catch. Depois que o fluxo é
completado pelo catch, o controle não retorna para a instrução que causou a exceção. Nesse
caso, o controle continua abaixo do último catch. Além do catch há também o bloco finally, que
é opcional. Se esse bloco for usado, ele será executado, ocorrendo ou não uma exceção. Em
resumo, temos:
try: é usado para um bloco de código no qual possa ocorrer alguma exceção.
catch: serve para tratar o possível erro.
finally:sempre será executado depois de try/catch.
Assim, try/catch servem para informar à Java Virtual Machine o que fazer quando uma
exceção ocorrer. Os blocos catch devem aparecer após o try, sendo que entre esses blocos não
deve possuir nenhuma instrução.
Como pode ocorrer a utilização de diversos blocos catch e como todas as exceções são
vinculadas à classe Exception, deve-se, caso ocorra necessidade, inserir uma exceção geral no
último catch, deixando as especificas antes desta.
Exemplo:
try{........}
catch(NumberFormatException e1){......}
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
12
catch(ArithmeticException e2){......}
catch(NullPointerException e3){.....}
.....
O trecho anterior destaca algumas exceções, como NumberFormatException (trata
formatação de números), NullPointerException (erro de referência a uma instância inexistente)
e ArithmeticException(erros em processamentos aritméticos) e outros.
05.03. Validando dados numéricos
Ao receber a entrada de uma string via JOptionPane deve-se efetuar a conversão da
string para um valor numérico (int, float, etc.) dentro de try/catch, tratando a exceção de forma
correta.
05.04. Gerando números randômicos
A geração de números em Java ás vezes se torna importante, como é caso de se criar
valores para testes em um programa ou, até mesmo, criar cartelas para mega-sena. Em Java, a
geração de números ocorre através da classe Random que, naturalmente, gera números
fracionários entre 0 e 1.Se você desejar gerar números inteiros deverá utilizar alguma operação
sobre o número para conseguir o resultado desejado.
Exemplo:
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
13
Para gerar números utiliza-se da classe Random que faz parte do pacote Math. Para referenciar
Random, basta utilizar Math.Random. No trecho de código anterior, a linha 11 destaca a geração
de um número randômico que é armazenado na variável double d.
Nesse caso, será gerado um número fracionário entre 0 e 1. Na linha 15 temos a seguinte
instrução:
int i = (int) (Math.Random()*10) + 1;
Neste caso, um número randômico será gerado. Em seguida, será multiplicado por 10 e
adicionado a 1 e convertido para inteiro. Esse é um exemplo de geração de números irão variar
entre 1 e 10. Visto que:
a)se for gerado um 0.0 * 10 = 0, adicionado a 1 implicará no resultado 1.
b)se for gerado um 0.9... * 10 = 9, adicionado a 1 implicará no resultado 10.
A linha 19 gerará números entre 50 e 149. Caso você deseje gerar números em intervalos
específicos deverá analisar a expressão correta que proporcionará os resultados desejados.
Exemplo de resultados do programa anterior :
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
14
Com isso você poderá gerar, além de números, uma sequência de letras ou de outros caracteres,
bastando para isso utilizar o código ASCII.
Como o homem utiliza muitos símbolos (letras, dígitos, ponto, chaves, colchetes,
parênteses e diversos outros) foi necessário criar um padrão de codificação desses
símbolos e caracteres para o computador. Então, foi criado o PADRÃO ASCII (ou TABELA
ASCII). Essa tabela apresenta uma relação de 256 símbolos que são utilizados por
computadores e outros dispositivos eletrônicos, como é ilustrado a seguir:
Note que cada símbolo possui um código que varia de 0 a 255. O termo ASCII é o
acrônimo de “American Standard Code for Information Interchange”, que, em português,
significa "Código Padrão Americano para o Intercâmbio de Informação".
ECEC – Escola de Ciências Exatas e da Computação
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Desenvolvimento de Software Cliente/Servidor (CMP1119 / CMP1138)
15
Nota: Em relação à randomização, há a opção de se utilizar a classe Random existente em
java.util:
Random a = new Random();
int numero = a.nextInt(10);
Neste caso, deve-se instanciar a classe Random. Enquanto que Math.Random() acessa
diretamente esse recurso sem necessitar de instanciação.