o Windows não Consegue Encontrar Null

Preview:

Citation preview

1

Linguagem de Programação

Orientação a Objetos Linguagem Java

UNICEUB

Jorge Farias

Mar/2008

2

Objetivo Geral

• Ao final do curso, o aluno estará desenvolvendo aplicações visuais que podem ser distribuídas pela internet, utilizando os conceitos de orientação a objetos com a linguagem Java.

3

• Utilizar o ambiente de desenvolvimento da linguagem Java.

• Identificar e utilizar os principais componentes da linguagem Java.

• Desenvolver aplicações na linguagem Java.

Objetivos Específicos

4

Principais Tópicos

• Visão geralO ambiente de desenvolvimento JDKCaracterísticas geraisUm programa simplesConvenções

• Estrutura da linguagemComentáriosTipos primitivosOperadoresControle de fluxo

5

Principais Tópicos

• Introdução a Orientação a ObjetosVisão geral de orientação a objetosClassesObjetosCriação de objetos em JavaReferência a membros de objetos e classes

• Manipulação de Array, Integer e StringManipulação de Array, Integer e StringClasse IntegerArrayStringConversão de tiposStringBuffer

6

Principais Tópicos

• Classes e objetosConceitos de orientação a objetosDeclaração de classes e métodosInstanciação e referência a objetos e métodosAbstraçãoEncapsulamentoHerançaTroca de MensagemPolimorfismoSobreposição de métodosSobrecarga de métodos

7

• Classes em Java - tópicos avançadosVectorDados estruturados Classes AbstratasInterfacesClasses Aninhadas ou Internas

• Interfaces gráficas em JavaVisão geral da AWT e SWINGHierarquiaUsando cada um dos seus componentes

Principais Tópicos

8

• AWTUsando Gerenciadores de Layout Escrevendo Manipuladores de Eventos

• Applets

Principais Tópicos

9

1 - Visão Geral

10

O ambiente de desenvolvimento JDK

• Instalar o JDK apropriado para o seu ambiente. A última versão homologada encontra-se em:www.javasoft.com www.java.sun.comwww.sunsoft.com

• Inicializar apropriadamente as variáveis de ambiente. Para a versão j2sdk1.6.0, segue:

SET PATH=C:\J2SDK1.6.0\BIN; %PATH% SET CLASSPATH=J2SDK1.6.0\JRE\LIB\RT.JAR;%CLASSPATH%;.

11

O que é JAVA?

• Uma linguagem de programaçãoÉ o resultado da pesquisa por uma linguagem de

programação que provesse o poder da linguagem C++e a segurança de SmallTalK.

• Um ambiente de desenvolvimento• Uma ambiente para construir aplicações

12

As principais metas

• Criar-se uma linguagem orientada a objeto.• Prover uma ambiente interpretado, por duas

razões:Velocidade de desenvolvimento - elimina o ciclo

compila-linkedita-carrega-testa.Portabilidade do código - um ambiente interpretado

que faz chamadas específicas a nível de sistema operacional, para alguns procedimentos, em tempo de execução.

13

• Eliminar práticas de codificação que afetam a robustez do código:Aritmética de ponteirosAlocação e desalocação de memória

• Prover um maneira do programa executar mais de “thread de atividade” ao mesmo tempo.

As principais metas – cont.

14

Possui as características:

• SimplicidadeSintaxe do C++, mas:

• Não possui herança múltipla.

• Faz coleta automática de lixo em memória (“Garbage collection”)

Linguagem “enxuta”• Interpretador e biblioteca padrão pequenos

• Programação em máquinas pequenas

15

Tecnologia de Objetos

Estado

Var1

Var2

Var3

Var4

Comportamento

Met1

Met3 Met4

Met2

Mensagem

Mensagem

Mensagem

• Interfaces bem definidas

• Reusabilidade

16

Suporte a Redes

TCP/IP

HTTP

FTP

URL

• Bibliotecas padronizadas com suporte para protocolos

• Facilidade de interconexão

• Fácil acesso a recursos remotos

17

Linguagem Robusta e Segura

• Tipagem estáticaTipagem estáticaVerificação em tempo de compilação

• Avançado modelo de referênciasAvançado modelo de referênciasNão existe manipulação direta de ponteirosElimina invasão indevida de área de memória

• Programação distribuídaProgramação distribuídaTécnicas de autenticação via encriptação

18

Heterogeneidade

Bytecode

CódigoFonte

Máquina virtual JAVA

Compilação

Interpretação

19

Programação Concorrente

• Múltiplas linhas de controle

• Máquinas paralelas• paralelismo

• Máquinas convencionais• concorrência

• Primitivas de sincronização

Processo

Linhas de controle

20

• A máquina virtual Java (JVM)É uma máquina imaginária que é implementada

pela emulação de um software sobre uma máquina real.

Prover uma especificação de plataforma de hardware no qual todos os códigos java são compilados. Essa especificação torna os programas java independente de plataforma porque toda compilação é feita para uma máquina imaginária.

A arquitetura Java

21

A arquitetura Java

• O coletor de lixo (“Garbage Collector”)É um processo executado em background a nível de

sistema operacional que registra toda memória alocada e mantém um contagem do número de referências para cada ponto da memória.

A JVM (“thread” em background) de tempos em tempos verifica se há na memória alguma referência com valor 0, procedendo então a desalocação da mesma.

22

A arquitetura Java

• Segurança do códigoOs programas javas são convertidos de código

fonte para um conjunto de código binário (byte code).

Em tempo de execução, os códigos binários são carregados, checados e executados pelo interpretador. O interpretador possui dois serviços: Executar o código binário; Fazer as chamadas apropriadas ao sistema

operacional para o hardware em uso.

23

Segurança do código

Em alguns ambientes de execução do java, uma porção do código binário verificado são compiladas para código nativo da máquina e é executado diretamente no hardware da plataforma alvo (JIT).

Nota: Todas os arquivos classe que são importados da internet são verificados pelo verificador de código binário.

24

Segurança do código

• O que é verificado?Teste quanto ao formato dos fragmentos do

código binário.Aplicado provas de teoremas para checar a

legalidade do código quanto a:• códigos que corrompem ponteiros;

• violação dos direitos de acesso a objetos;

• mudanças em tipos de objetos ou classes.

25

javac Hello.java

Hello.class

Compile Carregadorde Classe

Verificador do

Bytecode

JITGerador de

código

Interpretador

Runtime

Hardware

Runtime

O ambiente de programa java,onde podemos ver como javaforça a segurança do código

26

A Plataforma Java

• javac

• javadoc

• java

• appletviewer

Http://www.javasoft.com

O JDK pode ser copiado de:

27

A Plataforma Java

Sua classe.java

Byte code gerado.class

Sua aplicaçãoJava

Documentação HTML da classe

Código HTML

Sua applet Java

javac

javadoc

aplletviewer

java

referenciadono

28

Meu Primeiro Programa

// Comentario de uma linha

public class HelloInternet { public static void main (String args[]) { System.out.println("Hello Internet!"); }}

29

Compilando um programa

• Certifique-se de ter adicionado a sua lista de path’s o path do compilador e interpretador Java, Javac e Java respectivamente.

• Crie o arquivo ao lado em um diretório qualquer e salve com o nome: HelloInternet.Java

• Chame o compilador Java para este arquivo: Javac HelloInternet.Java

• Seu diretório deve ter recebido um novo arquivo após essa compilação: HelloInternet.class

• Chame o interpretador Java para este arquivo (omita a extensão .class de arquivo): Java HelloInternet

• Observe o resultado na tela: Hello Internet!

30

//Comentário de uma linha

Comentários em Java seguem a mesma sintaxe de C++, “//” inicia uma linha de comentário, todo o restante da linha é ignorado. Existe também um outro tipo de comentário formado por /* Insira aqui o texto a ser ignorado */ , este tipo de comentário pode ser intercalado em uma linha de código. Comentários são tratados como espaços em branco.

31

public class HelloInternet

• class é a palavra reservada que marca o inicio da declaração de uma classe.

• public é um especificador, por enquanto guarde public class como o início da declaração de uma classe. Toda classes serão declaradas assim por enquanto.

32

HelloInternet

• É o nome dado a esta classe. O “abre chaves” marca o início das declarações da classe que são os atributos e métodos. Esta classe só possui uma declaração, a do método main, note que um método, ao contrário de C++, só pode ser declarado {internamente} a classe a qual pertence, evitando as confusões sobre “escopo”. Desta forma, todo pedaço de código em Java deve pertencer ao abre chaves, fecha chaves da definição de uma classe.

33

public static void main (String args[]){ System.out.println("Hello Internet!");}

O trecho do programa

public:

É um qualificador do método que indica que este é acessível externamente a esta classe (para outras classes que eventualmente seriam criadas), não se preocupe com ele agora, apenas declare todos os métodos como public

34

static

• É um outro qualificador ou “specifier”, que indica que o método deve ser compartilhado por todos os objetos que são criados a partir desta classe.

• Os métodos static podem ser invocados, mesmo quando não foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe: <NomeClasse>.<NomemetodoStatic>(argumentos);. Retornaremos a esta explicação mais tarde, por hora você precisa saber que particularmente o método main precisa ter essa qualificação porque ele é chamado sem que se crie nenhum objeto de sua classe (a classe HelloInternet).

35

void

• Semelhante ao void C++ ou C, é o valor de retorno da função, quando a função não retorna nenhum valor ela retorna void, uma espécie de valor vazio que tem que ser especificado.

36

main

• Este é um nome particular de método que indica para o compilador o início do programa;

• É dentro deste método e através das iterações entre os atributos, variáveis e argumentos visíveis nele que o programa se desenvolve.

37

(String args[])

• É o argumento do método main e por consequência do programa todo, ele é um vetor de Strings que é formado quando são passados ou não argumentos através da invocação do nome do programa na linha de comando do sistema operacional, exemplo:Java HelloInternet argumentotexto1 argumentotexto2

38

{ ... }

• “Abre chaves” e “fecha chaves”. Para quem não conhece C ou C++, eles podem ser entendidos como algo semelhante ao BEGIN END de Pascal, ou seja: delimitam um bloco de código.

39

System.out.println("Hello Internet!");

• Chamada do método println para o atributo out da classe System, o argumento é uma constante do tipo String para imprimir a cadeia “Hello Internet!” e posicionar o cursor na linha abaixo.

• Por hora guardar esta linha de código como o comando para imprimir mensagens na tela, onde o argumento que vem entre aspas é a String a ser impressa.

40

Exibindo a saída em uma janela ou caixa de diálogo

• Utilizando a classe JOptionPane do pacote swing.

Barra de título

O botão OK permite o usuáriofechar a caixa de diálogo

A região reservadaao diálogo de mensagem

Ícone apropriado

41

Tipos de diálogo de mensagem

JOptionPane.ERROR_MESSAGE

JOptionPane.INFORMATION_ MESSAGE

JOptionPane.WARNING_MESSAGE

JOptionPane.QUESTION_MESSAGE

JOptionPane.PLAIN_MESSAGE

Exibe um diálogo que indica um erro.

Exibe um diálogo informacional.

Exibe um diálogo de advertência.

Exibe um diálogo que impõe uma pergunta ao usuário. Em botões Yes ou NO.

Exibe um diálogo somente com mensagem.

i

!

?

Sem ícone

Tipo Ícone Descrição

42

Primeiro programa gráfico

• O código fonte:

import javax.swing.JOptionPane;

public class HelloInternetGrafico

{

public static void main (String [] args)

{

JOptionPane.showMessageDialog(null,

"Hello Internet gráfico!",

"Primeiro Programa Gráfico",

JOptionPane.INFORMATION_MESSAGE);

System.exit(0);

}

}

43

Primeiro programa gráfico - cont.

• O resultado:

44

Convenções

• Variáveis e métodos iniciam com letras minúsculas.

• Classes iniciam com letras maiúsculas

• Nome composto: utilizar letras maiúsculas para as iniciais das palavras que seguem a primeira

• Letras maiúsculas para as constantes

45

2 - Estrutura da Linguagem

46

Estrutura da linguagem

Comentários

Tipos primitivos

Operadores

Controle de fluxo

47

Comentários

• Há três formas de inserir comentários:// comentários em uma linha/* comentários em uma ou mais linhas *//** documentando comentários */

quando colocado Imediatamente antes da declaração (de uma função ou variável), indica que o comentário poderá ser incluído automaticamente em uma página html (gerado pelo comando javadoc).

48

Descritores do javadoc

@param <nome> <Descrição do parâmetro>

Obs.: (incluir uma descrição para cada parâmetro)

@return <Descrição do retorno>

@exception <nome> <Descrição da exceção lançada pelo método>

@see <nome do hipertexto a ser relacionado>

@since <indicar a versão da inclusão deste membro>

49

Exemplo de javadoc

/*** Programa para exemplificar o javadoc.*/

public class HelloInternet {/*** Método <code>main</code>. Determina o início da execução.* @param args Recebe um array de elementos do tipo String que * será passado na linha de comando.*/ public static void main (String args[]) { System.out.println("Hello Internet!"); }}

50

Ponto-e-vírgula, blocos e espaço em branco

• Os comandos são terminados com ponto-e-vírgula.

• Um bloco é delimitado por chaves - { e } e constitui um comando composto.

• O espaço em branco é permitido entre elementos do código fonte, em qualquer lugar e em qualquer quantidade. São considerados espaço em branco o espaço, o tab (\t) e mudança de linha (\n).

{

int x;

x = 23 * 54;

}

51

Identificadores

• O identificador começa com uma letra, hífen-caixa-baixa ( _ ), ou símbolo dólar ($). Os subsequentes caracteres podem conter dígitos. Caracteres maiúsculo e minúsculo são diferentes e não tem tamanho máximo. Identificadores válidos:• identifier • userName • User_name• userName • _sys_var1 • $change

• Utilizar somente caracteres ascii (porque o unicode pode suportar caracteres diferentes com a mesma representação), não utilizar palavra reservada e evitar nome iniciados com $ (por causa das variáveis de ambiente do Sistema Operacional).

52

Palavras reservadas

abstract do implements private throwboolean double import protected throwsbreak else instanceof public transientbyte extends int return truecase false interface short trycatch final long static voidchar finally native super volatileclass float new switch whilecontinue for null synchronizeddefault if package this

Nota: atualmente as seguintes palavras reservadas não são utilizadas: cast, const, future, generic, goto, inner, operator, outer, rest, var.

53

Tipos Primitivos

Tipo Tamanho Valor Mín Valor MáxWrapper boolean 1-bit – – Booleanchar 16-bit Unicode 0 Unicode216- 1 Characterbyte 8-bit -128 +127 Byteshort 16-bit -215 +215 – 1Shortint 32-bit -231 +231 – 1Integerlong 64-bit -263 +263 – 1Longfloat 32-bit IEEE754 IEEE754 Floatdouble 64-bit IEEE754 IEEE754Doublevoid – – – Void

54

Declaração de variáveis e constantes

int x, y; // declarando variáveis inteirasx = 6;y=1000; // atribuindo valores a variável

float z = 3.414f; // ponto flutuantedouble w = 3.1415; // declarando e atribuindo double

boolean truth = true; // booleano

char c; // declarando variável caracter

c = ‘A’; // atribuindo um valor char

final int MAX = 2; // Constantesfinal int CONSTANTE;CONSTANTE = 1; // somente admite uma atribuição

55

Operadores Aritméticos

Operador Uso Descrição

+ op1 + op2 Retorna a soma de op1 e op2.- op1 - op2 Retorna a subtração de op1 por op2.* op1 * op2 Retorna a multiplicação de op1

por op2./ op1 / op2 Retorna a divisão de op1 por

op2.% op1 % op2 Retorna o resto da divisão de

op1 por op2.

56

Operadores Aritméticos

Operador Uso Descrição

+ +op Promove op para int, se for byte, short ou char.

- -op Retorna op aritmeticamente negado.++ op++ Retorna o valor de op, depois o

incrementa de 1.++ ++op Incrementa op de 1,depois retorna

o valor.-- op-- Retorna o valor de op, depois o

decrementa de 1.-- --op Decrementa op de 1,depois retorna

o valor.

57

Operadores Relacionais

Operador Uso Retorna verdadeiro se

> op1 > op2 op1 for maior que op2.>= op1 >= op2 op1 for maior que ou igual ao

op2.< op1 < op2 op1 for menor que op2.<= op1 <= op2 op1 for menor que ou igual ao

op2.== op1 == op2 op1 igual ao op2.!= op1 != op2 op1 diferente do op2.

58

Operadores Lógicos

Operador Uso Retorna verdadeiro se

&& op1 && op2 op1 e op2 forem true. Só avalia op2, se op1 for true.|| op1 || op2 op1 ou op2 for true (ou

ambos).Só avalia op2, se op1 for false.

! ! op op for false.& op1 & op2 op1 e op2 forem true. Sempre avalia op1 e op2.| op1 | op2 op1 ou op2 for true (ou ambos).

Sempre avalia op1 e op2.!= op1 != op2 op1 diferente do op2.

59

Controle de Fluxo

Categoria Comandodecisão if-else, switch-caseloop for, while, do-whilediversos break, continue, label: , return

60

Controle de Fluxo - if

if (expressão booleana)comando ou bloco

elsecomando ou bloco

61

Exemplo de uso - if

public class UsoIF { public static void main (String args[]) { int a = 10;

int b = 20; int c;

if (a > b) c = a; else c = b; System.out.println("O maior valor = " + c); }}

62

Controle de Fluxo - while

while (expressão booleana)comando ou bloco

docomando ou bloco

while(expressão booleana);

63

Exemplo de uso - while

public class UsoWhile

{

public static void main (String args[])

{

int i = 0;

while (i < 11)

{

if ( (i % 2) == 0)

{

System.out.println("Número " + i + " e' par !");

}

i = i + 1;

}

}

}

64

Exemplo de uso - do whilepublic class UsoDoWhile

{

public static void main (String args[])

{

int i = 0;

do

{

if ( (i % 2) == 0)

{

System.out.println("Número " + i + " e' par !");

}

i = i + 1;

}

while (i < 11);

}

}

65

Controle de Fluxo - for

for (expressão inicial; expressão booleana; expressão de iteração)comando ou bloco

expressão inicial; while (expressão booleana){

comando ou blocoexpressão de iteração;

}

66

Exemplo de uso - for

public class UsoFor{ public static void main(String[] args) { for (int i=1;i<=15;i++)

{ System.out.println ("O quadrado de "

+ i + " = " + i * i ); }

}}

67

Controle de Fluxo - switch

switch (expressão1){case expressão2:

comando ou blocobreak;

. . .case expressãon:

comando ou blocobreak;

default:comando ou blocobreak;

}

68

Exemplo de uso - switchpublic class UsoSwitch{ public static void main (String args[]) { for (int i = 1; i<5; i++) { switch (i) { case 1: System.out.println ("Numero UM"); break; case 2: System.out.println ("Numero DOIS"); break; case 3: System.out.println ("Numero TRES"); break; default: System.out.println ("NUMERO INVALIDO"); }

} } }

69

Exercícios

2.1- Crie uma classe java com o nome “ValorChar” que mostre na tela os caracteres correspondentes aos números de 32 a 256.

Dica para resolução: utilize a seguinte notação para transformar um int em char: (char) valorInteiro (por enquanto não se preocupe com o significado desta notação, ela será abordada mais tarde).

70

3 - Introdução a Orientação a Objetos

71

Orientação a Objetos

• Componentes:ObjetosClasses

Conceitos a serem abordados:

72

Orientação a Objetos

• Propósitos da Programação Orientada a ObjetosProver mecanismos para visualizar a complexidade do

desenvolvimento de software da mesma forma que visualizamos a complexidade do mundo real;

Acelerar o desenvolvimento de softwares com base na modularidade e acoplamento;

Melhorar a qualidade do software desenvolvido.

73

Classes - conceitos

• definem a estrutura e o comportamento de um tipo de objeto;

• atuam como templates;• permitem a instanciação de um ou

mais objetos de um mesmo tipo.

Nome

Atributos

Métodos

74

Classes

Visão do mundo real:• moldes para criação de objetos;• especificam propriedades e ações em comum a todos seus objetos.

Classe

Automóvel

75

Classes

Um protótipo que define os atributos e os métodos comuns a todos objetos de um determinado tipo e da própria classe, com a finalidade de servir como molde para a criação de objetos.

Classes - Visão em POO:

Classe

Objetos

Joaquim José Maria

Empregado

76

Objetos - conceitos

• Objeto é uma representação abstrata de uma entidade do mundo real, que tem um identificador único, propriedades embutidas e a habilidade de interagir com outros objetos e consigo mesmo.

