15
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 … · ECEC – Escola de Ciências Exatas e da Computação Curso de Tecnologia em Análise e Desenvolvimento de Sistemas

Embed Size (px)

Citation preview

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.