O documento descreve classes Java e pacotes padrão, como pacotes de entrada e saída de dados, banco de dados e interface gráfica. Ele apresenta as classes Java.lang e pacotes como java.io, java.sql e java.swing.
3. Glossário de Termos
Termo Descrição
JDBC Java Data Base Conectivity
API Application Program Interface
DAO Data Access Object
JCP Java Community Process
ODBC Object DataBase Conectivity
Refactory Reconstruir parte do Programa
ANSI American National ?? Institute
DML Data Model Language
DDL Data Definition Language
SQL Structure Query Languare
SGBD Sistema Gerenciador de Banco de Dados
27/03/12 3
5. Aula 1
• Usando a Classe String
– Em Java, cada caractere de uma String é um
caractere Unicode de 16 bits. Já que caracteres
Unicode tem 16 bits (e não os restritos 7 ou 8 bits
que a ASCII oferece), um conjunto de caracteres
sofisticado e internacional é facilmente
representado em Unicode.
– Em Java, strings são objetos:
String s = new String(“abcdef”);
– Ou:
String s = “abcdef”;
27/03/12 5
6. Classe String
• Usando a Classe String
String s2 = s; //s2 aponta para o mesmo
//objeto referenciado
// por s
• O objetivo para a certificação declara: “descrever o
significado da inalterabilidade dos objetos String”,
portanto, quando um valor for atribuído a uma String,
esse nunca poderá ser alterado.
Mas isso não significa que sua variável de referência
também seja, muito pelo contrário.
27/03/12 6
7. Classe String
• Classe String e a Memória
– Concatenando Objetos String
– Criando novos objetos String
27/03/12 7
8. Classe String
• Métodos importantes
– concat
– equalsIgnoreCase
– length
– replace
– substring
– toString
– toLowerCase
– toUperCase
– trim
27/03/12 8
9. Classe StringBuffer
• Utilizada para manipulação de grande volumes de
Strings, pois não cria novos objetos como a classe
String. Então quando necessitar de concatenar
grandes volumes de caracteres de preferência a
Classe StringBuffer.
• Métodos Importantes
– append
– insert
– reverse
– toString
27/03/12 9
10. Classe Math
• Métodos da Classe Math
– abs
– ceil
– Ffoor
– max
– min
– random
– round
– sin
– cons
– tan
– sqrt
– toDegrees
– toRadians
27/03/12 10
12. Objetos Wrappers - Metodos
• Método estático valueOf()
• Métodos utilitários de conversão das Classes
Wrappers
– xxxValue()
– parseXxx e valueOf
– toString
27/03/12 12
13. Aula 2
• Collenctions em Java
–java.util
•Collections
•List
•ArrayList
•Set
•HashSet
• hashCode e equals
27/03/12 13
14. Collections
• Desvantagens dos arrays:
– Arrays não podem ser redimensionados;
– É impossível buscar diretamente um
elemento para qual não se sabe o índice;
– Não é possível saber quantas posições do
array já foram populadas sem se criar
métodos adicionais;
• Collections Framework (pacote java.util):
– É uma API robusta e possui diversas classes
que representam estruturas de dados
avançados em Java.
27/03/12 14
15. Collections – Principais Interfaces
• As coleções têm como base a interface Collection,
que define métodos para adicionar e remover um
elemento, verificar se ele está na coleção entre
outras operações (ver Javadoc).
• Uma coleção pode implementar diretamente a
interface Collection, porém normalmente se usa uma
das duas subinterfaces mais famosas: justamente Set
e List.
• A interface Set, define um conjunto de elementos
únicos enquanto a interface List permite a réplica de
elementos.
27/03/12 15
16. Collections – Listas [java.util.List]
• Um primeiro recurso que a API de Collections traz são
listas. Uma lista é uma coleção que permite
elementos duplicados e mantendo uma ordenação
específica entre os elementos.
• Em outras palavras, temos a garantia de que, quando
percorrer a lista, os elementos serão encontrados em
uma ordem prédeterminada, definida na hora da
inserção dos mesmos.
• Ela resolve todos os problemas que levantamos em
relação a array (busca, remoção, tamanho “infinito”,
etc). Esse código já está pronto!
• A API de Collections traz a interface java.util.List que
especifica o que uma classe deve ser capaz de fazer
para ser uma lista.
27/03/12 16
17. Collections – Listas [java.util.List]
• Há diversas implementações disponíveis, cada uma
com uma forma diferente de representar uma lista.
• A implementação mais utilizada da interface List é a
ArrayList que trabalha com uma array interna para
gerar uma lista portanto ela é mais rápida na
pesquisa que sua concorrente, a LinkedList, que é
mais rápida na inserção e remoção de itens nas
pontas.
• Para criar um ArrayList basta chamar o construtor:
ArrayList lista = new ArrayList();
• É sempre possível abstrair a lista a partir da interface
List:
List lista = new ArrayList();
27/03/12 17
18. Collections – Listas [java.util.List]
• Para criar uma lista de nomes (String),
podemos fazer:
List lista = new ArrayList();
lista.add("Guilherme");
lista.add("Paulo");
lista.add("Sergio");
• A interface List possui dois métodos add, um
que recebe o objeto a ser inserido e o coloca
no final da lista e um segundo que permite
adicionar o elemento em qualquer posição da
mesma.
27/03/12 18
19. Collections – Listas [java.util.List]
• Notem que em momento algum
dizemos qual é o tamanho da lista;
podemos acrescentar quantos
elementos quisermos que a lista cresce
conforme for necessário.
• Toda lista (na verdade, toda Collection)
trabalha do modo mais genérico
possível. Isto é, não há uma ArrayList
específica para Strings, outra para
Números, outra para Datas etc. Todos
os métodos trabalham com Object.
27/03/12 19
20. Collections – Listas [java.util.List]
• Assim, é possível criar, por exemplo,
uma lista de Contas:
Conta c1 = new Conta();
c1.depositar(100);
Conta c2 = new Conta();
c2.depositar(200);
Conta c3 = new Conta();
c3.depositar(300);
List contas = new ArrayList();
contas.add(c1);
contas.add(c3);
contas.add(c2);
27/03/12 20
21. Collections – Listas [java.util.List]
• Para saber quantos elementos há na
lista, podemos usar o método size():
System.out.println(contas.size());
• Há ainda um método get(int) que
recebe como argumento o índice do
elemento que se quer recuperar.
Através dele podemos fazer um for para
iterar na lista de contas:
for(int i = 0; i < contas.size(); i++) {
contas.get(i);
}
27/03/12 21
22. Collections – Listas [java.util.List]
• Mas como fazer para imprimir o saldo dessas
contas? Podemos acessar o getSaldo()
diretamente após fazer contas.get(i)? Não
podemos! Lembrem-se que toda lista trabalha
sempre com Object! Assim a referência
retornada pelo get(i) é do tipo Object, sendo
necessário fazer um casting para Conta se
quisermos acessar o getSaldo():
for(int i = 0; i < contas.size(); i++) {
ContaCorrente cc = (ContaCorrente) contas.get(i);
System.out.println(cc.getSaldo());
} // Notem que a ordem dos elementos não é alterada
27/03/12 22
23. Collections – Listas [java.util.List]
• Há ainda outros métodos como
remove() que recebe um objeto que se
deseja remover da lista; e o contains()
que recebe um objeto como argumento
e devolve true or false indicando se o
elemento está ou não na lista.
• A interface List e algumas classes que a
implementam podem ser vistas no
diagrama a seguir
27/03/12 23
25. Collections – Listas [java.util.List]
• Algumas listas, como a ArrayList, tem
acesso aleatório aos seus elementos: a busca
por um elemento em uma determinada
posição é feita de maneira imediata, sem que
a lista inteira seja percorrida.
• Neste caso o acesso é feito através do método
get(int) e é muito rápido. Caso contrário,
percorrer uma lista usando um for como esse
que acabos de ver, pode ser desastroso. Ao
percorrermos uma listas, devemos usar
sempre um Iterator ou o enhanced for,
como veremos.
27/03/12 25
26. Collections – Listas [java.util.List]
• Uma lista é uma excelente alternativa a
um array comum já que temos todos os
benefícios de arrays, sem a necessidade
de tomar cuidado com remoções, falta
de espaço etc.
• A outra implementação muito usada
(LinkedList), fornece métodos adicionais
para obter e remover o primeiro e
último elemento da lista.
27/03/12 26
27. Ordenação: Collections.sort
• Vimos anteriormente que as listas são percorridas de
maneira pré-determinada de acordo com a inclusão
dos itens. Mas muitas vezes queremos percorrer a
nossa lista de maneira ordenada. A classe
Collections traz um método estático sort que recebe
um List como argumento e o ordena por ordem
crescente. Por exemplo:
List lista = new ArrayList();
lista.add("Sérgio");
lista.add("Paulo");
lista.add("Guilherme");
System.out.println(lista);
Collections.sort(lista);
System.out.println(lista);
27/03/12 27
28. Ordenação: Collections.sort
• Ao testarmos o exemplo acima, observamos que
primeiro a lista é impressa na ordem de inserção e,
depois de chamar o sort, ela é impressa em ordem
alfabética. Mas toda lista em Java pode ser de
qualquer tipo de objeto, por exemplo, Conta. E se
quisermos ordenar uma lista de Conta? Em que
ordem a classe Collections ordenará? Pelo saldo? Pelo
nome do correntista?
Conta c1 = new Conta();
c1.deposita(500);
Conta c2 = new Conta();
c2.deposita(200);
Conta c3 = new Conta();
c3.deposita(150);
27/03/12 28
29. Ordenação: Collections.sort
List<Conta> contas = new ArrayList<Conta>();
contas.add(c1);
contas.add(c3);
contas.add(c2);
Collections.sort(contas); // qual o critério de
ordenação?
27/03/12 29
30. Ordenação: Collections.sort
• Sempre que falamos em ordenação, precisamos
pensar em um critério de ordenação, uma forma de
determinar qual elemento vem antes de qual. É
necessário instruir o Java sobre como comparar
nossas ContaCorrente a fim de determinar uma
ordem na lista.
• Vamos fazer com que os elementos da nossa coleção
implementem a interface java.lang.Comparable,
que define o método int compareTo(Object). Este
método deve retornar zero se o objeto comparado for
igual a este objeto, um número negativo se este
objeto for menor que o objeto dado, e um número
positivo se este objeto for maior que o objeto dado.
27/03/12 30
31. Ordenação: Collections.sort
• Para ordenar as ContaCorrente por
saldo, basta implementar o
Comparable:
public class Conta implements Comparable {
...
public int compareTo(Conta outra) {
if(this.saldo < outra.saldo) {
return -1;
} else if(this.saldo > outra.saldo) {
return 1;
}
return 0;
}
}
27/03/12 31
32. Ordenação: Collections.sort
• Com o código anterior, nossa classe tornou-se
“comparável”: dados dois objetos da classe,
conseguimos dizer se um objeto é maior, menor ou
igual ao outro, segundo algum critério por nós
definido. No nosso caso, a comparação será feita
baseando-se no saldo da conta.
• Repare que o critério de ordenação é totalmente
aberto, definido pelo programador. Se quisermos
ordenar por outro atributo (ou até por uma
combinação de atributos), basta modificar a
implementação do método compareTo na classe.
• Agora sim, quando chamarmos o método sort de
Collections ele saberá como fazer a ordenação da
lista; ele usará o critério que definimos no método
compareTo.
27/03/12 32
33. Ordenação: Collections.sort
• Mas e o exemplo anterior, com uma
lista de Strings? Porque a ordenação
funcionou naquele caso sem
precisarmos fazer nada? Simples: quem
escreveu a classe String (lembrem-se
que ela é uma classe normal do Java)
implementou a interface Comparable e
o método compareTo para Strings,
fazendo comparação em ordem
alfabética.
27/03/12 33
34. Collections : Conjuntos – java.util.Set
• Um conjunto (Set) funciona de forma
análoga aos conjuntos da matemática,
ele é uma coleção que não permite
elementos duplicados:
27/03/12 34
36. Collections – Conjuntos – java.util.Set
• Outra característica fundamental é o
fato de que a ordem em que os
elementos são armazenados pode não
ser a ordem na qual eles foram
inseridos no conjunto.
• Tal ordem varia de implementação para
implementação.
• Um conjunto é representado pela
interface Set e tem como suas
principais implementações as classes
HashSet e TreeSet.
27/03/12 36
37. Collections – Conjuntos – java.util.Set
• O código a seguir cria um conjunto e adiciona três
itens, apesar de tentar adicionar quatro:
Set conjunto = new HashSet();
conjunto.add("item 1");
conjunto.add("item 2");
conjunto.add("item 3");
conjunto.add("item 3");
// imprime a sequência na tela
System.out.println(conjunto);
• O resultado são os elementos do conjunto, a ordem
na qual eles aparecem podem ou não ser a ordem na
qual eles foram inseridos e é incorreto supor que será
sempre a mesma ordem!
27/03/12 37
38. Collections – Percorrendo Coleções
• Como percorrer os elementos de uma
coleção? Se for uma lista, podemos sempre
utilizar um laço for, chamando o método get
para cada elemento. Mas e se a coleção não
permitir indexação?
• Por exemplo, um Set não possui uma função
para pegar o primeiro, o segundo ou o quinto
elemento do conjunto...
• Toda coleção fornece acesso a um iterator,
um objeto que implementa a interface
Iterator, que conhece internamente a
coleção e dá acesso a todos os seus
elementos, como a figura a seguir:
27/03/12 38
40. Collections: Ordenando um Set
• Seria possível usar uma outra
implementação de conjuntos, como um
TreeSet, que insere os elementos, de tal
forma, que quando forem percorridos,
aparecem em uma ordem definida pelo
método de comparação entre seus
elementos. Esse método é definido pela
interface Comparable.
27/03/12 40
41. Collections – Percorrendo Coleções
• Primeiro criamos um Iterator que entra na
coleção.
• A cada chamada do método next(), o
Iterator retorna o próximo objeto do
conjunto.
• Um iterator pode ser obtido com o método
iterator() de Collection, por exemplo:
Iterator i = lista.iterator();
• A interface Iterator possui dois métodos
principais: hasNext() indica se ainda existe
um elemento a ser percorrido e next()
retorna o próximo objeto.
27/03/12 41
42. Collections – Percorrendo Coleções
• Voltando ao exemplo do conjunto de
strings, vamos percorrer o conjunto:
// popula o conjunto
Set conjunto = new HashSet();
conjunto.add(“item 1”);
conjunto.add(“item 2”);
conjunto.add(“item 3”);
// retorna o iterator
Iterator i = conjunto.iterator();
// continua
27/03/12 42
43. Collections – Percorrendo Coleções
while (i.hasNext()) {
// recebe a palavra
Object elemento = i.next();
String palavra = (String) elemento;
// mostra a palavra
System.out.println(palavra);
}
.
27/03/12 43
44. Collections – Percorrendo Coleções
• O while anterior só termina quando todos os elementos do
conjunto forem percorridos, isto é, quando o método
hasNext mencionar que não existem mais itens.
• Em que ordem serão acessados os elementos?
• Numa lista, os elementos irão aparecer de acordo com o
índice em que foram inseridos, isto é, de acordo com o
que foi prédeterminado.
• Em um conjunto, a ordem depende da implementação da
interface Set.
• Por que o Set é então tão importante e usado?
• Para perceber se um item já existe em uma lista é muito
mais rápido usar um Set do que um List, e os TreeSets já
vem ordenados de acordo com as características que
desejarmos!
27/03/12 44
45. Collections – Principais Interfaces
• A busca em um Set pode ser mais
rápida que em um objeto do tipo List,
pois diversas implementações utilizam
tabelas de espalhamento (hashtables),
trazendo a busca para tempo linear.
• A interface Map faz parte do framework
mas não estende Collection. (veremos
Map mais adiante).
27/03/12 45
47. Collections : Mapas – java.util.Map
• Um mapa é composto de uma associação
de um objeto chave a um objeto valor. É
equivalente ao conceito de dicionário
usado em várias linguagens. Algumas
linguagens, como Perl ou PHP, possuem
suporte nativo a mapas, onde são
conhecidos como matrizes associativas.
• Ele é um mapa pois é possível usá-lo
para mapear uma chave, por exemplo:
mapeie o valor “Season” à chave
“escola”, ou mapeie “Avenida Nelson
D'Avila” à chave “rua”.
27/03/12 47
49. Collections : Mapas – java.util.Map
• O método put(Object, Object) da
interface Map recebe a chave e o
valor de uma nova associação. Para
saber o que está associado a um
determinado objeto-chave, passa-se
esse objeto no método
get(Object).
• Observem o exemplo: criamos duas
contas e as colocamos em um mapa
associando-as ao seu dono
respectivamente.
27/03/12 49
50. Collections – Mapas – java.util.Map
Conta c1 = new Conta();
c1.depositar(10000);
Conta c2 = new Conta();
c2.depositar(3000);
// cria o mapa
Map mapaDeContas = new HashMap();
// adiciona duas chaves e seus valores
mapaDeContas.put("diretor", c1);
mapaDeContas.put("gerente", c2);
// qual a conta do diretor?
Object elemento = mapaDeContas.get("diretor");
Conta contaDoDiretor = (Conta) elemento;
27/03/12 50
51. Collections : Mapas – java.util.Map
• Um mapa, assim como as coleções, trabalha diretamente com
Objects (tanto na chave quanto no valor), o que torna
necessário o casting no momento que recuperar elementos.
• Suas principais implementações são o HashMap e o
Hashtable.
• Apesar do mapa fazer parte do framework, ele não implementa
a interface Collection, por ter um comportamento bem
diferente. Porém, as coleções internas de um mapa (a de chaves
e a de valores) são acessíveis por métodos definidos na
interface Map.
• O método keySet() retorna um Set com as chaves daquele
mapa, e o método values() retorna a Collection com todos os
valores que foram associados a alguma das chaves.
• Um mapa importante é a tradicional classe Properties, que
mapeia strings e é muito utilizada para a configuração de
aplicações.
27/03/12 51
53. Object
Cliente
Cliente cliente = new Cliente()
54. Collections – Equals e HashCode
• Muitas das coleções do Java guardam os
objetos dentro de tabelas de hash. Essas
tabelas são utilizadas para que a pesquisa de
um objeto seja feira de maneira rápida.
• Como funciona? Cada objeto é “classificado”
pelo seu hashCode, e com isso conseguimos
espalhar cada objeto agrupando-os pelo
hashCode. Quando formos buscar um
determinado objeto, só vamos procurar entre
os elementos que estão no grupo daquele
hashCode. Dentro desse grupo vamos
testando o objeto procurado com o candidato
usando equals().
27/03/12 54
55. Collections – Equals e HashCode
• Para que isso funcione direito, o método
hashCode de cada objeto deve retornar o
mesmo valor para dois objetos se eles são
considerados equals. Em outras palavras:
a.equals(b) implica a.hashCode() == b.hashCode()
• Implementar hashCode de tal maneira que ele
retorne valores diferentes para dois objetos
considerados equals quebra o contrato de
Object, e resultará em collections que usam
espalhamento (como HashSet, HashMap e
Hashtable) não achando objetos iguais dentro
de uma mesma coleção.
27/03/12 55
56. Exercícios
1) Criar duas classe filhas de Conta: ContaCorrente e
ContaPoupanca. Agora, criar na classe Banco, uma lista
de Contas. Repare que nessa lista de Contas podemos
colocar tanto ContaCorrente quanto ContaPoupanca. Criar
um metodo void addConta(Conta c), um método Conta
getConta(int x) e outro int totalDeContas().
2) Criar um método na classe Banco que busca por uma
determinada Conta e informar se ela se encontra lá.
3) Criar um código que insira 100 mil números numa
ArrayList e pesquise-os. Vamos usar um método da classe
System para cronometrar o tempo gasto.
4) Troque a ArrayList por um HashSet e verifiquem o tempo
que vai demorar.
27/03/12 56
57. Aula 3
• Mais de java.util
Trabalhando com Datas
Manipulação de Arquivos
Serialização de Objetos
27/03/12 57
58. Trabalhando com Datas
• Trabalhar com Datas é uma das coisas mais
trabalhosas em qualquer linguagem de
programação. Aquelas que usam bancos de dados
exigem do desenvolvedor um esforço maior ainda.
Formatar a saída destes dados também pode ser um
problema quando a formatação depende do local do
usuário – ou seja, na internet estamos falando do
mundo inteiro.
• A linguagem Java oferece um rico conjunto de
classes para manipular datas. As principais classes
para manipulação de datas pertence os pacote
• java.util:
– java.util.Date
– java.util.Calendar
– java.util.GregorianCalendar
27/03/12 58
59. Trabalhando com Datas
• A classe Date representa, por default, a data corrente do
sistema em milisegundos.
• Anteriormente a versão 1.1 do Java, a classe Date
suportava a criação de datas a partir de parâmetros como
dia, mês, ano, horas, minutos, etc, e também a
formatação e o parsing de strings para Datas. Porém,
essas funções foram depreciadas por não suportarem
internacionalização.
• A partir da versão 1.1, as classes Calendar e DateFormat
foram inseridas na API e devem ser usadas para
conversão entre campos de datas e horas para Date e
formatação e parsing, respectivamente.
• Para instanciar um objeto Date:
Date hoje = new Date();
System.out.println("A data de hoje é: " + hoje);
27/03/12 59
60. Trabalhando com Datas
• A classe abstrata Calendar também encapsula
um momento no tempo representado em
milissegundos.
• Também provê métodos para manipulação
desse momento.
• A subclasse concreta de Calendar mais usada é
a GregorianCalendar que representa o
calendário usado pela maior parte dos países
(outras implementações existem, como a do
calendário budista BuddhistCalendar, mas que
são internas e devolvidas de acordo com suas
respectivas localizações).
27/03/12 60
61. Trabalhando com Datas
• Para obter um Calendar que encapsula o instante
atual (data e hora), usamos o método estático
getInstance() (familiar?) de Calendar:
Calendar c = Calendar.getInstance();
System.out.println(“Dia do Mês:“ + c.get(Calendar.DAY_OF_MONTH));
System.out.println(“Dia da Semana:“ + c.get(Calendar.DAY_OF_WEEK));
• No exemplo acima, imprimimos o dia de hoje e o
dia da semana correspondente. Note que o dia da
semana devolvido é um inteiro que representa o
d
dia da semana (Calendar.MONDAY, etc.)
27/03/12 61
62. Trabalhando com Datas
• A partir de um Calendar, podemos saber o valor de seus
campos, como ano, mês, dia, hora e minuto. Para isso,
usamos o método get que recebe um inteiro
representando o campo; os valores possíveis estão em
constantes na própria classe Calendar.
• Da mesma forma que podemos obter os valores dos
campos, podemos atribuir novos valores a esses campos
por meio dos métodos set. Há diversos métodos set em
Calendar. O mais geral é o que recebe dois argumentos: o
primeiro indica qual é o campo (usando as constantes de
Calendar) e o segundo, o novo valor. Além desse método
set, outros métodos set recebem valores de determinados
campos; o set de três argumentos, por exemplo, recebe
ano, mês e dia.
27/03/12 62
63. Trabalhando com Datas
• Vejamos um exemplo de como alterar a data de hoje:
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR, 10);
c.set(Calendar.MINUTE, 30);
c.set(2005, 12, 25);
• Outro método bastante usado é add que adiciona uma
certa quantidade a qualquer campo do Calendar. Por
exemplo, para adicionar um ano à data de hoje:
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, 1); // adiciona 1 ao ano
• Note que, embora o método se chame add, também
podemos usá-lo para subtrair valores, bastando colocar
uma quantidade negativa no segundo argumento.
27/03/12 63
64. Trabalhando com Datas
• Os métodos after e before são usados para
comparar o objeto Calendar em questão a outro
Calendar. O método after devolverá true quando
o Calendar em questão estiver num momento no
tempo maior que o do Calendar passado como
argumento. Por exemplo, after devolverá false se
compararmos o Dia das Crianças com o Natal,
pois o Dia das Crianças não vem depois do Natal:
Calendar c1 = new GregorianCalendar(2005, Calendar.OCTOBER, 12);
Calendar c2 = new GregorianCalendar(2005, Calendar.DECEMBER, 25);
System.out.println(c1.after(c2)); // imprime false
27/03/12 64
65. Trabalhando com Datas
• Analogamente, o método before verifica se o
momento em questão vem antes do momento
do Calendar passado como argumento. No
exemplo anterior, c1.before(c2) devolverá
true, pois o Dia das Crianças vem antes do
Natal.
• Notem que Calendar implementa a interface
Comparable. Isso quer dizer que podemos
usar o método compareTo para comparar
dois calendários. No fundo, after e before
usam o compareTo para dar suas respostas.
27/03/12 65
66. Trabalhando com Datas
• Por default, em Java, datas consideradas
inválidas, como “35/08/1981” por exemplo, são
“roladas”, ou seja, transformadas em datas
válidas, adicionando os dias excedentes. A data
35/08/1981 será rolada para a seguinte data
válida: 04/09/1981. Porém, caso uma data
inválida seja informada, há uma maneira de
evitar que essa transformação ocorra e uma
exceção lançada.
• Para desabilitar esse comportamento é
necessário utilizar o método
setLenient(boolean), que evita a rolagem de
data e lança uma exceção.
27/03/12 66
67. Trabalhando com Datas
• Exercício:
– Criar um método que verifique o
intervalo entre duas datas e retorne o
número de dias, dado dois objetos
Calendar como argumentos.
27/03/12 67
68. Trabalhando com Datas
• O cálculo é feito pegando a diferença
entre as datas em milissegundos e
dividindo esse valor pelo número de
milissegundos em um dia:
public int diferencaEmDias(Calendar c1, Calendar c2) {
long m1 = c1.getTimeInMillis();
long m2 = c2.getTimeInMillis();
Double d = new Double(((m2 - m1) / (24*60*60*1000)));
return d.intValue();
}
27/03/12 68
69. Manipulando Arquivos
• Assim como todo o resto das bibliotecas em Java,
a parte de controle de entrada e saída de dados
(conhecido como I/O) é orientada a objetos e
usa os principais conceitos mostrados até agora:
interface, classes abstratas e polimorfismo.
• A idéia atrás do polimorfismo no pacote java.io é
de utilizar fluxos de entrada (InputStream) e de
saída (OutputStream) para toda e qualquer
operação, seja ela relativa a um arquivo, a uma
conexão remota via sockets ou até mesmo a
entrada e saída padrão de um programa
(normalmente o teclado e o console).
27/03/12 69
70. Manipulando Arquivos
• As classes abstratas InputStream e
OutputStream definem respectivamente o
comportamento padrão dos fluxos em Java:
em um fluxo de entrada é possível ler bytes e
no fluxo de saída escrever bytes.
• A grande vantagem dessa abstração pode ser
mostrada em um método qualquer que utiliza
um OutputStream recebido como argumento
para escrever em um fluxo de saída. Para
onde o método está escrevendo? Não se sabe
e não importa: quando o sistema precisar
escrever em um arquivo ou em uma socket
basta chamar o mesmo método!
27/03/12 70
71. InputStream: Lendo bytes
• Vamos ler um byte de um arquivo:
class TestaEntrada {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("arquivo.txt");
int b = is.read();
}
}
• A classe InputStream é abstrata, e
FileInputStream uma de suas filhas. Ela recebe
uma String que é o nome do arquivo como
argumento pelo construtor. Ela vai procurar o arquivo
no diretório em que o java foi invocado (no caso do
Eclipse vai ser dentro do diretório do projeto).
Podemos usar um caminho absoluto.
27/03/12 71
72. InputStream: Lendo bytes
• Quando trabalhamos com java.io, diversos
métodos lançam IOException, que é uma
exception do tipo checked, o que nos obriga a
tratá-la ou lançá-la.
• Estamos aqui declarando IOException através
do throws do main apenas para facilitar o
exemplo, caso a exception ocorra a JVM vai
parar mostrando a stacktrace.
• InputStream tem diversas filhas, como
ObjectInputStream, AudioInputStream,
ByteArrayInputStream, entre outras.
27/03/12 72
73. InputStreamReader: lendo chars
• Para recuperar um caractere precisamos traduzir os
bytes com o encoding dado para o respectivo código
unicode. Escrever esse decoder é muito complicado.
Mas o Java já nos oferece uma classe que faz isso,
que é a classe InputStreamReader:
class TestaEntrada {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("arquivo.txt");
InputStreamReader isr = new InputStreamReader(is);
int c = isr.read();
}
}
• O construtor de InputStreamReader pode receber o
character encoding a ser utilizado como parâmetro,
se desejado, tais como UTF-8 ou ISO-88591.
27/03/12 73
74. InputStreamReader: lendo chars
• InputStreamReader é filha da classe
abstrata Reader. Existem diversas
filhas, próprias para manipulação de
chars. A mais apropriada para leitura de
arquivos é a classe FileReader.
27/03/12 74
75. BufferedReader: lendo Strings
• Apesar da classe abstrata Reader já ajudar no
trabalho com caracteres ainda fica difícil para pegar
uma String. É necesário fazer o casting de cada
caractere para char e isso pode ser muito custoso. A
classe BufferedReader é um Reader que recebe
Reader no construtor e concatena os diversos chars
para formar uma String através do método
readLine:
class TestaEntrada {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("arquivo.txt");
BufferedReader bReader = new BufferedReader(reader);
String s = bReader.readLine();
}
}
27/03/12 75
76. BufferedReader: lendo Strings
• Como o próprio nome diz, essa classe lê do Reader
por pedaços (também conhecidos como chunk) para
evitar realizar muitas chamadas ao file system.
Também podemos configurar o tamanho do buffer
pelo construtor.
• O gráfico abaixo mostra a composição de classes na
operação de leitura:
27/03/12 76
77. BufferedReader: lendo Strings
• O método readLine devolve a linha que foi lida e
muda o cursor para a próxima linha. Caso ele chegue
ao fim do Reader (no nosso caso fim do arquivo), ele
vai devolver null. Então com um simples laço
podemos ler o arquivo por Inteiro:
class TestaEntrada {
public static void main(String[] args) throws IOException {
FileReader reader = new Filereader(“arquivo.txt”);
BufferedReader bReader = new BufferedReader(reader);
String s = bReader.readLine(); // primeira linha
while(s != null) {
System.out.println(s);
s = bReader.readLine();
}
}
}
27/03/12 77
78. Lendo Strings do teclado
• Exercício:
– Dado o gráfico abaixo, criar um mecanismo para leitura
de Strings digitado pelo teclado:
27/03/12 78
79. Lendo Strings do teclado
• Com um passe de mágica, passamos a ler do teclado
em vez de um arquivo, utilizando o System.in que é
uma referência a um InputStream que lê da entrada
padrão.
class TestaEntrada {
public static void main(String[] args) throws IOException {
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
while(s != null) {
System.out.println(s);
s = br.readLine();
}
}
}
27/03/12 79
80. A analogia na saída
• Como podemos imaginar, o processo de
escrita (output) é o processo inverso ao de
leitura (input):
27/03/12 80
81. A analogia na saída
• Exercício:
– Dado o gráfico anterior e o que vimos
até agora sobre leitura, fazer um
programa para escrita de um arquivo a
partir de String lidos do teclado.
27/03/12 81
82. Fechando arquivos
• É importantíssimo SEMPRE fechar o arquivo, ou a classe a qual
estamos utilizando para facilitar a leitura/escrita. Ao realizar a
operação de close, a classe facilitadora sempre fechará o stream
do qual ela está lendo.
• O método close deve ser invocado de qualquer maneira, por isso
é comum que este esteja dentro de um bloco finally.
• Se um arquivo for esquecido aberto, e a referência para ele for
perdida, ele será fechado pelo garbage collector, que veremos
mais a frente, por causa do finalize. Mas não é bom nos
prendermos a isso. Se esquecermos de fechar o arquivo no caso
de um programa pequeno como os que fizemos até agora, o
programa vai terminar antes que o garbage collector atue,
resultando em um arquivo não escrito (os bytes ficarão no
buffer do BufferedWriter).
• Problemas similares podem acontecer com leitores deixados em
aberto.
27/03/12 82
83. Uma maneira mais fácil de ler arquivos
• No java 1.5 temos a classe java.util.Scanner que facilita bastante o
trabalho de ler de um InputStream. Além disso, a classe PrintStream
possui agora um construtor que já recebe o nome de um arquivo como
argumento. Dessa forma a leitura do teclado com saída para um
arquivo ficou muito simples:
Scanner s = new Scanner(System.in);
PrintStream ps = new PrintStream("arquivo.txt");
while(s.hasNextLine()) {
ps.println(s.nextLine());
}
• Ambos os métodos não lançam IOException (PrintStream lança
FileNotFoundException se construirmos passando uma String, que é filha de
IOException e indica que o arquivo não foi encontrado), sendo que o Scanner
considerará que chegou ao fim se uma IOException for lançada, e o PrintStream
simplesmente engole exceptions desse tipo. Ambos possuem métodos para
verificar se algum problema ocorreu. A classe Scanner é do pacote java.util. Ela
possui métodos muito úteis para trabalhar com Strings, em especial diversos
métodos já preparados para pegar números e palavras já formatadas através de
expressões regulares.
27/03/12 83
84. Serialização de Objetos
• No contexto de armazenamento e transmissão de
dados, a serialização é o processo de salvar um
objeto em um meio de armazenamento (como um
arquivo de computador ou um buffer de memória) ou
transmiti-lo por uma conexão de rede, seja em forma
binária ou em formato de texto. Esta série de bytes
pode ser usada para recriar um objeto com o mesmo
estado interno que o original.
• A serialização fornece algumas vantagens, tais como:
– Um método simples e robusto de tornar
objetos persistentes
– Um método para a implementação de
chamadas de procedimento remoto
– Um método a distribuição de objetos
27/03/12 84
85. Serialização de Objetos
• Para que tais funcionalidades sejam
usufruídas, deve ser mantida a
independência de arquitetura. Por
exemplo, um computador com uma
arquitetura de hardware diferente
deve ser capaz de reconstruir de
forma consistente o fluxo de dados
seriais.
• Em Java, para tornar um objeto
Serializável, basta que a classe
implemente a interface
java.io.Serializable.
27/03/12 85
86. Serialização de Objetos
• Tendo um objeto serializável em
mãos, podemos tanto persistí-lo em
disco, em um banco de dados, ou
ainda enviá-lo através de uma rede.
• A linguagem Java oferece duas classes
que permitem, a partir de um input
stream ou um output stream,
respectivamente serializar ou
desserializar um objeto.
27/03/12 86
87. Serialização de Objetos
• A classe ObjectOutputStream permite
gravar através de um output stream
um objeto serializável:
Conta c = new Conta(); // Nossa conta corrente é serializável
FileOutputStream output = new FileOutputStream(“arquivo.txt”);
ObjectOutputStream objOutput = new ObjectOutputStream(output);
objOutput.writeObject(c); // Gravando a conta no arquivo
objOutput.flush();
objOutput.close();
27/03/12 87
88. Serialização de Objetos
• E a classe ObjectInputStream permite ler
através de um input stream um objeto
serializável:
FileInputStream input = new FileInputStream(“arquivo.txt”);
ObjectInputStream objInput = new ObjectInputStream(input);
Object objeto = objInput.ReadObject();
Conta c = (Conta)c;
objInput.close();
27/03/12 88
89. Serialização de Objetos
• Exercícios:
– Dado o exercício de armazenamento de contas
da aula passada, criar um mecanismo para
persistir as aulas em um arquivo texto e,
sempre ao se inicializar a aplicação, recuperar
as contas já criadas.
– Personalizar o aplicativo para ler as contas a
partir de um arquivo configurado em um
arquivo .properties (para manipulação de
arquivos de propriedades, ver a classe
Properties)
27/03/12 89
90. Aula 4
• JDBC
– Arquitetura
– Drivers
– DriveManager
– Fazendo uma consulta no banco
• java.sql.Connection
• java.sql.Statement
• java.sql.ResultSet
• java.sql.PreparedStatement
– Design Pattern DAO ( Data Access Object ) e VO
( Value Object )
– Características
– Arquitetura
27/03/12 90
91. Banco de Dados
• Banco de dados Relacionais.
– Uma reprodução de uma parte de uma mundo real.
– Armazenamento dos dados ficam em Tabelas que são formadas por
linhas e colunas. E cada coluna representa um campo e cada linha
um registro.
– Comprando com Classes Java as Tabelas são as Classes Java, cada
Campo da Tabela é um Atributo de uma Classe e cada Registro da
Tabela é um Objeto( representa propriamente o Dado).
– Utiliza uma linguagem padrão para sua manipulação. Padrão SQL
ANSI. Mas cada banco aplica suas variações em cima deste padrão.
– Esta linguagem utiliza uma serie de comandos para definição de
dados “estruturais” (DDL), tais como criação de Tabelas,Bancos de
Dados etc. Ela utiliza outro tipos de comandos (DML) para
manipular ( selecionar, inserir, excluir, etc. ) os registros de forma
simultânea.
– Relacionamento entre entidades.
• Tem como objetivo eliminar redundâncias na armazenagem dos
dados, evitando assim informações conflitantes.
27/03/12 91
92. Linguagem SQL
• Comandos de DDL
– Create Database: Criar um novo banco de dados.
– Create TABLE: Criar uma nova tabela no banco de dados.
– Alter Table: Alterar uma tabela no banco de dados.
– Drop Table: Remover uma tabela no banco de dados.
– Drop Database: Remover um banco de dados.
• Comandos de DML:
– SELECT : Selecionar / Manipular os dados armazenados no
banco de dados. O produto desta seleção é chamado de
“Recordset”.
– Insert :Comando dado para inserir dados da tabela
– Update: Comando dado para atualizar dados já inseridos na
tabela.
– Delete: Comando dado para excluir dados contidos na tabela.
27/03/12 92
93. Sintaxe SQL - DML
• Select :
SELECT <campo1>,<campo2>,..<campoN>
FROM <nomeTabela>
WHERE <campo1> = and <campo2> = <valor2>
• INSERT
INSERT INTO <nomeTabela>(<campo1>,<campo2>,..<campoN>
VALUES (<valor1> , <valor2>, <valorN> ...)
• UPDATE
UPDATE <NOME TABELA> SET <CAMPO1 = novoValorCAMPO1 > , <CAMPON =
novoValorCAMPON .. >
WHERE <CAMPO COND1> = <VALOR COND1>
AND <CAMPO CONDN> = <VALOR CONDN>
• DELETE
DELETE FROM <NOME TABELA>
WHERE <CAMPO COND1> = <VALOR COND1>
and <CAMPO CONDN> = <VALOR CONDN>
27/03/12 93
94. JDBC
• JDBC *
– Disponibilizar uma interface de acesso e
manipulação de dados para vários bancos
de dados (Oracle,My SQL, HSQLDB, Access)
– Qual a versão que utilizaremos desta API ?
• JDBC 4.0
27/03/12 94
95. JDBC - Arquitetura
Aplicação Java
Gerenciador de Driver do JDBC
JDBC JDBC
JDBC Ponte
Driver C Driver D
Driver de Rede A JDBC-ODBC
ODBC
Driver C Nativo
Driver B
Driver B Nativo
27/03/12 95
97. JDBC – Sintaxe de Acesso
• A Especificação JDBC define uma sintaxe particular para
conectar-se com o banco, ela de um endereço de localização
uniforme (URL).Sua sintaxe básica é definida como:
jdbc:<nomedodriver>:<subnome>
Sendo o subnome os parametros de acesso ao banco, estes
parametros variam de Drivers para drivers.
Ex:
Oracle: jdbc:oracle://[hostname]:[port]/[SID_Oracle]
MySQL: jdbc:mysql://[hostname]:[port]/[databesename]
DERBY : jdbc:derby://[hostname]:[port]/[databesename]
27/03/12 97
99. Um programa JDBC mínimo
Registra o Driver Provido pelo Fornecedor
Class.forName("com.mysql.jdbc.Driver");
Classe DriverManager retorna um Obj Instanciado da Interface Connection
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/fastbuy","fastbuy","fastbuy”);
A Partir de agora estou Conectado no Banco !!
Obj. Connection prove o Executor (Statement) de Comandos no Banco.
Statement stmt = conn.createStatement();
Posso Enviar uma instrução, comando para o Banco
O Executor pode ou não Obter um Conjunto de Dados (ResultSet)
do Banco
ResultSet rset = stmt.executeQuery("select * from organizacao");
27/03/12 99
100. JDBC – java.sql
• Diagrama de Classes
Quem Prove a
Classe Concreta ??
Veremos com mais Detalhes as interfaces Connection, Statement,
PreparedStatement , ResultSet
27/03/12 100
101. JDBC - Connection
• Interface Connection: Representa a Seção do
usuário no banco, tem como objetivo prover informações sobre
o banco , prover mecanismo para execução de Comandos SQL
neste.
• Principais Métodos da Interface Connection
createStatement : Responsável por retornar uma instância concreta da
Interface Statement.
prepareStatement : Responsável por retornar uma instância concreta da
Interface PreparedStatement
prepareCall : Responsável por retornar uma instância concreta da
Interface CallableStatement
27/03/12 101
102. JDBC - Statement
• Interface Statement: Utilizado pela execução de uma
instrução SQL estática e retornar o produto da instrução.
• Principais Métodos da Interface Statement
execute : Responsável por executar uma instrução SQL que pode retornar um
conjunto de resultados.
executeQuery : Responsável por executar uma instrução SQL que pode retornar
um objeto (ResultSet) de resultado
executeUpdate : Responsável por executar uma instrução SQL de atualização
(INSERT,UPDATE,DELETE) retornando somente o volume de dados alterados.
executeBatch : Responsável por executar um conjunto de instruções (batch) SQL,
este medoto deve ser utilizado após a chamada do método addBatch.
addBatch : Responsável por adicionar uma uma instrução SQL na fila de comandos
para execução futura (executeBatch).
27/03/12 102
103. JDBC - PreparedStatement
• Interface PreparedStatement: Utilizado para a
execução de uma instrução SQL dinâmica e retornar o produto da
instrução, estende a interface Statement
Principais Métodos da Interface PreparedStatementBoa
Prá
tica
execute : Responsável por executar uma instrução SQL que pode
retornar um conjunto de resultados.
executeQuery : Responsável por executar uma instrução SQL que pode
retornar um objeto (ResultSet) de resultado
executeUpdate : Responsável por executar uma instrução SQL de
atualização (INSERT,UPDATE,DELETE) retornando somente o volume de
dados alterados.
Veremos mais detalhes sobre Statement X PreparedStatement
27/03/12 103
104. JDBC - ResultSet
• Interface ResultSet: Utilizado para representar uma coleção
(cursor) de dados obtidos do Banco de Dados, gerado por uma
instrução executada por um Statement.Ela prove métodos de
navegação (iteração) com o conjunto de dadas obtidos e também prove
métodos para acesso a cada coluna (atributo) obtida.
Principais Métodos da Interface PreparedStatement
next : Responsável por mover o cursor para próximo registro e
retornando verdadeiro ou falso (true|false).
getString, getInt, getDouble, getFloat, getCursor etc.. :
São métodos para obtenção do valor contido em cada coluna retornada pelo
comando.
27/03/12 104
105. Exercício
• Vamos criar uma Classe Chamada de
TesteJDBC. Nela implementaremos os
métodos realizarão as operações de
CRUD (Create, Read, Update, Delete)
– Criaremos os Seguintes métodos
• executeQuery()
• executeInsert()
• executeUpDate()
• executeDelete()
27/03/12 105
106. Lendo Dados do Banco
public static void executeQuery() {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://maquinaintrutor:3306/fastbuy“
, “fastbuy “
, “fastbuy");
System.out.println("Caraca ... maluco to no banco ... ");
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("select * from organizacao");
while (rset.next()) {
System.out.println(“ID Org :" + rset.getInt(“idorg"));
System.out.println("Nome :" + rset.getString(“nome"));
System.out.println("--");
}
} catch (SQLException ex) {
} catch (ClassNotFoundException ex) {
}
}
27/03/12 106
108. Atualizando Dados no Banco
public static void executeUpdate () {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://maquinaintrutor:3306/fastbuy“
, “fastbuy “
, “fastbuy");
Statement stmt = conn.createStatement();
int i = stmt.executeUpdate(“update organizacao set " +
“ nome = ‘Bisso Corporation’ where cnpj = ‘23333’ “;
} catch (SQLException ex) {
} catch (ClassNotFoundException ex) {
}
}
27/03/12 108
109. Excluindo Dados no Banco
public static void executeUpdate () {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://maquinaintrutor:3306/fastbuy“
, “fastbuy “
, “fastbuy");
Statement stmt = conn.createStatement();
int i = stmt.executeUpdate(“delete from organizacao where cnpj = ‘23333’ “;
} catch (SQLException ex) {
} catch (ClassNotFoundException ex) {
}
}
27/03/12 109
110. Qual a diferença ?
• Qual a diferença entre os métodos
– executeQuery()
– executeInsert()
– executeUpDate()
– executeDelete()
27/03/12 110
111. JDBC : Como Aplicá-lo e AONDE ?
• Divisão da Aplicação por camadas de
responsabilidade:
Visualização
Qual o Pattern
Controle Responsável
por
Gerenciar a
Modelo Camada de
Persistência ?
Camada de Negócio
Camada de Integração e Persistência DAO
27/03/12 111
112. JDBC : Como Aplicá-lo e AONDE ?
• Aonde aplicá-lo nós vimos, e qual o
pattern responsável por isso ? Como e
devo criá-lo ?
• Para Demonstrar utilização do JDBC nós
iniciaremos um projeto novo, que visa
atender as necessidades do processo de
compra de materiais de escritório de
uma grande empresa.
27/03/12 112
113. Projeto FastBuy
• Criaremos um conjunto de classes que
representarão a lógica de negócio de um
sistema de compras de materiais indiretos.
• Definiremos as grandes entidades envolvidas,
para elas atribuiremos um conjunto de
atributo que comporão o modelo de negócio.
• Conforme o andamento do projeto serão
apresentados os padrões de projeto mais
utilizados em cada camada da aplicação.
27/03/12 113
114. Projeto FastBuy
• Entidades Envolvidas
– Dados Mestres
• Materiais
• Organização
• Usuários
– Módulo de Compras
• Pedido de Compra
27/03/12 114
117. Projeto FastBuy
• Construção de Baixo para Cima.
– Desenvolver os componentes de infra-estrutura antes de
construir os componentes da camada de negócio e
apresentação, ou seja inicie sempre pelo DAO/VO.
27/03/12 117
118. Criando o Projeto no NeatBeans
• Copiar o Diretório contida na pasta do
instrutor chamada FastBuyERP.
- Sub Diretórios
- src - Código Fonte.
- lib - Bibliotecas
- model – diagramas
- Crie um projeto baseado em um código que
já exista.
27/03/12 118
119. Projeto FastBuy
• Vamos Olhar a implementação da Classe
EnderecoDAO, que se encontra no package:
br.com.season.fastbuyerp.persistencia
• Vamos verificar o metodo
getEndereco (String login)
• Vamos aplicar a escada de acessos ... !!!
27/03/12 119
120. Projeto FastBuy
• Atividade em Grupo:
– Vamos criar o método:
public EnderecoVO getEndereco(long idEndereco)
• Atividade em CASA :
– Implementar o DAO de PedidoCompra utilizem os DAOs
implementados como base.
27/03/12 120
121. Aula 6
• Interface Gráfica
– Arquitetura
– Diferenças entre AWT / Swing
– Componentes e Eventos
– Fazendo nossa primeira tela
• MVC
– Arquitetura e classe da aplicação com banco de
dados
– Fazendo uma aplicação de cadastro com JDBC
– Construção da tela de cadastro
– Reutilizando a tela de cadastro para Atualização
– Monstrando mensagens para o usuário com
JOptionPanel
27/03/12 121
122. Camada UI – Swing
O que é ?
Com o Java 1.2 ele se tornou o novo toolkit gráfico substituindo os
componentes visuais do AWT e acrescentando muitas novas
funcionalidades. Os componentes visuais são escritos
inteiramente em Java, o que garante recursos e comportamento
independente da plataforma. Isso a torna também “diferente”
das aplicações nativas, no seu visual e comportamento. Apesar
do recurso de look-and-feels personalizados (Basicamente uma
capacidade de temas para o Swing), e o mesmo com as
melhorias nas ultimas versões do Java, ainda é possivel
perceber claramente quando uma aplicação e puro-Java ou
quando ela usa um toolkit nativo (Dephi, VB) no Windows, ou
no Gnome e KDE no Linux (Isso não é necessariamente uma
desvantagem).
O Swing também implementa muitos design patters orientados a
objetos, o que o torna o toolkit gráfico mais flexível, extensível
e poderoso do mercado, porém este recurso traz um custo
significativo em performance e Curva de Aprendizado.
27/03/12 122
124. Swing - Arquitetura
Note que o Swing e o AWT
Componentes
duplicam parte da funcionalidade
MVC gráfica básica fornecida pela
plataforma nativa (anti-aliasing de
textos, efeitos com janelas e
Swing vários outros recursos ), que o
Componentes
Sofisticados
torna mais difícil das aplicações
Java se beneficiarem de hardware
gráfico acelerado e outras
otimizações do sistema
operacional. Isso contribui em
Primitivas Gráficas parte para a percepção de
e Componentes “lentidão” de aplicações Swing
AWT Simples
otimizadas.
Acesso ao
Sistema Gráfico do SO
Hardwarde
27/03/12 124
125. Swing - Pacotes
javax.swing - Provides a set of "lightweight" (written in Java with no native code) components
that, to the maximum degree possible, work the same on all platforms.
javax.swing.colorchooser - Contains classes and interfaces used by the JColorChooser
component.
javax.swing.event - Provides support for events fired by Swing components.
javax.swing.filechooser - Contains classes and interfaces used by the JFileChooser
component.
javax.swing.plaf - Provides one interface and many abstract classes that Swing uses to
provide its pluggable look and feel capabilities.
all painting is delegated.
javax.swing.table - Provides classes and interfaces for dealing with JTable.
javax.swing.text - Provides classes and interfaces that deal with editable and non-editable
text components.
javax.swing.text.rtf - Provides a class (RTFEditorKit) for creating Rich Text Format text
editors.
javax.swing.tree - Provides classes and interfaces for dealing with JTree.
javax.swing.undo - Allows developers to provide support for undo/redo in applications such as
text editors.
27/03/12 125
127. Swing – 1º Componentes
• Nosso Primeiro Componente
– Vamos Criar a classe Main no pacote :
• br.com.fastbuy.view.gui
Vamos criar nosso
primeiro componente
Swing.
1. Acesse o menu
New File do NeatBeans.
2. Selecione a opção
Java Gui Form e
JFrame Form
27/03/12 127
129. Swing – 1º Componente
• Boas Praticas
– Alterar nome dos Componentes para nomes compreensíveis, ou seja , não
utilize JTextField1, textA , etc ... Utilize o nome do atributo que ele
representa. Por Exemplo um JTextField que conterá o atributo ‘nome” defina
o nome do componente como nomeTxt ou txtNome.
27/03/12 129
132. Swing Customizando Componentes
• Os componentes Swing são Segregados em três camadas ( Model, View,
Controler) , quando adicionamos um JButton no nosso formulário, na verdade
estamos adicionando um controlador, que gerencia a camada de Apresentação e
Modelo deste Componente.
• Os componente Swing JButton , JLabel ,
JList , JTable são controladores que
gerenciam os Componentes de "PLAF“
(Pluggable Look-And-Feel) como por ex :
javax.swing.plaf.ButtonUI e também os
componentes de Modelo que são os responsáveis pelo comportamento do
componente Button. Este tipo de arquitetura é o diferencial das Aplicações Swing
comparado com outros framework GUI de mercado (Delphi , Visual Basic).
• Isso proporciona maior escalabilidade referente a Look and Feel e customização
do comportamento de cada componente, ou seja, ganho de capacidade de aplicar
Skins a minha apresentação sem afetar o comportamento do componente.
27/03/12 132
133. Swing Customizando Componentes
• Também posso alterar o comportamento dos componentes existentes. Por exemplo: Por
Default um JTable não é capaz de identificar se uma determinada célula (LinhaXColuna)
deverá ter a cor da Fonte Vermelha ou Exibir uma Imagem baseado no conteúdo ou ainda
exibir uma ComboBox com uma lista de valores possíveis para aquela célula. Então vamos
observar como é a relação do Componente JTable (Controle) com outras classes e
interfaces.
27/03/12 133