• Estado do objeto é um conjunto de valores que os atributos do objeto podem ter em um determinado instante do tempo.

77

Objetos

Visão do mundo real:• Na nossa vida, estamos cercados por objetos.

78

Objetos

Um conjunto distinto de atributos e métodos que representam entidades do mundo real, implementados por software e gerados (instanciados) através de classes.

Visão em POO:

AtributosMétodos

Métodos

Métodos

Métodos

79

Criando Objetos em Java

• Objetos são criados através da declaração new, seguida de um método construtor. Exemplo:

Automovel gol = new Automovel(); • Uma classe pode ter construtores especializados ou

somente o construtor default (gerado pelo compilador); • Um construtor recebe sempre o mesmo nome da sua

classe;• O método construtor gera uma instância do objeto em

memória e o seu código é executado imediatamente após a criação do objeto provendo-lhe um estado inicial;

80

Criando Objetos em Java - cont.

• Valores de parâmetros são passados no momento da criação;

• Quando declaramos variáveis de qualquer tipo primitivo (boolean, byte, short, char, int, long, float, ou double) o espaço em memória (na área de dados) é alocado como parte da operação;

• A declaração de uma variável referência a um objeto não aloca espaço em memória;

• A alocação de memória (no heap) é feita somente quando o objeto é criado.

81

Criando Objetos em Java - cont.

• Considere o exemplo abaixo:Automovel gol;

gol = new Automovel();

• O primeiro comando, a declaração, aloca apenas o espaço suficiente para a referência. O segundo, aloca o espaço para os atributos do objeto gol.

• Somente após a criação do objeto é que seus membros (atributos e métodos) podem ser referenciados.

82

Criando objetos - cont

• Alocação e layoutNo corpo do método, a declaração

Automovel gol aloca espaço somente para a referência:

O comando new Automovel() aloca e inicializa o espaço:

String modelo

String cor

int ano

????????

?

?

0

gol

83

Criando objetos - cont

• Alocação e layoutFinalmente, atribuindo a variável referência o

endereço do objeto alocado.

gol = new Automovel();

gol

String modelo

String cor

int ano

?

?

0

0x01abdfe

84

Exemplopublic class Automovel{ String modelo,cor; int ano; boolean estadoMotor = false; public void ligaMotor() { estadoMotor = true; } public void informaDados() { String motorString; if (estadoMotor){

motorString = " ligado";}else{ motorString = " desligado";}

System.out.println("Automovel:" + modelo + " " + ano + " " + cor + motorString); }}

85

Exemplo - cont.public class AgenciaAutomoveis{ public static void main(String args[]) { // Criando os objetos (instancias) da classe

Automovel: Automovel fusca = new Automovel(); Automovel gol = new Automovel();

fusca.modelo = "Fusca"; fusca.cor = "Preto"; fusca.ano = 69; gol.modelo = "Gol"; gol.cor = "Vermelho"; gol.ano = 96; // Ligando o motor de um automoveis: fusca.ligaMotor(); // Mostrando informações dos automóvel fusca.informaDados();

gol.informaDados(); }}

86

Atributos

• propriedades associadas a uma classe e seus objetos;

• atributos armazenam resultados do processamento feito pelos métodos da classe.

• Nome • Cor do pêlo• Idade

atributos do objeto

• Número de patas

atributos da classe (estáticos)

instância

87

Exemplopublic class Canil{ public static void main(String args[]) { Cachorro rex = new Cachorro(); rex.nome = "Rex"; rex.idade = 2; rex.corDoPelo = "Marrom"; System.out.println("Todo cachorro tem " + Cachorro.NUMERODEPATAS + " patas"); System.out.println("O cachorro "+ rex.nome + " tem pêlo de cor:" + rex.corDoPelo); }}class Cachorro{ // Atributos da classe Cachorro public static final int NUMERODEPATAS = 4; // Atributos do objeto (criados quando o objeto é instanciando) public String nome; public int idade; public String corDoPelo;}

88

Métodos

• Operações que manipulam o estado do objeto.

• Podem fazer parte da interface do objeto ou realizar uma função interna.

• acender• apagar• indicarVoltagem

MétodosClasse: LâmpadaObjeto: philips60w

89

Referência a Membros de Objetos e Classes

• Resgatar o resultado é opcional

• Os parâmetros, quando existentes, são posicionais e são tipados

• Número de parâmetros é verificado em tempo de compilação

< resultado = referência.método( parâmetros )>Método

fusca.ligaMotor();

< referência.variável>Variável

fusca.ano = 69;

90

Retornando valor em métodos

• Na definição do nome do método deve ser indicado se haverá ou não o retorno de valores.– Com retorno de valores:

public int quadrado (int y)

{

return y * y;

}

– sem retorno de valores: public void setValor (int y)

{

valor = y;

}

91

Membros Estáticos

• Acessíveis através de uma instância ou diretamente através da classe

• Campos estáticos– Uma única variável cujo o valor é compartilhado por

todos os objetos da classe

– Comparáveis à variáveis globais

• Métodos estáticos– Tarefas que envolvem um conjunto dos objetos

– Podem fazer acesso somente a membros estáticos

92

Dados Estáticos

• Os dados estáticos relativos a classe são únicos para todos os objetos da classe. Funciona de forma análogo a uma variável global.– No exemplo a seguir a variável totalempregados guarda

o numero total de empregados e não é associada a UM empregado específico.

93

Exemplo: dados estáticosclass Empregado { String nome; int matricula; static int totalEmpregados=0; Empregado (String nm, int mat) { matricula = mat; nome = nm; }}public class Empresa { public static void main(String args[]) { Empregado novoEmpregado = new Empregado(“Adail”, 123); System.out.println(Empregado.totalEmpregados); Empregado.totalEmpregados++; System.out.println(Empregado.totalEmpregados); }}

94

Métodos Estáticos = métodos da classe

• Da mesma forma como há dados que pertencem a uma classe como um todo, também existem métodos estáticos, que, em vez de serem aplicados a um objeto individual, executam operações que afetam a classe inteira

• Métodos estáticos não podem acessar os dados de instâncias

• Métodos estáticos só podem acessar diretamente campos estáticos

95

Exemplo: métodos estáticosclass Empregado { String nome; int matricula; static int totalEmpregados; public Empregado (String nome, int matricula) {...} static void abreEmpresa() {

Empregado.totalEmpregados=0; }}public class Empresa{ public static void main(String args[]) { Empregado.abreEmpresa(); Empregado = new Empregado (“Adail”, 123); System.out.println(Empregado.totalEmpregados); Empregado.totalEmpregados++; System.out.println(Empregado.totalEmpregados); }}

96

Exercício

3.1 – Uma classe de nome Triangulo, possui os atributos: base e altura do tipo inteiro. E os métodos:public void setBase (int b);public void setAltura (int a);public int getArea();

Sabe-se que o cálculo da área do triângulo é: área = base * altura / 2. Logo, implemente em java um programa que mostra a área de um triângulo de base igual 20 e altura igual a 12;

97

4 - Manipulação de Array, 4 - Manipulação de Array, Integer e StringInteger e String

98

O pacote lang e util

Classe Integer

Array

Classe String

Classe StringBuffer

Classe StringTokenizer

99

Integer

• Um objeto do tipo Integer contém uma variável do tipo int.

Construtor OperaçãoInteger(int value) Constrói um novo objeto Integer contendo

o valor inteiro do argumento.

Integer(String s) Constrói um novo objeto Integer contendo o valor inteiro do argumento convertido

em int.

Constantes Valor

static int MAX_VALUE O maior valor do tipo int.

static int MIN_VALUE O menor valor do tipo int.

100

Alguns métodos da classe Integer

Métodos

byte byteValue( ) : retorna o valor do Integer como byte.

short shortValue( ) : retorna o valor do Integer como short.

int intValue( ) : retorna o valor do Integer como int.

long longValue( ) : retorna o valor do Integer como long.

float floatValue( ) : retorna o seu valor como float.

101

Alguns métodos da classe Integer - cont.

Métodosint compareTo(Integer outroInteger) : compara dois objetos

inteiros numericamente. Se o resultado for 0, então os dois objejtos são iguais. Se o resultado for maior que zero então o objeto é maior que o do argumento. Se o resultado menor que zero então o objeto é menor que o do argumento.

static int parseInt(String s) : retorna o valor do String s como int.

String toString( ) : retorna o seu valor como String.

static String toString(int i ) : retorna uma String do valor inteiro i.

102

Exercício

4.1 - Faça um programa para exibir o maior e o menor valor inteiro que pode ser armazenado em um objeto Integer.

103

Array

• Seguro:- Controle de acesso fora do limite- Controle de inicialização

• Exemplos:int[] array1;

int array2[];int[] array3 = {1, 2, 3};

int array4[] = array3;int[] array5 = new int[5];

• Primeiro elemento: índice 0• Constante length:

array3.length 3array5.length 5

104

Array - cont• Array retangular com múltiplas dimensões:

int[][] array6 = {{1,2},{3,4},{5,5}};int[][] array7 = new int[3][2];

• Constante length:array6.length 3array6[0].length 2

• Array não retangular com múltiplas dimensões:int[][] array8 = {{1,2,3},{3,4},{5}};int[][] array9 = new int[3][];

array9[0] = new int[3];array9[1] = new int[2];array9[2] = new int[1];

• Constante length:array9.length 3array9[0].length 3array9[1].length 2array9[2].length 1

105

public class Arrays { public static void main(String[] args) { int[] array1 = { 1, 2, 3, 4, 5 }; int[] array2; array2 = array1; for(int i = 0; i < array2.length; i++) array2[i]++; for(int i = 0; i < array1.length; i++) System.out.println("array1["+i+ "] = "+array1[i]); }}

Exemplo de uso - array

106

Exercícios

4.2 - Crie uma classe Java (arquivo ExercicioArray1.java) que contenha um método que receba um array do tipo int, calcule o somatório destes elementos e mostre o valor encontrado na saída padrão.

4.3 -Na mesma classe anterior, crie outro método com a mesma funcionalidade da classe anterior, sendo que o array recebido tenha elementos do tipo Integer.

107

Exercícios - cont.

4.4 - Crie uma classe Java (ExercicioArray2.java) que contenha como atributo um array bidimensional contendo informações sobre países e seus estados. Esta classe conterá um método que retorna um array dos estados do país informado como parâmetro. Crie outra classe que recebe da linha de comando um nome de país (ou JOptionPane) e que, a partir da classe ExercicioArray2, liste seus estados.

108

A classe String representa uma seqüência de literais (tipo char).

String str = "abc";

char data[] = {'a', 'b', 'c'};

String str = new String(data);

String

109

String

Construtor

String() : aloca um novo objeto String com nenhum caracter.

String(String value) : aloca um novo objeto String com o mesmo conteúdo do objeto String de argumento.

String(char value[]) : aloca um novo objeto String contendo a mesma sequência de caracteres do array de caracteres de argumento.

String(StringBuffer value) : aloca um novo objeto String com o mesmo conteúdo do objeto StringBuffer de argumento.

110

String

Construtor

String(byte[] bytes, int offset, int length) : constrói uma nova String pela decodificação do array de bytes usando os caracteres padrões da plataforma alvo.

String(byte[] bytes, String charsetName) : constrói uma nova String pela decodificação do array de bytes usando os caracteres de um charset específico.

String(char[] value, int offset, int count) : aloca uma nova String que contém os caracteres do array de caracteres.

111

String

Métodos

char charAt(int Index) : recupera o caracter na posição informada.

String concat(String str) : concatena a string do parâmetro ao final desta string.

boolean contentEquals(StringBuffer sb) : retorna verdadeiro se e somente se essa string representa a mesma seqüência de caracteres do stringbuffer passado como parâmetro.

boolean endsWith(String s) : retorna um boleano indicando se o objeto string termina ou não com o string de argumento.

boolean equals(String val) : testa a igualdade do conteúdo de dois strings.

112

StringMétodos

boolean equalsIgnoreCase(String s) : testa igualdade do conteúdo de dois string, considerando maiúscula e minúscula iguais.

int indexOf(char c) : retorna o índice da 1ª ocorrência de c ou -1 se o argumento não foi encontrado.

int length( ) : retorna o número de caracteres do string.

int lastIndexOf(char c) : procura do fim para o começo.

String replace(char oldChar, char newChar) : retorna uma nova string resultante da atualização de todas as ocorrências do oldChar nesta string pelo newChar.

113

String

Métodos

String replaceFirst(String regex, String replacement) : atualiza a primeira substring nesta string anterior a expressão regular que seja igual a string passada no parâmetro.

String [] split(String regex) : quebra a string em várias substring que esteja delimitada pela expressão regular dada. Retorna um array de string.

Ex: a string "boo:and:foo”:

Regex Resultado

: { "boo", "and", "foo" }

o { "b", "", ":and:f" }

114

String

Métodos

boolean startsWith(String s) : retorna um boleano indicando se o objeto string começa ou não com o string do argumento.

String substring(int inic, fim ) : retorna um novo objeto string contendo o conjunto de caracteres especificado (inic .. fim-1).

char [] toCharArray( ) : retorna um array dos caracteres do string.

String trim( ) :retorna um novo objeto string sem espaços no início e fim.

115

Concatenação de objetos do tipo String: "+"

String str1 = "Hello";

str1 = str1 + " World";

str1 aponta para um novo objeto String com valor: "Hello World".

String

116

public class TesteString

{

public static void main(String args[])

{

String str1 = "Hello";

String str2 = str1;

str2 = str2 + " world!";

System.out.println("str1 = " + str1);

System.out.println("str2 = " + str2);

}

}

String

117

String

• Observação:

todos os objetos em Java são herança da classe Object e nesta classe possui o método toString, uma conversão para String pode ser obtida através da utilização deste método.

118

Exercícios

4.5 - Crie uma classe java com o nome “Extremos” que receba parâmetros da linha de comando e mostre em seguida qual destes é o maior e qual o menor.

Dica para resolução: utilize a seguinte notação para receber um int relativo ao tamanho da String de posição n do array args (por enquanto não se preocupe com o significado desta notação, ela será abordada mais tarde): args[n].length( ) Atenção: cuidado para não confundir o atributo length de um array com o método length( ) de uma String.

119

Exercícios - cont.

4.6 - Crie uma classe em Java que recebe um objeto String e retorna um objeto String com os valores de entrada na forma invertida.

4.7 - Crie uma classe Java (arquivo Utilitario.java) que contenha um método que receba uma String no formato campo1;campo2; (ex.:Janeiro;Fevereiro;Março;) e retorne um array de Strings contendo os campos da String de origem dentro deste array.

4.8 - Crie, na mesma classe anterior, outro método com a funcionalidade inversa, isto é, recebe um array de Strings e retorna este como uma String com os campos em sequência, separados por “;”

120

Conversão de tipos

Conversão: int para String

int i = 10;

Integer intObj = new Integer(i);

String str1 = intObj.toString();

121

Conversão de tipos - cont.

Conversão: String para int

String str = “10”;

Integer intObj = new Integer(str);

int i = intObj.intValue();

ou

String str = “10”;

int i = Integer.parseInt(str);

122

Entrada de dados via janela ou caixa de diálogo

• Utilizando a classe JOptionPane do pacote swing.

Barra de título

O botão OK permite o usuárioinformar valor e Cancel retorna null

A região reservadapara entrada de dados

Ícone apropriado

123

Exemplo de entrada de dados em janela gráfica

import javax.swing.JOptionPane;public class TesteInput{ public static void main (String [] args) { String valor;

valor = JOptionPane.showInputDialog(null, "Informe o valor!",

"Input dialog", JOptionPane.QUESTION_MESSAGE);

System.out.println("O valor : " + valor); System.exit(0); }}

124

• String: seqüência imutável de caracteres de comprimento fixo.

Alteração cria novo objeto

• StringBuffer: seqüência de caracteres de tamanho variável.

Alteração no mesmo objeto

StringBuffer

125

StringBuffer

Construtor Operação

StringBuffer() Aloca um novo objeto StringBuffer com nenhum caracter e uma capacidade inicial de 16 caracteres.

StringBuffer(int length) Aloca um novo objeto StringBuffer com nenhum caracter e a capacidade inicial do argumento.

StringBuffer(String s) Aloca um novo objeto String com o mesmo conteúdo do objeto String de argumento.

126

StringBuffer

Métodos

StringBuffer append(String s) : String é concatenado no final do StringBuffer, aumentando o seu tamanho, se necessário.

StringBuffer append(Object obj),StringBuffer append(char str[]), StringBuffer append(int i), StringBuffer append(long l),

StringBuffer append(double d) :o argumento é convertido para String e concatenado no final do StringBuffer, aumentando o seu tamanho quando necessário.

char charAt(int i) :retorna o caracter (char) na posição indicada.

127

StringBuffer

Métodos

StringBuffer insert(int i, String s) : insere o string na posição indicada.

int length( ) : retorna o número de caracteres do stringbuffer.

void setCharAt(int i, char c) :modifica o valor na posição indicada.

void setLength(int i) : trunca ou expande o stringbuffer. Na expansão preenche os novos espaços com valor nulo.

String toString( ) : cria um objeto string a partir deste stringbuffer.

128

public class TesteStringBuffer{

public static void main(String args[ ]){

StringBuffer strB1 = new StringBuffer(); strB1 = strB1.append("Hello"); StringBuffer strB2 = strB1; strB1 = strB1.append(" World").append("!"); StringBuffer strB3 = new StringBuffer("Hello"); strB3.append(" world!"); System.out.println("strB1 = " + strB1); System.out.println("strB2 = " + strB2); System.out.println("strB3 = " + strB3);

String str1 = strB1.append(" Again") .append("!").toString() + " abc"; System.out.println("str1 = " + str1); } }

StringBuffer

129

Exercícios4.9 - Crie uma classe Java (arquivo Utilitario.java) que contenha um método que receba uma StringBuffer no formato campo1;campo2 (ex.:Janeiro;Fevereiro;Março) e retorne um array de Strings contendo os campos da String de origem dentro deste array.

4.10 - Crie, na mesma classe anterior, outro método com a funcionalidade inversa, isto é, recebe um array de Strings e retorna este como uma StringBuffer com os campos em sequência, separados por “;” .

4.11 - Crie uma classe Java que recebe uma String contendo um nome e retorna um StringBuffer contendo o nome alterado para o formato ABNT. Ex.: José Luiz Ferreira -> Ferreira, J.L.

130

StringTokenizer

• Esta classe permite quebra uma string em tokens.• Os delimitadores de tokens default são " \t\n\r\f”,

que são os caracteres: barra de branco, a tabulação, o newline, o

carriage-return e o form-feed. Os delimitadores não são tratados como sendo tokens. – P.ex: os tokens da string “onde está meu cão”.

São “onde”, “esta”, “meu” e “cão”.

131

StringTokenizer

Construtor

StringTokenizer(String str): constrói uma StringTokenizer para uma String específica.

StringTokenizer(String str, String delim) : constrói uma StringTokenizer para uma String específica usando a lista de delimitadores do parâmetro.

StringTokenizer(String str, String delim,

boolean returnDelims) : constrói uma StringTokenizer para uma String específica usando a lista de delimitadores do parâmetro. Podendo ou não o delimitador ser considerado como um token dependendo do valor do parâmetro returnDelims.

132

StringTokenizer

Métodos

int countTokens() : calcula o número de vezez que o método nextToken pode ser chamado antes de gerar uma exceção.

boolean hasMoreTokens() : testa se há mais tokens disponíveis para a string em questão.

String nextToken() : retorna o próximo token da string em questão.

String nextToken(String delim) : retorna o próximo token da string utilizando as lista de delimitadores do parâmetro.

133

Exemplo

import java.util;

public class TestStringTokenizer

{

public static void main (String [] args)

{

StringTokenizer st = new StringTokenizer

(”Isso é um teste de StringTokenizer");

while (st.hasMoreTokens())

{

println(st.nextToken());

}

}

}

134

Exercício

4.12 - Faça um programa que leia N linhas e faça:a) dividir as linhas lidas em palavras, armazenando-as em

um array de String;

b) considerar os delimitadores: “ \t\n\r;#”. Porém, não considerar os delimitadores como tokens.

c) definir o array de String com tamanho inicial igual a 50 e fazer a expansão do array de 10 em 10 elementos. Esta funcionalidade deve ser feita através de um método com a seguinte assinatura: public String [] expande(String [] st);

d) Não considerar as palavras: “de”, “do”, “dos”, “o”, “a”, “os”, “as”, “em”, “um”, “uma”, “e”, “com” e “;

