SlideShare uma empresa Scribd logo
Linguagem de
Programação
Java
Linguagem de Programação Java
Agenda
• Iniciando
• Revisão de Conceitos
• Arrays
• Desenho Avançado de Classes
• Manipulação de Erros e Exceções
• Desenvolvimento de Aplicações
• Construindo GUIS (Interfaces Gráficas com o
Usuário)
• Tratamento de Eventos para GUIs
• Programação para Redes
• Programação Multi-Tarefa (Multi-Thread
Programming)
Iniciando
Iniciando
• Objetivos do módulo
• Capacitar o aluno no desenvolvimento de aplicações
em Java usando as CORE APIs, bem como
manipulação de arquivos, dados, interfaces gráficas e
programação cliente-servidor.
• Habilidades adquiridas
• Codificar, compilar e executar aplicações em Java
Revisão de Conceitos
Conceitos
• Distribuições da Tecnologia Java
• Tipos de Programas Java
• “Key Features” da Tecnologia Java
• Conceitos errados sobre Java
• Palavras Reservadas
• Entendendo a Portabilidade do Java
• Entendendo a Java Runtime Enviromnent
• Definição de Nomes
• Anatomia de uma Classe Java
• Aplicações Java Stand-Alone
• Operadores
• Controle de Fluxo
• Criando Classes
• Encapsulamento
Revisão de Conceitos
Distribuições da Tecnologia Java
J2SE
Standard Edition
• Cliente/Servidor
• Applet
• Departamental
J2EE
Enterprise Edition
• eBusiness
• eCommerce
• Corporativo
J2ME
Micro Edition
• Telefone celular
• Dispositivos
eletrônicos
• Móvel
Revisão de Conceitos
Tipos de programas Java
• Stand-Alone
• Java Applets™
• Java Servlets™
• Java Midlets™
• JavaBeans™
Revisão de Conceitos
“Key Features” da Tecnologia Java
• Simples
• Orientada a objetos
• Distribuída
• Robusta
• Segura
• Neutra em relação à
Plataforma
• Portável
• Interpretada
• Alto desempenho
• Múltiplas linhas de
execução
• Dinâmica
Revisão de Conceitos
Conceitos errados sobre Java
• Java é uma extensão do HTML
• Java é apenas outra linguagem
• Todos os programas Java executam em páginas Web
• O Javascript é uma versão “Light” da linguagem Java
• Java é interpretado, muito lento para aplicações sérias
• Java é uma linguagem de programação fácil de
aprender
• Java é um ambiente fácil no qual programar
Revisão de Conceitos
Palavras Reservadas
abstract double int strictfp **
boolean else interface super
break extends long switch
byte final native synchronized
case finally new this
catch float package throw
char for private throws
class goto * protected transient
const * if public try
continue implements return void
default import short volatile
do instanceof static while
Revisão de Conceitos
Entendendo a Plataforma Java
JVM
JRE
JDK
• JVM – Java Virtual Machine
Máquina Virtual Java
• JRE – Java Runtime Environmnent
Ambiente de execução de aplicativos Java
• JDK – Java Development Kit
Ambiente de desenvolvimento Java
Também chamado de J2SDK – Java 2 Software
Development Kit
Revisão de Conceitos
Entendendo a Java Runtime Enviromnent
Sistema Operacional
Java Virtual Machine
bytecode
Revisão de Conceitos
Entendendo a Portabilidade do Java
Revisão de Conceitos
Definição de Nomes
• Um nome pode ser composto por letras (minúsculas
e/ou maiúsculas), dígitos e os símbolos _ e $.
• Um nome não pode ser iniciado por um dígito
(0 a 9).
• Letras maiúsculas são diferenciadas de letras
minúsculas. (Full Sensitive Case)
• Uma palavra-chave da linguagem Java não pode
ser um identificador.
Revisão de Conceitos
Anatomia de uma Classe Java
Revisão de Conceitos
Aplicações Java Stand-Alone
public static void main(String args[]) {
}
• Toda classe Java que possui o método acima, pode
ser iniciada numa JRE exclusiva, no modo Stand-
Alone
• Nem todas as classes Java necessitam ter esse
método
Revisão de Conceitos
Operadores
Negação !
Incremento / Decremento ++, --
Representação de sinal +, -
Inversão ~
Conversão (cast)
Atribuição =
Soma +
Subtração -
Divisão /
Multiplicação *
Resto da Divisão %
Incremento / Decremento ++, --
Representação de sinal +, -
Condicional ternário ?:
Revisão de Conceitos
Operadores de bits
Deslocamento a esquerda <<
Deslocamento a direita >>
Deslocamento a direita (unsigned) >>>
Inversão de bits ~
Resto da Divisão %
Complemento (XOR) ^
Revisão de Conceitos
Operadores de Comparação
Igualdade ==
Maioridade <
Menoridade >
Maior ou igual >=
Menor ou igual <=
Diferente !=
Revisão de Conceitos
Estruturas de Repetição - FOR
sintaxe:
// antes de iniciar o laço, é executada a
// declaração
for ( declaracao; condicao booleana; expressao ) {
// bloco de código que sera repetido
// ate que a condição booleana seja false
// antes da execução iniciar o proximo laço
// sera a executada a expressao
}
Revisão de Conceitos
Estruturas de Repetição - WHILE
sintaxe:
while (condicao booleana) {
// bloco de código que sera repetido
// ate que a condição booleana seja false
}
Revisão de Conceitos
Estruturas de Repetição – DO WHILE-
sintaxe:
do {
// bloco de código que sera repetido
// ate que a condição booleana seja false
} while ( condicao booleana );
Revisão de Conceitos
Estruturas de Seleção - IF
sintaxe:
if ( expressão booleana ) {
// bloco de código que será executado
// se a expressão booleana valer true.
} else {
// bloco de código que será executado
// se a expressão booleana valer false.
}
Revisão de Conceitos
Estruturas de Seleção - SWITCH
sintaxe:
switch ( variavel ) {
case (inteiro):
// caso o valor da variavel seja igual
// ao do inteiro, inicia aqui
case (inteiro):
// caso o valor da variavel seja igual
// ao do inteiro, inicia aqui
default:
// caso não seja nenhum acima, inicia aqui
}
Revisão de Conceitos
Controle de Fluxo
Uso do continue
for(int i = 0; i < 10; i++){
if (i == 5){
continue;
}
//....
}
Revisão de Conceitos
Controle de Fluxo
for(int i = 0; i < 10; i++){
if (i == 5){
break;
}
//....
}
Revisão de Conceitos
Uso do break
Controle de Fluxo Especiais
continue e break com label:
fora:
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
if (j == 5){
continue fora;
}
//....
}
Revisão de Conceitos
Criando Classes em Java
• O que é abstração?
• O que são objetos?
• Do que eles são constituídos?
• O que são classes?
• Do que elas são constituídas?
• Qual a relação entre classe e objeto?
• Quais são os membros de uma classe?
• Atributos, métodos e construtores!
Revisão de Conceitos
Revisão de Conceitos
• Encapsulamento
pedido: Pedido
- pedidoID: String
- clienteID: String
- notaFiscal:String
- total: double
- ICMS: double
- produtos: List
+ adcionarProduto(Produto)
+ removerProduto(produtoID)
+ recuperaProduto(produtoID)
+ calculaTotal(): double
+ calculaImpostos(): double
+ encerraPedido(): double
+ Pedido(pedidoID, clienteID)
Atributos privados
Métodos públicos
Definimos uma interface de métodos
públicos fornecendo acesso a
informação do objeto
• Encapsulamento
Dessa forma, podemos alterar o código
dos métodos da classe Pedido sem
alterar a classe Cliente.
pedido: Pedido
- pedidoID: String
- clienteID: String
- notaFiscal:String
- total: double
- ICMS: double
- produtos: List
+ adcionarProduto(Produto)
+ removerProduto(produtoID)
+ recuperaProduto(produtoID)
+ calculaTotal(): double
+ calculaImpostos(): double
+ encerraPedido(): double
+ Pedido(pedidoID, clienteID)
Atributos privados
Métodos públicos
Cliente
permitido
não permitido
Revisão de Conceitos
Discussão
• O que se entende afinal pela Tecnologia e Plataformas
do Java?
• Sabendo que uma classe Java pode facilmente ser
modelada, então é fácil analisa-la e codifica-la?
• Programar em Java, não é só codificar? Exige um
entendimento prévio do problema?
Revisão de Conceitos
Arrays
Arrays
Agenda
• Java Arrays
• Definindo Arrays
• Cópia elementos
• Manipulando elementos
Arrays
Java Arrays
• Manipulação de conjunto de dados em
memória
• Possuem quantidade limitada de itens
• Podem ser usados com objetos ou primitivos
• Usamos para definir matrizes ou vetores
Arrays
• Sintaxe
tipo identificador[] = new tipo[tamanho];
int[] inteiros = new int[10];
String[] nomes = new String[10];
• Exemplos
Java Arrays
Arrays
int[] inteiros = new int[10];
• Visualização Gráfica
Java Arrays
Java Arrays
• Podem ter “n” dimensões formando matrizes
int[][] dados = new int[10][10];
dados[0][0] = 100;
Arrays
Definindo elementos
• Valores podem ser atribuídos na definição
int[] inteiros = {10,8,5,10,9};
• Tamanho pode ser obtido pela
propriedade length
System.out.print(inteiros.length);
Arrays
Copiando Elementos
int original[] = { 1, 2, 3, 4, 5, 6 };
int copia[] = new int[10];
System.arraycopy(original, 0, copia, 0, original.length);
Arrays
Manipulando elementos
String nomes[] = new String[10];
// preenchendo
for (int i=0; i < nomes.length; i++) {
nomes[i] = new String("Valor: "+i);
}
// imprimindo na tela
for (int i=0; i < nomes.length; i++) {
System.out.print( nomes[i]+ " " );
}
Arrays
Discussão
• Para que servem os Arrays nas linguagens de
programação?
• Vetores e matrizes são elementos complexos de
manipular, não existe nada mais fácil em Java para se
manipular objetos?
• Quando um objeto tiver uma relação múltipla com
outro, vamos definir usando arrays?
Arrays
Exercícios
Arrays
Desenho Avançado de
Classes
Agenda
• Herança
• Generalização e Especialização
• Representação UML
• Objetos a partir de subclasses
• Codificando em Java
• Implementação das classes
• Formas de Herança
• Polimorfismo
• Overloading
• Overriding
• Benefícios do Polimorfismo
• Refinando a Hierarquia de Classes
• Uso de Classes, Métodos e Variáveis Final
• Uso de Classes e Métodos Abstratos
• Uso de Interfaces
• Pacotes
Desenho Avançado de Classes
Herança
• ferramenta mais valiosa das linguagens e modelos
baseados em OO;
• possibilita reutilizar uma grande quantidade de
código e componentes.
• facilita a criação de classes partir de superclasses.
• Definição: “capacidade de um objeto filho herdar
atributos e métodos do objeto pai, podendo
reescrever (alterar) as características herdadas se
necessário”.
Desenho Avançado de Classes
Herança
A classe “cliente” é uma
subclasse da classe
“pessoa”, e herda todos os
atributos e métodos da
classe “pessoa”.
Cliente é uma subclasse de
Pessoa.
Pessoa é uma superclasse de
Cliente
Cliente
- clienteID: String
- CPF: String
+ getClienteID(): String
+ getCPF() : String
+ Cliente(clienteID,CPF)
Pessoa
- nome: String
- nascimento: Data
+ getNome(): String
+ getDate() :Date
+Pessoa(nome)
Construtores não são herdados
Desenho Avançado de Classes
Generalização: Bottom-Up
• Definição: Processo pelo qual
identificamos atributos comuns em
classes diferentes que são colocados
numa superclasse, menos específica e
mais genérica.
Desenho Avançado de Classes
Especialização: Top-Down
• Definição: Processo pelo qual
identificamos atributos incomuns em
classes diferentes que são colocados
nas subclasses de uma superclasse,
tornando-a mais específica e menos
genérica .
Desenho Avançado de Classes
Representação na UML
Define um modelo completo para
solucionar um problema
computacional.
Desenho Avançado de Classes
Pessoa
- nome: String
- nascimento: Data
+ getNome(): String
+ getDate() :Date
+Pessoa(nome) Joao:Pessoa
nome = Joao Souza
nascimento: 10/10/1980
Jose:Pessoa
nome = Jose Silva
nascimento: 10/01/1970
Instancias de Pessoa: Jose e Joao
Objetos a partir de subclasses
Desenho Avançado de Classes
Cliente
- clienteID: String
- CPF: String
+ getClienteID(): String
+ getCPF() : String
+ Cliente(clienteID,CPF)
Pessoa
- nome: String
- nascimento: Data
+ getNome(): String
+ getDate() :Date
+Pessoa(nome)
Mario:Cliente
nome = Mario Silva Souza
nascimento: 01/05/1970
clienteID = 0056
CPF: 12345678-00
Oscar:Cliente
nome = Oscar Souza
nascimento: 02/02/1987
clienteID = 0058
CPF: 87654321-00
Instancias de Cliente: Mario e Oscar
Desenho Avançado de Classes
Objetos a partir de subclasses
Desenho Avançado de Classes
Codificando em Java
public class Pessoa {
// definição de classe
}
public class Cliente extends Pessoa {
// definição de classe
}
• Uma subclasse pode estender somente uma
superclasse diretamente. A herança em Java é
simples.
• A keyword extends na definição de classe,
define a relação de herança.
Desenho Avançado de Classes
Implementação das Classes
public class Produto {
// definição de classe
}
public class Livro extends Produto {
// definição de classe
}
public class CompactDisc
extends Produto {
// definição de classe
}
Desenho Avançado de Classes
Formas de Herança
• Extensão.
• Especificação.
• Combinação de Extensão com Especificação.
Durante a modelagem, devemos
aplicar a herança com critério!
Polimorfismo
• POLIMORFISMO = Muitas Formas
Ou seja, para uma árvore de herança, temos muitas
formas de objetos e métodos a partir de uma
superclasse e suas subclasses.
• Princípio pelo qual modelamos e usamos objetos
construídos a partir de uma arvore de herança.
Desenho Avançado de Classes
Polimorfismo
• Subclasses
• Sobrescrita de método
• Sobrecarga da método
Desenho Avançado de Classes
Polimorfismo
• Subclasses
• Quando especializamos uma superclasse e criamos um
subclasse criamos um nova forma para a superclasse e
conseqüentemente novas formas de objetos
Livro e CompactDisc são formas de
Produto.
Desenho Avançado de Classes
Overriding
• Sobrescrita de métodos
Definição: Esta utilidade da
orientação a objetos e das
linguagens orientada a
objetos nos permite escrever
numa subclasse um ou mais
métodos presentes numa das
superclasses da árvore de
herança podendo alterar o
comportamento da
superclasse
Desenho Avançado de Classes
Overriding
• Sobrescrita de métodos – Invocação Virtual de Métodos
Quando for chamado para execução
o método getDetalhes() da instancia
de Pessoa, o código executado será:
Pessoa.getDetalhes()
Quando for chamado para execução
o método getDetalhes() da instancia
de Cliente, o código executado será:
Cliente.getDetalhes()
Ou seja, quando chamarmos um
método de um objeto, o método
escolhido para ser executado será a
primeira ocorrência encontrada
daquele método num arvore de
herança (Invocação Virtual de
Métodos).
Desenho Avançado de Classes
Overloading
• Sobrecarga de métodos
O Polimorfismo ainda permite
que numa mesma classe
tenhamos métodos com o
mesmo nome, desde que o
número ou tipos de
parâmetros passados sejam
diferentes
Desenho Avançado de Classes
Benefícios do Polimorfismo
• Uso da Herança
Cadastro
- pessoas: Lista
+ adcionaPessoa(Pessoa)
+ removePessoa(indice)
+ listaPessoas(): Lista
+ Cadastro()
Vendo estas classes de objetos
podemos ver que o cadastro, pode
cadastrar (ele entende) qualquer
pessoa, inclusive os clientes,
devido a herança.
Desenho Avançado de Classes
Benefícios no Polimorfismo
• Maior facilidade de alteração do modelo;
• Maior facilidade de expansão de um modelo;
• Melhor garantia de que uma idéia presente na
“Descrição do Problema” será mantida;
Desenho Avançado de Classes
Revisão
Desenho Avançado de Classes
Desenho Avançado de Classes
Refinando a Hierarquia de Classes
• Aplicação de Classes Final (Última forma);
• Aplicação de Classes Abstratas;
• Aplicação de Interfaces;
Processo pelo qual refinamos o modelo de
classes com o objetivo de melhor definir a
abrangência da solução referente ao
problema de negócio.
Desenho Avançado de Classes
Uso de Classes, Métodos ou Atributos Final (final)
Final Classes: Não podem ser especializadas, ou
seja, é a última forma do objeto.
public final class ContaEspecial
extends Conta {
...
}
Desenho Avançado de Classes
Uso de Classes, Métodos ou Atributos Final (final)
Final Methods: Não podem ser especializados,
ou seja, não podem ser reescritos na herança.
public class Poupanca extends Conta{
...
public final void credito(double valor) {
}
}
Desenho Avançado de Classes
Uso de Classes, Métodos ou Atributos Final (final)
Final Variables: Não podem ser alteradas depois
de inicializadas, ou seja, tornam-se constantes.
public class Conta {
...
public static final double CPMF = 0.0038;
}
As constantes geralmente são definidas como public static final,
para que qualquer classe tenha acesso a esse valor!
Uso de Classes e Métodos Abstratos (abstract)
Desenho Avançado de Classes
public abstract class Produto extends Object {
// metodo abstrato não possui corpo de implementacao.
public abstract String getDescricaoCompleta();
}
Abstract Classes: Não podem ser instanciadas,
ou seja, é a primeira forma do objeto, e devem ser
especializadas.
Desenho Avançado de Classes
public abstract classs Produto extends Object{
...
public int getCodigo() {
return codigo;
}
public double getPreco() {
return preco;
}
public abstract String getDescricaoCompleta();
}
Uma classe abstrata, deve ter no mínimo um método abstrato.
Uma classe abstrata, pode ter métodos concretos (não abstratos).
Uma classe concreta, não pode ter métodos abstratos.
Uso de Classes e Métodos Abstratos (abstract)
Desenho Avançado de Classes
Uso de Classes e Métodos Abstratos (abstract)
Nesse modelo, vemos que o
Produto é um tipo abstrato
manipulado pelo Catálogo!
Nesse caso, não podemos
vender ou manipular um
instância de Produto, somente
de Livro ou CD.
Uso de Interfaces (interface)
Desenho Avançado de Classes
Interfaces: Não podem ser instanciadas, e só
possuem métodos abstratos ou constantes.
public interface identificador [extends OutraInterface] {
// os métodos de uma interface não possuem corpo,
// somente definição.
[modificador] tipoRetorno identificador ([argumentos]);
}
Uso de Interfaces (interface)
Desenho Avançado de Classes
Usadas para definir apenas o nome de um
comportamento, e não sua implementação!
Uma classe, abstrata ou concreta, pode estender
somente uma classe, mas pode implementar múltiplas
interfaces.
public interface Vendavel {
public double getValorVenda();
}
Uso de Interfaces (interface)
Desenho Avançado de Classes
public class Livro extends Produto
implements Vendavel {
...
public double getValorVenda() {
return getPreco() * 1.2;
}
}
public class CompactDisc extends Produto
implements Vendavel {
...
public double getValorVenda() {
return getPreco() * 1.1;
}
}
Dessa forma, todas os objetos do modelo que quiserem ser vendavel,
implementam a interface Vendavel, dando um comportamento para o método
getValorVenda () de acordo com a necessidade de cada objeto.
Uso de Interfaces (interface)
Desenho Avançado de Classes
Nesse modelo, vemos que o
Vendavel é um tipo
extremamente abstrato
Dessa forma, Livro e CD, são
Produtos Vendaveis, com as
características herdadas de
produto, e uma
implementação de Vendavel.
Uso de Interfaces (interface)
Desenho Avançado de Classes
Dessa forma um
carrinho de compras,
manipula qualquer
objeto Vendavel,
inclusive Livro e CD.
Na evolução, esse
sistema pode usar o
Carrinho para qualquer
Vendavel, não somente
Produtos.
Enquanto o Catalogo
manipula Produtos, o
Carrinho manipula
Vendaveis
Uso de Interfaces (interface)
Desenho Avançado de Classes
public class Carrinho {
private Vendavel[] vendaveis;
private int counter;
...
public int adcionaVendavel(Vendavel vendavel) {
vendaveis[ counter++ ] = vendavel;
return counter;
}
public Vendavel getVendavel(int index) {
return vendaveis[ index ];
}
public double calculoCompras() {
double valor = 0;
for ( int i =0; i<vendaveis.length; i++ ) {
valor += vendaveis[i].getValorVenda();
}
return valor;
}
}
Organizando as Classes em Pacotes (package)
Desenho Avançado de Classes
Estrutura lógica, representada fisicamente em
diretórios e subdiretórios usada com o intuito de
organizar as classes de uma aplicação ou
sistema.
Notação da UML
Organizando as Classes em Pacotes (package)
Desenho Avançado de Classes
Exemplos do Banco e da Loja
Notação da UML
Organizando as Classes em Pacotes (package)
Desenho Avançado de Classes
Codificação
Nas classes de um pacote
colocamos a definição de
package
package ibta.loja;
public class Carrinho {
..
}
package ibta.loja;
public class Catalogo {
..
}
Nas classes de outro pacote
que necessitam usar as
classes acima, usamos a
definição de import
import ibta.loja.*;
public class TestaProdutos {
..
}
Discussão
• Resumindo. O que se entende por Herança?
• Quando devemos usar especialização e generalização?
• Sabemos que o polimorfismo nos fornece uma ferramenta
poderosa na adição de tipos de objetos, então quer dizer que ele
nos permite ter sistemas mais flexíveis e que tem menos impacto
nas mudanças?
• Qual a necessidade de usar Classes Abstratas?
• Qual a maior diferença de Classes Abstratas e Interfaces?
• Porque usamos os pacotes?
Desenho Avançado de Classes
Exercícios
Desenho Avançado de Classes
Manipulando Erros e
Exceções
Agenda
• O que são Erros e Exceções?
• Hierarquia de Exceções
• Exceções mais conhecidas
• Capturando e tratando Exceções
• Estrutura try-catch-finally
• Usando o bloco try-catch
• Criando Exceções Customizadas
Manipulando Erros e Exceções
O que são erros e exceções?
Manipulando Erros e Exceções
São objetos e possuem classes para serem definidas.
Exceções estão associadas a condições não previstas
durante a execução de uma aplicação Java, e no caso de
acontecerem, a execução pode continuar, exemplo, uma
conversão numérica que falhou.
Tem o conceito de serem “arremessadas” ao chamador de
um método, e são filhas da classe java.lang.Exception
O que são erros e exceções?
Manipulando Erros e Exceções
São objetos e possuem classes para serem definidas.
Erros estão associados a condições não previstas durante a
execução de uma aplicação Java, e no caso de
acontecerem, a execução não pode continuar, exemplo,
falta de memória na JVM.
Tem o conceito de serem “arremessadas” ao chamador de
um método, e são filhas da classe java.lang.Error
Hierarquia da exceções
Manipulando Erros e Exceções
Todas as exceções e erros são subclasses de java.lang.Throwable
Exceções mais conhecidas
Manipulando Erros e Exceções
• java.lang.ArithmeticException - erro de aritmética;
• java.lang.NumberFormatException – erro de formatação
numérica;
• java.lang.ArrayIndexOutOfBoundsException – erro de
manipulação de posições em arrays;
• java.lang.NullPointerException – erro ao chamar um
membro de objeto nulo;
• java.io.IOException – erro de entrada e saída;
• java.lang.ClassNotFoundException – erro de carga de
classes;
Exceções mais conhecidas
Manipulando Erros e Exceções
• java.lang.RuntimeException - erro não previsto na
execução;
As exceções filhas de RuntimeException não
são obrigadas a serem tratadas, pois são consideradas
“Unchecked Exceptions”
As exceções filhas de Exception que não são de
RuntimeException são obrigadas a serem tratadas,
pois são consideradas “Checked Exceptions”
Todos os Erros, filhos de Error, devem ser tratados apesar
de não permitir que o programa continue.
Capturando e tratando exceções
Manipulando Erros e Exceções
Usamos em Java uma estrutura em bloco para
tratar execução de código que pode gerar uma
exceção: é o bloco try – catch – finally.
Estrutura try – catch - finally
Manipulando Erros e Exceções
try {
// código que inclui comandos/invocações de métodos
// que podem gerar uma situação de exceção.
} catch (Throwable t) {
// bloco de tratamento associado à condição de
// exceção derivada de Throwable ou a qualquer uma de suas
// subclasses, identificada aqui pelo objeto
// com referência t
} finally {
// bloco de código que sempre será executado após
// o bloco try, independentemente de sua conclusão
// ter ocorrido normalmente ou ter sido interrompida
// este bloco é opcional
}
Estrutura try – catch - finally
Manipulando Erros e Exceções
try {
a.method();
b.method();
c.method();
} catch (IOException t) {
// A
} catch (Exception t) {
// B
} catch (Throwable t) {
// C
} finally {
}
Se ocorrer uma IOException dentro do
bloco try, será executado o bloco A.
Se ocorrer uma Exception que não é
filha de IOException dentro do bloco try,
será executado o bloco B.
Se ocorrer um Error dentro do bloco try,
será executado o bloco C.
Independente do que aconteça o bloco
finally será executado.
Usando try – catch - finally
Manipulando Erros e Exceções
import java.io.*;
public class ConverteInteiro2 {
public String leLinha() {
byte[] lidos = new byte[20];
String texto = "";
try {
// le o buffer do teclado e pode gerar uma IOException
System.in.read(lidos);
texto = new String(lidos);
texto = texto.trim(); // retira os espacos em branco
} catch (IOException ioException) {
// se acontecer um erro na leitura
// imprime na tela o erro
ioException.printStackTrace();
}
return texto;
}
public int leInt() {
String linha = leLinha();
return Integer.parseInt(linha);
}
public static void main(String[] args) {
ConverteInteiro2 ci = new ConverteInteiro2();
System.out.print("Entre inteiro: ");
int valor = ci.leInt();
System.out.println("Valor lido foi: " + valor);
}
}
Criando exceções Customizadas
Manipulando Erros e Exceções
Geralmente em Java, quando queremos abortar a
execução de um método, internamente fazemos um
tratamento e geramos uma exceção ao invés de usar
testes de retorno.
public class Conta {
public boolean debito(double valor) {
if ( valor < 0 ) {
return false;
} else {
if ( saldo - valor < 0 ) {
return false;
} else {
saldo -= valor;
return true;
}
}
}
}
Criando exceções Customizadas
Manipulando Erros e Exceções
Dessa forma criamos uma exceção customizada!
Criando exceções Customizadas
Manipulando Erros e Exceções
Dessa forma criamos uma exceção customizada!
public class SaldoInsuficienteException
extends Exception {
public SaldoInsuficienteException () {
super("Falta de saldo para esta operação!");
}
public SaldoInsuficienteException (String mensagem) {
super(mensagem);
}
}
Arremessando exceções Customizadas
Manipulando Erros e Exceções
Dessa forma criamos uma exceção customizada!
public class Conta2 {
private double saldo;
public void debito(double valor)
throws SaldoInsuficienteException {
if ( valor < 0 ) {
// unchecked exception não precisa ser declarada na clausula thorws
throw new IllegalArgumentException (“ Valor de debito deve ser maior que zero! ");
} else {
if ( saldo - valor < 0 ) {
// checked exceptio, deve ser declara na clausula throws
throw new SaldoInsuficienteException ("Saldo insuficiente! Atual: "+saldo);
} else {
saldo -= valor;
}
}
}
Tratando exceções Customizadas
Manipulando Erros e Exceções
public class TesteConta2 {
public static void main(String args[]) {
Conta2 c2 = new Conta2();
try {
c2.credito(100);
System.out.println("Saldo: "+ c2.getSaldo() );
c2.debito(50);
System.out.println("Saldo: "+ c2.getSaldo() );
c2.debito(500);
System.out.println("Saldo: "+ c2.getSaldo() );
} catch (SaldoInsuficienteException e) {
// se acontecer uma SaldoInsuficienteException
// caira neste bloco
e.printStackTrace();
} catch (Exception e) {
// se acontecer qualquer outra Exception
// caira neste bloco
e.printStackTrace();
} finally {
System.out.println("Saldo: "+ c2.getSaldo() );
}
}
}
Discussão
• Já que as exceções em Java são objetos, então temos classes
para representá-las?
• Como identificar que um método lança uma exceção seu
chamador?
• Devemos então sempre definir exceções customizadas para
nossas aplicações?
• Qual a principal diferença entre CHECKED e UNCHECKED
Exceptions?
Manipulando Erros e Exceções
Exercícios
Manipulando Erros e Exceções
Desenvolvimento de
Aplicações em Java
Agenda
• Aplicações e Pacotes Java
• Parâmetros em linha de comando
• Manipulando texto e cadeia de caracteres
• Entrada e saída de dados
• Java Streamers
• Java Readers e Writers
• Arquivos de Acesso Randômico
• Arquivos de Propriedades
• Serialização de Objetos
• Uso de Java Collectinons™
• Wrapper Classes
• Discussão
• Exercícios
Desenvolvimento de Aplicações em Java
A funcionalidades principais de uma linguagem inclui:
• manipulação de textos;
• manipulação de estruturas de dados;
• parâmetros em linha de comando para inicializar aplicativos;
• manipulação de arquivos de texto;
• manipulação de arquivos randômicos;
• manipulação de arquivos de configuração;
• formatação de dados;
Essas funcionalidades vão nos permitir implementar uma boa
parte das necessidades de qualquer tipo de sistema ou
aplicação.
Desenvolvimento de Aplicações em Java
Aplicações e Pacotes
Desenvolvimento de Aplicações em Java
Os principais pacotes que usaremos para escrever aplicações stand-
alone utilitárias sem interfaces gráficas são:
• java.lang – fornece as classes fundamentais de linguagem java;
• java.io – fornece classes para manipulação de arquivos;
• java.util – fornece as estruturas de dados e classes utilitárias;
• java.text – fornece as classes para formatação de dados;
• java.math – fornece as classes para manipular números grandes;
Aplicações e Pacotes
Desenvolvimento de Aplicações em Java
Usamos a passagem de dados como parâmetros em linha
de comando com o intuito de passar valores a uma
aplicação ou utilitário.
Esses valores podem ser:
diretórios, nomes de arquivos, valores, etc.
Ex: # java ClasseMain –a nomearquivo.txt
Parâmetros em linha de comando
Desenvolvimento de Aplicações em Java
Capturando os parâmetros dentro da aplicação Java:
public class TesteParametros {
public static void main(String args[]) {
int tamanho = args.length;
System.out.println("Numero de Parâmetros: "+tamanho);
for(int i=0; i < tamanho; i++) {
System.out.println("Param: " + i + " Valor: "+ args[i] );
}
}
}
Parâmetros em linha de comando
No método main, existe um array de String, args[],
que representa os parâmetros passados.
# java TesteParametros parametro1 parametro2 “parametro 3”
Desenvolvimento de Aplicações em Java
Manipulação de textos (cópia, pesquisa, conversões,
maiúsculas e minúsculas, carateres, etc.)
Conjunto de método presentes nas classes:
• java.lang.String – cadeia de caracteres
• java.lang.StringBuffer – buffer de caracteres
• java.lang.StringTokenizer – separador de textos
Manipulando textos e cadeia de caracteres
Desenvolvimento de Aplicações em Java
Usos da Classe java.lang.String
public class TesteString {
public static void main(String args[]) {
String texto = "IBTA Java!";
int tamanho = texto.length();
System.out.println("Texto: "+texto);
System.out.println("Tamanho: "+tamanho);
String texto2 = texto.toUpperCase();
System.out.println("Texto2: "+texto2);
String texto3 = texto.toLowerCase();
System.out.println("Texto3: "+texto3);
String texto4 = texto3.replace( 'u', 'U' );
texto4 = texto4.replace( 'j', 'J' );
System.out.println("Texto4: "+texto4);
if ( texto3.equals( texto ) ) {
System.out.println(" texto3 e texto são iguais! ");
} else {
System.out.println(" texto3 e texto são diferentes! ");
}
if ( texto4.equals( texto ) ){
System.out.println(" texto4 e texto são iguais! ");
} else {
System.out.println(" texto4 e texto são diferentes! ");
}
}
}
Desenvolvimento de Aplicações em Java
Usos da classe StringBuffer e StringTokenizer
import java.util.StringTokenizer;
public class TesteStringBuffer {
public static void main(String args[]) {
String texto = "IBTA Java! Java é aqui!";
StringTokenizer tokenizer = new StringTokenizer( texto, "!");
int numero = tokenizer.countTokens();
String[] tokens = new String[ numero ];
int count = 0;
while ( tokenizer.hasMoreTokens() ) {
tokens[count] = tokenizer.nextToken();
count++;
}
System.out.println("Texto: "+texto);
System.out.println("# Tokens: "+numero);
System.out.print("Tokens: ");
for ( int i = 0 ; i<tokens.length; i++) {
System.out.print( tokens[i] +",");
}
System.out.println();
StringBuffer buffer = new StringBuffer( texto );
StringBuffer invertido = buffer.reverse();
System.out.println("Texto: "+texto);
System.out.println("Invertido: "+invertido );
}
}
Desenvolvimento de Aplicações em Java
Entrada e saída de dados.
Basicamente um aplicativo lida com:
• entrada de dados (via teclado, arquivos, mouse);
• processamento (execução de tarefas nesses dados);
• saída (via interface, arquivos e relatórios);
A entrada ou saída de dados usando teclado e arquivos,
em Java é feito usando:
• Streamers
• Readers
• Writers
Desenvolvimento de Aplicações em Java
Java Streamers
Usados para manipular byte (ASCII) de forma
seqüencial (escrita ou leitura do arquivo todo).
Ligam uma fonte de dados (DataSource) até ao
aplicativo (Program)
Geralmente usados para troca de dados entre
aplicações Java e Non-Java.
Desenvolvimento de Aplicações em Java
Java Streamers – java.io.InputStream
Streamers de entrada (do recurso para a aplicação)
Desenvolvimento de Aplicações em Java
Java Streamers – java.io.OutputStream
Streamers de saída (da aplicação para o recurso)
Desenvolvimento de Aplicações em Java
Readers e Writers
Usados para manipular char (UTF-16) de forma
seqüencial (escrita ou leitura do arquivo todo).
Ligam uma fonte de dados (DataSource) até ao
aplicativo (Program)
Geralmente usados para troca de dados entre
aplicações Java e Java.
Padrão para as aplicações WEB.
Desenvolvimento de Aplicações em Java
Readers – java.io.Reader
Readers (entrada de dados do recurso para a aplicação)
Desenvolvimento de Aplicações em Java
Writers – java.io.Writer
Writers (saída de dados da aplicação para o recurso)
Desenvolvimento de Aplicações em Java
Categorias e uso
Desenvolvimento de Aplicações em Java
Categorias e uso
Desenvolvimento de Aplicações em Java
Exemplos
import java.io.*;
public class Copy {
public static void main(String[] args) {
try {
FileReader input = new FileReader(args[0]);
FileWriter output = new FileWriter(args[1]);
char[] buffer = new char[128];
int charsRead = 0;
charsRead = input.read(buffer);
while ( charsRead != -1 ) {
output.write(buffer, 0, charsRead);
charsRead = input.read(buffer);
}
input.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Desenvolvimento de Aplicações em Java
Exemplos
import java.io.*;
public class LeTeclado {
public static void main (String args[]) {
String s = null;
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
System.out.println("Tecle Ctrl-Z para sair!");
try {
s = in.readLine();
while ( s != null ) {
System.out.println("Lido: " + s);
s = in.readLine();
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Desenvolvimento de Aplicações em Java
Exemplos
import java.io.*;
public class GravaArquivo {
public static void main (String[] args) {
File file = new File(args[0]);
try {
BufferedReader in = new BufferedReader( new
InputStreamReader( System.in ));
PrintWriter out = new PrintWriter( new
FileWriter(file));
String texto = null;
System.out.print("Digite o texto! ");
System.out.println("Ctrl+Z para gravar!");
while ( (texto = in.readLine() ) != null ) {
out.println(texto );
}
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Desenvolvimento de Aplicações em Java
Arquivos de Acesso Randômico
Usados para manipular arquivos de dados que de forma
randômica (escrita em leitura em qualquer parte do
arquivo).
Ligam uma fonte de dados (DataSource) até ao aplicativo
(Program)
Geralmente usados para troca de dados entre aplicações
Java e Non-Java.
Permite a implementação em Java do conceito de
Registro.
Desenvolvimento de Aplicações em Java
Arquivos de Acesso Randômico
Classe: java.io.RandomAccessFile
O arquivo pode ser aberto num modo (Read, Write ou
ReadWrite)
Cada REGISTRO, tem um inicio e fim, com tamanho
definido.
A classe fornece principalmente métodos para:
lock (bloqueio), seek (pesquisa), read (leitura) e write
(gravação).
Desenvolvimento de Aplicações em Java
Trabalho com Propriedades (Properties)
Uma propriedade (property) é um elemento da aplicação que
pode ser alterado em tempo de execução.
Sua existência permite a configuração do aplicativo (ex:
diretorio de dados, nomes de arquivos, dicionários, etc), e
essa configuração fica armazenada em arquivo.
Ainda podemos identificar elementos da JRE e do sistema
corrente (Windows, UNIX, etc)
Classe: java.util.Properties
Desenvolvimento de Aplicações em Java
Trabalho com Propriedades (Properties)
Listando as propriedades do sistema
import java.util.*;
public class TestePropriedades {
public static void main(String args[]) {
Properties props = System.getProperties();
Enumeration prop_names = props.propertyNames();
while ( prop_names.hasMoreElements() ) {
String prop_name = (String) prop_names.nextElement();
String property = props.getProperty(prop_name);
System.out.println("property ’" + prop_name + "’ is ’" +
property + "’");
}
}
}
Desenvolvimento de Aplicações em Java
Trabalho com Arquivos de Propriedades
Permite criar e manipular arquivos de configuração ou de
outra necessidade para as aplicações:
#nomes.properties
#tipo=papel
usuario=user
administrador=admin
convidado=guest
#aplicacao.ini
#arquivo de configuração
diretorioTemp=c:/temp
diretorioApp=d:/appl
Arquivos de texto simples, onde do
lado esquerdo do igual temos a
propriedade e do lado direito seu
valor.
Desenvolvimento de Aplicações em Java
Trabalho com Arquivos de Propriedades
Lendo um arquivo de propriedades
// class CarregaPropriedades.java
import java.io.*;
import java.util.*;
public class CarregaPropriedades {
private Properties props;
public CarregaPropriedades(String nomeArquivo) {
try {
FileInputStream fis = new FileInputStream(
nomeArquivo );
props = new Properties();
props.load( fis );
} catch (Exception e) {
e.printStackTrace();
}
}
public String getProperty(String nome) {
return (String) props.get( nome );
}
}
Desenvolvimento de Aplicações em Java
Trabalho com Arquivos de Propriedades
Obtendo as propriedades lidas:
// class TesteCarregaPropriedades.java
public class TesteCarregaPropriedades {
public static void main(String args[]) {
CarregaPropriedades carregador = null;
if ( args.length == 1 ) {
carregador = new CarregaPropriedades ( args[0] );
System.out.println("usuario="+
carregador.getProperty("usuario") );
System.out.println("convidado="+
carregador.getProperty("convidado") );
System.out.println("administrador="+
carregador.getProperty("administrador") );
} else {
System.out.println("Uso: java
TesteCarregaPropriedades arquivo.properties ");
}
}
}
Desenvolvimento de Aplicações em Java
Serialização de Objetos
Mecanismo exclusivo da tecnologia Java
e usado para:
• Armazenar objetos em disco (manter o estado);
• Transmitir dados de objetos pela rede (comunicação);
• Permitir armazenar o estado das GUIs (J2SE e J2ME);
• Permitir a redundância em aplicações J2EE;
• Permitir armazenar dados em JavaCards™ (J2ME);
• Etc.
Desenvolvimento de Aplicações em Java
Serialização de Objetos
Quando armazenamos um objeto (serializamos),
estamos gravando num Stream o estado como ele
se encontra (gravar atributos da memória no
recurso)
Quando lemos um objeto (deserializamos), estamos
lendo de um Stream o objeto no estado como ele se
encontrava (ler atributos do recurso para a memória)
Desenvolvimento de Aplicações em Java
Serialização de Objetos
Para serializar um objeto, sua classe deve
implementar a interface java.io.Serializable
// Pessoa.java
public class Pessoa implements java.io.Serializable {
private String nome;
private java.util.Date nascimento;
public java.util.Date getNascimento() {
return nascimento;
}
public String getNome() {
return nome;
}
public void setNascimento(java.util.Date
nascimento) {
this.nascimento = nascimento;
}
public void setNome(String nome) {
this.nome = nome;
}
}
Desenvolvimento de Aplicações em Java
Exemplos de Serialização de Objetos
// SerializadorPessoa.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializadorPessoa {
public void gravaPessoa(String nomeArquivo, Pessoa pessoa)
throws IOException {
if ( pessoa != null && nomeArquivo != null ) {
FileOutputStream fos = new FileOutputStream( nomeArquivo );
ObjectOutputStream oos = new ObjectOutputStream ( fos );
oos.writeObject( pessoa );
oos.close();
}
}
public Pessoa recuperaPessoa(String nomeArquivo)
throws IOException, ClassNotFoundException {
Pessoa pessoa = null;
if ( nomeArquivo != null ){
FileInputStream fis = new FileInputStream( nomeArquivo );
ObjectInputStream ois = new ObjectInputStream( fis );
pessoa = (Pessoa) ois.readObject();
ois.close();
}
return pessoa;
}
}
Desenvolvimento de Aplicações em Java
Exemplos de Serialização de Objetos
// classe TesteSerializadorPessoa.java
public class TesteSerializadorPessoa {
public static void main(String args[]) {
Pessoa pessoa = new Pessoa();
pessoa.setNome("Oziel Moreira Neto");
pessoa.setNascimento( new java.util.Date(75,9,23) );
try {
SerializadorPessoa serializador = new SerializadorPessoa();
serializador.gravaPessoa("oziel.obj", pessoa);
pessoa = null;
pessoa = serializador.recuperaPessoa("oziel.obj");
System.out.println( pessoa.getNome() );
System.out.println( pessoa.getNascimento() );
} catch (Exception e) {
e.printStackTrace();
}
}
}
Desenvolvimento de Aplicações em Java
Serialização de Objetos
Quando serializamos um objeto, estamos
armazenando seus atributos de uma forma que o
Java entende!
Desenvolvimento de Aplicações em Java
Coleções de Objetos – Java Collections™
Trabalhar mais facilmente com multiplicidade de
objetos sem os problemas dos arrays de
dimensionamento, pesquisa, etc.
Usamos uma Collection para:
• suportar relacionamentos múltiplos entre objetos;
• substituir o uso e manipulação de arrays;
• trabalhar com estruturas de dados em memória para
ordenação;
Desenvolvimento de Aplicações em Java
As Java Collections ™ fornecem uma interface de métodos
simples que manipulam qualquer objeto Java, pois seus
métodos manipulam referâncias da java.lang.Object.
As classes concretas da API de collection são divididas de
acordo com sua categoria de superclasse, e quando uma
subclasse implementa uma das interfaces abaixo temos:
• java.util.List – lista de objetos não ordenados, que permite
duplicados;
• java.util.Set – conjunto de objetos não ordenados, que não
permite duplicados;
•java.util.Map – estrutura em memória que armazena os objetos
de acordo com uma chave;
Coleções de Objetos – Java Collections™
Desenvolvimento de Aplicações em Java
Coleções de Objetos – Java Collections™
Como este framework é muito extenso, vamos estudar as três
principais estruturas de manipulação de coleções de objetos:
• java.util.ArrayList;
• java.util.HashMap
• java.util.HashSet.
Para o perfeito funcionamento das Collections, é
imprescindível que o os nossos objetos reescrevam os
seguintes métodos da java.lang.Object:
• public boolean equals(Object obj);
• public int hashCode();
Desenvolvimento de Aplicações em Java
Coleções de Objetos – Java Collections™
Alterando a classe Pessoa
public class Pessoa implements java.io.Serializable {
private String nome;
private java.util.Date nascimento;
...
public boolean equals(Object obj) {
boolean flag = false;
if ( obj instanceof Pessoa ) {
Pessoa that = (Pessoa) obj;
flag = that.nome.equals( this.nome ) &&
that.nascimento.equals( this.nascimento );
}
return flag;
}
public int hashCode() {
return ( nome != null && nascimento != null) ?
nome.hashCode() ^ nascimento.hahsCode() : 0;
}
}
Desenvolvimento de Aplicações em Java
Coleções de Objetos – Java Collections™
Testando as Collections com o objeto Pessoa:
• Explicar o ListaPessoas e executar o TesteListaPessoas;
• Explicar o MapaPessoas e executar o TesteMapaPessoas;
• Explicar o ConjuntoPessoas e executar o TesteConjuntoPessoas;
O que foi percebido?
Desenvolvimento de Aplicações em Java
Wrapper Classes
Finalidade de converter:
• os tipos primitivos em tipos de referência;
• Strings (cadeias de números) em tipos primitivos;
Desenvolvimento de Aplicações em Java
Wrapper Classes
Exemplos:
// convertendo um primitivo para String
int numero = 10;
Integer wrapperNumero = new Integer( numero );
String strNumero = wrapperNumero.toString();
// convertendo uma String para primitivo
String strNumero = “10”;
Integer wrapperNumero = new Integer( strNumero );
int numero = wrapperNumero.intValue();
Discussão
• Vimos nesse capítulo uma série de conceitos que são usados em
aplicações de fato, ou seja, arquivos de configurações
(properties), coleções de objetos, manipulação de arquivos texto
e de arquivos de dados (Randômico).
• Necessariamente todas as aplicações usam esses recursos?
• Quais dos recursos nesse capítulo são mais fáceis de se
implementar?
• Podemos usar a serialização de objetos para armazenar nossos
objetos temporariamente e indefinidamente?
Desenvolvimento de Aplicações em Java
Exercícios
Desenvolvimento de Aplicações em Java
Construindo GUIs (Interfaces
Gráficas com o Usuário)
Agenda
• Exemplos de GUIs
• Introdução as JFCs
• Entendendo a Hierarquia de Classes
• Modelo de Desenvolvimento de GUIs
• Modelo de Desenvolvimento usando SWING
• Gerenciadores de Layout e Posicionamento
• Manipulando Aspectos Visuais
• Tipos de Componentes Visuais
• Criando Menus para o Usuário
• Trabalhando com Caixas , Botões e Campos
• Trabalhando com Listas, Combos e Tabelas
• Discussão
• Exercícios
Construindo GUIs
Exemplos de GUIs
Construindo GUIs
Java Foundation Classes
• Desenvolvimento de aplicações Stand-Alone ou Applets
• Riqueza visual e iteratividade
• Desenhos 2D
• Acessibilidade
• Drag and Drop
Introdução as JFC
Construindo GUIs
Java Foundation Classes
• AWT – java.awt, java.awt.event
• Accessibility – javax.accessibility
• Java 2D – java.awt, java.awt.geom, java.awt.image
• DnD – java.awt.dnd
• SWING – javax.swing, javax.swing.event
Introdução as JFC
Construindo GUIs
Estes são os pacotes principais, dentro de cada um deles
existem classes específicas para determinadas
necessidades.
Entendendo a Hierarquia de Classes
Construindo GUIs
A classe principal do SWING é
a JComponent, e a partir
dela temos as abstrações
para construirmos uma GUI.
Top-Level Containers
(Components) são aqueles
que devem conter os outros
tipos de componentes para
uma GUI pode ser exibida.
“Containers” e “Components”
• Vendo a hierarquia de classes, um Container (Top-
Level Component) pode conter Components, e usamos
um Container para exibir todos os outros Components.
• Components são todos aqueles que usamos para
desenhar a GUI
• Top-Level Components, usamos para exibir uma GUI
(JFrame, JApplet, JWindow, JDialog)
Modelo de Desenvolvimento de GUIs
Construindo GUIs
Especialização
• Geralmente para criamos nossa “Tela-Principal” de uma
aplicação, criamos uma nova classe especializando a
classe javax.swing.JFrame.
Modelo de Desenvolvimento usando SWING
Construindo GUIs
import javax.swing.*;
public class MyFrame extends JFrame {
...
}
Especialização
• Geralmente para criamos formulários completos que
pode ser reutilizados, especializados a classe
javax.swing.JPanel.
Modelo de Desenvolvimento usando SWING
Construindo GUIs
import javax.swing.*;
public class MyPanel extends JPanel {
...
}
Composição
• Para criamos formulários (telas) das nossas aplicações
que podem ser reutilizadas em qualquer aplicação
SWING faremos composição de outros componentes.
Modelo de Desenvolvimento usando SWING
Construindo GUIs
import javax.swing.*;
private JTextField txtNome, txtEndereco;
public class MyPanel extends JPanel {
...
}
Funcionar em qualquer plataforma e modo de
exibição:
• Facilita a codificação
• Comportamento garantido (Windows, MAC, Linux, Unix)
• 100% Java
• Não são necessários cálculos de tamanho e posição
quando redimensionamos os componentes
Gerenciadores de Layout e Posicionamento
Construindo GUIs
Assim necessitamos de um Gerenciador de Layout, veja a
interface: java.awt.LayoutManager
Podemos aplicar um Layout Manager num:
• Top-Level Component (JFrame, JWindow, JDialog,
JApplet)
• Container (JPanel, etc)
• Usamos o metodó setLayout( layoutManger )
Gerenciadores de Layout e Posicionamento
Construindo GUIs
Dessa forma, não é necessário tratar posição e tamanho
dos componentes no nosso código, devemos apenas
respeitar as regrar do Gerenciador de Layout
Tipos de Gerenciadores (Layout Managers)
• FlowLayout
• BorderLayout
• GridLayout
• GridBagLayout
• Layout Compostos
Gerenciadores de Layout e Posicionamento
Construindo GUIs
FlowLayout
• Alinhamento padrão ao centro e acima, tentando
arranjar os componentes numa única linha
• Mantém o preferedSize dos componentes (tamanho
inicial dos componentes)
• O container pode receber mais de um componente
numa área
• Usado quase sempre!
Gerenciadores de Layout e Posicionamento
Construindo GUIs
FlowLayout
Gerenciadores de Layout e Posicionamento
Construindo GUIs
import java.awt.FlowLayout;
import javax.swing.*;
public class FlowExample extends JFrame {
public FlowExample() {
super("FlowExample");
...
getContentPane().setLayout( new FlowLayout() );
}
public void init() {
..
setVisible( true );
}
public static void main(String args[]) {
new FlowExample().init();
}
}
GridLayout
• Divide um Container em partes iguais, no formato de
um GRID (Tabela)
• NÃO mantém o preferedSize dos componentes
(tamanho inicial dos componentes)
• O container só recebe um componente por área e
componente tende a ocupar toda a área
Gerenciadores de Layout e Posicionamento
Construindo GUIs
GridLayout
Gerenciadores de Layout e Posicionamento
Construindo GUIs
import java.awt.*;
import javax.swing.*;
public class GridExample extends JFrame {
public FlowExample() {
super(“GridExample");
...
getContentPane().setLayout( new GridLayout(2,2) );
}
public void init() {
..
setVisible( true );
}
public static void main(String args[]) {
new GridExample().init();
}
}
BorderLayout
• Divide um Container em cinco áreas (North, South,
East, West e Center)
• NÃO mantém o preferedSize dos componentes
(tamanho inicial dos componentes)
• O container só recebe um componente por área e
componente tende a ocupar toda a área
Gerenciadores de Layout e Posicionamento
Construindo GUIs
BorderLayout
Gerenciadores de Layout e Posicionamento
Construindo GUIs
import java.awt.*;
import javax.swing.*;
public class BorderExample extends JFrame {
public BorderExample() {
super(“BorderExample");
...
getContentPane().setLayout( new BorderLayout() );
}
public void init() {
..
setVisible( true );
}
public static void main(String args[]) {
new BorderLayout().init();
}
}
GridBagLayout
• Divide um Container em um GRID (Tabela)
extremamente flexível e customizável.
• NÃO mantém o preferedSize dos componentes
(tamanho inicial dos componentes)
• O container só recebe um componente por área e
componente tende a ocupar toda a área
• Necessário definir um objeto GridBagConstraints para
cada Component
Gerenciadores de Layout e Posicionamento
Construindo GUIs
GridBagLayout
Gerenciadores de Layout e Posicionamento
Construindo GUIs
import java.awt.*;
import javax.swing.*;
public class GridBagExample extends JFrame {
public FlowExample() {
super(“GridExample");
...
getContentPane().setLayout( new GridBagLayout() );
}
public void init() {
..
setVisible( true );
}
public static void main(String args[]) {
new GridBagExample().init();
}
}
Layouts Compostos
• Criamos vários conteiners e cada um deles com um
layout manager diferente.
• Dividimos uma GUI em pedaços e trabalhos com
Composição de elementos
Gerenciadores de Layout e Posicionamento
Construindo GUIs
Layouts Compostos
Gerenciadores de Layout e Posicionamento
Construindo GUIs
JFrame do tipo BorderLayout,
JPanel com Botões na parte
NORTH,
JPanel com Mensagem na parte
SOUTH,
JTextArea na parte CENTER
Podemos mudar Cursores, Fontes, Cores, Bordas e
Dicas
• Cursor – setCursor ( java.awt.Cursor );
• Fonte – setFont( java.awt.Font );
• Cor de Frente – setForeground( java.awt.Color );
• Cor de Fundo – setBackground ( java.awt.Color );
• Dica – setToolTipText( java.lang.String );
• Borda – setBorder( javax.swing.border.Border );
• Exibição – setEnabled ( boolean );
Manipulando Aspectos Visuais
Construindo GUIs
Um tipo de componente para cada necessidade
• Janela – JFrame, JWindow, JDialog
• Botão – JButton, JToogleButton, JRadioButton,
JCheckBox
• Texto – JTextField, JTextArea, JFormattedField,
JPasswordField
• Combo – JComboBox, DefaultComboModel
• Listas – JList, DefaultListModel
• Tabela – JTable, DefaultTableModel
• Menu – JMenu, JMenuItem, JMenuBar
• Diálogo – JOptionPane
Tipos de Componentes Visuais
Construindo GUIs
Para facilitar a navegação entre telas de uma GUI
• Criamos os itens de menu usando JMenuItem
• Criamos os menus usando JMenu
• Montamos o menu usando JMenuBar
• Num JFrame usamos o método
setJMenuBar( umMenuaBar )
Criando Menus para o Usuário
Construindo GUIs
Criando Menus para o Usuário
Construindo GUIs
// construindo objetos
abrir = new JMenuItem("Abrir");
novo = new JMenuItem("Novo");
salvar = new JMenuItem("Salvar");
sair = new JMenuItem("Sair");
copiar = new JMenuItem("Copiar");
colar = new JMenuItem("Colar");
recortar = new JMenuItem("Recortar");
ajuda = new JMenuItem("Ajuda");
info = new JMenuItem("Info");
arquivo = new JMenu("Arquivo");
editar = new JMenu("Editar");
sobre = new JMenu("Sobre");
// construindo menu arquivo
arquivo.add ( abrir );
arquivo.add ( novo );
arquivo.add ( salvar );
arquivo.addSeparator();
arquivo.add ( sair );
// construindo menu editar
editar.add ( copiar );
editar.add ( colar );
editar.add ( recortar );
// construindo menu sobre
sobre.add ( ajuda );
sobre.add ( info );
// construindo menu
menuBar = new JMenuBar();
menuBar.add( arquivo );
menuBar.add( editar );
menuBar.add( sobre );
setJMenuBar( menuBar );
Caixa de Diálogo - JOptionPane
• Usado para exibir informações ou opções para o
usuário.
Trabalhando com Caixas, Botões e Campos
Construindo GUIs
Botões
• JButton – botão simples para uma ação.
• JRadioButton e ButtonGroup – usamos para opções
únicas e exclusivas como escolher sexo, estado civil,
etc.
• JCheckBox – opções múltiplas e não exclusivas como
marcar bens, carro, moto, casa, etc.
• JToggleButton – usamos quando um valor está ativo ou
desativo.
Trabalhando com Caixas, Botões e Campos
Construindo GUIs
Botões
Trabalhando com Caixas, Botões e Campos
Construindo GUIs
...
sim = new JButton("Sim");
nao = new JButton("Nao");
carro = new JCheckBox("Carro");
moto = new JCheckBox("Moto");
casa = new JCheckBox("Casa");
masculino = new JRadioButton("Masc");
feminino = new JRadioButton("Fem");
luz = new JToggleButton("Acesso");
...
Trabalhando com Caixas, Botões e Campos
Construindo GUIs
• Campos – usados para entrada de dados
• JTextField – caixa de texto livre, com uma única linha e
sem formatação
• JTextArea – caixa de texto livre, com múltiplas linhas e
sem formatação
• JPassowordField – específico para entrada de senhas
ou dados sensíveis.
• JFormattedTextField – caixa de texto com máscara de
entrada.
Trabalhando com Caixas, Botões e Campos
Construindo GUIs
• Campos
lblNome = new JLabel("Nome");
lblEmail = new JLabel("Email");
lblNascimento = new JLabel("Nascimento");
lblFone = new JLabel("Fone");
lblEndereco = new JLabel("Endereco");
txtNome = new JTextField(40);
txtEmail = new JTextField(35);
txtFone = new JTextField(15);
txtEndereco = new JTextArea("", 3, 35);
// cria-se o elemento de entrada formatada usando um formato pre-definido
// atraves da java.text.SimpleDateFormat
dateFormater = new SimpleDateFormat("dd/MM/yyyy");
txtNascimento = new JFormattedTextField( dateFormater );
txtNascimento.setColumns( 20 );
Estes componentes do SWING, para facilitar a
sua construção e serem mais flexíveis,
seguem o modelo MVC (Model-View-
Controller)
Trabalhando com Listas, Combos e Tabelas
Construindo GUIs
Modelo MVC
Trabalhando com Listas, Combos e Tabelas
Construindo GUIs
A responsabilidade das classes que se
comportam como Model, é representar um
modelo de dados e garantir o estado desse
modelo.
A responsabilidade das classes que se
comportam como View é prover uma forma de
visualização para aquele modelo naquele
estado.
E o Controller atua como controlador destas
escolhas e visualizações.
Listas - JList
Trabalhando com Listas, Combos e Tabelas
Construindo GUIs
quando formos manipular objetos dentro de uma lista na tela usaremos:
• javax.swing.JList – controlador;
• javax.swing.DefaultListModel – modelo;
• javax.swing.DefaultListCellRenderer - visualização;
Listas - JComboBox
Trabalhando com Listas, Combos e Tabelas
Construindo GUIs
quando formos manipular objetos dentro de uma combo na tela usaremos:
• javax.swing.JComboBox – controlador;
• javax.swing.DefaultComboBoxModel – modelo;
• javax.swing.plaf.basic.BasicComboBoxRenderer - visualização;
• javax.swing.plaf.basic.BasicComboBoxEditor - editor;
Tabelas - JTable
Trabalhando com Listas, Combos e Tabelas
Construindo GUIs
quando formos manipular objetos dentro de uma tabela na tela usaremos:
• javax.swing.JComboBox – controlador;
• javax.swing.table.DefaultTableModel – modelo;
• javax.swing.table.DefaultTableCellRender - visualização;
• javax.swing.DefautCellEditor- editor;
Discussão
• Qual o melhor processo para se desenhar uma GUI?
• No capítulo atual, as GUIs estão restritas á aplicações stand-
alone, como fica uma GUI na WEB?
• Quando estamos desenhando GUIs não seria melhor pensar em
componentes generéricos?
Construindo GUIs
Exercícios
Construindo GUIs
Tratamento de Eventos para
GUIs
Agenda
• Modelo de Delegação para Tratamento de
Eventos
• Implementando o Tratamento de Eventos
• Tratando Eventos Comuns
• Tratando Eventos de Janelas
• Tratando Eventos de Botões e Menus
• Tratando Eventos de Textos
• Tratando Eventos de Combos
• Tratando Eventos de Listas
• Tratando Eventos de Tabelas
• Discussão
• Exercícios
Tratamento de Eventos para GUIs
Modelo de Delegação para Tratamento de Eventos
Tratamento de Eventos para GUIs
O que é um evento?
• Objeto que representa a ação do usuário na GUI
• Superclasse dos eventos java.util.EventObject
• Categorizada por tipo (Action, Component, Item, Text e
outros)
• Classes e interfaces do pacote java.awt.event e
javax.swing.event;
Modelo de Delegação para Tratamento de Eventos
Tratamento de Eventos para GUIs
Delegando o Tratando de um evento
• Criamos uma classe que trata um ou mais tipos de
eventos dependendo do tipo de evento escolhido.
• Extendemos uma classe java.awt.event.XXXAdapter;
• Implementamos uma interface java.awt.event. XXXListener;
• Usando um método específico do componente,
registramos o tratador do evento ( addXXXListener() )
• Quando o evento for gerado, o objeto XXXEvent será
delegado para o objeto tratador registrado pelo listener.
Tratamento de Eventos para GUIs
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CanvasPanel extends JFrame {
private Canvas areaDesenho;
...
public void init() {
// registra para o canvas, o listener capaz de tratar
// os eventod de movimento do mouse
areaDesenho.addMouseMotionListener ( new MouseMotionHandler() );
...
}
// por facilidade usamos uma classe interna para definir o tratamento de eventos
// Esta classe trata eventos de movimentação do mouse
class MouseMotionHandler extends MouseMotionAdapter {
// escolhido tratar o evento de movimento arrastar do mouse
public void mouseDragged(MouseEvent me) {
// recupera o objeto Graphics e desenha no Canvas
// de acordo com a posicao do mouse
areaDesenho.getGraphics().drawString("*", me.getX(), me.getY() );
}
}
}
Exemplo de implementação usando Adapter
Tratamento de Eventos para GUIs
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CanvasPanel2 extends JFrame {
private Canvas areaDesenho;
public void init() {
...
// registra para o canvas, o listener capaz de tratar
// os eventod de movimento do mouse
areaDesenho.addMouseMotionListener ( new MouseMotionHandler2() );
...
}
// por facilidade usamos uma classe interna para definir o tratamento de eventos
// Esta classe trata eventos de movimentação do mouse
class MouseMotionHandler2 implements MouseMotionListener {
public void mouseMoved(MouseEvent me) {
// sem implementacao
}
// escolhido tratar o evento de movimento arrastar do mouse
public void mouseDragged(MouseEvent me) {
// recupera o objeto Graphics e desenha no Canvas
// de acordo com a posicao do mouse
areaDesenho.getGraphics().drawString("*", me.getX(), me.getY() );
}
}
...
}
Exemplo de implementação usando Listener
Tratando Eventos Comuns
Tratamento de Eventos para GUIs
Tipos de Eventos
• Cada tipo de componente tem um conjunto de eventos
associados, para isso devemos pesquisar no componente
quais listeners podem ser registrados ( ver métodos
JComponent.addXXXListener() )
• O tipos de eventos mais comuns são:
Tratando Eventos de Janelas
Tratamento de Eventos para GUIs
Tipos de Eventos
• Podemos associar eventos de Janelas a JFrame, JWindow
e JDialog
( ver método JWindow.addWindowListener() )
• O tipos de eventos são:
Tratando Eventos de Botões e Menus
Tratamento de Eventos para GUIs
Tipos de Eventos
• Podemos associar eventos de Botões a todas as classes
filhas da javax.swing.AbstractButton
(ver método AbstractButton.addActionListener() )
• O tipos de eventos são:
Tratando Eventos de Botões e Menus
Tratamento de Eventos para GUIs
Teclas de Atalhos para Menus
• Usamos o método JMenuItem.setAccelerator(
javax.swing.KeyStroke );
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK, false);
menuItem.setAccelerator( key );
Tratando Eventos de Textos
Tratamento de Eventos para GUIs
Tipos de Eventos
• Podemos associar eventos de texto para facilitar a
manipulação da entrada de dados
(ver método JTextComponent.addActionListener() )
• O tipos de eventos são:
Tratando Eventos de Listas
Tratamento de Eventos para GUIs
Tipos de Eventos
• Podemos associar eventos de uma Lista para facilitar a
escolha de itens de uma lista
(ver método JList.addListSelectionListener() ou
addItemListener() )
• O tipos de eventos são:
Tratando Eventos de Combos
Tratamento de Eventos para GUIs
Tipos de Eventos
• Podemos associar eventos de um Combo para facilitar a
escolha de itens
(ver método JComboBox.addActionListener() e
addItemListener() )
• O tipos de eventos são:
Tratando Eventos de Tabelas
Tratamento de Eventos para GUIs
Tipos de Eventos
• Podemos associar eventos de um Tabela para facilitar a
escolha de itens bem como alterar dados do modelo.
(ver método JList.addMouseListener(),
addListSelectionListener(),
DefaultTableModel.addTableModelListener() )
O tipos de eventos são:
Discussão
• Numa aplicação devemos separar claramente as
responsabilidades, em classes de dados (representam o modelo
de negócio), classes de serviços (aquelas que acessam recursos,
como arquivos, bancos, etc) das classes de GUI?
• Porque devemos fazer essa separação?
• Significa então que é nas classes de Eventos definidas dentro
das GUIs que faremos as chamadas as classes de negócio e
classes de serviço?
Tratamento de Eventos para GUIs
Exercícios
Tratamento de Eventos para GUIs
Programação Para Redes
(Network Programming)
Agenda
• Introdução
• Trabalhando com Sockets Streams
• Codificando um Servidor e um Client
• Discussão
• Exercícios
Programação para Redes
Introdução
java.net API
• Fornece os componentes para a comunicação em Rede;
• Suporte a IPV4 e IPV6
• Suporte a TCP (Comunicação Síncrona) e UDP
(Comunicação Assíncrona)
• Permite a criação de aplicações Client (Se conecta a
alguém) e Server (Recebe conexões de alguém)
• Pacote java.net
Programação para Redes
Trabalhando com Socket Streams para TCP
Modelo
Programação para Redes
Trabalhando com Socket Streams para TCP
Modelo
Programação para Redes
Um Server publica uma PORTA
num endereço IP usando o
ServerSocket
Um Client se conecta ao IP do
Server na PORTA publicada
usando um Socket
Nesse momento usa-se objetos
de InputStream ou
OutputStream para a troca
de mensagens
Codificando um Servidor e um Client
Programação para Redes
import java.net.*;
import java.io.*;
public class SimpleServer {
public static void main(String args[]) {
ServerSocket s= null;
try {
s = new ServerSocket(5432);
} catch (IOException e) {
e.printStackTrace();
}
for (;;) {
try {
Socket s1 = s.accept();
OutputStream s1out = s1.getOutputStream();
DataOutputStream dos = new DataOutputStream(s1out);
// Envia a mensagem
dos.writeUTF("Hello Net World!");
dos.close();
s1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Codificando um Servidor e um Client
Programação para Redes
import java.net.*;
import java.io.*;
public class SimpleClient {
public static void main(String args[]) {
try {
// Endereço IP é Localhost
Socket s1 = new Socket("127.0.0.1", 5432);
InputStream is = s1.getInputStream();
DataInputStream dis = new DataInputStream(is);
// le a mensagem enviada pelo servidor
System.out.println(dis.readUTF());
dis.close();
s1.close();
} catch (ConnectException connExc) {
System.err.println("Could not connect to the server.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Discussão
• Que tipos de sistemas, aplicações e programas podemos
desenvolver usando a comunicação em rede?
• Que tipos de dados podem ser passados pela rede? Depende do
Stream usado?
• Em aplicações que rodarão em redes heterogêneas, como fica a
comunicação e o dados?
Programação para Redes
Exercícios
Programação para Redes
Programação MultiTarefa
(MultiThread Programming)
Agenda
• Introdução
• Java Thread API: Classes e Interfaces
• Construindo Threads
• Manipulando Threads
• Máquina de Estados
• Controlando Concorrência
• Controlando a Execução
• Construindo e Executando Timers
• Discussão
• Exercícios
Programação MultiTarefa
Introdução
O que é MultiTarefa?
• Capacidade de executar mais de uma operação ao
mesmo tempo (paralelismo)
• Em Java, o paralelismo é implementado usando-se
Threads.
• Usamos Threads, quando desejamos implementar
processos paralelos, concorrentes ou automatizados.
Programação MultiTarefa
Introdução
O que são Threads?
• São objetos que possuem:
• Uma área de dados;
• Um trecho de código que será executado;
• E utilizam um tempo de CPU (Representada pelo objeto
java.lang.Thread);
• Prioridade de execução;
Programação MultiTarefa
Java Thread API: Classe e Interfaces
Programação MultiTarefa
Java Thread API: Classe e Interfaces
Programação MultiTarefa
As classes Thread, ThreadGroup e a interface Runnable são
usadas quando queremos construir aplicações que manipulem
múltiplas execuções em paralelo, e que geralmente tem tempo
de execução definido e finito.
As classes Timer e TimerTask são usadas quando queremos
construir aplicações que manipulem processos e execuções
que geralmente tem tempo de execução cíclico e finito.
Construindo Threads – especializando a java.lang.Thread
Programação MultiTarefa
Construindo Threads – especializando a java.lang.Thread
Programação MultiTarefa
public class ThreadTest {
public static void main(String a[]) {
MyThread mt = new MyThread();
mt.start();
}
}
public class MyThread extends Thread {
// atributos de instancia
// que será usado nesta Thread
public void run() {
// código que será executado
// em paralelo com outras
// Threads
}
}
Construindo Threads – implementado a java.lang.Runnable
Programação MultiTarefa
Construindo Threads – implementado a java.lang.Runnable
Programação MultiTarefa
public class MyRunnable extends Runnable {
// atributos de instancia
// que será usado nesta Thread
public void run() {
// código que será executado
// em paralelo com outras
// Threads
}
}
public class RunnableTest {
public static void main(String a[]) {
MyRunnable mr = new MyRunnable ();
Thread cpu = new Thread( mr );
cpu.start();
}
}
Manipulando Threads
Programação MultiTarefa
Principais métodos da java.lang.Thread
Manipulando Threads - Prioridades
Programação MultiTarefa
Trabalhando com Prioridades
Máquina de Estados
Programação MultiTarefa
Controlando a Concorrência
Sincronizando
• Quando temos algum atributo de instância de um objeto
que é compartilhado por mais de uma Thread, devemos
controlar a concorrência do acesso a ele.
• Podemos usar o modificador synchronized nos
métodos que manipulam o atributo.
• Podemos usar um bloco synchronized durante a
manipulação do atributo.
Programação MultiTarefa
Controlando a Concorrência
Programação MultiTarefa
public class SyncStack {
private Stack stack;
public SyncStack() {
stack = new Stack();
}
// método sincronizado
public synchronized void put(Object obj) {
stack.add( obj );
}
public Object get(int index) {
Object obj = null;
// bloco sincronizado
synchronized ( stack ) {
obj = stack.get( index );
}
return obj;
}
// método sincronizado
public synchronized void clear() {
stack.removeAllElements();
}
}
Controlando a Execução
Podemos mudar o estado de uma Thread usando:
• Thread.sleep() e outros métodos da classe Thread,
entretanto, quando queremos controlar o acesso a um
objeto, devemos usar técnica de “Object Locking and
Wait”, por ser mais eficiente.
Programação MultiTarefa
Construindo e executando Timers
Programação MultiTarefa
Timers
• Objetos que executam tarefas agendadas e cíclicas (em
ciclos)
• Classes: java.util.Timer e java.util.TimerTask
Construindo e executando Timers
Programação MultiTarefa
Criamos uma classe que
representa a Tarefa
estendendo a
java.utl.TimerTask
Criamos um Timer, e neste
timer, schedulamos
(agendamos) a execução a
Tarefa
Construindo e executando Timers
Programação MultiTarefa
public class MyTimerTask extends java.util.TimerTask {
public void run() {
System.out.println ( System.currentTimeMillis() );
}
}
public class TestMyTimerTask {
public static void main(String args[]) throws Exception {
MyTimerTask mtt = new MyTimerTask();
java.util.Timer timer = new java.util.Timer();
timer.schedule( mtt, 10, 1000 );
Object obj = new Object();
synchronized( obj ) {
obj.wait();
}
}
}
Discussão
• Qual a melhor maneira de se especificar um Thread? Estender a
classe java.lang.Thread ou implementar a interface
java.lang.Runnable?
• Nas GUIs usamos as Threads para preencher barras de progresso
de acordo com o andamento de um processo, nas aplicações
WEB faremos isso?
• Quando criamos um servidor que necessita atender mais de um
usuário ao mesmo tempo, usaremos os conceitos de Threads?
• Usando todos os elementos de Threads (Thread, Monitor, Task,
etc), podemos fazer aplicativos complexos e ricos no
gerenciamento de processos, que tipos de aplicações são essas?
Programação MultiTarefa
Exercícios
Programação MultiTarefa
www.oziel.com.br
oziel@oziel.com.br

Mais conteúdo relacionado

Mais procurados

Apostila de uml
Apostila de umlApostila de uml
Apostila de uml
audiclerio
 
clean code
clean codeclean code
clean code
Douglas Siviotti
 
Qualidade de Software - Introdução
Qualidade de Software - Introdução Qualidade de Software - Introdução
Qualidade de Software - Introdução
Elaine Cecília Gatto
 
Planejamento de Testes
Planejamento de TestesPlanejamento de Testes
Planejamento de Testes
elliando dias
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
Elias Nogueira
 
Algoritmos: Tipos de Dados
Algoritmos: Tipos de DadosAlgoritmos: Tipos de Dados
Algoritmos: Tipos de Dados
Elaine Cecília Gatto
 
API - Como fazer?
API - Como fazer?API - Como fazer?
API - Como fazer?
Felipe Caparelli
 
UML - Criando Diagramas Eficientes
UML - Criando Diagramas EficientesUML - Criando Diagramas Eficientes
UML - Criando Diagramas Eficientes
Rodrigo Cascarrolho
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a Objetos
Ludimila Monjardim Casagrande
 
Uml
UmlUml
Aula 1 - Introdução a Engenharia de Software
Aula 1 -  Introdução a Engenharia de SoftwareAula 1 -  Introdução a Engenharia de Software
Aula 1 - Introdução a Engenharia de Software
Leinylson Fontinele
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
Bruno Catão
 
Análise e Projeto de Sistemas
Análise e Projeto de SistemasAnálise e Projeto de Sistemas
Análise e Projeto de Sistemas
Guilherme
 
Desenhando Componentes de Software com UML
Desenhando Componentes de Software com UMLDesenhando Componentes de Software com UML
Desenhando Componentes de Software com UML
Rildo (@rildosan) Santos
 
POO - 20 - Wrapper Classes
POO - 20 - Wrapper ClassesPOO - 20 - Wrapper Classes
POO - 20 - Wrapper Classes
Ludimila Monjardim Casagrande
 
Qualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normasQualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normas
Alex Camargo
 
Aula 2. frameworks js
Aula 2. frameworks jsAula 2. frameworks js
Aula 2. frameworks js
andreluizlc
 
Qualidade de Software
Qualidade de SoftwareQualidade de Software
Qualidade de Software
Tiago Antônio da Silva
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
Natanael Fonseca
 
Algoritmo 06 - Array e Matrizes
Algoritmo 06 - Array e MatrizesAlgoritmo 06 - Array e Matrizes
Algoritmo 06 - Array e Matrizes
Professor Samuel Ribeiro
 

Mais procurados (20)

Apostila de uml
Apostila de umlApostila de uml
Apostila de uml
 
clean code
clean codeclean code
clean code
 
Qualidade de Software - Introdução
Qualidade de Software - Introdução Qualidade de Software - Introdução
Qualidade de Software - Introdução
 
Planejamento de Testes
Planejamento de TestesPlanejamento de Testes
Planejamento de Testes
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
Algoritmos: Tipos de Dados
Algoritmos: Tipos de DadosAlgoritmos: Tipos de Dados
Algoritmos: Tipos de Dados
 
API - Como fazer?
API - Como fazer?API - Como fazer?
API - Como fazer?
 
UML - Criando Diagramas Eficientes
UML - Criando Diagramas EficientesUML - Criando Diagramas Eficientes
UML - Criando Diagramas Eficientes
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a Objetos
 
Uml
UmlUml
Uml
 
Aula 1 - Introdução a Engenharia de Software
Aula 1 -  Introdução a Engenharia de SoftwareAula 1 -  Introdução a Engenharia de Software
Aula 1 - Introdução a Engenharia de Software
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Análise e Projeto de Sistemas
Análise e Projeto de SistemasAnálise e Projeto de Sistemas
Análise e Projeto de Sistemas
 
Desenhando Componentes de Software com UML
Desenhando Componentes de Software com UMLDesenhando Componentes de Software com UML
Desenhando Componentes de Software com UML
 
POO - 20 - Wrapper Classes
POO - 20 - Wrapper ClassesPOO - 20 - Wrapper Classes
POO - 20 - Wrapper Classes
 
Qualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normasQualidade de Software: Modelos e normas
Qualidade de Software: Modelos e normas
 
Aula 2. frameworks js
Aula 2. frameworks jsAula 2. frameworks js
Aula 2. frameworks js
 
Qualidade de Software
Qualidade de SoftwareQualidade de Software
Qualidade de Software
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
Algoritmo 06 - Array e Matrizes
Algoritmo 06 - Array e MatrizesAlgoritmo 06 - Array e Matrizes
Algoritmo 06 - Array e Matrizes
 

Destaque

Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
Joel Lobo
 
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃOCURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
Microsoft
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos Java
Marcio Marinho
 
Linguagem Java - Conceitos e Técnicas
Linguagem Java - Conceitos e TécnicasLinguagem Java - Conceitos e Técnicas
Linguagem Java - Conceitos e Técnicas
Breno Vitorino
 
Introdução ao JAVA (linguagem de programação WEB)
Introdução ao JAVA (linguagem de programação WEB)Introdução ao JAVA (linguagem de programação WEB)
Introdução ao JAVA (linguagem de programação WEB)
Luis Borges Gouveia
 
Algoritmo e lógica de programação - Aula 1
Algoritmo e lógica de programação - Aula 1Algoritmo e lógica de programação - Aula 1
Algoritmo e lógica de programação - Aula 1
engenhariadecomputacao
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
Jamildo Feitosa
 
Conhecendo A Linguagem de Programação Java
Conhecendo A Linguagem de Programação JavaConhecendo A Linguagem de Programação Java
Conhecendo A Linguagem de Programação Java
Micael Coutinho
 
ApresentaçãO De Java
ApresentaçãO De JavaApresentaçãO De Java
ApresentaçãO De Java
Eduardo Bregaida
 
Apresentação java
Apresentação javaApresentação java
Apresentação java
munosai
 
Java modulo 01 - Introdução
Java modulo 01 - IntroduçãoJava modulo 01 - Introdução
Java modulo 01 - Introdução
Professor Samuel Ribeiro
 
Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections
Eduardo Carvalho
 
Lógica de programação - Como estudar sem achar chato e ainda ter motivação
Lógica de programação - Como estudar sem achar chato e ainda ter motivaçãoLógica de programação - Como estudar sem achar chato e ainda ter motivação
Lógica de programação - Como estudar sem achar chato e ainda ter motivação
Felipe Fontoura
 
Curso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFXCurso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFX
Curso em Vídeo - Cursos Grátis com Certificado
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
rodfernandes
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
Mauro Pereira
 
Java 05
Java 05Java 05
Java 05
samuelthiago
 
Aula 01 o que é java
Aula 01  o que é javaAula 01  o que é java
Aula 01 o que é java
Sergio Luiz da Silveira
 
GSOIII (JAVA) CONEXÃO MYSQL
GSOIII (JAVA)  CONEXÃO MYSQLGSOIII (JAVA)  CONEXÃO MYSQL
GSOIII (JAVA) CONEXÃO MYSQL
ETEC Monsenhor Antonio Magliano
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos
Centro Paula Souza
 

Destaque (20)

Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃOCURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos Java
 
Linguagem Java - Conceitos e Técnicas
Linguagem Java - Conceitos e TécnicasLinguagem Java - Conceitos e Técnicas
Linguagem Java - Conceitos e Técnicas
 
Introdução ao JAVA (linguagem de programação WEB)
Introdução ao JAVA (linguagem de programação WEB)Introdução ao JAVA (linguagem de programação WEB)
Introdução ao JAVA (linguagem de programação WEB)
 
Algoritmo e lógica de programação - Aula 1
Algoritmo e lógica de programação - Aula 1Algoritmo e lógica de programação - Aula 1
Algoritmo e lógica de programação - Aula 1
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Conhecendo A Linguagem de Programação Java
Conhecendo A Linguagem de Programação JavaConhecendo A Linguagem de Programação Java
Conhecendo A Linguagem de Programação Java
 
ApresentaçãO De Java
ApresentaçãO De JavaApresentaçãO De Java
ApresentaçãO De Java
 
Apresentação java
Apresentação javaApresentação java
Apresentação java
 
Java modulo 01 - Introdução
Java modulo 01 - IntroduçãoJava modulo 01 - Introdução
Java modulo 01 - Introdução
 
Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections
 
Lógica de programação - Como estudar sem achar chato e ainda ter motivação
Lógica de programação - Como estudar sem achar chato e ainda ter motivaçãoLógica de programação - Como estudar sem achar chato e ainda ter motivação
Lógica de programação - Como estudar sem achar chato e ainda ter motivação
 
Curso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFXCurso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFX
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
 
Java 05
Java 05Java 05
Java 05
 
Aula 01 o que é java
Aula 01  o que é javaAula 01  o que é java
Aula 01 o que é java
 
GSOIII (JAVA) CONEXÃO MYSQL
GSOIII (JAVA)  CONEXÃO MYSQLGSOIII (JAVA)  CONEXÃO MYSQL
GSOIII (JAVA) CONEXÃO MYSQL
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos
 

Semelhante a Linguagem de Programação Java para Iniciantes

Linguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação JavaLinguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação Java
Escola Básica e Secundária da Povoação
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
Rafael Benevides
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
Frederico Maia Arantes
 
Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01
John Godoi
 
Manual
ManualManual
Manual
Jose Moniz
 
1.introducao java
1.introducao java1.introducao java
1.introducao java
Kievnny Mendonca
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da Dissertacao
Marcius Brandão
 
Minicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraMinicurso Ruby on Rails Dextra
Minicurso Ruby on Rails Dextra
Dextra
 
Aula2
Aula2Aula2
Aula2
fkimura
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
Wesley Lemos
 
S2 b desenvolvimento de sistemas [reparado]
S2 b   desenvolvimento de sistemas [reparado]S2 b   desenvolvimento de sistemas [reparado]
S2 b desenvolvimento de sistemas [reparado]
Milena Rebouças
 
Lpj i ads2_apresentacao_aulas
Lpj i ads2_apresentacao_aulasLpj i ads2_apresentacao_aulas
Lpj i ads2_apresentacao_aulas
Oziel Moreira Neto
 
001 cesep - turma java
001   cesep - turma java001   cesep - turma java
001 cesep - turma java
Junior Souza
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitor
Felipe Hummel
 
Palestra
PalestraPalestra
Java 9, 10 e ... 11
Java 9, 10 e ... 11Java 9, 10 e ... 11
Java 9, 10 e ... 11
Rodrigo Cândido da Silva
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
armeniocardoso
 
Programação "Estruturada" com Java
Programação "Estruturada" com JavaProgramação "Estruturada" com Java
Programação "Estruturada" com Java
Luiz Ricardo Silva
 
Aula1
Aula1Aula1
Aula1
fkimura
 
Java20141215 17[1]
Java20141215 17[1]Java20141215 17[1]
Java20141215 17[1]
Diogo Rafael da Silva
 

Semelhante a Linguagem de Programação Java para Iniciantes (20)

Linguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação JavaLinguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação Java
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01
 
Manual
ManualManual
Manual
 
1.introducao java
1.introducao java1.introducao java
1.introducao java
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da Dissertacao
 
Minicurso Ruby on Rails Dextra
Minicurso Ruby on Rails DextraMinicurso Ruby on Rails Dextra
Minicurso Ruby on Rails Dextra
 
Aula2
Aula2Aula2
Aula2
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
S2 b desenvolvimento de sistemas [reparado]
S2 b   desenvolvimento de sistemas [reparado]S2 b   desenvolvimento de sistemas [reparado]
S2 b desenvolvimento de sistemas [reparado]
 
Lpj i ads2_apresentacao_aulas
Lpj i ads2_apresentacao_aulasLpj i ads2_apresentacao_aulas
Lpj i ads2_apresentacao_aulas
 
001 cesep - turma java
001   cesep - turma java001   cesep - turma java
001 cesep - turma java
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitor
 
Palestra
PalestraPalestra
Palestra
 
Java 9, 10 e ... 11
Java 9, 10 e ... 11Java 9, 10 e ... 11
Java 9, 10 e ... 11
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
Programação "Estruturada" com Java
Programação "Estruturada" com JavaProgramação "Estruturada" com Java
Programação "Estruturada" com Java
 
Aula1
Aula1Aula1
Aula1
 
Java20141215 17[1]
Java20141215 17[1]Java20141215 17[1]
Java20141215 17[1]
 

Mais de Oziel Moreira Neto

Usabilidade de Interfaces - Parte 3
Usabilidade de Interfaces - Parte 3Usabilidade de Interfaces - Parte 3
Usabilidade de Interfaces - Parte 3
Oziel Moreira Neto
 
Usabilidade de Interfaces - Parte 2
Usabilidade de Interfaces - Parte 2Usabilidade de Interfaces - Parte 2
Usabilidade de Interfaces - Parte 2
Oziel Moreira Neto
 
Usabilidade de Interfaces - Parte 1
Usabilidade de Interfaces - Parte 1Usabilidade de Interfaces - Parte 1
Usabilidade de Interfaces - Parte 1
Oziel Moreira Neto
 
Introdução aos Métodos Ágeis - Parte II
Introdução aos Métodos Ágeis - Parte IIIntrodução aos Métodos Ágeis - Parte II
Introdução aos Métodos Ágeis - Parte II
Oziel Moreira Neto
 
Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)
Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)
Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)
Oziel Moreira Neto
 
Gestão Empresarial Integrada
Gestão Empresarial IntegradaGestão Empresarial Integrada
Gestão Empresarial Integrada
Oziel Moreira Neto
 
Boa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java EnterpriseBoa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java Enterprise
Oziel Moreira Neto
 
A Evolução da Arquitetura de Sistemas Corporativos
A Evolução da Arquitetura de Sistemas CorporativosA Evolução da Arquitetura de Sistemas Corporativos
A Evolução da Arquitetura de Sistemas Corporativos
Oziel Moreira Neto
 
The Evolution Of Enterprise Application Architecture
The Evolution Of Enterprise Application ArchitectureThe Evolution Of Enterprise Application Architecture
The Evolution Of Enterprise Application Architecture
Oziel Moreira Neto
 

Mais de Oziel Moreira Neto (9)

Usabilidade de Interfaces - Parte 3
Usabilidade de Interfaces - Parte 3Usabilidade de Interfaces - Parte 3
Usabilidade de Interfaces - Parte 3
 
Usabilidade de Interfaces - Parte 2
Usabilidade de Interfaces - Parte 2Usabilidade de Interfaces - Parte 2
Usabilidade de Interfaces - Parte 2
 
Usabilidade de Interfaces - Parte 1
Usabilidade de Interfaces - Parte 1Usabilidade de Interfaces - Parte 1
Usabilidade de Interfaces - Parte 1
 
Introdução aos Métodos Ágeis - Parte II
Introdução aos Métodos Ágeis - Parte IIIntrodução aos Métodos Ágeis - Parte II
Introdução aos Métodos Ágeis - Parte II
 
Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)
Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)
Trabalhando com Centro de Custo e Receita no FIT Business Suite (ADempiere)
 
Gestão Empresarial Integrada
Gestão Empresarial IntegradaGestão Empresarial Integrada
Gestão Empresarial Integrada
 
Boa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java EnterpriseBoa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java Enterprise
 
A Evolução da Arquitetura de Sistemas Corporativos
A Evolução da Arquitetura de Sistemas CorporativosA Evolução da Arquitetura de Sistemas Corporativos
A Evolução da Arquitetura de Sistemas Corporativos
 
The Evolution Of Enterprise Application Architecture
The Evolution Of Enterprise Application ArchitectureThe Evolution Of Enterprise Application Architecture
The Evolution Of Enterprise Application Architecture
 

Linguagem de Programação Java para Iniciantes

  • 2. Linguagem de Programação Java Agenda • Iniciando • Revisão de Conceitos • Arrays • Desenho Avançado de Classes • Manipulação de Erros e Exceções • Desenvolvimento de Aplicações • Construindo GUIS (Interfaces Gráficas com o Usuário) • Tratamento de Eventos para GUIs • Programação para Redes • Programação Multi-Tarefa (Multi-Thread Programming)
  • 4. Iniciando • Objetivos do módulo • Capacitar o aluno no desenvolvimento de aplicações em Java usando as CORE APIs, bem como manipulação de arquivos, dados, interfaces gráficas e programação cliente-servidor. • Habilidades adquiridas • Codificar, compilar e executar aplicações em Java
  • 6. Conceitos • Distribuições da Tecnologia Java • Tipos de Programas Java • “Key Features” da Tecnologia Java • Conceitos errados sobre Java • Palavras Reservadas • Entendendo a Portabilidade do Java • Entendendo a Java Runtime Enviromnent • Definição de Nomes • Anatomia de uma Classe Java • Aplicações Java Stand-Alone • Operadores • Controle de Fluxo • Criando Classes • Encapsulamento Revisão de Conceitos
  • 7. Distribuições da Tecnologia Java J2SE Standard Edition • Cliente/Servidor • Applet • Departamental J2EE Enterprise Edition • eBusiness • eCommerce • Corporativo J2ME Micro Edition • Telefone celular • Dispositivos eletrônicos • Móvel Revisão de Conceitos
  • 8. Tipos de programas Java • Stand-Alone • Java Applets™ • Java Servlets™ • Java Midlets™ • JavaBeans™ Revisão de Conceitos
  • 9. “Key Features” da Tecnologia Java • Simples • Orientada a objetos • Distribuída • Robusta • Segura • Neutra em relação à Plataforma • Portável • Interpretada • Alto desempenho • Múltiplas linhas de execução • Dinâmica Revisão de Conceitos
  • 10. Conceitos errados sobre Java • Java é uma extensão do HTML • Java é apenas outra linguagem • Todos os programas Java executam em páginas Web • O Javascript é uma versão “Light” da linguagem Java • Java é interpretado, muito lento para aplicações sérias • Java é uma linguagem de programação fácil de aprender • Java é um ambiente fácil no qual programar Revisão de Conceitos
  • 11. Palavras Reservadas abstract double int strictfp ** boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto * protected transient const * if public try continue implements return void default import short volatile do instanceof static while Revisão de Conceitos
  • 12. Entendendo a Plataforma Java JVM JRE JDK • JVM – Java Virtual Machine Máquina Virtual Java • JRE – Java Runtime Environmnent Ambiente de execução de aplicativos Java • JDK – Java Development Kit Ambiente de desenvolvimento Java Também chamado de J2SDK – Java 2 Software Development Kit Revisão de Conceitos
  • 13. Entendendo a Java Runtime Enviromnent Sistema Operacional Java Virtual Machine bytecode Revisão de Conceitos
  • 14. Entendendo a Portabilidade do Java Revisão de Conceitos
  • 15. Definição de Nomes • Um nome pode ser composto por letras (minúsculas e/ou maiúsculas), dígitos e os símbolos _ e $. • Um nome não pode ser iniciado por um dígito (0 a 9). • Letras maiúsculas são diferenciadas de letras minúsculas. (Full Sensitive Case) • Uma palavra-chave da linguagem Java não pode ser um identificador. Revisão de Conceitos
  • 16. Anatomia de uma Classe Java Revisão de Conceitos
  • 17. Aplicações Java Stand-Alone public static void main(String args[]) { } • Toda classe Java que possui o método acima, pode ser iniciada numa JRE exclusiva, no modo Stand- Alone • Nem todas as classes Java necessitam ter esse método Revisão de Conceitos
  • 18. Operadores Negação ! Incremento / Decremento ++, -- Representação de sinal +, - Inversão ~ Conversão (cast) Atribuição = Soma + Subtração - Divisão / Multiplicação * Resto da Divisão % Incremento / Decremento ++, -- Representação de sinal +, - Condicional ternário ?: Revisão de Conceitos
  • 19. Operadores de bits Deslocamento a esquerda << Deslocamento a direita >> Deslocamento a direita (unsigned) >>> Inversão de bits ~ Resto da Divisão % Complemento (XOR) ^ Revisão de Conceitos
  • 20. Operadores de Comparação Igualdade == Maioridade < Menoridade > Maior ou igual >= Menor ou igual <= Diferente != Revisão de Conceitos
  • 21. Estruturas de Repetição - FOR sintaxe: // antes de iniciar o laço, é executada a // declaração for ( declaracao; condicao booleana; expressao ) { // bloco de código que sera repetido // ate que a condição booleana seja false // antes da execução iniciar o proximo laço // sera a executada a expressao } Revisão de Conceitos
  • 22. Estruturas de Repetição - WHILE sintaxe: while (condicao booleana) { // bloco de código que sera repetido // ate que a condição booleana seja false } Revisão de Conceitos
  • 23. Estruturas de Repetição – DO WHILE- sintaxe: do { // bloco de código que sera repetido // ate que a condição booleana seja false } while ( condicao booleana ); Revisão de Conceitos
  • 24. Estruturas de Seleção - IF sintaxe: if ( expressão booleana ) { // bloco de código que será executado // se a expressão booleana valer true. } else { // bloco de código que será executado // se a expressão booleana valer false. } Revisão de Conceitos
  • 25. Estruturas de Seleção - SWITCH sintaxe: switch ( variavel ) { case (inteiro): // caso o valor da variavel seja igual // ao do inteiro, inicia aqui case (inteiro): // caso o valor da variavel seja igual // ao do inteiro, inicia aqui default: // caso não seja nenhum acima, inicia aqui } Revisão de Conceitos
  • 26. Controle de Fluxo Uso do continue for(int i = 0; i < 10; i++){ if (i == 5){ continue; } //.... } Revisão de Conceitos
  • 27. Controle de Fluxo for(int i = 0; i < 10; i++){ if (i == 5){ break; } //.... } Revisão de Conceitos Uso do break
  • 28. Controle de Fluxo Especiais continue e break com label: fora: for(int i = 0; i < 10; i++){ for(int j = 0; j < 10; j++){ if (j == 5){ continue fora; } //.... } Revisão de Conceitos
  • 29. Criando Classes em Java • O que é abstração? • O que são objetos? • Do que eles são constituídos? • O que são classes? • Do que elas são constituídas? • Qual a relação entre classe e objeto? • Quais são os membros de uma classe? • Atributos, métodos e construtores! Revisão de Conceitos
  • 30. Revisão de Conceitos • Encapsulamento pedido: Pedido - pedidoID: String - clienteID: String - notaFiscal:String - total: double - ICMS: double - produtos: List + adcionarProduto(Produto) + removerProduto(produtoID) + recuperaProduto(produtoID) + calculaTotal(): double + calculaImpostos(): double + encerraPedido(): double + Pedido(pedidoID, clienteID) Atributos privados Métodos públicos Definimos uma interface de métodos públicos fornecendo acesso a informação do objeto
  • 31. • Encapsulamento Dessa forma, podemos alterar o código dos métodos da classe Pedido sem alterar a classe Cliente. pedido: Pedido - pedidoID: String - clienteID: String - notaFiscal:String - total: double - ICMS: double - produtos: List + adcionarProduto(Produto) + removerProduto(produtoID) + recuperaProduto(produtoID) + calculaTotal(): double + calculaImpostos(): double + encerraPedido(): double + Pedido(pedidoID, clienteID) Atributos privados Métodos públicos Cliente permitido não permitido Revisão de Conceitos
  • 32. Discussão • O que se entende afinal pela Tecnologia e Plataformas do Java? • Sabendo que uma classe Java pode facilmente ser modelada, então é fácil analisa-la e codifica-la? • Programar em Java, não é só codificar? Exige um entendimento prévio do problema? Revisão de Conceitos
  • 34. Arrays Agenda • Java Arrays • Definindo Arrays • Cópia elementos • Manipulando elementos
  • 35. Arrays Java Arrays • Manipulação de conjunto de dados em memória • Possuem quantidade limitada de itens • Podem ser usados com objetos ou primitivos • Usamos para definir matrizes ou vetores
  • 36. Arrays • Sintaxe tipo identificador[] = new tipo[tamanho]; int[] inteiros = new int[10]; String[] nomes = new String[10]; • Exemplos Java Arrays
  • 37. Arrays int[] inteiros = new int[10]; • Visualização Gráfica Java Arrays
  • 38. Java Arrays • Podem ter “n” dimensões formando matrizes int[][] dados = new int[10][10]; dados[0][0] = 100; Arrays
  • 39. Definindo elementos • Valores podem ser atribuídos na definição int[] inteiros = {10,8,5,10,9}; • Tamanho pode ser obtido pela propriedade length System.out.print(inteiros.length); Arrays
  • 40. Copiando Elementos int original[] = { 1, 2, 3, 4, 5, 6 }; int copia[] = new int[10]; System.arraycopy(original, 0, copia, 0, original.length); Arrays
  • 41. Manipulando elementos String nomes[] = new String[10]; // preenchendo for (int i=0; i < nomes.length; i++) { nomes[i] = new String("Valor: "+i); } // imprimindo na tela for (int i=0; i < nomes.length; i++) { System.out.print( nomes[i]+ " " ); } Arrays
  • 42. Discussão • Para que servem os Arrays nas linguagens de programação? • Vetores e matrizes são elementos complexos de manipular, não existe nada mais fácil em Java para se manipular objetos? • Quando um objeto tiver uma relação múltipla com outro, vamos definir usando arrays? Arrays
  • 45. Agenda • Herança • Generalização e Especialização • Representação UML • Objetos a partir de subclasses • Codificando em Java • Implementação das classes • Formas de Herança • Polimorfismo • Overloading • Overriding • Benefícios do Polimorfismo • Refinando a Hierarquia de Classes • Uso de Classes, Métodos e Variáveis Final • Uso de Classes e Métodos Abstratos • Uso de Interfaces • Pacotes Desenho Avançado de Classes
  • 46. Herança • ferramenta mais valiosa das linguagens e modelos baseados em OO; • possibilita reutilizar uma grande quantidade de código e componentes. • facilita a criação de classes partir de superclasses. • Definição: “capacidade de um objeto filho herdar atributos e métodos do objeto pai, podendo reescrever (alterar) as características herdadas se necessário”. Desenho Avançado de Classes
  • 47. Herança A classe “cliente” é uma subclasse da classe “pessoa”, e herda todos os atributos e métodos da classe “pessoa”. Cliente é uma subclasse de Pessoa. Pessoa é uma superclasse de Cliente Cliente - clienteID: String - CPF: String + getClienteID(): String + getCPF() : String + Cliente(clienteID,CPF) Pessoa - nome: String - nascimento: Data + getNome(): String + getDate() :Date +Pessoa(nome) Construtores não são herdados Desenho Avançado de Classes
  • 48. Generalização: Bottom-Up • Definição: Processo pelo qual identificamos atributos comuns em classes diferentes que são colocados numa superclasse, menos específica e mais genérica. Desenho Avançado de Classes
  • 49. Especialização: Top-Down • Definição: Processo pelo qual identificamos atributos incomuns em classes diferentes que são colocados nas subclasses de uma superclasse, tornando-a mais específica e menos genérica . Desenho Avançado de Classes
  • 50. Representação na UML Define um modelo completo para solucionar um problema computacional. Desenho Avançado de Classes
  • 51. Pessoa - nome: String - nascimento: Data + getNome(): String + getDate() :Date +Pessoa(nome) Joao:Pessoa nome = Joao Souza nascimento: 10/10/1980 Jose:Pessoa nome = Jose Silva nascimento: 10/01/1970 Instancias de Pessoa: Jose e Joao Objetos a partir de subclasses Desenho Avançado de Classes
  • 52. Cliente - clienteID: String - CPF: String + getClienteID(): String + getCPF() : String + Cliente(clienteID,CPF) Pessoa - nome: String - nascimento: Data + getNome(): String + getDate() :Date +Pessoa(nome) Mario:Cliente nome = Mario Silva Souza nascimento: 01/05/1970 clienteID = 0056 CPF: 12345678-00 Oscar:Cliente nome = Oscar Souza nascimento: 02/02/1987 clienteID = 0058 CPF: 87654321-00 Instancias de Cliente: Mario e Oscar Desenho Avançado de Classes Objetos a partir de subclasses
  • 53. Desenho Avançado de Classes Codificando em Java public class Pessoa { // definição de classe } public class Cliente extends Pessoa { // definição de classe } • Uma subclasse pode estender somente uma superclasse diretamente. A herança em Java é simples. • A keyword extends na definição de classe, define a relação de herança.
  • 54. Desenho Avançado de Classes Implementação das Classes public class Produto { // definição de classe } public class Livro extends Produto { // definição de classe } public class CompactDisc extends Produto { // definição de classe }
  • 55. Desenho Avançado de Classes Formas de Herança • Extensão. • Especificação. • Combinação de Extensão com Especificação. Durante a modelagem, devemos aplicar a herança com critério!
  • 56. Polimorfismo • POLIMORFISMO = Muitas Formas Ou seja, para uma árvore de herança, temos muitas formas de objetos e métodos a partir de uma superclasse e suas subclasses. • Princípio pelo qual modelamos e usamos objetos construídos a partir de uma arvore de herança. Desenho Avançado de Classes
  • 57. Polimorfismo • Subclasses • Sobrescrita de método • Sobrecarga da método Desenho Avançado de Classes
  • 58. Polimorfismo • Subclasses • Quando especializamos uma superclasse e criamos um subclasse criamos um nova forma para a superclasse e conseqüentemente novas formas de objetos Livro e CompactDisc são formas de Produto. Desenho Avançado de Classes
  • 59. Overriding • Sobrescrita de métodos Definição: Esta utilidade da orientação a objetos e das linguagens orientada a objetos nos permite escrever numa subclasse um ou mais métodos presentes numa das superclasses da árvore de herança podendo alterar o comportamento da superclasse Desenho Avançado de Classes
  • 60. Overriding • Sobrescrita de métodos – Invocação Virtual de Métodos Quando for chamado para execução o método getDetalhes() da instancia de Pessoa, o código executado será: Pessoa.getDetalhes() Quando for chamado para execução o método getDetalhes() da instancia de Cliente, o código executado será: Cliente.getDetalhes() Ou seja, quando chamarmos um método de um objeto, o método escolhido para ser executado será a primeira ocorrência encontrada daquele método num arvore de herança (Invocação Virtual de Métodos). Desenho Avançado de Classes
  • 61. Overloading • Sobrecarga de métodos O Polimorfismo ainda permite que numa mesma classe tenhamos métodos com o mesmo nome, desde que o número ou tipos de parâmetros passados sejam diferentes Desenho Avançado de Classes
  • 62. Benefícios do Polimorfismo • Uso da Herança Cadastro - pessoas: Lista + adcionaPessoa(Pessoa) + removePessoa(indice) + listaPessoas(): Lista + Cadastro() Vendo estas classes de objetos podemos ver que o cadastro, pode cadastrar (ele entende) qualquer pessoa, inclusive os clientes, devido a herança. Desenho Avançado de Classes
  • 63. Benefícios no Polimorfismo • Maior facilidade de alteração do modelo; • Maior facilidade de expansão de um modelo; • Melhor garantia de que uma idéia presente na “Descrição do Problema” será mantida; Desenho Avançado de Classes
  • 65. Desenho Avançado de Classes Refinando a Hierarquia de Classes • Aplicação de Classes Final (Última forma); • Aplicação de Classes Abstratas; • Aplicação de Interfaces; Processo pelo qual refinamos o modelo de classes com o objetivo de melhor definir a abrangência da solução referente ao problema de negócio.
  • 66. Desenho Avançado de Classes Uso de Classes, Métodos ou Atributos Final (final) Final Classes: Não podem ser especializadas, ou seja, é a última forma do objeto. public final class ContaEspecial extends Conta { ... }
  • 67. Desenho Avançado de Classes Uso de Classes, Métodos ou Atributos Final (final) Final Methods: Não podem ser especializados, ou seja, não podem ser reescritos na herança. public class Poupanca extends Conta{ ... public final void credito(double valor) { } }
  • 68. Desenho Avançado de Classes Uso de Classes, Métodos ou Atributos Final (final) Final Variables: Não podem ser alteradas depois de inicializadas, ou seja, tornam-se constantes. public class Conta { ... public static final double CPMF = 0.0038; } As constantes geralmente são definidas como public static final, para que qualquer classe tenha acesso a esse valor!
  • 69. Uso de Classes e Métodos Abstratos (abstract) Desenho Avançado de Classes public abstract class Produto extends Object { // metodo abstrato não possui corpo de implementacao. public abstract String getDescricaoCompleta(); } Abstract Classes: Não podem ser instanciadas, ou seja, é a primeira forma do objeto, e devem ser especializadas.
  • 70. Desenho Avançado de Classes public abstract classs Produto extends Object{ ... public int getCodigo() { return codigo; } public double getPreco() { return preco; } public abstract String getDescricaoCompleta(); } Uma classe abstrata, deve ter no mínimo um método abstrato. Uma classe abstrata, pode ter métodos concretos (não abstratos). Uma classe concreta, não pode ter métodos abstratos. Uso de Classes e Métodos Abstratos (abstract)
  • 71. Desenho Avançado de Classes Uso de Classes e Métodos Abstratos (abstract) Nesse modelo, vemos que o Produto é um tipo abstrato manipulado pelo Catálogo! Nesse caso, não podemos vender ou manipular um instância de Produto, somente de Livro ou CD.
  • 72. Uso de Interfaces (interface) Desenho Avançado de Classes Interfaces: Não podem ser instanciadas, e só possuem métodos abstratos ou constantes. public interface identificador [extends OutraInterface] { // os métodos de uma interface não possuem corpo, // somente definição. [modificador] tipoRetorno identificador ([argumentos]); }
  • 73. Uso de Interfaces (interface) Desenho Avançado de Classes Usadas para definir apenas o nome de um comportamento, e não sua implementação! Uma classe, abstrata ou concreta, pode estender somente uma classe, mas pode implementar múltiplas interfaces. public interface Vendavel { public double getValorVenda(); }
  • 74. Uso de Interfaces (interface) Desenho Avançado de Classes public class Livro extends Produto implements Vendavel { ... public double getValorVenda() { return getPreco() * 1.2; } } public class CompactDisc extends Produto implements Vendavel { ... public double getValorVenda() { return getPreco() * 1.1; } } Dessa forma, todas os objetos do modelo que quiserem ser vendavel, implementam a interface Vendavel, dando um comportamento para o método getValorVenda () de acordo com a necessidade de cada objeto.
  • 75. Uso de Interfaces (interface) Desenho Avançado de Classes Nesse modelo, vemos que o Vendavel é um tipo extremamente abstrato Dessa forma, Livro e CD, são Produtos Vendaveis, com as características herdadas de produto, e uma implementação de Vendavel.
  • 76. Uso de Interfaces (interface) Desenho Avançado de Classes Dessa forma um carrinho de compras, manipula qualquer objeto Vendavel, inclusive Livro e CD. Na evolução, esse sistema pode usar o Carrinho para qualquer Vendavel, não somente Produtos. Enquanto o Catalogo manipula Produtos, o Carrinho manipula Vendaveis
  • 77. Uso de Interfaces (interface) Desenho Avançado de Classes public class Carrinho { private Vendavel[] vendaveis; private int counter; ... public int adcionaVendavel(Vendavel vendavel) { vendaveis[ counter++ ] = vendavel; return counter; } public Vendavel getVendavel(int index) { return vendaveis[ index ]; } public double calculoCompras() { double valor = 0; for ( int i =0; i<vendaveis.length; i++ ) { valor += vendaveis[i].getValorVenda(); } return valor; } }
  • 78. Organizando as Classes em Pacotes (package) Desenho Avançado de Classes Estrutura lógica, representada fisicamente em diretórios e subdiretórios usada com o intuito de organizar as classes de uma aplicação ou sistema. Notação da UML
  • 79. Organizando as Classes em Pacotes (package) Desenho Avançado de Classes Exemplos do Banco e da Loja Notação da UML
  • 80. Organizando as Classes em Pacotes (package) Desenho Avançado de Classes Codificação Nas classes de um pacote colocamos a definição de package package ibta.loja; public class Carrinho { .. } package ibta.loja; public class Catalogo { .. } Nas classes de outro pacote que necessitam usar as classes acima, usamos a definição de import import ibta.loja.*; public class TestaProdutos { .. }
  • 81. Discussão • Resumindo. O que se entende por Herança? • Quando devemos usar especialização e generalização? • Sabemos que o polimorfismo nos fornece uma ferramenta poderosa na adição de tipos de objetos, então quer dizer que ele nos permite ter sistemas mais flexíveis e que tem menos impacto nas mudanças? • Qual a necessidade de usar Classes Abstratas? • Qual a maior diferença de Classes Abstratas e Interfaces? • Porque usamos os pacotes? Desenho Avançado de Classes
  • 84. Agenda • O que são Erros e Exceções? • Hierarquia de Exceções • Exceções mais conhecidas • Capturando e tratando Exceções • Estrutura try-catch-finally • Usando o bloco try-catch • Criando Exceções Customizadas Manipulando Erros e Exceções
  • 85. O que são erros e exceções? Manipulando Erros e Exceções São objetos e possuem classes para serem definidas. Exceções estão associadas a condições não previstas durante a execução de uma aplicação Java, e no caso de acontecerem, a execução pode continuar, exemplo, uma conversão numérica que falhou. Tem o conceito de serem “arremessadas” ao chamador de um método, e são filhas da classe java.lang.Exception
  • 86. O que são erros e exceções? Manipulando Erros e Exceções São objetos e possuem classes para serem definidas. Erros estão associados a condições não previstas durante a execução de uma aplicação Java, e no caso de acontecerem, a execução não pode continuar, exemplo, falta de memória na JVM. Tem o conceito de serem “arremessadas” ao chamador de um método, e são filhas da classe java.lang.Error
  • 87. Hierarquia da exceções Manipulando Erros e Exceções Todas as exceções e erros são subclasses de java.lang.Throwable
  • 88. Exceções mais conhecidas Manipulando Erros e Exceções • java.lang.ArithmeticException - erro de aritmética; • java.lang.NumberFormatException – erro de formatação numérica; • java.lang.ArrayIndexOutOfBoundsException – erro de manipulação de posições em arrays; • java.lang.NullPointerException – erro ao chamar um membro de objeto nulo; • java.io.IOException – erro de entrada e saída; • java.lang.ClassNotFoundException – erro de carga de classes;
  • 89. Exceções mais conhecidas Manipulando Erros e Exceções • java.lang.RuntimeException - erro não previsto na execução; As exceções filhas de RuntimeException não são obrigadas a serem tratadas, pois são consideradas “Unchecked Exceptions” As exceções filhas de Exception que não são de RuntimeException são obrigadas a serem tratadas, pois são consideradas “Checked Exceptions” Todos os Erros, filhos de Error, devem ser tratados apesar de não permitir que o programa continue.
  • 90. Capturando e tratando exceções Manipulando Erros e Exceções Usamos em Java uma estrutura em bloco para tratar execução de código que pode gerar uma exceção: é o bloco try – catch – finally.
  • 91. Estrutura try – catch - finally Manipulando Erros e Exceções try { // código que inclui comandos/invocações de métodos // que podem gerar uma situação de exceção. } catch (Throwable t) { // bloco de tratamento associado à condição de // exceção derivada de Throwable ou a qualquer uma de suas // subclasses, identificada aqui pelo objeto // com referência t } finally { // bloco de código que sempre será executado após // o bloco try, independentemente de sua conclusão // ter ocorrido normalmente ou ter sido interrompida // este bloco é opcional }
  • 92. Estrutura try – catch - finally Manipulando Erros e Exceções try { a.method(); b.method(); c.method(); } catch (IOException t) { // A } catch (Exception t) { // B } catch (Throwable t) { // C } finally { } Se ocorrer uma IOException dentro do bloco try, será executado o bloco A. Se ocorrer uma Exception que não é filha de IOException dentro do bloco try, será executado o bloco B. Se ocorrer um Error dentro do bloco try, será executado o bloco C. Independente do que aconteça o bloco finally será executado.
  • 93. Usando try – catch - finally Manipulando Erros e Exceções import java.io.*; public class ConverteInteiro2 { public String leLinha() { byte[] lidos = new byte[20]; String texto = ""; try { // le o buffer do teclado e pode gerar uma IOException System.in.read(lidos); texto = new String(lidos); texto = texto.trim(); // retira os espacos em branco } catch (IOException ioException) { // se acontecer um erro na leitura // imprime na tela o erro ioException.printStackTrace(); } return texto; } public int leInt() { String linha = leLinha(); return Integer.parseInt(linha); } public static void main(String[] args) { ConverteInteiro2 ci = new ConverteInteiro2(); System.out.print("Entre inteiro: "); int valor = ci.leInt(); System.out.println("Valor lido foi: " + valor); } }
  • 94. Criando exceções Customizadas Manipulando Erros e Exceções Geralmente em Java, quando queremos abortar a execução de um método, internamente fazemos um tratamento e geramos uma exceção ao invés de usar testes de retorno. public class Conta { public boolean debito(double valor) { if ( valor < 0 ) { return false; } else { if ( saldo - valor < 0 ) { return false; } else { saldo -= valor; return true; } } } }
  • 95. Criando exceções Customizadas Manipulando Erros e Exceções Dessa forma criamos uma exceção customizada!
  • 96. Criando exceções Customizadas Manipulando Erros e Exceções Dessa forma criamos uma exceção customizada! public class SaldoInsuficienteException extends Exception { public SaldoInsuficienteException () { super("Falta de saldo para esta operação!"); } public SaldoInsuficienteException (String mensagem) { super(mensagem); } }
  • 97. Arremessando exceções Customizadas Manipulando Erros e Exceções Dessa forma criamos uma exceção customizada! public class Conta2 { private double saldo; public void debito(double valor) throws SaldoInsuficienteException { if ( valor < 0 ) { // unchecked exception não precisa ser declarada na clausula thorws throw new IllegalArgumentException (“ Valor de debito deve ser maior que zero! "); } else { if ( saldo - valor < 0 ) { // checked exceptio, deve ser declara na clausula throws throw new SaldoInsuficienteException ("Saldo insuficiente! Atual: "+saldo); } else { saldo -= valor; } } }
  • 98. Tratando exceções Customizadas Manipulando Erros e Exceções public class TesteConta2 { public static void main(String args[]) { Conta2 c2 = new Conta2(); try { c2.credito(100); System.out.println("Saldo: "+ c2.getSaldo() ); c2.debito(50); System.out.println("Saldo: "+ c2.getSaldo() ); c2.debito(500); System.out.println("Saldo: "+ c2.getSaldo() ); } catch (SaldoInsuficienteException e) { // se acontecer uma SaldoInsuficienteException // caira neste bloco e.printStackTrace(); } catch (Exception e) { // se acontecer qualquer outra Exception // caira neste bloco e.printStackTrace(); } finally { System.out.println("Saldo: "+ c2.getSaldo() ); } } }
  • 99. Discussão • Já que as exceções em Java são objetos, então temos classes para representá-las? • Como identificar que um método lança uma exceção seu chamador? • Devemos então sempre definir exceções customizadas para nossas aplicações? • Qual a principal diferença entre CHECKED e UNCHECKED Exceptions? Manipulando Erros e Exceções
  • 102. Agenda • Aplicações e Pacotes Java • Parâmetros em linha de comando • Manipulando texto e cadeia de caracteres • Entrada e saída de dados • Java Streamers • Java Readers e Writers • Arquivos de Acesso Randômico • Arquivos de Propriedades • Serialização de Objetos • Uso de Java Collectinons™ • Wrapper Classes • Discussão • Exercícios Desenvolvimento de Aplicações em Java
  • 103. A funcionalidades principais de uma linguagem inclui: • manipulação de textos; • manipulação de estruturas de dados; • parâmetros em linha de comando para inicializar aplicativos; • manipulação de arquivos de texto; • manipulação de arquivos randômicos; • manipulação de arquivos de configuração; • formatação de dados; Essas funcionalidades vão nos permitir implementar uma boa parte das necessidades de qualquer tipo de sistema ou aplicação. Desenvolvimento de Aplicações em Java Aplicações e Pacotes
  • 104. Desenvolvimento de Aplicações em Java Os principais pacotes que usaremos para escrever aplicações stand- alone utilitárias sem interfaces gráficas são: • java.lang – fornece as classes fundamentais de linguagem java; • java.io – fornece classes para manipulação de arquivos; • java.util – fornece as estruturas de dados e classes utilitárias; • java.text – fornece as classes para formatação de dados; • java.math – fornece as classes para manipular números grandes; Aplicações e Pacotes
  • 105. Desenvolvimento de Aplicações em Java Usamos a passagem de dados como parâmetros em linha de comando com o intuito de passar valores a uma aplicação ou utilitário. Esses valores podem ser: diretórios, nomes de arquivos, valores, etc. Ex: # java ClasseMain –a nomearquivo.txt Parâmetros em linha de comando
  • 106. Desenvolvimento de Aplicações em Java Capturando os parâmetros dentro da aplicação Java: public class TesteParametros { public static void main(String args[]) { int tamanho = args.length; System.out.println("Numero de Parâmetros: "+tamanho); for(int i=0; i < tamanho; i++) { System.out.println("Param: " + i + " Valor: "+ args[i] ); } } } Parâmetros em linha de comando No método main, existe um array de String, args[], que representa os parâmetros passados. # java TesteParametros parametro1 parametro2 “parametro 3”
  • 107. Desenvolvimento de Aplicações em Java Manipulação de textos (cópia, pesquisa, conversões, maiúsculas e minúsculas, carateres, etc.) Conjunto de método presentes nas classes: • java.lang.String – cadeia de caracteres • java.lang.StringBuffer – buffer de caracteres • java.lang.StringTokenizer – separador de textos Manipulando textos e cadeia de caracteres
  • 108. Desenvolvimento de Aplicações em Java Usos da Classe java.lang.String public class TesteString { public static void main(String args[]) { String texto = "IBTA Java!"; int tamanho = texto.length(); System.out.println("Texto: "+texto); System.out.println("Tamanho: "+tamanho); String texto2 = texto.toUpperCase(); System.out.println("Texto2: "+texto2); String texto3 = texto.toLowerCase(); System.out.println("Texto3: "+texto3); String texto4 = texto3.replace( 'u', 'U' ); texto4 = texto4.replace( 'j', 'J' ); System.out.println("Texto4: "+texto4); if ( texto3.equals( texto ) ) { System.out.println(" texto3 e texto são iguais! "); } else { System.out.println(" texto3 e texto são diferentes! "); } if ( texto4.equals( texto ) ){ System.out.println(" texto4 e texto são iguais! "); } else { System.out.println(" texto4 e texto são diferentes! "); } } }
  • 109. Desenvolvimento de Aplicações em Java Usos da classe StringBuffer e StringTokenizer import java.util.StringTokenizer; public class TesteStringBuffer { public static void main(String args[]) { String texto = "IBTA Java! Java é aqui!"; StringTokenizer tokenizer = new StringTokenizer( texto, "!"); int numero = tokenizer.countTokens(); String[] tokens = new String[ numero ]; int count = 0; while ( tokenizer.hasMoreTokens() ) { tokens[count] = tokenizer.nextToken(); count++; } System.out.println("Texto: "+texto); System.out.println("# Tokens: "+numero); System.out.print("Tokens: "); for ( int i = 0 ; i<tokens.length; i++) { System.out.print( tokens[i] +","); } System.out.println(); StringBuffer buffer = new StringBuffer( texto ); StringBuffer invertido = buffer.reverse(); System.out.println("Texto: "+texto); System.out.println("Invertido: "+invertido ); } }
  • 110. Desenvolvimento de Aplicações em Java Entrada e saída de dados. Basicamente um aplicativo lida com: • entrada de dados (via teclado, arquivos, mouse); • processamento (execução de tarefas nesses dados); • saída (via interface, arquivos e relatórios); A entrada ou saída de dados usando teclado e arquivos, em Java é feito usando: • Streamers • Readers • Writers
  • 111. Desenvolvimento de Aplicações em Java Java Streamers Usados para manipular byte (ASCII) de forma seqüencial (escrita ou leitura do arquivo todo). Ligam uma fonte de dados (DataSource) até ao aplicativo (Program) Geralmente usados para troca de dados entre aplicações Java e Non-Java.
  • 112. Desenvolvimento de Aplicações em Java Java Streamers – java.io.InputStream Streamers de entrada (do recurso para a aplicação)
  • 113. Desenvolvimento de Aplicações em Java Java Streamers – java.io.OutputStream Streamers de saída (da aplicação para o recurso)
  • 114. Desenvolvimento de Aplicações em Java Readers e Writers Usados para manipular char (UTF-16) de forma seqüencial (escrita ou leitura do arquivo todo). Ligam uma fonte de dados (DataSource) até ao aplicativo (Program) Geralmente usados para troca de dados entre aplicações Java e Java. Padrão para as aplicações WEB.
  • 115. Desenvolvimento de Aplicações em Java Readers – java.io.Reader Readers (entrada de dados do recurso para a aplicação)
  • 116. Desenvolvimento de Aplicações em Java Writers – java.io.Writer Writers (saída de dados da aplicação para o recurso)
  • 117. Desenvolvimento de Aplicações em Java Categorias e uso
  • 118. Desenvolvimento de Aplicações em Java Categorias e uso
  • 119. Desenvolvimento de Aplicações em Java Exemplos import java.io.*; public class Copy { public static void main(String[] args) { try { FileReader input = new FileReader(args[0]); FileWriter output = new FileWriter(args[1]); char[] buffer = new char[128]; int charsRead = 0; charsRead = input.read(buffer); while ( charsRead != -1 ) { output.write(buffer, 0, charsRead); charsRead = input.read(buffer); } input.close(); output.close(); } catch (IOException e) { e.printStackTrace(); } } }
  • 120. Desenvolvimento de Aplicações em Java Exemplos import java.io.*; public class LeTeclado { public static void main (String args[]) { String s = null; InputStreamReader ir = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(ir); System.out.println("Tecle Ctrl-Z para sair!"); try { s = in.readLine(); while ( s != null ) { System.out.println("Lido: " + s); s = in.readLine(); } in.close(); } catch (IOException e) { e.printStackTrace(); } } }
  • 121. Desenvolvimento de Aplicações em Java Exemplos import java.io.*; public class GravaArquivo { public static void main (String[] args) { File file = new File(args[0]); try { BufferedReader in = new BufferedReader( new InputStreamReader( System.in )); PrintWriter out = new PrintWriter( new FileWriter(file)); String texto = null; System.out.print("Digite o texto! "); System.out.println("Ctrl+Z para gravar!"); while ( (texto = in.readLine() ) != null ) { out.println(texto ); } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }
  • 122. Desenvolvimento de Aplicações em Java Arquivos de Acesso Randômico Usados para manipular arquivos de dados que de forma randômica (escrita em leitura em qualquer parte do arquivo). Ligam uma fonte de dados (DataSource) até ao aplicativo (Program) Geralmente usados para troca de dados entre aplicações Java e Non-Java. Permite a implementação em Java do conceito de Registro.
  • 123. Desenvolvimento de Aplicações em Java Arquivos de Acesso Randômico Classe: java.io.RandomAccessFile O arquivo pode ser aberto num modo (Read, Write ou ReadWrite) Cada REGISTRO, tem um inicio e fim, com tamanho definido. A classe fornece principalmente métodos para: lock (bloqueio), seek (pesquisa), read (leitura) e write (gravação).
  • 124. Desenvolvimento de Aplicações em Java Trabalho com Propriedades (Properties) Uma propriedade (property) é um elemento da aplicação que pode ser alterado em tempo de execução. Sua existência permite a configuração do aplicativo (ex: diretorio de dados, nomes de arquivos, dicionários, etc), e essa configuração fica armazenada em arquivo. Ainda podemos identificar elementos da JRE e do sistema corrente (Windows, UNIX, etc) Classe: java.util.Properties
  • 125. Desenvolvimento de Aplicações em Java Trabalho com Propriedades (Properties) Listando as propriedades do sistema import java.util.*; public class TestePropriedades { public static void main(String args[]) { Properties props = System.getProperties(); Enumeration prop_names = props.propertyNames(); while ( prop_names.hasMoreElements() ) { String prop_name = (String) prop_names.nextElement(); String property = props.getProperty(prop_name); System.out.println("property ’" + prop_name + "’ is ’" + property + "’"); } } }
  • 126. Desenvolvimento de Aplicações em Java Trabalho com Arquivos de Propriedades Permite criar e manipular arquivos de configuração ou de outra necessidade para as aplicações: #nomes.properties #tipo=papel usuario=user administrador=admin convidado=guest #aplicacao.ini #arquivo de configuração diretorioTemp=c:/temp diretorioApp=d:/appl Arquivos de texto simples, onde do lado esquerdo do igual temos a propriedade e do lado direito seu valor.
  • 127. Desenvolvimento de Aplicações em Java Trabalho com Arquivos de Propriedades Lendo um arquivo de propriedades // class CarregaPropriedades.java import java.io.*; import java.util.*; public class CarregaPropriedades { private Properties props; public CarregaPropriedades(String nomeArquivo) { try { FileInputStream fis = new FileInputStream( nomeArquivo ); props = new Properties(); props.load( fis ); } catch (Exception e) { e.printStackTrace(); } } public String getProperty(String nome) { return (String) props.get( nome ); } }
  • 128. Desenvolvimento de Aplicações em Java Trabalho com Arquivos de Propriedades Obtendo as propriedades lidas: // class TesteCarregaPropriedades.java public class TesteCarregaPropriedades { public static void main(String args[]) { CarregaPropriedades carregador = null; if ( args.length == 1 ) { carregador = new CarregaPropriedades ( args[0] ); System.out.println("usuario="+ carregador.getProperty("usuario") ); System.out.println("convidado="+ carregador.getProperty("convidado") ); System.out.println("administrador="+ carregador.getProperty("administrador") ); } else { System.out.println("Uso: java TesteCarregaPropriedades arquivo.properties "); } } }
  • 129. Desenvolvimento de Aplicações em Java Serialização de Objetos Mecanismo exclusivo da tecnologia Java e usado para: • Armazenar objetos em disco (manter o estado); • Transmitir dados de objetos pela rede (comunicação); • Permitir armazenar o estado das GUIs (J2SE e J2ME); • Permitir a redundância em aplicações J2EE; • Permitir armazenar dados em JavaCards™ (J2ME); • Etc.
  • 130. Desenvolvimento de Aplicações em Java Serialização de Objetos Quando armazenamos um objeto (serializamos), estamos gravando num Stream o estado como ele se encontra (gravar atributos da memória no recurso) Quando lemos um objeto (deserializamos), estamos lendo de um Stream o objeto no estado como ele se encontrava (ler atributos do recurso para a memória)
  • 131. Desenvolvimento de Aplicações em Java Serialização de Objetos Para serializar um objeto, sua classe deve implementar a interface java.io.Serializable // Pessoa.java public class Pessoa implements java.io.Serializable { private String nome; private java.util.Date nascimento; public java.util.Date getNascimento() { return nascimento; } public String getNome() { return nome; } public void setNascimento(java.util.Date nascimento) { this.nascimento = nascimento; } public void setNome(String nome) { this.nome = nome; } }
  • 132. Desenvolvimento de Aplicações em Java Exemplos de Serialização de Objetos // SerializadorPessoa.java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializadorPessoa { public void gravaPessoa(String nomeArquivo, Pessoa pessoa) throws IOException { if ( pessoa != null && nomeArquivo != null ) { FileOutputStream fos = new FileOutputStream( nomeArquivo ); ObjectOutputStream oos = new ObjectOutputStream ( fos ); oos.writeObject( pessoa ); oos.close(); } } public Pessoa recuperaPessoa(String nomeArquivo) throws IOException, ClassNotFoundException { Pessoa pessoa = null; if ( nomeArquivo != null ){ FileInputStream fis = new FileInputStream( nomeArquivo ); ObjectInputStream ois = new ObjectInputStream( fis ); pessoa = (Pessoa) ois.readObject(); ois.close(); } return pessoa; } }
  • 133. Desenvolvimento de Aplicações em Java Exemplos de Serialização de Objetos // classe TesteSerializadorPessoa.java public class TesteSerializadorPessoa { public static void main(String args[]) { Pessoa pessoa = new Pessoa(); pessoa.setNome("Oziel Moreira Neto"); pessoa.setNascimento( new java.util.Date(75,9,23) ); try { SerializadorPessoa serializador = new SerializadorPessoa(); serializador.gravaPessoa("oziel.obj", pessoa); pessoa = null; pessoa = serializador.recuperaPessoa("oziel.obj"); System.out.println( pessoa.getNome() ); System.out.println( pessoa.getNascimento() ); } catch (Exception e) { e.printStackTrace(); } } }
  • 134. Desenvolvimento de Aplicações em Java Serialização de Objetos Quando serializamos um objeto, estamos armazenando seus atributos de uma forma que o Java entende!
  • 135. Desenvolvimento de Aplicações em Java Coleções de Objetos – Java Collections™ Trabalhar mais facilmente com multiplicidade de objetos sem os problemas dos arrays de dimensionamento, pesquisa, etc. Usamos uma Collection para: • suportar relacionamentos múltiplos entre objetos; • substituir o uso e manipulação de arrays; • trabalhar com estruturas de dados em memória para ordenação;
  • 136. Desenvolvimento de Aplicações em Java As Java Collections ™ fornecem uma interface de métodos simples que manipulam qualquer objeto Java, pois seus métodos manipulam referâncias da java.lang.Object. As classes concretas da API de collection são divididas de acordo com sua categoria de superclasse, e quando uma subclasse implementa uma das interfaces abaixo temos: • java.util.List – lista de objetos não ordenados, que permite duplicados; • java.util.Set – conjunto de objetos não ordenados, que não permite duplicados; •java.util.Map – estrutura em memória que armazena os objetos de acordo com uma chave; Coleções de Objetos – Java Collections™
  • 137. Desenvolvimento de Aplicações em Java Coleções de Objetos – Java Collections™ Como este framework é muito extenso, vamos estudar as três principais estruturas de manipulação de coleções de objetos: • java.util.ArrayList; • java.util.HashMap • java.util.HashSet. Para o perfeito funcionamento das Collections, é imprescindível que o os nossos objetos reescrevam os seguintes métodos da java.lang.Object: • public boolean equals(Object obj); • public int hashCode();
  • 138. Desenvolvimento de Aplicações em Java Coleções de Objetos – Java Collections™ Alterando a classe Pessoa public class Pessoa implements java.io.Serializable { private String nome; private java.util.Date nascimento; ... public boolean equals(Object obj) { boolean flag = false; if ( obj instanceof Pessoa ) { Pessoa that = (Pessoa) obj; flag = that.nome.equals( this.nome ) && that.nascimento.equals( this.nascimento ); } return flag; } public int hashCode() { return ( nome != null && nascimento != null) ? nome.hashCode() ^ nascimento.hahsCode() : 0; } }
  • 139. Desenvolvimento de Aplicações em Java Coleções de Objetos – Java Collections™ Testando as Collections com o objeto Pessoa: • Explicar o ListaPessoas e executar o TesteListaPessoas; • Explicar o MapaPessoas e executar o TesteMapaPessoas; • Explicar o ConjuntoPessoas e executar o TesteConjuntoPessoas; O que foi percebido?
  • 140. Desenvolvimento de Aplicações em Java Wrapper Classes Finalidade de converter: • os tipos primitivos em tipos de referência; • Strings (cadeias de números) em tipos primitivos;
  • 141. Desenvolvimento de Aplicações em Java Wrapper Classes Exemplos: // convertendo um primitivo para String int numero = 10; Integer wrapperNumero = new Integer( numero ); String strNumero = wrapperNumero.toString(); // convertendo uma String para primitivo String strNumero = “10”; Integer wrapperNumero = new Integer( strNumero ); int numero = wrapperNumero.intValue();
  • 142. Discussão • Vimos nesse capítulo uma série de conceitos que são usados em aplicações de fato, ou seja, arquivos de configurações (properties), coleções de objetos, manipulação de arquivos texto e de arquivos de dados (Randômico). • Necessariamente todas as aplicações usam esses recursos? • Quais dos recursos nesse capítulo são mais fáceis de se implementar? • Podemos usar a serialização de objetos para armazenar nossos objetos temporariamente e indefinidamente? Desenvolvimento de Aplicações em Java
  • 145. Agenda • Exemplos de GUIs • Introdução as JFCs • Entendendo a Hierarquia de Classes • Modelo de Desenvolvimento de GUIs • Modelo de Desenvolvimento usando SWING • Gerenciadores de Layout e Posicionamento • Manipulando Aspectos Visuais • Tipos de Componentes Visuais • Criando Menus para o Usuário • Trabalhando com Caixas , Botões e Campos • Trabalhando com Listas, Combos e Tabelas • Discussão • Exercícios Construindo GUIs
  • 147. Java Foundation Classes • Desenvolvimento de aplicações Stand-Alone ou Applets • Riqueza visual e iteratividade • Desenhos 2D • Acessibilidade • Drag and Drop Introdução as JFC Construindo GUIs
  • 148. Java Foundation Classes • AWT – java.awt, java.awt.event • Accessibility – javax.accessibility • Java 2D – java.awt, java.awt.geom, java.awt.image • DnD – java.awt.dnd • SWING – javax.swing, javax.swing.event Introdução as JFC Construindo GUIs Estes são os pacotes principais, dentro de cada um deles existem classes específicas para determinadas necessidades.
  • 149. Entendendo a Hierarquia de Classes Construindo GUIs A classe principal do SWING é a JComponent, e a partir dela temos as abstrações para construirmos uma GUI. Top-Level Containers (Components) são aqueles que devem conter os outros tipos de componentes para uma GUI pode ser exibida.
  • 150. “Containers” e “Components” • Vendo a hierarquia de classes, um Container (Top- Level Component) pode conter Components, e usamos um Container para exibir todos os outros Components. • Components são todos aqueles que usamos para desenhar a GUI • Top-Level Components, usamos para exibir uma GUI (JFrame, JApplet, JWindow, JDialog) Modelo de Desenvolvimento de GUIs Construindo GUIs
  • 151. Especialização • Geralmente para criamos nossa “Tela-Principal” de uma aplicação, criamos uma nova classe especializando a classe javax.swing.JFrame. Modelo de Desenvolvimento usando SWING Construindo GUIs import javax.swing.*; public class MyFrame extends JFrame { ... }
  • 152. Especialização • Geralmente para criamos formulários completos que pode ser reutilizados, especializados a classe javax.swing.JPanel. Modelo de Desenvolvimento usando SWING Construindo GUIs import javax.swing.*; public class MyPanel extends JPanel { ... }
  • 153. Composição • Para criamos formulários (telas) das nossas aplicações que podem ser reutilizadas em qualquer aplicação SWING faremos composição de outros componentes. Modelo de Desenvolvimento usando SWING Construindo GUIs import javax.swing.*; private JTextField txtNome, txtEndereco; public class MyPanel extends JPanel { ... }
  • 154. Funcionar em qualquer plataforma e modo de exibição: • Facilita a codificação • Comportamento garantido (Windows, MAC, Linux, Unix) • 100% Java • Não são necessários cálculos de tamanho e posição quando redimensionamos os componentes Gerenciadores de Layout e Posicionamento Construindo GUIs Assim necessitamos de um Gerenciador de Layout, veja a interface: java.awt.LayoutManager
  • 155. Podemos aplicar um Layout Manager num: • Top-Level Component (JFrame, JWindow, JDialog, JApplet) • Container (JPanel, etc) • Usamos o metodó setLayout( layoutManger ) Gerenciadores de Layout e Posicionamento Construindo GUIs Dessa forma, não é necessário tratar posição e tamanho dos componentes no nosso código, devemos apenas respeitar as regrar do Gerenciador de Layout
  • 156. Tipos de Gerenciadores (Layout Managers) • FlowLayout • BorderLayout • GridLayout • GridBagLayout • Layout Compostos Gerenciadores de Layout e Posicionamento Construindo GUIs
  • 157. FlowLayout • Alinhamento padrão ao centro e acima, tentando arranjar os componentes numa única linha • Mantém o preferedSize dos componentes (tamanho inicial dos componentes) • O container pode receber mais de um componente numa área • Usado quase sempre! Gerenciadores de Layout e Posicionamento Construindo GUIs
  • 158. FlowLayout Gerenciadores de Layout e Posicionamento Construindo GUIs import java.awt.FlowLayout; import javax.swing.*; public class FlowExample extends JFrame { public FlowExample() { super("FlowExample"); ... getContentPane().setLayout( new FlowLayout() ); } public void init() { .. setVisible( true ); } public static void main(String args[]) { new FlowExample().init(); } }
  • 159. GridLayout • Divide um Container em partes iguais, no formato de um GRID (Tabela) • NÃO mantém o preferedSize dos componentes (tamanho inicial dos componentes) • O container só recebe um componente por área e componente tende a ocupar toda a área Gerenciadores de Layout e Posicionamento Construindo GUIs
  • 160. GridLayout Gerenciadores de Layout e Posicionamento Construindo GUIs import java.awt.*; import javax.swing.*; public class GridExample extends JFrame { public FlowExample() { super(“GridExample"); ... getContentPane().setLayout( new GridLayout(2,2) ); } public void init() { .. setVisible( true ); } public static void main(String args[]) { new GridExample().init(); } }
  • 161. BorderLayout • Divide um Container em cinco áreas (North, South, East, West e Center) • NÃO mantém o preferedSize dos componentes (tamanho inicial dos componentes) • O container só recebe um componente por área e componente tende a ocupar toda a área Gerenciadores de Layout e Posicionamento Construindo GUIs
  • 162. BorderLayout Gerenciadores de Layout e Posicionamento Construindo GUIs import java.awt.*; import javax.swing.*; public class BorderExample extends JFrame { public BorderExample() { super(“BorderExample"); ... getContentPane().setLayout( new BorderLayout() ); } public void init() { .. setVisible( true ); } public static void main(String args[]) { new BorderLayout().init(); } }
  • 163. GridBagLayout • Divide um Container em um GRID (Tabela) extremamente flexível e customizável. • NÃO mantém o preferedSize dos componentes (tamanho inicial dos componentes) • O container só recebe um componente por área e componente tende a ocupar toda a área • Necessário definir um objeto GridBagConstraints para cada Component Gerenciadores de Layout e Posicionamento Construindo GUIs
  • 164. GridBagLayout Gerenciadores de Layout e Posicionamento Construindo GUIs import java.awt.*; import javax.swing.*; public class GridBagExample extends JFrame { public FlowExample() { super(“GridExample"); ... getContentPane().setLayout( new GridBagLayout() ); } public void init() { .. setVisible( true ); } public static void main(String args[]) { new GridBagExample().init(); } }
  • 165. Layouts Compostos • Criamos vários conteiners e cada um deles com um layout manager diferente. • Dividimos uma GUI em pedaços e trabalhos com Composição de elementos Gerenciadores de Layout e Posicionamento Construindo GUIs
  • 166. Layouts Compostos Gerenciadores de Layout e Posicionamento Construindo GUIs JFrame do tipo BorderLayout, JPanel com Botões na parte NORTH, JPanel com Mensagem na parte SOUTH, JTextArea na parte CENTER
  • 167. Podemos mudar Cursores, Fontes, Cores, Bordas e Dicas • Cursor – setCursor ( java.awt.Cursor ); • Fonte – setFont( java.awt.Font ); • Cor de Frente – setForeground( java.awt.Color ); • Cor de Fundo – setBackground ( java.awt.Color ); • Dica – setToolTipText( java.lang.String ); • Borda – setBorder( javax.swing.border.Border ); • Exibição – setEnabled ( boolean ); Manipulando Aspectos Visuais Construindo GUIs
  • 168. Um tipo de componente para cada necessidade • Janela – JFrame, JWindow, JDialog • Botão – JButton, JToogleButton, JRadioButton, JCheckBox • Texto – JTextField, JTextArea, JFormattedField, JPasswordField • Combo – JComboBox, DefaultComboModel • Listas – JList, DefaultListModel • Tabela – JTable, DefaultTableModel • Menu – JMenu, JMenuItem, JMenuBar • Diálogo – JOptionPane Tipos de Componentes Visuais Construindo GUIs
  • 169. Para facilitar a navegação entre telas de uma GUI • Criamos os itens de menu usando JMenuItem • Criamos os menus usando JMenu • Montamos o menu usando JMenuBar • Num JFrame usamos o método setJMenuBar( umMenuaBar ) Criando Menus para o Usuário Construindo GUIs
  • 170. Criando Menus para o Usuário Construindo GUIs // construindo objetos abrir = new JMenuItem("Abrir"); novo = new JMenuItem("Novo"); salvar = new JMenuItem("Salvar"); sair = new JMenuItem("Sair"); copiar = new JMenuItem("Copiar"); colar = new JMenuItem("Colar"); recortar = new JMenuItem("Recortar"); ajuda = new JMenuItem("Ajuda"); info = new JMenuItem("Info"); arquivo = new JMenu("Arquivo"); editar = new JMenu("Editar"); sobre = new JMenu("Sobre"); // construindo menu arquivo arquivo.add ( abrir ); arquivo.add ( novo ); arquivo.add ( salvar ); arquivo.addSeparator(); arquivo.add ( sair ); // construindo menu editar editar.add ( copiar ); editar.add ( colar ); editar.add ( recortar ); // construindo menu sobre sobre.add ( ajuda ); sobre.add ( info ); // construindo menu menuBar = new JMenuBar(); menuBar.add( arquivo ); menuBar.add( editar ); menuBar.add( sobre ); setJMenuBar( menuBar );
  • 171. Caixa de Diálogo - JOptionPane • Usado para exibir informações ou opções para o usuário. Trabalhando com Caixas, Botões e Campos Construindo GUIs
  • 172. Botões • JButton – botão simples para uma ação. • JRadioButton e ButtonGroup – usamos para opções únicas e exclusivas como escolher sexo, estado civil, etc. • JCheckBox – opções múltiplas e não exclusivas como marcar bens, carro, moto, casa, etc. • JToggleButton – usamos quando um valor está ativo ou desativo. Trabalhando com Caixas, Botões e Campos Construindo GUIs
  • 173. Botões Trabalhando com Caixas, Botões e Campos Construindo GUIs ... sim = new JButton("Sim"); nao = new JButton("Nao"); carro = new JCheckBox("Carro"); moto = new JCheckBox("Moto"); casa = new JCheckBox("Casa"); masculino = new JRadioButton("Masc"); feminino = new JRadioButton("Fem"); luz = new JToggleButton("Acesso"); ...
  • 174. Trabalhando com Caixas, Botões e Campos Construindo GUIs • Campos – usados para entrada de dados • JTextField – caixa de texto livre, com uma única linha e sem formatação • JTextArea – caixa de texto livre, com múltiplas linhas e sem formatação • JPassowordField – específico para entrada de senhas ou dados sensíveis. • JFormattedTextField – caixa de texto com máscara de entrada.
  • 175. Trabalhando com Caixas, Botões e Campos Construindo GUIs • Campos lblNome = new JLabel("Nome"); lblEmail = new JLabel("Email"); lblNascimento = new JLabel("Nascimento"); lblFone = new JLabel("Fone"); lblEndereco = new JLabel("Endereco"); txtNome = new JTextField(40); txtEmail = new JTextField(35); txtFone = new JTextField(15); txtEndereco = new JTextArea("", 3, 35); // cria-se o elemento de entrada formatada usando um formato pre-definido // atraves da java.text.SimpleDateFormat dateFormater = new SimpleDateFormat("dd/MM/yyyy"); txtNascimento = new JFormattedTextField( dateFormater ); txtNascimento.setColumns( 20 );
  • 176. Estes componentes do SWING, para facilitar a sua construção e serem mais flexíveis, seguem o modelo MVC (Model-View- Controller) Trabalhando com Listas, Combos e Tabelas Construindo GUIs
  • 177. Modelo MVC Trabalhando com Listas, Combos e Tabelas Construindo GUIs A responsabilidade das classes que se comportam como Model, é representar um modelo de dados e garantir o estado desse modelo. A responsabilidade das classes que se comportam como View é prover uma forma de visualização para aquele modelo naquele estado. E o Controller atua como controlador destas escolhas e visualizações.
  • 178. Listas - JList Trabalhando com Listas, Combos e Tabelas Construindo GUIs quando formos manipular objetos dentro de uma lista na tela usaremos: • javax.swing.JList – controlador; • javax.swing.DefaultListModel – modelo; • javax.swing.DefaultListCellRenderer - visualização;
  • 179. Listas - JComboBox Trabalhando com Listas, Combos e Tabelas Construindo GUIs quando formos manipular objetos dentro de uma combo na tela usaremos: • javax.swing.JComboBox – controlador; • javax.swing.DefaultComboBoxModel – modelo; • javax.swing.plaf.basic.BasicComboBoxRenderer - visualização; • javax.swing.plaf.basic.BasicComboBoxEditor - editor;
  • 180. Tabelas - JTable Trabalhando com Listas, Combos e Tabelas Construindo GUIs quando formos manipular objetos dentro de uma tabela na tela usaremos: • javax.swing.JComboBox – controlador; • javax.swing.table.DefaultTableModel – modelo; • javax.swing.table.DefaultTableCellRender - visualização; • javax.swing.DefautCellEditor- editor;
  • 181. Discussão • Qual o melhor processo para se desenhar uma GUI? • No capítulo atual, as GUIs estão restritas á aplicações stand- alone, como fica uma GUI na WEB? • Quando estamos desenhando GUIs não seria melhor pensar em componentes generéricos? Construindo GUIs
  • 183. Tratamento de Eventos para GUIs
  • 184. Agenda • Modelo de Delegação para Tratamento de Eventos • Implementando o Tratamento de Eventos • Tratando Eventos Comuns • Tratando Eventos de Janelas • Tratando Eventos de Botões e Menus • Tratando Eventos de Textos • Tratando Eventos de Combos • Tratando Eventos de Listas • Tratando Eventos de Tabelas • Discussão • Exercícios Tratamento de Eventos para GUIs
  • 185. Modelo de Delegação para Tratamento de Eventos Tratamento de Eventos para GUIs O que é um evento? • Objeto que representa a ação do usuário na GUI • Superclasse dos eventos java.util.EventObject • Categorizada por tipo (Action, Component, Item, Text e outros) • Classes e interfaces do pacote java.awt.event e javax.swing.event;
  • 186. Modelo de Delegação para Tratamento de Eventos Tratamento de Eventos para GUIs Delegando o Tratando de um evento • Criamos uma classe que trata um ou mais tipos de eventos dependendo do tipo de evento escolhido. • Extendemos uma classe java.awt.event.XXXAdapter; • Implementamos uma interface java.awt.event. XXXListener; • Usando um método específico do componente, registramos o tratador do evento ( addXXXListener() ) • Quando o evento for gerado, o objeto XXXEvent será delegado para o objeto tratador registrado pelo listener.
  • 187. Tratamento de Eventos para GUIs import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CanvasPanel extends JFrame { private Canvas areaDesenho; ... public void init() { // registra para o canvas, o listener capaz de tratar // os eventod de movimento do mouse areaDesenho.addMouseMotionListener ( new MouseMotionHandler() ); ... } // por facilidade usamos uma classe interna para definir o tratamento de eventos // Esta classe trata eventos de movimentação do mouse class MouseMotionHandler extends MouseMotionAdapter { // escolhido tratar o evento de movimento arrastar do mouse public void mouseDragged(MouseEvent me) { // recupera o objeto Graphics e desenha no Canvas // de acordo com a posicao do mouse areaDesenho.getGraphics().drawString("*", me.getX(), me.getY() ); } } } Exemplo de implementação usando Adapter
  • 188. Tratamento de Eventos para GUIs import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CanvasPanel2 extends JFrame { private Canvas areaDesenho; public void init() { ... // registra para o canvas, o listener capaz de tratar // os eventod de movimento do mouse areaDesenho.addMouseMotionListener ( new MouseMotionHandler2() ); ... } // por facilidade usamos uma classe interna para definir o tratamento de eventos // Esta classe trata eventos de movimentação do mouse class MouseMotionHandler2 implements MouseMotionListener { public void mouseMoved(MouseEvent me) { // sem implementacao } // escolhido tratar o evento de movimento arrastar do mouse public void mouseDragged(MouseEvent me) { // recupera o objeto Graphics e desenha no Canvas // de acordo com a posicao do mouse areaDesenho.getGraphics().drawString("*", me.getX(), me.getY() ); } } ... } Exemplo de implementação usando Listener
  • 189. Tratando Eventos Comuns Tratamento de Eventos para GUIs Tipos de Eventos • Cada tipo de componente tem um conjunto de eventos associados, para isso devemos pesquisar no componente quais listeners podem ser registrados ( ver métodos JComponent.addXXXListener() ) • O tipos de eventos mais comuns são:
  • 190. Tratando Eventos de Janelas Tratamento de Eventos para GUIs Tipos de Eventos • Podemos associar eventos de Janelas a JFrame, JWindow e JDialog ( ver método JWindow.addWindowListener() ) • O tipos de eventos são:
  • 191. Tratando Eventos de Botões e Menus Tratamento de Eventos para GUIs Tipos de Eventos • Podemos associar eventos de Botões a todas as classes filhas da javax.swing.AbstractButton (ver método AbstractButton.addActionListener() ) • O tipos de eventos são:
  • 192. Tratando Eventos de Botões e Menus Tratamento de Eventos para GUIs Teclas de Atalhos para Menus • Usamos o método JMenuItem.setAccelerator( javax.swing.KeyStroke ); KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK, false); menuItem.setAccelerator( key );
  • 193. Tratando Eventos de Textos Tratamento de Eventos para GUIs Tipos de Eventos • Podemos associar eventos de texto para facilitar a manipulação da entrada de dados (ver método JTextComponent.addActionListener() ) • O tipos de eventos são:
  • 194. Tratando Eventos de Listas Tratamento de Eventos para GUIs Tipos de Eventos • Podemos associar eventos de uma Lista para facilitar a escolha de itens de uma lista (ver método JList.addListSelectionListener() ou addItemListener() ) • O tipos de eventos são:
  • 195. Tratando Eventos de Combos Tratamento de Eventos para GUIs Tipos de Eventos • Podemos associar eventos de um Combo para facilitar a escolha de itens (ver método JComboBox.addActionListener() e addItemListener() ) • O tipos de eventos são:
  • 196. Tratando Eventos de Tabelas Tratamento de Eventos para GUIs Tipos de Eventos • Podemos associar eventos de um Tabela para facilitar a escolha de itens bem como alterar dados do modelo. (ver método JList.addMouseListener(), addListSelectionListener(), DefaultTableModel.addTableModelListener() ) O tipos de eventos são:
  • 197. Discussão • Numa aplicação devemos separar claramente as responsabilidades, em classes de dados (representam o modelo de negócio), classes de serviços (aquelas que acessam recursos, como arquivos, bancos, etc) das classes de GUI? • Porque devemos fazer essa separação? • Significa então que é nas classes de Eventos definidas dentro das GUIs que faremos as chamadas as classes de negócio e classes de serviço? Tratamento de Eventos para GUIs
  • 200. Agenda • Introdução • Trabalhando com Sockets Streams • Codificando um Servidor e um Client • Discussão • Exercícios Programação para Redes
  • 201. Introdução java.net API • Fornece os componentes para a comunicação em Rede; • Suporte a IPV4 e IPV6 • Suporte a TCP (Comunicação Síncrona) e UDP (Comunicação Assíncrona) • Permite a criação de aplicações Client (Se conecta a alguém) e Server (Recebe conexões de alguém) • Pacote java.net Programação para Redes
  • 202. Trabalhando com Socket Streams para TCP Modelo Programação para Redes
  • 203. Trabalhando com Socket Streams para TCP Modelo Programação para Redes Um Server publica uma PORTA num endereço IP usando o ServerSocket Um Client se conecta ao IP do Server na PORTA publicada usando um Socket Nesse momento usa-se objetos de InputStream ou OutputStream para a troca de mensagens
  • 204. Codificando um Servidor e um Client Programação para Redes import java.net.*; import java.io.*; public class SimpleServer { public static void main(String args[]) { ServerSocket s= null; try { s = new ServerSocket(5432); } catch (IOException e) { e.printStackTrace(); } for (;;) { try { Socket s1 = s.accept(); OutputStream s1out = s1.getOutputStream(); DataOutputStream dos = new DataOutputStream(s1out); // Envia a mensagem dos.writeUTF("Hello Net World!"); dos.close(); s1.close(); } catch (IOException e) { e.printStackTrace(); } } } }
  • 205. Codificando um Servidor e um Client Programação para Redes import java.net.*; import java.io.*; public class SimpleClient { public static void main(String args[]) { try { // Endereço IP é Localhost Socket s1 = new Socket("127.0.0.1", 5432); InputStream is = s1.getInputStream(); DataInputStream dis = new DataInputStream(is); // le a mensagem enviada pelo servidor System.out.println(dis.readUTF()); dis.close(); s1.close(); } catch (ConnectException connExc) { System.err.println("Could not connect to the server."); } catch (IOException e) { e.printStackTrace(); } } }
  • 206. Discussão • Que tipos de sistemas, aplicações e programas podemos desenvolver usando a comunicação em rede? • Que tipos de dados podem ser passados pela rede? Depende do Stream usado? • Em aplicações que rodarão em redes heterogêneas, como fica a comunicação e o dados? Programação para Redes
  • 209. Agenda • Introdução • Java Thread API: Classes e Interfaces • Construindo Threads • Manipulando Threads • Máquina de Estados • Controlando Concorrência • Controlando a Execução • Construindo e Executando Timers • Discussão • Exercícios Programação MultiTarefa
  • 210. Introdução O que é MultiTarefa? • Capacidade de executar mais de uma operação ao mesmo tempo (paralelismo) • Em Java, o paralelismo é implementado usando-se Threads. • Usamos Threads, quando desejamos implementar processos paralelos, concorrentes ou automatizados. Programação MultiTarefa
  • 211. Introdução O que são Threads? • São objetos que possuem: • Uma área de dados; • Um trecho de código que será executado; • E utilizam um tempo de CPU (Representada pelo objeto java.lang.Thread); • Prioridade de execução; Programação MultiTarefa
  • 212. Java Thread API: Classe e Interfaces Programação MultiTarefa
  • 213. Java Thread API: Classe e Interfaces Programação MultiTarefa As classes Thread, ThreadGroup e a interface Runnable são usadas quando queremos construir aplicações que manipulem múltiplas execuções em paralelo, e que geralmente tem tempo de execução definido e finito. As classes Timer e TimerTask são usadas quando queremos construir aplicações que manipulem processos e execuções que geralmente tem tempo de execução cíclico e finito.
  • 214. Construindo Threads – especializando a java.lang.Thread Programação MultiTarefa
  • 215. Construindo Threads – especializando a java.lang.Thread Programação MultiTarefa public class ThreadTest { public static void main(String a[]) { MyThread mt = new MyThread(); mt.start(); } } public class MyThread extends Thread { // atributos de instancia // que será usado nesta Thread public void run() { // código que será executado // em paralelo com outras // Threads } }
  • 216. Construindo Threads – implementado a java.lang.Runnable Programação MultiTarefa
  • 217. Construindo Threads – implementado a java.lang.Runnable Programação MultiTarefa public class MyRunnable extends Runnable { // atributos de instancia // que será usado nesta Thread public void run() { // código que será executado // em paralelo com outras // Threads } } public class RunnableTest { public static void main(String a[]) { MyRunnable mr = new MyRunnable (); Thread cpu = new Thread( mr ); cpu.start(); } }
  • 219. Manipulando Threads - Prioridades Programação MultiTarefa Trabalhando com Prioridades
  • 221. Controlando a Concorrência Sincronizando • Quando temos algum atributo de instância de um objeto que é compartilhado por mais de uma Thread, devemos controlar a concorrência do acesso a ele. • Podemos usar o modificador synchronized nos métodos que manipulam o atributo. • Podemos usar um bloco synchronized durante a manipulação do atributo. Programação MultiTarefa
  • 222. Controlando a Concorrência Programação MultiTarefa public class SyncStack { private Stack stack; public SyncStack() { stack = new Stack(); } // método sincronizado public synchronized void put(Object obj) { stack.add( obj ); } public Object get(int index) { Object obj = null; // bloco sincronizado synchronized ( stack ) { obj = stack.get( index ); } return obj; } // método sincronizado public synchronized void clear() { stack.removeAllElements(); } }
  • 223. Controlando a Execução Podemos mudar o estado de uma Thread usando: • Thread.sleep() e outros métodos da classe Thread, entretanto, quando queremos controlar o acesso a um objeto, devemos usar técnica de “Object Locking and Wait”, por ser mais eficiente. Programação MultiTarefa
  • 224. Construindo e executando Timers Programação MultiTarefa Timers • Objetos que executam tarefas agendadas e cíclicas (em ciclos) • Classes: java.util.Timer e java.util.TimerTask
  • 225. Construindo e executando Timers Programação MultiTarefa Criamos uma classe que representa a Tarefa estendendo a java.utl.TimerTask Criamos um Timer, e neste timer, schedulamos (agendamos) a execução a Tarefa
  • 226. Construindo e executando Timers Programação MultiTarefa public class MyTimerTask extends java.util.TimerTask { public void run() { System.out.println ( System.currentTimeMillis() ); } } public class TestMyTimerTask { public static void main(String args[]) throws Exception { MyTimerTask mtt = new MyTimerTask(); java.util.Timer timer = new java.util.Timer(); timer.schedule( mtt, 10, 1000 ); Object obj = new Object(); synchronized( obj ) { obj.wait(); } } }
  • 227. Discussão • Qual a melhor maneira de se especificar um Thread? Estender a classe java.lang.Thread ou implementar a interface java.lang.Runnable? • Nas GUIs usamos as Threads para preencher barras de progresso de acordo com o andamento de um processo, nas aplicações WEB faremos isso? • Quando criamos um servidor que necessita atender mais de um usuário ao mesmo tempo, usaremos os conceitos de Threads? • Usando todos os elementos de Threads (Thread, Monitor, Task, etc), podemos fazer aplicativos complexos e ricos no gerenciamento de processos, que tipos de aplicações são essas? Programação MultiTarefa