Download - o Windows não Consegue Encontrar Null
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.