e) Mostrar as palavras em ordem crescente alfabeticamente.

135

5 - Orientação a Objetos em Java

136

Orientação a Objetos

• Características:Abstração Encapsulamento Herança PolimorfismoMensagem Interfaces

Conceitos a serem abordados:

137

Abstração• “Extrair tudo o que for essencial e nada mais” (Aaron

Walsh)

• “A abstração é o processo de filtragem de detalhes sem importância do objeto, para que apenas as características apropriadas que o descrevem permanecam.” (Peter Van Der Linden)

• conceito aplicado a criação de software baseado em objetos, partindo do princípio que devemos considerar a essência de cada objeto e não pensar em todos os detalhes de implementação;

• semelhante ao que normalmente fazemos na nossa vida em relação aos objetos que nos rodeiam.

138

Abstração

Visão do mundo real:• Estamos acostumados a sempre abstrair de objetos aquilo que nos interessa.

cor cilindrada velocidadeMax

placa cor númeroChassi

139

Encapsulamento

• mecanismo utilizado visando obter segurança, modularidade e autonomia para objetos;

• conseguido através da definição de visibilidade privada dos atributos, ganhando-se assim autonomia para definir o que o mundo externo ao objeto poderá visualizar e acessar, normalmente através de métodos públicos.

dica: sempre defina os atributos de uma classe como privados, a não ser que tenha uma boa justificativa para não serem.

140

Encapsulamento - modificadores de visibilidade

public

private

protected

Estes atributos e métodos são sempre acessíveis em todos os métodos de todas as classes. Este é o nível menos rígido de encapsulamento, que equivale a não encapsular.

Estes atributos e métodos são acessíveis somente nos métodos (todos) da própria classe. Este é o nível mais rígido de encapsulamento.

Estes atributos e métodos são acessíveis no pacote, nos métodos da própria classe e suas subclasses, o que será visto em Herança.

141

Encapsulamento - modificadores de visibilidade

private protected

<default>

Estes atributos e métodos são acessíveis somente nos métodos da própria classe e suas subclasses.

Visível no pacote e na classe.

142

Encapsulamento

class CorpoCeleste { public long id; public String nome; .....}

class CorpoCeleste { private long id; private String nome; ..... public long getId() {

return id; } public String getNome() {

return nome; } .....}

garante acesso externosomente no modo “read-only”

143

Herança

• Herança significa ser capaz incorporar os dados e métodos de uma classe previamente definida. Assim como a herança de todas as operações e dados, você pode especializar métodos da classe ancestral e especificar novos operações e dados, para refinar, especializar, substituir ou estender a funcionalidade da classe progenitora.

144

Herança

• Você pode fazer sempre com que um objeto mais geral armazene um objeto mais especializado, mas o contrário não é verdadeiro sem uma conversão explícita de tipos.

• Todos os cítricos são frutas, mas nem todas as frutas são cítricos!

145

Herança

Visão do mundo real:• Estamos acostumados a lidar com classes agrupando-as em estruturas hierárquicas;

Filo dos cordados

Classe mamíferos Anfíbios ...

Ordem dos primatas Ordem dos roedores ...

Espécie homo sapiens

Possuem notocorda

Tem pêlosduas dentiçõesamamentam filhotes

Andam sobre dois pés

146

Herança - terminologia

• estenderestender = criar uma nova classe que herda todo o conteúdo da classe existente.

• superclassesuperclasse = uma classe progenitora ou “base”. • subclassesubclasse = uma classe filha que herda, ou estende,

uma superclasse.

147

Hierarquia de Classes

Em Java, a classe “Object” é raiz de todas as classes:

Object

Sobremesa

Bolo Torta

LuisFilipe

148

Herança - exemplo 1

public class HelloInternetSubClasse extends HelloInternet{}

class HelloInternet{

public static void main (String args[]){ System.out.println ( "Hello Internet");}

}

149

class Veiculo{

float preço;String modelo;

}

class Motocicleta extends Veiculo{ int cilindrada;}

Herança - exemplo 2

150

public class Agencia { public static void main(String args[]) {

Motocicleta cbHonda = new Motocicleta(); cbHonda.preço = 15000.0f; cbHonda.modelo = “Trail”; cbHonda.cilindrada = 1000;

System.out.println(“O modelo “ + cbHonda.modelo +“ preço “ + cbHonda.preço);

Veiculo honda = new Veiculo(); honda.preço = 45000f; honda.modelo = “civic”;

honda = cbHonda; // OKcbHonda = honda; // Oops!

}}

Herança - exemplo 2 (cont.)

151

Declaração de Atributos

[<controleAcesso>] [static] [final] <tipo> <nomeCampo>;

Forma

• controle de acesso– define o escopo de visibilidade de um atributo.

• static– define se o atributo diz respeito à classe (gerado uma única vez)

ou ao objeto.• final

– especifica que o valor do campo é constante.• tipo

– define a espécie do atributo, que pode ser um tipo primitivo (int, long, double, boolean) ou um objeto (String, etc.).

• nome do campo– especifica um nome para a propriedade.

152

Atributos - controle de acesso

Especificador Classe Subclasse Package Mundo

private protected public <branco>

Visibilidade dos membros de uma classe

153

Visibilidade de Atributos - exemplo 1 package Grego;class Alfa{

protected int campoProtegido;}class Beta{

void acessaMetodo(){Alfa a = new Alfa;a.campoProtegido = 15; // OK!

}}package Latin;import Grego.*;class Delta extends Alfa {

void acessaMetodo(Alfa a, Delta d){a.campoProtegido = 20; // Ilegald.campoProtegido = 30; // OK!

}}

154

Visibilidade de Atributos - exemplo 2package Grego;class Alfa{

void metodoPackage(){System.out.println(“Package”);

}}class Beta{

void acessaMetodo(){Alfa a = new Alfa;a.metodoPackage(); // OK!

}}package Latinimport Grego.*;class Delta extends Alfa {

void acessaMetodo(Alfa a, Delta d){a.metodoPackage(); // Ilegal!d.metodoPackage(); // Ilegal!

}}

155

this

•this é uma palavra-chave usada num método como referência para o objeto corrente.

• ela tem o significado de: “o objeto para o qual este trecho de código está sendo executado”.

156

this

Refere-se ao objeto corrente quandousado no código de um método não estático

Usado com freqüência para passar uma referência do objetocorrente num envio de mensagem para um outro objeto

A Bthis

A = this

157

//Classe pontopublic class Ponto { private float x,y; public Ponto(float x,float y) {

this.x=x; this.y=y; } public void move(float dx,float dy) {

this.x+=dx; this.y+=dy; } public float retorna_x() {

return x; }

this - exemplo

158

public void mostra() {

System.out.println( "(" + this.x + "," + this.y + ")" );

} }

//Classe principal, Arquivo Principal.java

public class Principal {

public static void main(String args[]) { Ponto ap; ap=new Ponto((float)0.0,(float)0.0); ap.mostra(); }}

Exemplo - cont.

159

super

• super é uma palavra chave usada numa subclasse como referência para membros da superclasse.

• ela tem o significado de: “a superclasse da classe corrente”.

Observação: normalmente utilizado com métodos. Será visto em detalhes a

frente.

160

Declarações de Métodospublic, protected, private, private protected.

Declara que o método é da classe, ao invés de ser do objeto.

O método não tem implementação e deve ser membro de uma classe abstrata. O método não pode ser sobreposto por uma subclasse.

Usado na declaração de threads.

Tipo de retorno do método. Se não tem retorno, especificar: void.

accessLevel

static

abstract

final

synchronized

returnType

161

Mensagem - chamada de método

• A captura do retorno é opcional.• Parâmetros possuem tipo.• O número de parâmetros é verificado em tempo de

compilação.

< resultado = referência.método( parâmetros );>Forma

resultado = terra.nomeOrbita();

162

Passagem de Parâmetros

• Toda passagem de parâmetro em Java é por valor.

Obs.: Se o argumento sendo passado é uma referência a um objeto, então o valor passado é o endereço do objeto. Desta forma, o conteúdo do objeto referenciado pode ser alterado pelo método que recebe a referência.

163

Exercício

5.1 - Crie duas classes que definam os seguintes atributos e métodos para objetos do tipo:

• Ao final crie um objeto da classe Aviao e um objeto da classe Piloto, fazendo com que o objeto piloto receba o objeto aviao e pilote ele.

Aviao

modelo: StringestaVoando: boolean

decolar() : voidpousar(): voidsetModelo(String modelo) : voidgetModelo() : String

Piloto

nome: StringaviaoPilotado: Aviao

pilotarAviao() : voidsetNome (String nome): voidgetNome (): String

164

Polimorfismo

• ocorre quando uma classe possui um método com o mesmo nome e assinatura (número, tipo e ordem de parâmetros) de um método na sua superclasse;

• toda vez que isto ocorrer, a máquina virtual irá executar o método da classe mais especializada (a subclasse) e não o método da superclasse (sobreposição). Note que esta decisão ocorre em tempo de execução;

• polimorfismo ocorre também quando existem dois métodos com mesmo nome, na mesma classe com e assinaturas diferentes. O método será escolhido de acordo com o número de parâmetros, tipo ou valor de retorno esperado. Note que esta decisão ocorre em tempo de compilação.

165

Polimorfismo

• Membros com mesmos identificadores substituem membros herdados.

• Os membros definidos na superclasse podem ser acessados na subclasse através do qualificador super.

• Métodos declarados como final não podem ser redefinidos.

• Métodos abstratos devem ser redefinidos ou declarados como abstratos.

166

super()

• O operador super pode ser utilizado de duas formas:a) Executar na subclasse métodos que foram sobrepostos.

Esta modalidade pode ser feita em qualquer método da subclasse e em qualquer posição.Segue a sintaxe:

super.<método_na_superclasse>;

b) Executar o método construtor da superclasse na subclasse. A chamada do construtor da superclasse só pode ser feita no construtor da subclasse e deve ser o primeiro comando. A sintaxe:

super(correspondente_construtor_na_supeclasse);

167

Polimorfismo -Sobreposição

Substituir a implementação de um método herdadopor uma implementação própria da subclasse

public class Super { ... public void metodo1() {

a = b * c; }}public class Sub extends Super { ... public void metodo1() {

x = y + z; }}

168

Polimorfismo - Sobreposição

class Fruta {int gramas;int calorias_por_grama;Fruta() { gramas=55; calorias_por_grama=0;}Fruta(int g, int c){ gramas =g; calorias_por_grama =c;}

void descascar () {

System.out.println(“Aqui eu descasco frutas”);}

}

sobreposição

169

Polimorfismo - Sobreposição

class Citros extends Fruta { private int acidoCitrico; public Citros() { super(); this.acidoCitrico=1000; } public Citros(int g, int c, int a) { super(g,c); this.setAcidoCitrico(a); }

170

int getAcidoCitrico() { return acidoCitrico; } void setAcidoCitrico(int acido) { this.acidoCitrico=acido; } void descascar () { System.out.println(

“Aqui eu descasco so citricos”); } }

Polimorfismo - Sobreposição

sobreposição

171

Polimorfismo - Sobrecarga

public class Fruta {

int gramas;int calorias_por_grama;public Fruta()

{ gramas=55; calorias_por_grama=0; }

public Fruta(int g, int c) {

this.gramas =g; this.calorias_por_grama =c;

}}

sobrecarga

172

Polimorfismo - Sobrecarga

public class Feira { public static void main(String args[]) { Fruta melancia = new Fruta(4000, 5);

Fruta manga = new Fruta (); manga.gramas=100; manga.calorias_por_grama=100; System.out.println(“manga “+ manga.gramas + “ gs “ + manga.calorias_por_grama);

}}

173

This()• O código this(corresp) é uma expressão comum quando se

faz sobrecarga no método construtor:chame o construtor com essa assinatura da minha classe

Classe TortaFruta{ private double peso; private java.util.Date feitaEm; public TortaFruta(int i) { this ((double) i); } public TortaFruta(double d) { this.peso = d; feitaEm = new java.util.Date(); }}

174

Polimorfismo - exercício

5.2 - Crie duas classes que definam os seguintes atributos e métodos para objetos do tipo:

Empregado

nome: Stringsalario: float

getSalario() : floatsetSalario(salario: float): void

Gerente

comissao: float

setComissao(comissao: float) : void

• Ao final crie um objeto da classe Empregado e um objeto da classe Gerente, atribuindo valores para seus salários e comissão para o gerente. Ao final execute os métodos getSalario() de ambos objetos. Lembrar que o salário do gerente é composto do salário + comissão.

175

Método finalize()

• Antes de um objeto passar pela coleta de lixo, seu método finalize() é executado

• Interessante para liberar recursos de posse do objeto

protected void finalize() throws Trowable {

...// Código de liberação para esta classe...super.finalize();

}

176

Exercício5.3 - Faça um programa que crie alguns objetos utilizando a

mesma referência, de tal forma que todas as vezes que um novo objeto for criado o anterior emita uma mensagem através do método finalize() informando que vai deixar de existir. Eis as funcionalidades:

a) criar a classe ExercícioFinalize, com 2 atributos nome msg do tipo String. E o método finalize(), onde neste método deve ser dada a mensagem: “O objeto “ + nome + “vai morrer!”.

b) criar a classe Principal, e instânciar 10 ocorrência de objetos tipo ExercícioFinalize. Os objetos com nome Objeto1, ..., Objeto10;

observação: para invocar o “Garbage collection” use

System.gc().

177

Classes Abstratas

Modelagem de um conceito abstratoClasse abstrata não pode conter instâncias

Conta

PessoaFisica PessoaJuridica Poupança

178

Classes Abstratas

• Quando a palavra-chave “abstract” aparece no início de uma declaração de classe, significa que um ou mais métodos são abstratos.

• Um método abstrato não tem corpo; o seu propósito é forçar uma subclasse a sobrepô-lo e fornecer uma implementação concreta do método.

179

Classes Abstratas: Exemplo

public abstract class VeiculoAquatico {

abstract void definirRumo (int n);abstract void definirVelocidade (int n);

}class Canoa extends VeiculoAquatico {

void definirRumo (int n) { .... }

void definirVelocidade (int n) { ... }}

180

Exercício5.4 - Considerando a hierarquia de contas anterior, fazer um programa

que faça a simulação de 1000 transações de débito e crédito nas diversas contas. Utilize a função Math.randon() (consulte a documentação para esta função). Eis as funcionalidades:

a) a classe conta possui o atributo saldo e os métodos abstratos: void debito(float valor), void crédito (float valor) e float saldo();

b) a classe poupança possui os atributos: int diasJuro, final float PERCENTUALJURO=0.007 e o método: void calculaJuros().

c) a classe pessoa física possui o atributo: float limite.

d) a classe pessoa jurídica somente os membros definidos na superclasse.

Lógica dos métodos:a) fazer o débito em uma conta e o crédito em outra. O débito só deve ser

feito se houver saldo. O valor a ser debitado e as contas envolvidas na transação calculados de forma randômica.

181

Exercício - cont.b) o saldo total da conta física é: saldo + limite.

c) a cada lançamento de crédito na conta poupança, adicionar 1 nos diasJuro e calcular os juros.

d) o cálculo do juros da conta poupança é o saldo mais o acréscimo dos juros no período de 30 dias. Da seguinte forma:

se diasJuro > 30 então

juros = saldo * 0.007;

diasJuro = diasJuro - 30;

senao

juros = 0;

saldo = saldo + juros;

e) Implemente uma classe Principal que cria 3 contas: poupança, física e jurídica e faça os 1000 lançamentos nas diversas contas. No final informar o saldo de cada conta. Os atributos definidos como private e criar os métodos get e set apropriados.

182

Interface

• interface pode ser considerada como a forma com que um objeto se apresenta para outros, no que diz respeito aos seus atributos e métodos (sua funcionalidade);

• é a representação externa de um objeto.

183

Interface

Visão do mundo real:• Na nossa vida, estamos acostumados a lidar com objetos através de sua interface, ignorando sua complexidade.

184

Interfaces em Java

• Criadas com a palavra reservada interface.• são sempre públicas.• implementadas pelas classes com a palavra

reservada implements.

185

Interface - exemplo

public interface ControleRemoto

{

public void ligaTV();

public void desligaTV();

public void mudaCanalTV(int canalNovo);

}

public class TV implements ControleRemoto

{

public void ligaTV() {...}

public void desligaTV() {...}

public void mudaCanalTV(int canalNovo) {...}

}

186

Modificadores de Classes em Java

A classe pode ser usada por qualquer outra classe de qualquer pacote (package).

A classe não pode ser instanciada (contém métodos abstratos).A classe não pode ter subclasse (folha da árvore de classes).A classe é uma subclasse da superclasse especificada.

A classe implementa a(s) interface(s) especificadas.

public

abstract

final

extends

implements

Padrão: não publica, não abstrata, não final, subclasse de Object e sem implementar nenhuma interface.

187

Pacotes

• O java provê um mecanismo de pacotes como uma forma de agrupar classes relacionadas.

• Pode-se indicar que as classes de um programa irão compor um determinado pacote, através do comando package.// Classe empregado do departamento financeiro

// da companhia ABC

package abc.FinanceDept;

public class Empregado {

...

}

188

Utilização de pacotes

• Quando se deseja utilizar as facilidades de um pacote, deve-se usar o comando import para informar ao compilador onde encontrar as classes que serão utilizadas.

import abc.FinanceDept.*;

public class Gerente extends Empregado {

String departamento;

Empregado[] subordinados;

}

189

A variável CLASSPATH

• Pacotes são armazenados em um diretório formado pelo nome do pacote. Por exemplo: o arquivo Empregado.class após compilado será armazenado no seguinte diretório.

path\abc\FinanceDept

• O diretório abc que forma a base da hierarquia deve ser colocada na variável CLASSPATH.

• O compilador java pode criar pacotes e colocar as classes compiladas dentro dele através do seguinte comando:

javac -d c:\home\mypackages Empregado.java

• A variável de ambiente CLASSPATH deve incluir o caminho do pacote.

CLASSPATH=c:\home\mypackages;.

190

6 - Classes em Java

191

• Array: Comprimento fixoElementos de um mesmo tipoAlteração cria novo objeto

• Vector: Tamanho variávelElementos do tipo Object Alteração no mesmo objeto

Vector

192

Vector

Construtor

Vector() : constrói um vector vazio e tamanho inicial de 10 elementos.

Vector(int initCap) : constrói um vector vazio com a capacidade informada.

Vector(Collection c) : constrói um vector contendo os elementos da coleção.

Vector(int initialCapacity, int capacityIncrement) : constrói um vector vazio com a capacidade e incremento informados.

193

VectorMétodosvoid add(int index, Object element) : insere o elemento no

vector na posição especificada.

boolean addAll(Collection c) : adiciona todos os elementos da coleção especificada no final do vector.

void addElement(Object obj) : adiciona o componente especificado no final. O tamanho é acrescido de 1.

void clear() : remove todos os elementos do vetor.

Object clone() : retorna um clone deste vector.

boolean contains(Object o) : verifica se o objeto especificado é um componente do vector.

void copyInto(Object[] anArray) : copia os componentes deste vetor dentro de array especificado.

194

VectorMétodosObject elementAt(int i) : retorna o componente no índice indicado.

boolean equals(Object o) : compara o objeto especificado com aqueles armazenados no vector.

void insertElementAt(Object o, int i) : insere o componente especificado na posição indicada. O indice i deve estar dentro do vector. O vector é reorganizado e seu tamanho acrescido.

boolean isEmpty() : verifica se o vector está vazio.

int indexOf(Object o) : retorna o índice da primeira ocorrência do

objeto no vector. Retorna -1, caso não o localize.

void setElementAt(Object o, int i): substitui item pelo componente especificado, na posição indicada.

195

Vector

Métodos

Object remove(int index) :remove o elemento do vector na posição indicada.

void removeElementAt(int i) :remove o item indicado pelo índice. O vector é reorganizado e seu tamanho diminuído de 1.

void removeAllElements() : remove todos componentes do vector e o muda o seu tamanho para zero.

void setSize(int i) : configura o tamanho do objeto vector. Se o tamanho é maior que o tamanho atual, novos itens nulos são adicionados. Se menor, os itens restantes são descartados.

void size() : retorna o número de elementos do Vector.

196

Vector

import java.util.Vector;public class PilhaVector{

private Vector pilha;

public PilhaVector(){

pilha = new Vector();}

public void push(Object parametro) {

pilha.addElement(parametro); }

197

Vector

public Object pop()

{

if (pilha.isEmpty())

{

return null;

}

else

{

Object retorno = pilha.elementAt(pilha.size()-1);

pilha.setSize(pilha.size() - 1);

return retorno;

}

}

}

198

Exercício6.1 - Crie uma classe em java que executa as funcionalidades

de uma pilha (como no exemplo anterior) que extraia e insira elementos no início do vetor.

6.2 - Crie uma classe em java que executa as funcionalidades de uma fila.

6.3 - Crie duas classes em java: Aviao e Passageiro. A classe Aviao conterá os seguintes métodos (com estas assinaturas):

public void embarcaPassageiro(Passageiro p);

public Passageiro desembarcaPassageiro();

public int totalPassageiros();

public String[] listaDePassageirosEmbarcados();

199

Exercícios - cont.

A classe Passageiro terá os métodos, para armazenar e retornar o nome do passageiro:

public String getNome();

public void setNome(String nome);

E as funcionalidades:

a) utilize a classe Vector para armazenar internamente os passageiros no avião.

b) crie uma terceira classe que instancie um objeto da classe Aviao e vários objetos da classe Passageiro, atribua um nome para cada passageiro, embarque cada um dos passageiros, solicita uma lista dos passageiros embarcados e imprima o nome de cada um deles.

200

7- Interfaces Gráficas em Java

201

Introdução

• Java fornece um forte suporte para a construção de interfaces gráficas através do pacote java.awt

• GUI inicial do Java: incompleta (falta grid, por exemplo) com problemas de portabilidade (peers)

• Substituída pela JFC (swing), mas compartilham partes fundamentais (como eventos)

202

Elementos Gráficos• Os elementos chaves de uma interface gráfica em Java

são:Componentes gráficos (botões etc.)Gerenciadores de layoutesProcessamento de eventos

• Componentes gráficos, tais como campo texto e botões, são elementos que o usuário manipula com o mouse ou com o teclado

• Gerenciadores de layout governam a maneira pela qual os componentes aparecem na tela

• Eventos assinalam ações do usuário consideradas importantes, como o click de um mouse em cima de um botão

203

Programação Dirigida por Eventos

• Programas Java devem responder a eventos gerados por componentes gráficos indicando que ações específicas ocorreram sobre tais componentes

• Uma categoria especial de classes, chamadas listeners, que ficam a espera de eventos

• Portanto, uma programa cliente Java é, geralmene, composto por:

• o código representando a interface gráfica com o usuário

• listeners escutando eventos

• código que respondem a eventos

204

Componentes Gráficos

• Awt contém vários tipos de componentes gráficos permitindo diferentes maneiras de interagir com o usuário:

labelstext fieldstext areaslistsbuttonsscrollbars

205

Classes de suporteAlém das classes vistas no slide anterior, a interface gráfica necessita utilizar várias classes de auxílio à montagem de uma interface gráfica. São elas:

Point

Dimension

Rectangle

Color

Font

206

PointPropósito: representar um ponto num sistema de

coordenadas (linhas e colunas) visando indicar a localização de um componente visual AWT no container onde o mesmo está inserido.

Construtores: Point ( ) Cria uma ponto nas coordenadas

(0, 0).

Point (int x, int y) Cria uma ponto através das coordenadas x e y especificadas.

Variáveis: x - representa a coluna. y - representa a linha.

207

Point

Método Uso

move(int x,int y) movimenta o ponto para uma nova localização.

translate(int dx,int dy)movimenta o ponto, incrementando suas coordenadas x e y com os valores de dx e dy respectivamente.

208

Dimension

Propósito: representar a dimensão (em largura e altura) de um componente visual AWT.

Construtores: Dimension ( ) Cria uma dimensão com 0

para largura e altura.

Dimension (int largura, int altura) Cria uma dimensão com os valores definidos nos parâmetros para

largura e altura. Variáveis:• height - a altura da dimensão.

• width - a largura da dimensão.

209

Dimension

Método Uso

setSize(int l,int a) redefine valores para a largura e altura de

uma dimensão.

equals(Object d) verifica se dois objetos da classe Dimension

têm os mesmos valores para altura e largura.

210

RectanglePropósito: representar um retângulo que especifica o formato

(em largura e altura) e a localização (eixos x e y) de um componente visual AWT.

Construtores: Rectangle (int x, int y, int largura, int altura)

Cria um retângulo com localização e formato pré-definidos.

Rectangle (Point p, Dimension d)Cria um retângulo com localização

representada pelo objeto p e formato representado

pelo objeto d.

Variáveis:• x - representa a coluna.• y - representa a linha.• height - a altura do retângulo.• width - a largura do retângulo.

211

Rectangle

Método Uso

getLocation( ) retorna um objeto Point representando a localização do retângulo.

setLocation(Point p) redefine a localização do retângulo.

contains(Point p)verifica se o ponto p está contido na área do retângulo.

grow(int l, int a) aumenta o retângulo com base nos valores de incremento l e a.

intersection(Rectangle r)

calcula a interseção entre dois retângulos devolvendo um novo.

212

ColorPropósito: representar uma cor através da composição das cores

primárias vermelho, verde e azul. A cor gerada poderá ser então atribuída a um componente visual, para definir suas propriedades para cor de frente e fundo.

Construtor: Color(int red, int green, int blue) Cria uma cor com a composição dos componentes vermelho , verde e azul.

Variáveis:black blue cyan darkGray gray green lightGray magenta orange pink red white yellow

213

Color

Método Uso

brighter( ) Cria uma versão mais clara da cor.

darker( ) Cria uma versão mais escura da

cor. getBlue( ) Retorna um inteiro correspondente

ao componente azul.

getGreen( ) Retorna um inteiro correspondente ao componente verde.

getRed( ) Retorna um inteiro correspondente ao componente verde.

214

Font

Construtor: Font(String name, int style, int size)

AtributosPLAIN, BOLD, ITALIC

ExemploFont f = new Font(“arial”, Font.PLAIN,14);

215

Criando aplicações gráficas AWT e JFC

• A criação de interfaces gráficas AWT consiste basicamente na criação (instância) de objetos do tipo Conponent (botões, textos etc.), na criação de recipientes ou objetos da classe Container (janelas, paineis etc.) para receber os componentes criados e na adição dos componentes aos recipientes, com base num sistema de coordenadas (especificando a localização da inserção) ou via utilização de gerentes de layouts que se encarregam de definir a localização e aspecto visual dos componentes inseridos nos recipientes.

216

Component

• A classe Component representa um objeto que tenha uma representação gráfica, como botões, campos de textos, choices etc. Esta classe define o comportamento básico para a maioria dos componentes visuais do pacote AWT (todos os métodos definidos nesta classe estarão disponíveis para todos os componentes visuais do AWT, bem como todos os recipientes).

• Ex.: método setVisible(boolean visibilidade)– botao.setVisible(true); // faz um Button aparecer no Container– janela.setVisible(false); // faz um Frame desaparecer

217

Component

Método Uso

getName( ) Retorna o nome do componente

setName(String n) Atribui um nome ao componente

getParent( ) Retorna o Container onde o componente foi adicionado

isVisible( ) Determina se o componente é visível. Componentes são inicialmente visíveis, exceto Frame, Window e Dialog.

setVisible(boolean b)

Torna o componente visível ou não, de acordo com o parâmetro.

218

Component

Método UsoisShowing( ) Retorna true se o componente

for visível e estiver dentro de um outro componente

que está sendo mostrado.isEnabled( ) Determina se um componente

está habilitado para receber a entrada do usuário e gerar eventos. Componentes são inicialmente habilitados.

setEnabled(boolean b) Habilita ou desabilita o componente.

219

Component

Outros métodos (aparência):Outros métodos (aparência):

public Color getForeground( )

public void setForeground(Color c)

public Color getBackground( )

public void setBackground(Color c)

public Font getFont( )

public synchronized void setFont(Font f)

220

Component

Outros métodos (localização):Outros métodos (localização):

public Point getLocation( )public Point getLocationOnScreen( )public void setLocation(int x, int y)public void setLocation(Point p)public void setBounds(int x,int y,int largura,int altura)public void setBounds(Rectangle r)public Dimension getSize( )public void setSize(int width, int height)public void setSize(Dimension d)

221

Containers

• Um container é uma categoria especial de componente gráfico que pode conter outros componentes ou mesmo outros containers.

• Todos os containers são componentes, mas nem todos os componentes são containers.

• Uma applet, uma janela e um painel são exemplos de container.

• Um container (painel) pode ser inserido dentro de outro.• Cada container possui associado um gerenciador de layout

para controlar a maneira pela qual seus componentes serão mostrados (tamanho e posição).

222

Containers do pacote AWT

Component

Container

WindowPanel

DialogFrameApplet

223

Containers• Alguns containers devem ser associados a uma

outra superfície gráfica:panelapplet

• Uma applet é associada a um browser ou a uma janela do appletviewer e um panel é associado a qualquer outro container.

• Outros containers podem ser movimentados de maneira independente:

windowframedialog

224

Container - métodos

• add(Component c) – Adiciona um componente ao container.

• add(Component c, int i) – Adiciona um componente ao container na posição

indicada pelo segundo parâmetro.• addContainerListener(ContainerListener c)

– Associa um “ouvinte” de eventos para o container.

• doLayout( ) – Reorganiza os componentes do container.

225

• getAlignmentX( )

– Retorna um inteiro correspondente ao alinhamento no eixo x.

• getAlignmentY( )

– Retorna um inteiro correspondente ao alinhamento no eixo y.

• getComponent(int i)

– Retorna o componente localizado na posição indicada pelo parâmetro fornecido.

• getComponentAt(int x, int y)

– Localiza o componente que contêm a posição x,y.

Container - métodos

226

• getComponentCount() – Retorna o número de componentes inseridos.

• getComponents( ) – Devolve um array contendo todos os componentes

inseridos no container.

• getLayout( ) – Devolve o gerente de layout utilizado pelo container.

• isAncestorOf(Component c) – Verifica se o componente está contido

hierarquicamente no Container.

• remove(Component c) – Remove o componente especificado do container.

Container - métodos

227

• remove(int) – Remove o componente especificado pelo índice do

container.

• removeAll( ) – Remove todos os componentes inseridos.

• setCursor(Cursor c) – Redefine a imagem associada ao cursor dentro do

container.

• setLayout(LayoutManager l) – Redefine o gerente de layout para o componente.

• validate( ) – Reorganiza o container e todos os seus componentes.

Container - métodos

228

Window

• Uma Window é uma janela sem barra de título e borda borda e que necessariamente tem que estar associada com outro objeto da classe Frame (janela) para que possa existir.

• A classe Window especializa a classe container, logo poderá conter outros componentes internamente.

• A classe Window normalmente é utilizada para implementar janelas pop-up.

• Quando um objeto da classe Window é criado, automaticamente é associado a ele o gerente de layout BorderLayout.

229

Window

Construtor

Window(Frame f)

Constrói um objeto (instância) da classe Window invisível que estará

vinculado ao objeto Frame (janela) previamente instanciado.

230

Window

Método Uso

show( ) Mostra a janela e a coloca na frente das outras.

dispose( ) Fecha a janela.

toBack( ) Move a janela para traz de outra janela.

toFront( ) Move a janela para frente de outra janela.

pack( ) Redimensiona a janela de tal forma que todos os seus componentes fiquem com seus tamanhos “preferidos” ou mínimos.

231

Migrando de AWT para Swing

• A AWT sempre esteve presente na linguagem Java. Os seus defeitos a muito tempo são bem conhecidos e os desenvolvedores tem gasto muito tempo e esforço na criação de componentes para prover alguma funcionalidade inexistente na AWT para construir interfaces que atentam às necessidades dos usuários.

• A meta do projeto Swing foi acrescentar novas funcionalidades, através de uma biblioteca de classes, a fim de suprir as demandas dos usuários.

232

O que é o JFC ?(Java Foundation Class)

• É um conjunto de aspectos (componentes) que foram implementados e disponibilizados em uma biblioteca e serve para criar interfaces gráficas de usuário.

• Iniciou sua implementação no JDK1.1 e continua nas versões seguintes.

233

A estrutura hierárquica AWT e Swing

Os retângulos sombreados representam os controles da AWT.

JWindow

Dialog

Frame

JLabel

AbstractButtonJPanel

JRootPane

JDialog

JFrame

JButton

Window

Jcomponent

Container

Component

234

Qual a relação entre JFC e AWT ?

• Com a introdução de um novo conjunto de componentes para construção de interface que usa um modelo diferente daquele da AWT é natural perguntar-se o que fazer com a AWT.

• Para conviver Swing e AWT, a versão JDK1.1 foi alterada e introduzida uma nova facilidade denominada de “Lightweight components”- (componentes leves).– Significa: que os desenvolvedores possam diretamente

estender uma classe Component e Container e utilizar as facilidades disponíveis nestas classes.

235

• Em JFC1.1 e JDK1.2, os componentes AWT e os componentes Swing são ambos suportados, embora os componentes AWT continuem usando o “peer model”. E não se sabe até quando esta situação manter-se-á.

• Alguns dos componentes Swing, atualmente, são derivados de componentes AWT. – P.ex: o componente JFrame, que fornece a janela principal da

aplicação, é derivado da classe Frame da AWT.

Qual a relação entre JFC e AWT ?

236

• Todos os componentes AWT possuem um componente correspondente no Swing, logo é possível implementar aplicações que não dependam diretamente da AWT.

Nota: Existe uma tendência da Javasoft em não usar o “peer model”. Logo, os desenvolvedores

devem ficar atentos quanto a migrarem as aplicações existentes em AWT para o Swing.

Qual a relação entre JFC e AWT ?

237

O que necessito reaprender para usar os componentes Swing?

• É possível utilizar alguns componentes básicos do Swing diretamente.

• Com o Swing não há mudanças fundamentais no modo como as aplicações são construídas.

• Pode-se criar a janela principal da aplicação, usar frames, componentes e gerenciadores de layout e é possível estabelecer conexão quase que da mesma forma.

238

• O produto JFC 1.1 é uma coleção de pacotes que contém os componentes do Swing, e que pode ser adicionado ao JDK 1.1.

• Para o JDK1.1, o nome dos pacotes iniciam com java.awt.swing.

• A partir de JDK1.2, os mesmos pacotes continuaram a existir, porém com o nome javax.swing.

• Segue a relação dos pacotes que são comuns a JFC1.1 e JDK1.2, agrupados por funcionalidade.

Os pacotes do Swing

239

javax.swingjavax.swing.borderjavax.swing.eventjavax.swing.plafjavax.swing.plaf.basicjavax.swing.plaf.metaljavax.swing.plaf.motifjavax.swing.plaf.multijavax.swing.plaf.windowsjavax.swing.previewjavax.swing.tablejavax.swing.textjavax.swing.text.htmljavax.swing.text.rtfjavax.swing.treejavax.swing.undo

Os pacotes do Swing

240

A estrutura hierárquica AWT e Swing

Os retângulos sombreados representam os controles da AWT.

JWindow

Dialog

Frame

JLabel

AbstractButtonJPanel

JRootPane

JDialog

JFrame

JButton

Window

Jcomponent

Container

Component

241

A classe Jcomponent fornece:

• Uma aparência que (”a pluggable look and feel - l&f”) pode ser especificado pelo programador ou (opcionalmente) selecionada pelo usuário em tempo de execução.

• Criação de componentes personalizados.

• Uma borda que implicitamente define os limites do componente.

• A habilidade para definir o tamanho máximo, mínimo e preferido de um componente.

• ToolTips: descrições curtas quando o cursor passa sobre um componente.

• Autoscrolling: ocorre a rolagem automática em lista, tabelas ou árvore quando o mouse é arrastado sobre estes com o botão pressionado.

242

A classe JcomponentMétodo UsosetToolTipText(String text)

registra o texto para ser mostrado em tooltip.

createToolTip()retorna o JToolTip que deve ser usado para mostrar um texto tooltip.

getBorder()retorna a borda do componente ou nulo se nenhuma borda estiver definida.

setBorder()atribui a borda do componente.

setPreferredSize(Dimension d)atribui o tamanho preferido.

getPreferredSize()retorna o tamanho preferido.

243

Definição de cores do componente• Todos os componentes possuem dois modos de cores

associados: a de fundo (background) e a de frente (foreground).

• A JFC introduz um conceito de um componente “lightweight”, que possui um fundo transparente que permite ver o que está atrás do componente. O componente transparente não faz uso de cores de fundo.

• A classe JComponent possue os métodos isOpaque, que retorna false se o componente é transparente, e setOpaque(boolean b), que permite alterar esta propriedade.

244

Frame

• Uma Frame é uma janela com uma barra de título e uma borda.

• A classe Frame especializa a classe Window, que por sua vez, especializa a classe container.

• A classe Frame implementa a interface MenuContainer, logo uma frame pode ter uma barra de menu associada a ela.

• Frames são geralmente usadas para construir aplicações, mas também podem ser usadas com applets.

245

Frame

• Se uma aplicação tem uma janela dependente de outra (que desaparece quando a outra é iconificada, por exemplo), então deve-se utilizar Dialog ou Window para esta janela.

• A classe Frame por padrão não fornece ao usuário mecanismos para ser fechada com o clique do mouse no botão para fechar a janela (x).

246

Construtor Operação

Frame() Constrói uma nova instância de Frame que é inicialmente invisível.

Frame(String t) Constrói uma nova instância de Frame que é inicialmente invisível, com o título passado como parâmetro.

Frame

247

Método Uso

getTitle() Retorna um objeto String contendo o título.

setTitle(String t) Atribui um título, passado como parâmetro, ao objeto Frame.

getIconImage() Retorna um objeto do tipo Image contendo a imagem mostrada quando a janela é iconificada.

setIconImage(Image I) Atruibui uma imagem a ser mostrada quando a janela é iconificada.

Frame

248

Método Uso

getMenuBar() Retorna a barra de menu do Frame

setMenuBar(MenuBar m) Atribui uma barra de menu ao Frame.

isResizable() Retorna true se o usuário pode modificar o tamanho do Frame e false, caso contrário

Frame

249

Método Uso

setResizable(boolean b) Permite, ou não, que o usuário modifique o tamanho do Frame.

setLayout (LayoutManager l) especifica um novo gerente de layout para a janela (ou sem layout se for passado o valor null.

Ex.: objJanela.setLayout ( null ).

Frame

250

• Deve-se usar pack( ) ou setSize(int,int) em um Frame antes que ele seja mostrado pela primeira vez. Caso contrário, somente a barra de título da janela aparecerá na tela.

• Em geral, preferível utilizar o pack do que o setSize: pack delega para o gerenciador de layout a

mudança no tamanho da janela. com o gerenciador de layout, adquire-se melhor

independência de plataforma.

Frame

251

• Quando um programa java inicia com uma GUI, vê-se a janela onde a aplicação irá fazer as interações com o usuário através de teclado e mouse. No Swing, a interface principal da aplicação é implementada pelo componente javax.swing.JFrame.

• Assim como outros componentes, o JFrame é derivado do controle da AWT. Segue a estrutura hierárquica dos componentes AWT e Swing.

A classe JFrame o esqueleto de uma aplicação

252

A estrutura de JFrame

JFrame

JRootPane

JLayeredPane

MenuBar (opcional)

GlassPane

ContentPane

253

• Quando criado, o JFrame possui um único filho, o container, que é uma instância da classe JRootPane.

• A classe JRootPane pode gerenciar outros 4 componentes: um JLayeredPane, um ContentPane, um MenuBar e um GlassPane.

• JRootPane é gerenciado de forma a cobrir a superfície inteira da JFrame, exceto a barra de título e o tamanho da barra.

A estrutura de JFrame

254

• JLayeredPane : adiciona profundidade a um container, permitindo sobreposição de componentes quando necessário.

• MenuBar: a classe MenuBar class encapsula os conceitos da plataforma para os limites da barra de menu para uma janela. O objetivo é associar a barra de menu com um objeto Frame, chamando o método setMenuBar.

A estrutura de JFrame

255

• A classe JFrame é ligeiramente incompatível com java.awt.Frame. JFrame contém a classe JRootPane como filho único.

• A contentPane deve ser pai de qualquer filho da classe JFrame. Essa é diferença da java.awt.Frame. P.ex. para adicionar um filho na Frame da AWT deve-se escrever: frame.add(child);

• Contudo, usando a JFrame necessita-se adicionar o filho ao contentPane da JFrame:

frame.getContentPane().add(child);

JFrame

256

Método Uso

getContentPane( ) retorna o objeto contentPane para este Frame.

getGlassPane( ) retorna o objeto glassPane para a janela.

getJMenuBar( ) retorna a barra de menu da janela.

getJLayredPane( ) retorna o objeto layeredPane para a janela.

JFrame

257

Método Uso

public void dispose( ) : fecha a janela. Herdado da classe Window.

public void setDefaultCloseOperation(int operação) : determina a operação default para quando o usuáro tentar fechar a janela.

Tipos de operação:• JFrame.DO_NOTHING_ON_CLOSE (definido em WindowConstants): nada acontece,

pois requer que o programa manipule a operação no método windowClosing do evento WindowListener registrado pelo objeto que gerou a ação.

• JFrame. HIDE_ON_CLOSE (definido em WindowConstants): automaticamente oculta a janela após ser invocado qualquer objeto WindowListener. Este é o valor default de JFrame.

• JFrame. DISPOSE_ON_CLOSE (definido em WindowConstants): automaticamente oculta e descarta a janela após ser invocado qualquer objeto WindowListener.

• JFrame. EXIT_ON_CLOSE (definido em JFrame): automaticamente sai da aplicação utilizando o método exit( ) da classe System. Aconselha-se que esta operação seja usada apenas em aplicações.

JFrame

258

import javax.swing.*;public class BasicFrame extends JFrame {

public static void main(String[] args) { BasicFrame bf = new BasicFrame ("Tela

Simples"); }

BasicFrame (String title) {super(title);setSize(250, 200);setVisible(true);

}}

JFrame - exemplo

259

JFrame - resultado

260

import javax.swing.*;Import java.awt.*;public class MyJFrame { public static void main (String args[]) { JFrame tela = new JFrame("Tela Exemplo 1"); tela.setSize(200,200); tela.setBackground(Color.blue); tela.setVisible(true);

}}

JFrame – exemplo 1

261

import java.awt.*;import javax.swing.*;public class MyJFrame extends JFrame { public static void main (String args[]) { MyJFrame tela = new MyJFrame(); tela.setTitle ("Tela Exemplo2"); tela.setSize(500,500); tela.setBackground(Color.green); tela.setVisible(true); }}

JFrame – exemplo 2

262

import java.awt.*;import javax.swing.*;public class MyJFrame extends JFrame { public static void main (String args[]) { MyJFrame tela = new MyJFrame("Tela Exemplo 3"); tela.setSize(500,500); tela.setBackground(Color.lightGray); tela.setVisible(true); } MyJFrame(String titulo) { super(titulo); }}

JFrame – exemplo 3

263

// Arquivo MyJFrame.javaimport java.awt.*;import javax.swing.*;public class MyJFrame extends JFrame{ MyJFrame(String titulo) { super(titulo); setSize(200,200); setBackground(Color.blue); setVisible(true); }}

// Arquivo ChamaMyJFrame.javapublic class ChamaMyJFrame{ public static void main(String args[]) { MyJFrame tela = new MyJFrame("Minha Tela"); }}

JFrame – exemplo 4

264

import java.awt.*;import javax.swing.*;public class MyJFrame extends JFrame { public static void main (String args[]) { MyJFrame tela = new MyJFrame(); tela.setTitle ("Tela1 Exemplo 5"); tela.setSize(500,500); tela.setBackground(Color.green); tela.setVisible(true);

MyJFrame tela2 = new MyJFrame(); tela2.setTitle ("Tela2 Exemplo 5"); tela2.setSize(300,300); tela2.setBackground(Color.white); tela2.setVisible(true); }}

JFrame – exemplo 5

265

import java.awt.*;import javax.swing.*;public class MyJFrame extends JFrame { public static void main (String args[]) { MyJFrame tela = new MyJFrame(); tela.setTitle ("Tela1 Exemplo 6"); tela.setSize(300,300); tela.setBackground(Color.green); tela.setVisible(true);

MyJFrame tela2 = new MyJFrame(); tela2.setTitle ("Tela2 Exemplo 6"); tela2.setSize(500,500); tela2.setBackground(Color.white); tela2.setVisible(true); tela2.toBack(); }}

JFrame – exemplo 6

266

import java.awt.*;

import javax.swing.*;

public class MyJFrame extends JFrame {

public static void main (String args[]) {

MyJFrame tela2 = new MyJFrame();

tela2.setTitle ("Tela Exemplo 7");

tela2.setSize(500,500);

tela2.setBackground(Color.white);

tela2.setVisible(true);

JWindow tela = new JWindow(tela2);

tela.setSize(300,300);

tela.setBackground(Color.green);

tela.setVisible(true);

}

}

JFrame – exemplo 7

267

Durante a abordagem dos componentes e recipientes do pacote swing será utilizado um exercício único que, na conclusão do mesmo, deverá ter o aspecto mostrado no slide a seguir. A cada nova etapa (a cada novo componente aprendido) será utilizado o exercício anterior para inserção do componente adicional. Neste ponto, apenas criaremos a janela (recipiente) que conterá os demais componentes.

JFrame – exercício

268

Crie uma classe em java (CandidatoEmprego.java) que contenha um atributo privado de nome janela (um objeto da classe JFrame). Esse atributo deverá ser instanciado no construtor da classe atual:

Título: Candidato a EmpregoCor de Fundo: (202,202,202)Dimensão : largura = 510 e altura = 490Layout: nuloResizable: false

A classe CandidatoEmprego deverá conter um método público com a seguinte assinatura: public void mostraJanela(). Este método se encarregará de tornar visível o objeto janela para o usuário.

*Incluir as instruções import java.awt.* .import javax.swing.* .

JFrame – exercício

269

JFrame – resultado final

270

• A classe JPanel (painel) é uma sub-classe de JComponent.

• Tem o propósito de agrupar componentes para serem posteriormente inseridos em outro container.

• Permitem a criação de layouts sofisticados.• podem conter componentes incluindo outros

painéis.• Utiliza o gerente de layout FlowLayout como

padrão.

JPanel

271

Construtor Operação

JPanel() Constrói uma nova instância de um painel que é inicialmente invisível.

JPanel(LayoutManager l) Constrói uma nova instância de um painel contendo um gerente de

layout específico.

JPanel

272

• O exemplo a seguir mostra a criação de um panel que pode ser usado para inserir novos componentes.

• Obs.: lembre-se que um panel é uma subclasse da classe JComponent, logo poderá utilizar o método add(Component c) para inserir algum componente internamente (o mesmo vale para objetos da classe JFrame !).

JPanel

273

import java.awt.*;import javax.swing.*;public class PanelDemo { private JPanel painelAzul; private JPanel painelVermelho; private JFrame janelaDemo; public PanelDemo() { painelAzul = new JPanel(); painelVermelho = new JPanel(); janelaDemo = new JFrame(); painelAzul.setBackground(Color.blue); painelVermelho.setBackground(Color.red); painelAzul.setSize(50,50); painelVermelho.setSize(100,100); janelaDemo.getContenPane().setLayout(null); janelaDemo.setSize(200,200); janelaDemo.getContentPane().add(painelAzul); janelaDemo.getContentPane().add(painelVermelho); painelAzul.setLocation(10,10); painelVermelho.setLocation(10,70); janelaDemo.setVisible(true); } public static void main(String[] args) { PanelDemo p = new PanelDemo(); }}

JPanel - exemplo

274

JPanel – exercício (1)

Utilize a classe CandidatoEmprego.java e lhe acrescente 4 atributos privados da classe JPanel. Esses atributos deverão ser instanciados no construtor da classe atual:

painelIdentificacao:Cor de Fundo: (202,202,202)Retângulo:(10,70,480,80)Layout: nulo

painelCurriculum:Cor de Fundo: (202,202,202)Retângulo:(10,155,480,150)Layout: nulo

275

painelAreas:Cor de Fundo: (202,202,202)Retângulo:(10,310,480,80)Layout: nulo

painelBotoes:Cor de Fundo: (87,213,87)Retângulo:(10, 395, 480,37)Layout: nulo

*Adicioná-los ao ContentPane.

JPanel – exercício (*2)

276

JDialog

• Um JDialog é uma janela com uma barra de título.

• Caixas de diálogos são em geral usadas para obter/mostrar informações do/para o usuário.

• O swing fornece um rico conjunto de diálogos que permite interações básicas com o usuário sem a necessidade de escrever muito código.

277

JDialog• Caixas de diálogos podem ser modais ou não-modais

– Caixas modais não permitem que outras janelas sejam acessadas até que a caixa de dialogo seja fechada.

• Ex.: Janela de confirmação de exclusão de arquivos no Windows Explorer do Windows 9x

– Caixas não-modais permitem que outras janelas sejam manipuladas concomitantemente a janela de dialogo

• BorderLayout é o gerente de layout usado implicitamente por caixas de diálogos

• JDialog utiliza uma estrutura de camadas como a classe JFrame. Assim, ao adicionarmos um componente, devemos utilizar o ContentPane:dialog.getContentPane().add(comp1);

278

JDialog

Construtor Operação

JDialog(Dialog f) Constrói uma nova instância de JDialoginicialmente invisível e vinculada a

janela f.

JDialog(Dialog f, boolean m)Constrói uma nova instância de JDialog

inicialmente invisível, definida como modal caso o parâmetro m seja verdadeiro.

JDialog(Dialog f, String titulo, boolean m)Semelhante ao construtor anterior mas

com o título da janela JDialog.

279

JDialog

Construtor Operação

JDialog(Frame f) Constrói uma nova instância de JDialoginicialmente invisível e vinculada a

janela f.

JDialog(Frame f, boolean m)Constrói uma nova instância de JDialog

inicialmente invisível, definida como modal caso o parâmetro m seja verdadeiro.

JDialog(Frame f, String titulo, boolean m)Semelhante ao construtor anterior mas

com o título da janela JDialog.

280

JDialog

Método Uso

isModal() Retorna verdadeiro se o objeto JDialog questionado for modal.

setModal(boolean b) Redefine o comportamento modal do objeto JDialog.

281

JDialog - exercício

Complementando o exercício CandidatoEmprego, crie uma classe em java (DocumentosEntregues.java) que seja subclasse de JDialog. Todas as características devem ser definidas no construtor da classe atual:

Frame-pai: janela (da classe CandidatoEmprego)Título: Documentos EntreguesModal: trueCor de Fundo: (73,165,227)Dimensão : largura = 300 e altura = 470Localização: x = 200 e y = 200Layout: nulo

282

JDialog – exercício (interface final)(complementar ao exercício CandidatoEmprego.java)

283

Imagens nos componentes: ícones

• O Swing inclui a implementação do ícone através da classe ImageIcon, que permite associar imagens a objetos Jcomponent. A ImageIcon possui vários construtores, seguem três deles:

public ImageIcon(String fileName)

public ImageIcon(URL url)

public ImageIcon(Image img)

• java pode manusear: GIF, JPEG e JPG.

284

JLabel

• Um área onde textos não editáveis e imagens podem ser mostrados

• Rótulos são usados para informações ou instruções textuais na interface gráfica

• Um rótulo imagem mostra texto não editável na posição selecionada

• Uma vez criado um rótulo, programas raramente modificam seu conteúdo

285

JLabel - construtores

public JLabel( )

public JLabel (String s)

public JLabel (String s, int alignment)

public JLabel(String text, Icon icon,int horizontalAlignment)

public JLabel(Icon icon, int horizontalAlignment)

Constantes de alinhamento:– SwingConstants.LEFT– SwingConstants.CENTER– SwingConstants.RIGHT

286

JLabel - métodos

• public String getText()– retorna o texto do rótulo.

• public void setText(String s)– coloca o texto s no rótulo.

• public void setAlignment (int alignment)– alinha o texto do rótulo conforme as constantes de alinhamento vistas anteriormente.

• public void setVerticalTextPosition(int textPosition)– especifica a posição do texto com relação à imagem(TOP, CENTER (default)ou BOTTOM).

• public void getVerticalTextPosition( )• public void setHorizontalTextPosition(int textPosition)

– especifica a posição do texto com relação à imagem(LEFT, CENTER, RIGHT).

• public void getHorizontalTextPosition( )

287

JLabel - exemplo

import java.awt.*;import javax.swing.*;public class TesteLabel{ public static void main(String[] args) { JFrame fr = new JFrame(); JLabel lb = new JLabel(“Texto em baixo”, new ImageIcon(“duke.gif”), SwingConstants.LEFT); lb.setHorizontalTextPosition(SwingConstants.CENTER); lb.setVerticalTextPosition(SwingConstants.BOTTOM); fr.getContentPane().add(lb); fr.pack(); fr.setVisible(true); }}

288

JLabel - exercícioUtilize a classe CandidatoEmprego.java e lhe acrescente 5 atributos privados da classe JLabel. Esses atributos deverão ser instanciados no construtor da classe atual:

jlCabecalho : título “Ficha de Avaliação”, alinhamento CENTER, cor de frente azul, retângulo (130, 20, 250, 25) e fonte ("Arial", negrito, 18). Adicionar ao ContentPane. jlNome : título “Nome”, alinhamento LEFT, cor de frente default, retângulo (15, 20, 40, 20) e fonte ("Arial", negrito, 12). Adicionar ao painelIdentificacao.

jlSexo: título “Sexo”, alinhamento LEFT, cor de frente default, retângulo (15, 45, 40, 20) e fonte ("Arial", negrito, 12). Adicionar ao painelIdentificacao.

jlInteresse: título “Interesse”, alinhamento LEFT, cor de frente default, retângulo (60, 10, 150, 20) e fonte ("Arial", negrito, 12). Adicionar ao painelAreas.

jlAtuacao: título “Atuação”, alinhamento LEFT, cor de frente default, retângulo (270, 10, 150, 20) e fonte ("Arial", negrito, 12). Adicionar ao painelAreas.

289

JTextComponent

• A classe JTextComponent é uma abstração de um componente que recebe inserções de textos do usuário.

• Ela é a super-classe abstrata de duas classes com funcionalidades em comum: JTextField e JTextArea e seus métodos e atributos são compartilhados por estas.

290

JTextComponent - métodos

• public String getText()– Retorna um objeto da classe String contendo o

texto correspondente ao que o usuário digitou no objeto JTextComponent.

• public void setText(String texto)– Define o texto do objeto JTextComponent

conforme o valor do objeto String texto passado como parâmetro.

291

• public String getSelectedText()– Retorna um objeto da classe String contendo o

texto correspondente ao que o usuário marcou no objeto JTextComponent.

• public void select(int inicio, int final)– Marca o texto do objeto JTextComponent

conforme no intervalo correspondente ao valor de início e final passados como parâmetros.

JTextComponent - métodos

292

• public void selectAll()– Seleciona todo o texto no objeto

TextComponent.

• public void setEditable(boolean estado)– Define o objeto JTextComponent como

editável ou não.

JTextComponent - métodos

293

JTextField

• Um objeto da classe JTextField é um campo texto na forma de uma linha na qual textos podem ser digitados pelo usuário através do teclado.

• A classe JTextField é uma sub-classe de JTextComponent, portanto pode-se aplicar nesta todos os métodos vistos anteriormente na classe JTextComponent.

294

JTextField - construtores

• public JTextField()– constrói um objeto do tipo campo de texto.

• public JTextField(int colunas)– constrói um objeto campo de texto vazio com o número

especificado de colunas.

• public JTextField(String texto)– constrói um objeto campo de texto com o texto fornecido

no parâmetro texto.• public JTextField(String s, int colunas)

– constrói um objeto campo de texto com o texto fornecido no parâmetro texto com o número especificado de colunas.

295

Utilize a classe CandidatoEmprego.java e lhe acrescente 1 atributo privado da classe JTextField. Esse atributo deverá ser instanciado no construtor da classe atual:

jtfNome: texto “nome do candidato”, 70 colunas, posição (65, 20) e dimensão (305, 20) . Adicionar ao painelIdentificacao.

JTextField - exercício

296

JTextArea

• Um objeto da classe JTextArea é um campo texto na forma de várias linhas nas quais textos podem ser digitados pelo usuário através do teclado.

• A classe JTextArea é também uma sub-classe de JTextComponent, portanto pode-se aplicar nesta todos os métodos vistos anteriormente na classe JTextComponent.

297

JTextArea - construtores

public JTextArea( )– constrói um objeto do tipo campo de texto com possibilidade para

várias linhas.

public JTextArea(int linhas, int colunas)– constrói um objeto JTextArea vazio com o número especificado de

colunas e linhas.

public JTextArea(String texto)– constrói um objeto JTextArea com o texto fornecido no parâmetro

texto.

public JTextArea(String texto , int linhas, int col)– constrói um objeto JTextArea com o texto especificado e número

especificado de colunas e linhas.

298

JTextArea - métodos• public void setColumns(int c)

– define o número de colunas visíveis para o objeto JTextArea.

• public int getColumns()– devolve o número de colunas visíveis já definidas

para o objeto JTextArea.

• public void setRows(int r)– define o número de linhas visíveis para o objeto

JTextArea.

• public int getRows()– devolve o número de linhas visíveis já definidas

para o objeto JTextArea.

• public void append(String str) – adiciona o texto no final do JTextArea.

• public void insert(String str, int pos) – insere o texto na posição especificada.

299

import java.awt.*;import javax.swing.*;public class TextAreaDemo{ public TextAreaDemo() { JLabel lNome = new JLabel("Observação:"); JTextArea tArea = new JTextArea("",5,30); JScrollPane sp = new JScrollPane(tArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); JPanel painelLabel = new JPanel(); JFrame janelaDemo = new JFrame(); painelLabel.add(lNome ); painelLabel.add(sp ); janelaDemo.getContentPane().add(painelLabel); janelaDemo.pack(); janelaDemo.setVisible(true); } public static void main(String[] args) { TextAreaDemo t = new TextAreaDemo(); }}

JTextArea - exemplo

300

Adicione à classe CandidatoEmprego dois métodos públicos para definição e leitura dos valores digitados no objeto TextArea:public void setCurriculum(String curriculum);public String getCurriculum().

Utilize a classe CandidatoEmprego.java e lhe acrescente 1 atributo privado da classe JTextArea. Esse atributo deverá ser instanciado no construtor da classe atual:

jtaCurriculum: texto “ ”, 6 linhas, 460 colunas e ToolTipText("Digite aqui os dados do Curriculum Vitae resumido"). NÃO adicionar a nenhum painel.

JTextArea - exercício

301

JScrollPane

• As mais sofisticadas interfaces de usuários utilizam áreas com barras de rolagem.

• O Swing inclui um conjunto de componentes em uma classe JScrollPane que atende estas demandas.

• Caso as características fornecidas pela classe JScrollPane não sejam suficientes, será possível criar novos componentes através da interação direta com os componentes da classe JScrollBar.

• Implementa as interfaces: ScrollPaneConstants e Accessible.

302

Rolagem horizontal

Rolagem vertical

A coluna header

A linha header

Viewport (onde é feita a rolagem do objeto)

cantos

A estrutura de JScrollPane

303

JScrollPane

Construtor

JScrollPane() cria um JScrollPane vazio (nenhuma viewport) onde as áreas de scrollbar horizontal e vertical aparecem quando necessário.

JScrollPane(Component view) cria um JScrollPane que exibe o conteúdo

de um componente específico, onde os scrollbars horizontal e vertical aparecem quando o conteúdo do componente é maior do que o campo de visão.

304

JScrollPane

Construtor

JScrollPane(Component view, int vsbPolicy, int hsbPolicy) cria um JScrollPane que exibe um campo de visão em uma viewport cuja posição do campo de visão pode ser controlada de acordo com as constantes da scrollbar.

JScrollPane(int vsbPolicy, int hsbPolicy) cria um JScrollPane vazio (sem viewport) de acordo com constantes scrollbar especificadas.

305

Constantes

JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED

JScrollPane.VERTICAL_SCROLLBAR_NEVER

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED

JScrollPane.HORIZONTAL_SCROLLBAR_NEVER

JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS

JScrollPane

306

Métodos setHorizontalscrollBarPolicy (int policy)

determina quando a scrollbar horizontal aparecerá na scrollpane.

setVerticalscrollBarPolicy (int policy)

determina quando a scrollbar veritcal aparecerá na scrollpane.

setViewportView(Component view) Creates a viewport if necessary

and then sets its view.

JScrollPane

307

JScrollPane - exercício Utilize a classe CandidatoEmprego.java e lhe acrescente 1 atributo privado da classe JScrollPane. Esse atributo deverá ser instanciado no construtor da classe atual com os parâmetros:

jspCurriculum: (jtaCurriculum, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS), posição (10, 20) e dimensão (460, 120) . Adicionar ao painelCurriculum.

308

Botões

• O pacote javax.swing suporta os seguintes tipos de botões:

• JButton Botão comum• JCheckBox Botões de seleção independentes • JRadioButtonBotões agrupados para seleção• JMenuItem Item de menu no formato de botão

JCheckBox ou JRadioButton.

309

JButton

É subclasse de AbstractButton e Jcomponent.

• public JButton( )– constrói um objeto do tipo Botão sem texto.

• public JButton(String texto)– constrói um objeto Botão com o texto especificado.

• public JButton(Icon icon)– constrói um objeto Botão com o ícone especificado.

• public JButton(String texto, Icon icon)– constrói um objeto Botão com o texto especificado.

310

JButton - métodos

• getText() – retorna o String representando o texto vinculado ao botão.

• setText(String s) – define um texto para representar o botão.

• getIcon() – retorna o ícone vinculado ao botão.

• setIcon(Icon icon) – define um ícone para ser mostrado pelo botão.

311

• setDisabledIcon(Icon icon) – atribui o ícone a ser exibido quando o botão for inibido.

• setPressedIcon(Icon icon) – atribui o ícone a ser exibido quando o botão for pressionado.

• setSelectedIcon(Icon icon) – atribui o ícone a ser exibido quando o botão for selecionado.

• setRolloverIcon(Icon icon) – atribui o ícone a ser exibido quando o botão for selecionado.

JButton - métodos

312

import java.awt.*;public class ButtonDemo{ private Button[] botoes; private Frame janelaDemo; public ButtonDemo() { janelaDemo = new Frame(“Botões”); janelaDemo.setLayout(new FlowLayout()); botoes = new Button[5]; for(int i = 0; i< botoes.length;i++) { botoes[i] = new Button(“Botão “+i); janelaDemo.add(botoes[i]); } janelaDemo.pack(); } public void mostraExemplo() { janelaDemo.setVisible(true); } public static void main(String[] args) { ButtonDemo t = new ButtonDemo(); t.mostraExemplo(); }}

JButton – exemplo

313

Utilize a classe CandidatoEmprego.java e lhe acrescente 3 atributos privados da classe JButton. Esses atributos deverão ser instanciados no construtor da classe atual com os parâmetros:

jbDocumentosEntregues:texto “Documentos Entregues”, retângulo (20,6,200,25) e ToolTipText("Clique aqui para acessar a tela de Documentos Entregues"). Adicionar ao painelBotoes.

jbSalva: texto “Salva” e retângulo (240,6,100,25). Adicionar ao painelBotoes.

jbCancela: texto “Cancela” e retângulo (360,6,100,25). Adicionar ao painelBotoes.

JButton - exercício

314

JRadioButton

• É subclasse de JToggleButton, AbstractButton e Jcomponent.

• Pode ter dois estados : ligado e desligado.• Podem ser agrupados pela classe ButtonGroup. Neste

caso, a seleção é mutuamente exclusiva.

315

import java.awt.*;import javax.swing.*;public class MeuRadioButton extends JFrame{ public static void main(String args[]) { MeuRadioButton window = new MeuRadioButton (); JPanel p = new JPanel(); window.getContentPane().add(p); JRadioButton masculino = new JRadioButton( "Masculino" ); p.add( masculino ); JRadioButton feminino = new JRadioButton( "Feminino" ); p.add( feminino ); ButtonGroup grupo = new ButtonGroup (); grupo.add(masculino); grupo.add(feminino); window.pack(); window.setVisible(true); }}

JRadioButton

316

Utilize a classe CandidatoEmprego.java e lhe acrescente 3 atributos privados: 2 da classe JRadioButton e outro da classe ButtonGroup . Esses atributos deverão ser instanciados no construtor da classe atual com os parâmetros:jrbfeminino: texto “Feminino”, retângulo(65,45,150,20) e selecionado = true. Adicionar ao painelIdentificacao e ao bgGrupoSexo.

jrbMasculino: texto “Masculino” e retângulo(220,45,150,20). Adicionar ao painelIdentificacao e ao bgGrupoSexo.

bgGrupoSexo: adicionar-lhe os objetos jrbFeminino e jrbMasculino. NÃO adicionar a nenhum painel.

JRadioButton - exercício

317

JCheckBox

• É subclasse de JToggleButton, AbstractButton e Jcomponent.

• Igualmente ao JRadioButton, um JCheckBox pode ter dois estados: ligado ou desligado.

• Um conjunto de checkboxes podem ser agrupados através da classe ButtonGroup. Neste caso, a seleção é mutuamente exclusiva.

318

JCheckBoxConstrutores UsoJCheckBox(String label) Cria um Checkbox desligado, com o label

especificado.

JCheckBox(String label,boolean state)

Cria um Checkbox ligado ou desligado, de

acordo com a variável booleana state e com

o label especificado.

JCheckBox(Icon icon, boolean state)

Cria um Checkbox ligado ou desligado, de

acordo com a variável booleana state, com

o ícone especificado.

319

import java.awt.*;import javax.swing.*;public class MeuCheckbox extends JFrame{ public static void main(String args[]) { MeuCheckbox window = new MeuCheckbox(); JPanel p = new JPanel(); window.getContentPane().add(p); JCheckBox negrito = new JCheckBox( "Negrito" ); p.add( negrito ); JCheckBox italico = new JCheckBox( "Itálico" ); p.add( italico ); window.pack(); window.setVisible(true); }}

JCheckBox - exemplo

320

Utilize a classe DocumentosEntregues.java e lhe acrescente 5 atributos privados da classe JCheckBox (não agrupados). Esses atributos deverão ser instanciados no construtor da classe atual e adicionados ao ContentPane correspondente:

jcbDoc1: texto “Carteira de Identidade e CPF”, ativo = true, cor de fundo (255,204,0), cor de frente preta, retângulo(10,20,270,45).

jcbDoc2: texto “Carteira de Trabalho”, ativo = false, cor de fundo default, cor de frente preta, retângulo(10,65,270,45).

jcbDoc3: texto “Curriculum resumido e Comprovantes”, ativo = false, cor de fundo (255,204,0), cor de frente preta, retângulo(10,110,270,45).

jcbDoc4: texto “Foto 3x4”, ativo = true, cor de fundo default, cor de frente preta, retângulo(10,155,270,45).

jcbDoc5: texto “Proposta de Trabalho”, ativo = true, cor de fundo (255,204,0), cor de frente preta, retângulo(10,200,270,45).

JCheckBox - exercício

321

JComboBox

• É herança direta de Jcomponent.

• Um JComboBox é um componente visual que possibilita a manipulação de coleções de objetos permitindo ao usuário selecionar apenas um objeto da coleção. Cada objeto inserido no JComboBox é representado visualmente pela String retornada pelo método toString().

322

JComboBox

• Um objeto JComboBox utiliza o MVC (Model Viewer Controler), possibilitando ao desenvolvedor criar sua própria massa de dados através de classes de manipulação fornecidas no pacote Swing.

• Um objeto JComboBox pode também ser manipulado diretamente, recebendo elementos para montagem de sua massa de dados um a um através do método addItem.

• objetos da classe JComboBox assumem também comportamento semelhante ao componente JTextField, tornando possível editar os componentes selecionáveis e pesquisar rapidamente um elemento digitando a primeira letra dele.

323

JComboBox

• public JComboBox(ComboBoxModel aModel)

– Cria um objeto JComboBox que recebe seus itens de um ComboBoxModel previamente definido.

• public JComboBox(Object[] items)

– Cria um objeto JComboBox que recebe seus itens de um array de objetos. O objeto JComboBox utilizará o método toString de cada objeto do array.

• public JComboBox(Vector items)– Cria um objeto JComboBox que recebe seus itens de um vetor de objetos. O objeto JComboBox

utilizará o método toString de cada objeto do vetor.

• public JComboBox()– Cria um objeto JComboBox com um modelo de dados padrão (uma lista de objetos vazia).

Construtores

324

• public void setModel(ComboBoxModel aModel)– Redefine o modelo de dados que o JComboBox utilizará.

• public ComboBoxModel getModel()– Resgata o modelo de dados que o JComboBox está utilizando.

• public void setEditable(boolean aFlag)– Faz com que o JCombobox se comporte como um JTextField,

possibilitando a edição ou seleção dos elementos cadastrados. (a edição não afeta a massa de dados, apenas o campo)

• public boolean isEditable()– Informa se o objeto JComboBox está editável ou não.

• public void setMaximumRowCount(int count)– Define o número máximo de linhas que o JComboBox irá mostrar.

• public int getMaximumRowCount()– Informa o máximo de linhas que o JComboBox poderá mostrar.

Métodos

JComboBox

325

• public void setSelectedItem(Object anObject)

– Seleciona um determinado objeto da lista no JComboBox.

• public Object getSelectedItem()

– Retorna o item correntemente selecionado.

• public void setSelectedIndex(int anIndex)

– Seleciona um determinado objeto da lista no JComboBox através do seu valor posicional.

• public int getSelectedIndex()

– Retorna o posicional do item correntemente selecionado.

• public void addItem(Object anObject)

– Adiciona um elemento na lista padrão (usado quando o JComboBox é criado com construtor vazio).

Métodos

JComboBox

326

• public void insertItemAt(Object anObject, int index)

– Insere um elemento na lista padrão na posição informada pelo índice (usado quando o JComboBox é criado com construtor vazio).

• public void removeItem(Object anObject)

– Remove o elemento na lista padrão (usado quando o JComboBox é criado com construtor vazio).

• public void removeItemAt(int anIndex)

– Remove o elemento do índice informado na lista padrão (usado quando o JComboBox é criado com construtor vazio).

• public void removeAllItems()

– Remove todos elementos da lista padrão (usado quando o JComboBox é criado com construtor vazio).

Métodos

JComboBox

327

• public void setEnabled(boolean b)

– Define se o objeto poderá ser manipulado pelo usuário.

• public int getItemCount()

– Retorna o número de elementos no objeto JComboBox.

• public Object getItemAt(int index)

– Retorna o objeto referente ao elemento posicionado no índice fornecido.

Métodos

JComboBox

328

import javax.swing.*;import java.awt.*;public class ExemploJComboBox {public ExemploJComboBox() {

JFrame f = new JFrame("Exemplo ExemploJComboBox"); JComboBox comboBox = new JComboBox(); comboBox.addItem("Consulta Conta Corrente"); comboBox.addItem("Extrato Conta Corrente"); comboBox.addItem("Consulta Cartão de Crédito"); comboBox.setBounds(10,10,200,30);

f.getContentPane().setLayout(null); f.getContentPane().add(comboBox);

f.setSize(300,100); f.setVisible(true);

} public static void main(String args[]) { ExemploJComboBox e = new ExemploJComboBox(); }}

JComboBox - exemplo

329

import javax.swing.*;

import java.awt.*;

public class ExemploJComboBoxArray {

public ExemploJComboBoxArray() {

JFrame f = new JFrame("Exemplo com Array");

String[] dados = {"Melancia", "Abacate", "Melão" };

JComboBox comboBox = new JComboBox(dados);

comboBox.setBounds(10,10,200,30);

f.getContentPane().setLayout(null);

f.getContentPane().add(comboBox);

f.setSize(300,100);

f.setVisible(true);

}

public static void main(String args[]) {

ExemploJComboBoxArray e = new ExemploJComboBoxArray();

}

}

JComboBox – exemplo com array

330

JComboBox - ComboBoxModel

• Conforme demonstrado nos exemplos anteriores, um objeto JComboBox pode ser utilizado de forma semelhante ao objeto Choice do pacote AWT (recebendo elementos um a um) ou recebendo uma coleção de objetos via vetor ou array de objetos. Outra forma de se utilizar um objeto JComboBox é através da criação de um modelo de dados que se associa à classe JComboBox via método construtor - public JComboBox(ComboBoxModel aModel) - ou por uma chamada ao método:

public void setModel(ComboBoxModel aModel).

• O modelo de dados ComboBoxModel é uma interface e subclasse de outra interface (ListModel) que contém métodos pré-definidos para manipulação e consulta de uma massa de dados por um JComboBox.

331

• public int getSize()

– Deverá ser implementado para retornar o número de elementos da coleção de dados.

• public Object getElementAt(int index)

– Deverá retornar o objeto na posição informada pelo índice.

• public void setSelectedItem(Object anItem)

– Deverá marcar o elemento como selecionado.

• public Object getSelectedItem()

– Deverá devolver o elemento que foi previamente selecionado.

Métodos

JComboBox - ComboBoxModel

332

JComboBox - exercício Utilize a classe CandidatoEmprego.java e lhe acrescente 2 atributos privados da classe JComboBox. Esses atributos deverão ser instanciados no construtor da classe atual com os parâmetros:

jcbInteresse: cor de fundo branca, retângulo(60,30,150,25), fonte ("TimesRoman",Font.ITALIC,12) e ToolTipText("Escolha a Área de Interesse"). Adicionar as Strings ("Professor", "Gerente", "Desenvolvedor" e “Outra”). Adicionar ao painelAreas.

jcbAtuacao: cor de fundo branca, retângulo (270,30,150,25) e fonte ("TimesRoman",Font.ITALIC,12). Adicionar as Strings ("Informática", "Matemática", "Biologia" e “Outra”). Adicionar ao painelAreas.

333

Criando Menus *LFSC*

Fonte : http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html

334

JMenuBar *LFSC*

É subclasse de JComponent. O layout default é o BoxLayout.

JMenuBar( ) Constrói um objeto do tipo barra de menu.

add(JMenu c) Adiciona o menu especificado ao final da barra de menu.

Para atribuir a barra de menu ao JFrame desejado, basta utilizar o método da janela:

void setJMenuBar(JMenuBar menubar)        

335

JMenuItem *LFSC*

É subclasse de JAbstractButton, ou seja, os itens de menu são simplesmente botões.

Construtores__________________JMenuItem( ) Cria um item de menu.

JMenuItem(String s) Cria um item de menu com o texto especificado.

JMenuItem(String s, Icon i) Cria um item de menu com o texto e ícone especificados.

JMenuItem(String s, int mnemonic) Cria um item de menu com o texto e mnemônico especificados.

336

JMenuItem *LFSC*

Alguns métodos importantes :

•void setMnemonic(int mnemônico)      -- Herdado de JAbstractButton, atribui uma tecla de acesso ao item de menu.

ex.: itemDeMenu.setMnemonic(72); // char N.

•void setAccelerator(KeyStroke keyStroke) -- Atribui uma tecla de atalho para execução direta do item de menu.

ex.: itemDeMenu.setAccelerator( KeyStroke.getKeyStroke(

KeyEvent.VK_B, ActionEvent.ALT_MASK));

*resultará na tecla de atalho ALT_B.

337

JMenu *LFSC*

É subclasse de JMenuItem. Utilizada para criar os itens principais de menu ou submenus.

JMenu( ) Cria um menu principal ou submenu. Para atribuir um ícone, utilize setText(String s).

JMenu(String s) Cria um menu principal ou submenu com o texto especificado. Para atribuir um ícone, utilize setIcon(Icon i).

add(String s) Cria um item de menu com o texto especificado e o adiciona ao final do menu.

add(JMenuItem j) Adiciona o item de menu especificado ao final da barra de menu.

addSeparator( ) Adiciona um separador como próximo (ou último) item do menu.

338

Como criar um menu *LFSC*

1. Criar primeiramente a JMenuBar( ) e atribuí-la ao JFrame desejado.

2. Criar os menus principais ou submenus do tipo JMenu( ) e adicioná-los à barra de menu (JMenuBar) ou a um menu (Jmenu) como um novo item.

3. Criar os itens de menu do tipo JMenuItem( ) e adicioná-los ao menu principal ou ao submenu correspondente (JMenu).

4. Se houver subitens de menu, repetir os passos 2 e 3.

339

JMenuBar e JMenu - exercício *LFSC*

Criar uma barra de menu (jmbBarraMenu) e atribuí-la à janela.

Criar 3 menus principais e adicioná-los à “barra de menu” :

Componentes a serem implementados na classe CandidatoEmprego.java :

jmArquivo: texto “Arquivo”, mnemônico ‘A’ (int 65)’ e ícone “tips.gif”.

jmFormatar: texto “Formatar”, mnemônico ‘F’ (int 70).

jmSobre: texto “Sobre”, mnemônico

‘o’ (int 111).

340

JMenuItem - exercício 1 *LFSC*

Criar 5 itens de menu e adicioná-los ao menu “Arquivo” :

Componentes a serem implementados na classe CandidatoEmprego.java :

jmiNovo: texto “Novo” (20 caracteres de largura), mnemônico ‘N’ (int 78) e tecla aceleradora “ALT_B”.

jmiAbrir: texto “Abrir”.

jmiFechar: texto “Fechar”.

jmiSalvar: texto “Salvar”.

jmiSair: texto “Sair”.

*Incluir a instrução import java.awt.event.* .

341

JMenuItem - exercício 2 *LFSC*

Criar 2 submenus e adicioná-los ao menu “Formatar” :

Componentes a serem implementados na classe CandidatoEmprego.java :

jmCor: texto “Cor”.

Adicionar um separador (addSeparator( )).

jmFonte: texto “Fonte”.

Criar 4 itens de menu do tipo JRadioButtonMenuItem (agrupados) e adicioná-los ao submenu jmCor :

jrbmiAzul: texto “Azul” e selecionado = true.

•jrbmiVerde: texto “Verde”.

•jrbmiVermelho: texto “Vermelho”.

•jrbmiPreto: texto “Preto”.

*Adicioná-los também ao ButtonGroup correspondente.

342

JMenuItem - exercício 3 *LFSC*

Componentes a serem implementados na classe CandidatoEmprego.java :

Criar 4 itens de menu do tipo JRadioButtonMenuItem (agrupados) e adicioná-los ao submenu jmFonte :

jrbmiArial: texto “Arial” e selecionado = true.

•jrbmiCourier: texto “Courier”.

•jrbmiHelvetica: texto “Helvetica”.

•jrbmiTimesRoman: texto “TimesRoman”.

•Adicionar um separador (addSeparator( )).

*Adicioná-los também ao ButtonGroup correspondente.

Criar 2 itens de menu do tipo JCheckBoxMenuItem e adicioná-los ao submenu jmFonte :

jcbmiNegrito: texto “Negrito”.

•jcbmiItalico: texto “Itálico” e selecionado = true.

343

JMenuItem - exercício 4 *LFSC*

Criar 1 item de menu e adicioná-lo ao menu “Sobre” :

Componentes a serem implementados na classe CandidatoEmprego.java :

jmiSobre: texto “Sobre a Aplicação” e ícone “tips.gif”.

344

Border

• A interface Border (javax.swing.border.*) permite a criação de vários modelos de bordas.

• A classe JComponent fornece o método public void setBorder(Border border), que permite a configuração da borda em componentes.

• O Swing também fornece uma classe utilitária de nome BorderFactory, que se encarrega de criar instâncias de bordas pré-definidas.

*Incluir a instrução import javax.swing.border.*.

345

BorderTipos pré-definidos de bordas:

BevelBorder, CompoundBorder, EmptyBorder, EtchedBorder, LineBorder, LoweredBevelBorder, MatteBorder, RaisedBevelBorder e TitledBorder.

346

BorderFactory

static Border createEmptyBorder()

static Border createEtchedBorder()

static Border createLineBorder(Color color)

static Border createLoweredBevelBorder()

static Border createRaisedBevelBorder()

static TitledBorder createTitledBorder(Border border)

static TitledBorder createTitledBorder(Border border, String title)

static CompoundBorder createCompoundBorder( Border outsideBorder, Border insideBorder)

347

Etapas na utilização de bordas1. Criar o objeto visual que conterá a borda:

JPanel painelComBorda = new JPanel();

2. Criar o(s) objeto(s) bordas por meio da classe BorderFactory . Segue o exemplo de uma TitledBorder com uma RaisedBevelBorder:

Border rbbBorda =

BorderFactory.createRaisedBevelBorder();TitledBorder tbBorda =

BorderFactory.createTitledBorder( rbbBorda, "Painel com TitledBorder" );

3. Caso existam ajustes de personalização na borda, efetuá-los antes de atribuí-la ao objeto visual. Os parâmetros abaixo se referem a uma TitledBorder:

tbBorda.setTitlePosition(TitledBorder.TOP);

tbBorda.setTitleJustification(TitledBorder.LEFT);

4. Vincular a borda ao objeto visual:

painelComBorda.setBorder(tbBorda);

348

Border - exercício 1 *LFSC*

Criar 5 objetos do tipo Border :

bbBorda: borda BevelBorder, tipo BevelBorder.RAISED, destaque verde e sombra laranja.

rbbBorda: borda RaisedBevelBorder.

ebBorda: borda EtchedBorder, destaque cinza escuro e sombra branca.

lbBorda: borda LineBorder, cor (3, 255, 3) e espessura 3.

lbbBorda: borda LoweredBevelBorder.

Criar 3 objetos do tipo TitledBorder, com os seguintes parâmetros:

tbIdentificacao: borda bbBorda e título “Identificação”.

tbCurriculum: borda rbbBorda e título “Curriculum Vitae”.

tbAreas : borda ebBorda e título “Áreas”.

Componentes a serem implementados na classe CandidatoEmprego.java :

349

Border - exercício 2 *LFSC*

Atribuir as bordas aos seguintes componentes:

borda rbbBorda aos jmbBarraMenu, jmiSobre, jbDocumentosEntregues, jbSalva e jbCancela.

borda tbIdentificacao ao painelIdentificacao. borda tbCurriculum ao painelCurriculum. borda tbAreas ao painelAreas. borda lbBorda ao painelBotoes borda lbbBorda ao jtfNome. borda lbbBorda aos jcbInteresse e jcbAtuacao.

Componentes a serem implementados na classe CandidatoEmprego.java :

350

Border - resultado final *LFSC*

Componentes a serem implementados na classe CandidatoEmprego.java :

351

A classe JOptionPane

• Através da classe JOptionPane é fácil exibir uma caixa de diálogo padrão que induza o usuário a um valor ou o informa de alguma coisa.

• A classe aparenta ser complexa devido ao grande número de métodos, porém a quase totalidade das chamadas é constituída de métodos estáticos.

• Na sua forma mais básica, ela exibe uma linha de mensagem e um botão rotulado com “OK”.

• Uma vez que o diálogo tenha sido exibido, ele fica na tela até o usuário pressionar o botão “OK”. Enquanto o diálogo continuar na tela, o usuário não poderá interagir com mais nada na aplicação.

352

A classe JOptionPane

• A aparência de uma das caixas de diálogo é similar à figura abaixo:

ícone

mensagem

valor de entrada

botões opcionais

título da janela

353

A classe JOptionPaneConstantes para tipos de mensagens:

ERROR_MESSAGEINFORMATION_MESSAGEWARNING_MESSAGE QUESTION_MESSAGEPLAIN_MESSAGE

Constantes para opções de botões:YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION

Constantes inteiras de retorno:JOptionPane.YES_OPTIONJOptionPane.NO_OPTIONJOptionPane.CANCEL_OPTIONJOptionPane.OK_OPTION

JOptionPane.CLOSED_OPTION

354

JOptionPane - exemplos 1

Mostra um diálogo de erro com título “Mensagem de erro” e mensagem “Entrada inválida”: JOptionPane.showMessageDialog(null, “Entrada inválida”, “Mensagem de erro”, JOptionPane.ERROR_MESSAGE);

Mostra um diálogo com as opções yes/no e a mensagem “Escolha uma opção”:JOptionPane.showConfirmDialog(null, “Escolha uma opção", “Diálogo de escolha", JOptionPane.YES_NO_OPTION);

355

JOptionPane - exemplo 2

Mostra um diálogo de aviso com opções OK e CANCELA:

Object[] options = { "OK", "CANCELA" };JOptionPane.showOptionDialog(null, “Continua?",

"Warning", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);

Assinatura do método:showOptionDialog(Component parent, Object mensagem, String título, int optionType, int messageType, Icon icone, Object[] options, Object intialValue).

356

Mostra um diálogo que requer um String de entrada:

String inputValue = JOptionPane.showInputDialog( “Por favor, entre o valor:");

Object[] possibleValues = { “Um", “Dois", “Três" };

Object selectedValue = JOptionPane.showInputDialog(

null,“Escolha um", "Input",

JOptionPane.INFORMATION_MESSAGE, null,

possibleValues, possibleValues[0]);

JOptionPane - exemplos 3

357

JFileChooser (tópico extra)

• Diálogos para selecionar arquivos.• São herança direta de JComponent.• Os principais tipos são : showDialog, showOpenDialog

e showSaveDialog.• Simples de serem criados:

– JFileChooser chooser = new JFileChooser();– int result = chooser.showDialog(parentFrame);

• result : – JFileChooser.APPROVE_OPTION ( 0 ) se algum arquivo é

escolhido.– JFileChooser.CANCEL_OPTION (1) se cancel é escolhido

ou a janela de diálogo é fechada.

358

//File Chooser: Exemplo Simplesimport javax.swing.*;import java.io.*;

public class FileChooserExample1 {public static void main(String[] args) {

JFrame parentFrame = new JFrame("File Chooser Example 1");JFileChooser chooser = new JFileChooser();int result = chooser.showDialog(parentFrame, “Título”);File selectedFile = chooser.getSelectedFile();System.out.println("Return value from showDialog is " + result);if (selectedFile != null)

{ System.out.println("Chosen file is " + selectedFile.getPath());}

else {

System.out.println("No file was selected");}System.exit(0); } }

JFileChooser – execute e veja o resultado !!

359

JOptionPane - exercício 1 *LFSC*

Chamar o método showMessageDialog da classe JOptionPane com os seguintes parâmetros:

Frame-pai: nulo.

Mensagem: “Valor incorreto = “ + valor + “. Tente outra vez !!”.

Título: “Alerta”.

Tipo de mensagem: JOptionPane.WARNING_MESSAGE.

Componentes a serem implementados no método main da classe CandidatoEmprego.java :

* Passar o parâmetro pela linha de comando e mostrar a caixa de diálogo se esse valor for menor que 10.

360

JOptionPane - exercício 2 *LFSC*

Componentes a serem implementados no método main da classe CandidatoEmprego.java :

Chamar o método showOptionDialog da classe JOptionPane com os seguintes parâmetros:

Frame-pai: nulo.

Mensagem: “O valor digitado é = “ + valor “. Deseja continuar mesmo assim ?”.

Título: “Pergunta”.

Tipo de opção: JOptionPane.YES_NO_OPTION.

Tipo de mensagem: JOptionPane.QUESTION_MESSAGE.

Ícone: nulo.

Array de opções: array de Object com as opções “Sim” e “Não”.

Opção default: “Sim” (posição zero).

* Passar o parâmetro pela linha de comando e mostrar a caixa de diálogo se esse valor for maior que 10.

361

JOptionPane - exercício 3 *LFSC*

Componentes a serem implementados no construtor da classe CandidatoEmprego.java :

Após mostrar a janela, chamar o método showInputDialog da classe JOptionPane com os seguintes parâmetros:

Frame-pai: janela.

Mensagem: “Escolha o nome do candidato ao emprego: ”.

Título: “JOptionPane com ComboBox”.

Tipo de mensagem: JOptionPane.PLAIN_MESSAGE.

Ícone: tips.gif.

Array de opções: array de Object com os nomes “Antônio da Siva, José Afonso e Ana Rita”.

Opção default: “Ana Rita” (posição 2).

*Capturar o retorno como String e passá-lo ao método setNome(String s) para que o campo jtfNome seja atualizado com o valor escolhido (setText( ) ).

362

JOptionPane - exercício 4 *LFSC*

Componentes a serem implementados no construtor da classe CandidatoEmprego.java :

Após o exercício anterior, invocar novamente o método showInputDialog da classe JOptionPane com os seguintes parâmetros:

Frame-pai: janela.

Mensagem: “Digite os dados do Curriculum Vitae resumido: ”.

Título: “Entrada de dados”.

Tipo de mensagem: JOptionPane.INFORMATION_MESSAGE.

*Capturar a String de retorno e passá-la ao método setCurriculum(String s) para que o campo jtaCurriculum seja atualizado com o valor escolhido (setText( ) ).

363

Gerenciadores de Layout

• Embora seja possível posicionar objetos em coordenadas fixas (x, y), deve-se evitar essa prática em Java.

• Isso causa problemas de portabilidade: outras JVMs, GUIs e Window Managers terão fontes e outros elementos em tamanhos e proporções diferentes.

• Baseados em regras, os Layout Managers calculam as coordenadas automaticamente.

364

Gerenciadores de Layout

• Há 7 gerenciadores de layout pré-definidos:• FlowLayout (java.awt.*)• GridLayout (java.awt.*)• BorderLayout (java.awt.*)• CardLayout (java.awt.*)• GridBagLayout (java.awt.*)• BoxLayout (javax.swing.*)• SpringLayout (javax.swing.* - v 1.4)

• Implicitamente, cada container possui um gerenciador de layout default associado. Assim, se não for declarado nenhum gerenciador de layout para o container, será usado o layout default.

• Um programador pode também criar novos gerenciadores de layout.

365

Gerenciadores de Layout

366

Gerenciadores de Layout

367

Escolhendo um gerenciador de layout

• Se você precisa mostrar alguns componentes utilizando os seus tamanhos naturais em uma linha, então use o FlowLayout.

• Se você precisa mostrar componentes de mesmo tamanho em linhas e colunas, então use o GridLayout.

• Se você precisa mostrar painéis alternativamente, então use o CardLayout.

• Se você precisa mostrar componentes e espalhá-los utilizando todo espaço disponível, então utilize o BorderLayout ou GridBagLayout.

368

• Cada container tem um gerenciador de layout default:– JPanel (incluindo JApplet) FlowLayout– Window BorderLayout– JMenuBar BoxLayout

• Para utilizar um gerenciador de layout diferente do default, você precisa criar uma instância do gerenciador de layout desejado e avisar ao container para usá-lo:aContainer.setLayout(new CardLayout());

ouCardLayout meuCardLayout = new CardLayout();aContainer.setLayout(meuCardLayout);

ouaContainer.setLayout(null); //sem gerenciador

Gerenciadores de layout - regras gerais

369

Gerenciadores de layout - regras gerais

• Os métodos add, remove e removeAll (que adiciona e removem componentes) podem ser utilizados a qualquer momento.

• Se você muda o tamanho de um componente indiretamente (por exemplo, mudando a sua Font), então você deverá invocar o método invalidate para o componente e, logo, após invocar o método validate para o container.

• Os métodos getPreferredSize e getMinimumSize podem retornar valores sem significado (os seus valores são válidos somente após o componente ter sido mostrado a primeira vez).

370

Pode-se simplificar um layout pelo agrupamento de componentes em containers do tipo JPanel (visíveis ou invisíveis).Exemplo : distribuir componentes no ContentPane de um JFrame.

Pode-se usar painéis dentro de painéis e cada um deles sendo controlado por um gerenciador de layout diferente, o que também auxilia a distribuição dos componentes visuais.Exemplo : botões posicionados com distâncias horizontais diferentes.

É possível atribuir painéis às áreas dos gerenciadores de layout (os que assim o permitam) e aplicar a cada uma dessas áreas um novo gerenciador.Exemplo : quando não se consegue um boa distribuição direta (sem

JPanel) dos componentes na área disponibilizada por um BorderLayout.

Gerenciadores de layout - curiosidades *LFSC*

371

FlowLayout

• FlowLayout é o layout default em painéis e applets. • À medida que os componentes são acrescentados ao

layout, eles são posicionados em uma linha da esquerda para a direita.

• O tamanho para cada componente é determinado automaticamente pelo gerenciador de layout (através da noção de preferred size).

• Uma nova linha é automaticamente criada quando falta espaço na linha corrente.

372

FlowLayout

• Dentro de cada linha, os componentes são automaticamente centralizados (por default) ou alinhados à direita ou esquerda, quando especificado:FlowLayout layout = new FlowLayout(FlowLayout.LEFT);

setLayout(layout);

layout.setAlignment(FlowLayout.RIGHT);

validate();

• O programador pode especificar o tamanho do espaço entre os componentes, tanto vertical quanto horizontalmente:FlowLayout layout = new FlowLayout(FlowLayout.CENTER, 5, 5));

layout.setHgap(10);

layout.setVgap(10);

validate();

373

FlowLayout - exemplo

import java.awt.*;import javax.swing.*;public class Janela extends JFrame{ public static void main(String args[]) { Janela j = new Janela();

Container c = j.getContentPane(); c.setLayout (new FlowLayout()); c.add (new Button ("Eu")); c.add (new Button ("penso,")); c.add (new Button ("logo")); c.add (new Button ("eu existo!")); j.pack(); j.setVisible(true); } }

374

FlowLayout - exercício *LFSC*

Considere a classe CandidatoEmprego.java. Para o seu painelBotoes:

Coloque entre comentários a linha com o método painel.setLayout(null).Determine o novo layout : FlowLayout(...), com alinhamento centralizado, espaço horizontal 10 e espaço vertical 5.Coloque entre comentários as linhas com o método setBounds(...) dos botões. Não retirar o setBounds( ) do próprio painel.Crie 3 novos botões (Anterior, Próximo e Novo) e os adicione ao painel.

375

FlowLayout – resultado final *LFSC*

376

GridLayout

• Componentes são colocados em um matriz com um numero específico de linhas e colunas.

• Cada componente ocupa exatamente uma célula da matriz.

• As células são preenchidas da esquerda para a direita e do topo para a base.

• Todas as células da matriz são do mesmo tamanho.

377

GridLayout - exemplo

import java.awt.*;import javax.swing.*;public class Janela extends JFrame{ public static void main(String args[]) { Janela j = new Janela();

Container c = j.getContentPane(); c.setLayout (new GridLayout(2,3)); c.add (new Button ("Eu")); c.add (new Button ("penso,")); c.add (new Button ("logo")); c.add (new Button ("eu"));

c.add (new Button ("existo!")); j.pack(); j.setVisible(true); } }

378

GridLayout - exercício 1 *LFSC*

Considere a classe DocumentosEntregues.java:

Coloque entre comentários a linha com o método setLayout(null) do ContentPane da classe atual.Determine o novo layout : GridLayout(...), com 5 linhas, 1 coluna, espaço horizontal 0 e espaço vertical 4.Coloque entre comentários as linhas com o método setBounds(...) dos cinco JCheckBox´s.

379

GridLayout - exercício 2

Crie um JFrame com 6 botões distribuídos por um gerenciador de layoute GridLayout. Os botões são inicialmente organizados em uma matriz com 2 linhas e 3 colunas. Quando o usuário clica em um dos botões, o layoute é mudado para um matriz de 3 linhas e 2 colunas. Ao clicar novamente, a matriz é transformada para 2 linhas e 3 colunas. E, assim, sucessivamente.

380

BorderLayout

• Cria 5 áreas pré-definidas, onde um componente ou um grupo de componentes pode ser colocado: NORTH, SOUTH, EAST, WEST e CENTER.

• O programador especifica a área na qual um componente deve aparecer.

• As dimensões relativas das áreas são governadas pelo tamanho dos componentes inseridos no layout.

• Dica: colocar o componente com maior tamanho no centro.

381

BorderLayout - exemploimport java.awt.*;import javax.swing.*;public class Janela extends JFrame{ public static void main(String args[]) { Janela j = new Janela();

Container c = j.getContentPane(); c.setLayout (new BorderLayout()); c.add (new Button ("Eu"),BorderLayout.NORTH); c.add (new Button ("penso,"),BorderLayout. SOUTH); c.add (new Button ("logo"),BorderLayout.EAST); c.add (new Button ("eu"),BorderLayout.WEST);

c.add (new Button ("existo"),BorderLayout.CENTER); j.pack(); j.setVisible(true); }}

382

BorderLayout - exercício 1 *LFSC*

Considere a classe CandidatoEmprego.java. Para o seu painelCurriculum:

Coloque entre comentários a linha com o método setLayout(null).Determine o novo layout : BorderLayout( ).Coloque entre comentários a linha com o método setBounds(...) do JScrollPane.Posicione o JScrollPane no “Centro” da área disponível do painel.

383

BorderLayout - exercício 2

• Crie um JFrame com 5 botões gerenciados por um BorderLayout, onde os botões estejam separados por 5 pixels.

• Quando o usuário clica em um botão, o mesmo se torna invisível, e o botão invisível (se houver algum) se torna visível.

• Dica: o método validate deve ser chamado sempre que os botões se tornam visíveis ou invisíveis.

384

Gerenciadores de layout – exercício geral *LFSC*

Considere a classe CandidatoEmprego.java. Para todos os componentes, organize-os na tela apenas utilizando os gerenciadores de layout adequados:

Coloque entre comentários todas as linhas com o método setLayout(null).Coloque entre comentários todas as linhas com o método setBounds(...).Determine os novos gerenciadores de layout, de modo que os componentes sejam devidamente dispostos na tela e apresentem a mesma organização anterior (quando se usava o setBounds( ) ).•Dica: use o gerenciador FlowLayout com o método setPreferredSize(Dimension d).

385

CardLayout

• Componentes governados por um CardLayout são “empilhados” de tal forma que somente um componente é mostrado na tela.

• Componentes são ordenados de acordo com a ordem na qual eles são inseridos no container.

• Métodos controlam qual componente é visível no container.

386

CardLayout - exemploimport java.awt.*;import java.awt.event.*;public class ExemploCardLayout extends Frame implements ItemListener { Panel paineisAlternativos = new Panel(); String botoes = "Panel com botões"; String texto = "Panel com TextField";

public ExemploCardLayout() { setLayout(new BorderLayout()); Panel choicePanel = new Panel();

Choice decisao = new Choice(); decisao.addItem(botoes); decisao.addItem(texto); decisao.addItemListener(this); choicePanel.add(decisao); add("North", choicePanel);

387

CardLayout - exemplo - cont.

paineisAlternativos.setLayout(new CardLayout()); Panel alt1 = new Panel(); alt1.add(new Button("Botão 1")); alt1.add(new Button("Botão 2")); alt1.add(new Button("Botão 3"));

Panel alt2 = new Panel(); alt2.add(new TextField("TextField", 20));

paineisAlternativos.add(botoes, alt1); paineisAlternativos.add(texto, alt2); add("Center", paineisAlternativos); }

388

public void itemStateChanged(ItemEvent e) { CardLayout cl = (CardLayout)paineisAlternativos.getLayout(); cl.show(paineisAlternativos, (String)e.getItem()); }

public static void main(String args[]) { ExemploCardLayout window = new ExemploCardLayout(); window.setTitle("ExemploCardLayout"); window.pack(); window.show(); }}

CardLayout - exemplo - cont.

389

GridBagLayout

• O gerenciador de layout GridBagLayout é o mais versátil e mais complexo de todos os gerenciadores de layout predefinidos.

• Projetado com uma matriz bi-dimensional de colunas e linhas.

• Contudo, nem todas as células na matriz são do mesmo tamanho.

• Componentes podem se expandir em várias colunas e linhas.

• Cada componente em um GridBagLayout é associado com um conjunto de restrições definidas pela classe GridBagConstraints.

390

GridBagLayout

• Cada linha pode ter um tamanho próprio• Cada coluna pode ter um tamanho próprio• O número de linhas e de colunas é determinado

dinamicamente• GridBagLayout usa o preferred size dos componentes

para determinar o tamanho de cada célula• O tamanho e a posição de cada componente são

determinados por um GridBagConstraints, através do método (da classe GridBagLayout) setConstraints.

391

GridBagLayout - exemplo

Panel p = new Panel();

GridBagLayout g = new GridBagLayout();

p.setLayout(g);

GridBagConstraints c = new GridBagConstraints();

. . . (atribui as restrições)

Label labelRua = new Label("Rua:", Label.LEFT);

g.setConstraints(labelRua,c);

p.add(labelRua);

392

GridBagConstraints

• gridwidth e gridheight: especifica o número de linhas e colunas na área de display. Default = 1.

GridBagConstraints c = new GridBagConstraints();

c.gridwidth = 2; c.gridheight = 1;

• anchor: especifica o alinhamento: CENTER, NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, NORTHWEST.

c.anchor = GridBagConstraints.WEST;

393

GridBagConstraints

• Usar GridBagConstraints.REMAINDER para especificar que o componente é o último da linha ou coluna.

c.gridwidth = GridBagConstraints.REMAINDER;

• fill:Usado para indicar que os componentes devem utilizar (ou não) todo espaço da área de display. Valores: NONE (default), HORIZONTAL, VERTICAL e BOTH.

c.fill = GridBagConstraints.BOTH;

394

GridBagConstraints

• insets: indica a separação entre os componentes, através de um objeto Insets.

• Insets(int top, int left, int bottom, int right)

c.insets = new Insets(5, 5, 5, 5);

395

1

8 - Eventos AWT

396

O que são eventos?

Quando o usuário interage com uma interface de aplicativo final (teclado, mouse etc), isso causa o disparo de alguma ação: o evento.

Mais propriamente, eventos são objetos que descrevem a ação ocorrida.

Qualquer objeto pode ser notificado de um evento. Existem vários tipos de classes de eventos para

tratar as diversas categorias de ações desencadeadas pelo usuário final.

*Incluir a instrução import java.awt.event.* .

397

Como os eventos são processados?

• Através de um modelo de delegação de eventos.Os componentes da AWT implementam rotinas de

manipulação de eventos (listener) com o objetivo de receber eventos.

O componente que gera o evento é chamado de fonte do evento (event source).

O componente que trata o evento é chamado de manipulador de evento (event handler) ou ouvinte de evento (event listener).

Normalmente a manipulação do evento é delegada para uma classe separada do componente-fonte desse evento.

398

Esquema do modelo de delegação

actionPerformed (ActionEvent e){ …… }

Manipulador ou ouvinte do evento (Action Listener)

Tipo do Evento (ex. Action event)

Lista de eventos registrados (EventListenerList)

botao.addActionListener(action listener)

PAINEL

FRAME

Fonte do evento (event source)

BOTÃO

399

Modelo de delegação – possibilidades *LFSC*

Objeto 1Objeto 1Evento Manipulador de

evento

2. Vários objetos chamam o mesmo manipulador de evento.

Objeto 2Objeto 2

Objeto 3Objeto 3

3. Um objeto chama vários manipuladores para tratar um único tipo de evento.

ObjetoObjetoEvento

Manipulador de evento 2

Manipulador de evento 1

Manipulador de evento 3

1. Um objeto chama um único tipo de manipulador de evento.

ObjetoObjeto Evento Manipulador de

evento

400

import java.awt.*;import java.awt.event.*;import javax.swing.*;

public class TesteEvento { public static void main (String args[]) { JFrame j = new JFrame("Teste de evento"); JButton b = new JButton("Pressione-me!"); b.addActionListener(new ActionDemo()); j.getContentPane().add(b, BorderLayout.CENTER); j.pack(); j.setVisible(true); }}

class ActionDemo implements ActionListener { public void actionPerformed (ActionEvent e){ System.out.println("Acao executada"); }}//classe externa de tratamento do evento

Modelo de delegação - exemplo

401

• Cada componente da AWT possui um conjunto de tipos de eventos a ele associado.

• Os componentes que podem gerar eventos possuem métodos para adicionar ou remover “listeners”.addActionListenerremoveActionListener

A seguir são relacionados os tipos de eventos que cada componente da AWT pode gerar.

Eventos gerados pelos componentes da AWT

402

Alguns dos eventos gerados pelos componentes AWT/Swing

Tipos de eventos que os componentes podem gerar Componentes A ct ion A dj ust . Component Container Focus item key mouse

mouse mot ion

text window

button

checkbox

combo box

Component

Container

dialog

frame

label

list

menu item

panel

radio button

scrollbar

text area

text field

window

Mais detalhes em: http://java.sun.com/docs/books/tutorial/uiswing/events/eventsandcomponents.html.

403

• Os tipos de eventos gerados pelos componentes da AWT são implementações da interface “listener”.

• O nome da interface associado ao tipo de evento é definido como sendo o nome do evento, acrescido da palavra “Listener”.

Exemplo: tipo de evento: Action

interface: ActionListener

• A seguir são descritas as interfaces dos eventos AWT.

Interface de eventos listener AWT

404

Interface de eventos listener AWT (1)

Interface Listener Classe Adapter MétodosActionListener ---------- actionPerformed(ActionEvent)AdjustmentListener --------- adjustmentValueChanged(adjustmentEvent)ComponentListener ComponentAdapter componentHidden(ComponentEvent)

componentMoved(ComponentEvent)componentRezised(ComponentEvent)componentShown(ComponentEvent)

ContainerListener ContainerAdapter componentAdded(ContainerEvent)componentRemoved(ContainerEvent)

FocusListener FocusAdapter focusGained(FocusEvent)focusLost(FocusEvent)

ItemListener -------- itemStateChanged(ItemEvent)KeyListener KeyAdapter keyPressed(KeyEvent)

keyReleased(KeyEvent)keyTyped(KeyEvent)

MouseListener MouseAdapter mouseClicked(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mousePressed(MouseEvent)mouseRealesed(MouseEvent)

405

Interface Listener Classe Adapter MétodosMouseMotionListener MouseMotionAdapter mouseDragged (MouseEvent)

mouseMoved(MouseEvent)TextListener ------ textValueChange(TextEvent)WindowListener WindowAdapter windowActived(WindowEvent)

windowClosed(WindowEvent)windowClosing(WindowEvent)windowDeactivated(WindowEvent)windowDeiconified(WindowEvent)windowIconified(WindowEvent)windowOpened(WindowEvent)

Interface de eventos listener AWT (2)

Mais detalhes em: http://java.sun.com/docs/books/tutorial/uiswing/events/api.html.

406

• A classe AWTEventCada método de cada interface “listener” dos eventos na

AWT possui um único argumento: uma instância de uma classe que descende da classe java.awt.AWTEvent.

Essa classe não define nenhum método ou API que o usuário, usualmente, necessite. Contudo, herda um método muito útil da classe java.util.EventObject: Object getSource( ): retorna o objeto (do tipo Object) que gerou o

evento. Sempre que possível, as subclasses da AWTEvent definem métodos

similares que retornam tipos mais restritivos. Por exemplo, na classe ComponentEvent existe o método getComponent( ) que retorna o

componente que gerou o evento.

A hierarquia de classes de eventos AWT

407

A hierarquia de classes de eventos AWT

A c tion E ve nt A d jus tm en tE ve nt

C o nta ine rE ve nt F o cusE ve nt

K e yE ve nt M o use E ve nt

In pu tE ve nt W in do w E ve nt

C o m p on e ntE ve nt Ite m E ve nt T e x tE ve n t

A W T E ve nt

ja va .u til.E ven tO b je ct

ja va .la ng .O b je t

408

As 4 maneiras de implementar um evento (1) *LFSC*

1. Fazer com que a própria classe (a que contém o objeto que gera o evento) implemente a interface (EventoListener) ou estenda a classe abstrata (EventoAdapter) do evento.Exemplo: public class MinhaClasse implements WindowListener { } ou

public class MinhaClasse extends WindowAdapter { }.

2. Construir uma classe externa que implemente a interface ou estenda a classe abstrata do evento. Exemplo: public class MinhaClasse { … }

public class EventoExt implements WindowListener { } ou

public class EventoExt extends WindowAdapter { }.

409

3. Construir uma classe-membro interna que implemente a interface ou estenda a classe abstrata do evento. Exemplo: public class MinhaClasse { …

class EventoInt implements WindowListener { } ou

class EventoInt extends WindowAdapter { } }.

4. Construir uma classe anônima interna que implemente a interface ou a classe abstrata do evento. Exemplo: public class MinhaClasse { …

janela.addWindowListener( new WindowAdapter( ) { public void windowClosing(WindowEvent e)

{System.exit(0);

} }); }.

As 4 maneiras de implementar um evento (2) *LFSC*

410

O que um evento requer *LFSC*

Primeiramente, deve-se implementar o evento, escolhendo uma das 4 opções mostradas nos dois slides anteriores.

Adicionar uma instância do ouvinte de evento ao(s) componente(s) desejado(s), conforme a implementação escolhida (slides anteriores):

1. componente.addWindowListener( this );2. componente.addWindowListener( new EventoExt( ) );3. componente.addWindowListener(new EventoInt( ) ); 4. Já é adição e também implementação do evento.

Implementar corretamente o método da interface (ou classe abstrata) que sabe tratar o evento. Deve-se optar por uma implementação leve para evitar problemas de performance, pois o Java usa a mesma event-dispatching thread para eventos e painting.

411

Como escrever WindowListener

• São gerados por um objeto janela (Window) após a janela ser: aberta, fechada, iconizada, desiconizada, ativada e desativada.

• A interface WindowListener e a classe abstrata WindowAdapter possuem os métodos a seguir:– void windowOpened(WindowEvent)

• é executado assim que a janela é mostrada pela primeira vez.

– void windowClosing(WindowEvent)• é executado assim que o usuário solicita o fechamento da janela.

Para fechar a janela, usa-se o método dispose() ou setVisible(false).

412

– void windowClosed(WindowEvent)• é chamado pela AWT após a janela tiver sido fechada.

– void windowIconified(WindowEvent)– void windowDeiconified(WindowEvent)

• é chamado pela AWT assim que a janela tenha sido iconizada ou deiconizada.

– Void windowActivated(WindowEvent)– void windowDeactivated(WindowEvent)

• é chamado pela AWT assim que a janela tenha sido ativada ou desativada.

Como escrever WindowListener

413

WindowListener – exemplo

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class WindowListenerDemo { public static void main (String args[]) { JFrame j = new JFrame("Evento de Janela"); j.setSize(200,200);

j.addWindowListener (new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //classe anônima interna de tratamento do

evento

j.setVisible(true); }}

414

A classe WindowEvent

• Cada método da WindowListener tem um único parâmetro: um objeto do tipo WindowEvent. A classe WindowEvent possui um método muito útil:– Window getWindow()

• retorna a janela que gerou o evento.

415

WindowListener - exercício *LFSC* Na classe CandidatoEmprego.java, implementar uma classe anônima interna de WindowAdapter que permita: a)fechar a janela atual ( System.exit(0) ) e b)emitir um alerta de que a aplicação será encerrada.

*Consulte o método setDefaultCloseOperation(int i) de JFrame para saber como proceder se o usuário retroceder na sua decisão de fechar a janela da aplicação.

416

Como escrever um ActionListener

• São os eventos mais fáceis e os mais comumente implementados.

• Implementa-se um ActionListener para responder a uma intervenção do usuário.

• Quando o usuário clicar um botão, o duplo clique em uma lista, a escolha em um menu ou pressionar o retorno de um campo texto, o gerenciador de eventos indicará que uma ação ocorreu. O resultado é o envio de uma mensagem “actionPerformed”

a todos os ActionListeners que estão registrados no componente-fonte.

417

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class ActionListenerDemo extends JFrame

implements ActionListener { JButton b1, b2, b3; JPanel p1; static final String DISABLE = "disable"; static final String ENABLE = "enable"; public ActionListenerDemo() { p1 = new JPanel(); b1 = new JButton("Desativa o botão do meio");

b1.setActionCommand(DISABLE); b2 = new JButton("Botão do meio"); b3 = new JButton("Ativa botão do meio"); b3.setEnabled(true); b3.setActionCommand(ENABLE); b1.addActionListener(this); b3.addActionListener(this);

ActionListener para botões – exemplo (1)

418

p1.add(b1); p1.add(b2); p1.add(b3); getContentPane().add(p1);}public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command == DISABLE) b2.setEnabled(false); else b2.setEnabled(true);}public static void main(String args[]) {

ActionListenerDemo j = new ActionListenerDemo();

j.setTitle("Vários Botões");j.pack();j.setVisible(true);

}} //Fim

ActionListener para botões – exemplo (*2)

419

A classe ActionEvent

• O método actionPerformed tem um parâmetro único: o objeto ActionEvent. A classe ActionEvent define dois métodos bastante úteis: String getActionCommand( )

• retorna o string associado com a ação. A maioria dos objetos que podem gerar ações suportam o método chamado setActionCommand que permite atribuir este string. Se o comando de ação não for atribuido explicitamente, então ele será o texto associado ao componente. Para objetos com múltiplos itens e, conseqüentemente, múltiplas ações possíveis, o comando ação é geralmente o nome do item selecionado.

420

int getModifiers( )• retorna um inteiro associado com a chave que foi

pressionada pelo usuário quando o evento ocorreu. Pode-se usar as constantes definidas na classe ActionEvent: SHIFT_MASK, CRTL_MASK, META_MASK e ALT_MASK para determinar qual chave foi pressionada.

A classe ActionEvent

421

ActionListener para texto

• Quando o usuário digita os dados em um JTextField ou JPasswordField e pressiona a tecla ENTER, um evento de ação ocorre.

• JTextArea não possui eventos de ação como JTextField. Algum evento externo é que costuma determinar quanto o texto nessa área deve ser processado.

422

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class ActionListenerDemo extends JFrame {

JTextField textField; JTextArea textArea; String newline; public ActionListenerDemo() { textField = new JTextField(20); textArea = new JTextArea(5,20); textArea.setBackground(Color.blue); textArea.setEditable(false); Container c = getContentPane(); c.add(textField, BorderLayout.NORTH); c.add(textArea, BorderLayout.CENTER); textField.addActionListener(new MeuEvento()); newline = System.getProperty("line.separator"); }

ActionListener para texto – exemplo (1)

423

class MeuEvento implements ActionListener { public void actionPerformed (ActionEvent evt) { String text = textField.getText(); textArea.append (text + newline); textField.selectAll(); }

} //classe-membro interna de tratamento do evento

public static void main(String args[]) { ActionListenerDemo j = new ActionListenerDemo(); j.setTitle("ActionListener com Texto"); j.pack(); j.setVisible(true); }} //Fim

ActionListener para texto – exemplo (2)

424

ActionListener – exercício 1 *LFSC* Na classe CandidatoEmprego.java, implementar uma classe-membro interna de ActionListener que permita chamar DocumentosEntregues.java por meio do botão jbDocumentosEntregues :

425

Quanto aos demais botões:Anterior, Próximo, Novo e Salva : implementar uma classe externa de ActionListener que emita a mensagem “Botão + TextoDoBotão + ainda não implementado”, título “Informação” e tipo Informação, por meio de JOptionPane. showMessageDialog( ). Após isso, atribuir uma instância da classe de evento a cada um dos botões relacionados.Salva : implementar uma classe externa de ActionListener que emita a mensagem “Você clicou no ClasseDoBotão + TextoDoBotão”, título “Informação” e tipo Informação, por meio de showMessageDialog( ). Após isso, atribuir também uma instância desta classe ao botão acima.Cancela : implementar uma classe anônima interna de ActionListener que permita fechar a janela (System.exit(0)). Após isso, atribuir uma instância desta classe ao botão acima.

*Métodos a serem utilizados: - evento.getActionCommand( ) e - (evento.getSource( ).getClass( ).getName( )).

ActionListener – exercício 2 *LFSC*

426

• Eventos em itens são gerados por componentes que implementam uma interface que tem a característica de permitir selecionar itens.

• Estes componentes mantém o estado, geralmente, ligado (on) ou desligado(off) para um ou mais itens. Os componentes na AWT que geram este tipo de evento são: checkboxes, checkbox menu itens, choices e lists.

• A interface ItemListener contém um único método. void itemStateChanged(ItemEvent)

• é chamado pela AWT após a ocorrência de uma mudança de estado no componente.

Como escrever um ItemListener

427

A classe ItemEvent

• O método itemStateChanged possui um único parâmetro: um objeto ItemEvent . A classe ItemEvent possui os seguintes métodos:– Object getItem( )

• retorna o componente associado ao item cujo estado tenha mudado. Freqüentemente, o retorno é um String contendo um texto sobre o item selecionado. No caso de uma lista de itens (List), ele é o inteiro (Integer) que especifica o índice do item selecionado.

– ItemSelectable getItemSelectable( )• retorna o componente que gerou o evento (item).

– int getStateChange( )• retorna o novo estado do item, que pode ser SELECTED e

DESELECTED.

428

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class ItemListenerDemo implements ItemListener { JComboBox lista; JLabel label; JFrame fr; public ItemListenerDemo() { fr = new JFrame("teste de ItemListener"); Container c = fr.getContentPane(); lista = new JComboBox(); lista.addItem("primeiro"); lista.addItem("segundo"); lista.addItem("terceiro"); lista.addItem("quarto"); lista.addItemListener(this); label = new JLabel(); setLabelText(lista.getSelectedIndex(), lista.getSelectedItem().toString());

ItemListener – exemplo 1 (1)

429

ItemListener – exemplo 1 (*2)

c.add(lista,BorderLayout.CENTER);

c.add(label,BorderLayout.SOUTH);

fr.pack();

fr.setVisible(true); }

void setLabelText(int num, String text) {

label.setText("Item #" + num + " selecionado. "

+ "Texto = \"" + text + "\"."); }

public void itemStateChanged(ItemEvent e) {

setLabelText(lista.getSelectedIndex(),

lista.getSelectedItem().toString()); }

public static void main(String args[]) {

ItemListenerDemo demo = new ItemListenerDemo(); }

}

430

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class ItemListenerDemo extends JFrame

implements ItemListener { JPanel cards; final static String BUTTONPANEL = "Painel com botão"; final static String TEXTPANEL = "Painel com texto"; public ItemListenerDemo() { getContentPane().setLayout(new BorderLayout()); setFont(new Font ("SansSerif", Font.PLAIN, 14)); JPanel cp = new JPanel(); Choice c = new Choice(); c.add (BUTTONPANEL); c.add(TEXTPANEL); c.addItemListener(this);

cp.add(c); getContentPane().add(cp, BorderLayout.NORTH); cards = new JPanel(); cards.setLayout(new CardLayout()); JPanel p1 = new JPanel();

ItemListener – exemplo 2 (1)

431

p1.add(new JButton("Botao 1")); p1.add(new JButton("Botao 2")); p1.add(new JButton("Botao 3")); JPanel p2 = new JPanel (); p2.add (new JTextField("TextField", 20)); cards.add (BUTTONPANEL,p1); cards.add (TEXTPANEL,p2); getContentPane().add(cards, BorderLayout.CENTER); } public void itemStateChanged(ItemEvent e) { CardLayout cl = (CardLayout) (cards.getLayout()); cl.show (cards, (String) e.getItem()); } public static void main(String args[]) { ItemListenerDemo j = new ItemListenerDemo();

j.setTitle("ItemListener com CardLayout"); j.pack(); j.setVisible(true); }}

ItemListener – exemplo 2 (2)

432

ItemListener – exercício *LFSC*

Na classe CandidatoEmprego.java, implementar uma classe externa de ItemListener que permita mostrar o índice e o texto do item selecionado de jcbInteresse, por meio de JOptionPane. showMessageDialog( ) :

433

1

9 - Applet9 - Applet

434

Applet - ordem de inicialização

init: executado quando a applet é carregada ou recarregada (menos para Netscape).

start: executado após o método init ou quando a página é recarregada.

stop: executado quando o usuário muda de página, continuando na memória, ou quando a execução do browser é encerrada.

destroy: executada quando a applet for ser removida da memória.

435

import java.applet.*;import java.awt.*;import java.awt.Graphics;public class TesteApplet extends Applet{ StringBuffer mensagem; int cont; public void init() { mensagem = new StringBuffer(); adicionaMsg("entrou no init() "); } public void start() { cont = cont + 1; adicionaMsg("entrou no start() "

+ cont + " "); } //Continua …

Applet - exemplo

436

public void stop() { adicionaMsg("entrou no stop() "); } public void adicionaMsg(String msg) { System.out.println(msg); mensagem.append(msg); repaint(); } public void paint(Graphics g) { g.drawString(mensagem.toString(), 5,15); }} //Fim.

Applet - exemplo

437

< applet codebase = URL (opcional)

code = arquivoExecutável (obrigatório)

width = pixelLargura (obrigatório)

height = pixelAltura > (obrigatório)

< param name = nome value = valor >

. . .

</applet>

Applet e HTML

438

No código HTML:< param name=parTipo value=intranet >

< param name=parValor value=50 >

No código da Applet:String tipo = getParameter(“parTipo”);

int valor = (new Integer (getParameter("parValor"))) .intValue();

Applet e HTML

439

Applet e URL

import java.net.URL;

. . .

getAppletContext().showDocument(new URL(url, opção)

onde opção:• _self: mostrar no frame atual• _parent: mostrar no frame-pai• _top: mostrar no primeiro frame• _blank: mostrar em uma nova janela do browser

440

Bibliografia

Cornell, Gary. Core Java; tradução Daniel Vieira; revisão técnica Rodrigo Rodrigues. São Paulo, Makron Books, 1997.

Eckel, Bruce. Thinking in Java. Prentice Hall PTR, USA, 1998. Campione, Mary. The Java Tutorial: object-oriented programming for the

internet. Addison Wesley Longman, California- USA, 1998. Deitel, H. M.;Deitel, P. J. Java, Como Programar. 3a. edição – Porto Alegre:

Bookman, 2001. Java Tutorial : http://java.sun.com/docs/books/tutorial/java/TOC.html#nutsandbolts.

JAVA Swing (JFC) : http://java.sun.com/docs/books/tutorial/uiswing/TOC.html#start.

JAVADOC: http://java.sun.com/j2se/1.4/docs/api/index.html.

Classes Essenciais Java: http://java.sun.com/docs/books/tutorial/essential/TOC.html.

JAVA WORLD e CORE JAVA: http://www.javaworld.com/channel_content/jw-core-index.shtml.

Recommended