Vous êtes sur la page 1sur 69

Módulo V

AWT e Swing
AWT e Swing – Alessandro Cerqueira - 20/8/2007

Objetivo
Apresentar como Implementar
Interfaces Gráficas em Java
Utilizando
AWT e Swing
2

Abstract Windowing Toolkit


• Pacote contendo classes para implementação
de interfaces gráficas em Java
• Casamento da Programação Orientada a
Eventos com a Programação Orientada a
Objetos em Java
AWT e Swing – Alessandro Cerqueira - 20/8/2007
3

Estratégia de Implementação
(Regra 1)
• Para cada tipo de janela na aplicação deveremos codificar
uma classe em Java que deverá ser especialização da
classe java.awt.Frame
• Alguns métodos em Frame:
– setResizable(
setResizable(boolean modificavel)
modificavel)
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– setBackground(
setBackground(Color cor)
Constantes” definidas na classe Color:
• “Constantes”
Color.
Color.black,
black, Color.
Color.blue,
blue, Color.
Color.cyan,
cyan, Color.
Color.darkGray,
darkGray, Color.
Color.gray,
gray,
Color.
Color.green,
green, Color.
Color.lightGray,
lightGray, Color.
Color.magenta,
magenta, Color.
Color.orange,
orange,
Color.
Color.pink,
pink, Color.
Color.red,
red, Color.
Color.white,
white, Color.
Color.yellow.
yellow.

– setLocation(int
setLocation(int x,int y)
– setBounds(int
setBounds(int x,int y,int largura,int altura)
– setSize(int
setSize(int largura, int altura)
4

Estratégia de Implementação
(Regra 1)

• Para que uma classe seja especialização de


outra, devemos a palavra reservada extends
public class Janela extends Frame

• Todas as classes em Java são direta ou


indiretamente especializações da classe
AWT e Swing – Alessandro Cerqueira - 20/8/2007

java.lang.Object
5
Exemplo
(Regra 1)
package face;
import java.
java.awt.*;
awt.*;
public class Janela extends Frame
{
// Construtor da classe Janela
public Janela(String titulo, int posX,
posX, int posY)
posY)
{
//Chamada ao construtor definido na classe Frame
super(titulo);
AWT e Swing – Alessandro Cerqueira - 20/8/2007

// determino que a janela não poderá


poderá ser redimensionada
this.
this.setResizable(
setResizable(false);
false);
// determino o tamanho da janela
this.
this.setSize(100,100);
setSize(100,100);
// determino a posiç
posição da janela
this.
this.setLocation(
setLocation(posX,
posX,posY);
posY);
// torno a janela visí
visível
this.
this.setVisible(
setVisible(true);
true);
}
}
6

Exemplo
(Regra 1)
package controle;
import face.*;
public class Programa
{
public static void main(String
main(String args[])
args[])
{
// Instancio dois objetos Janela
AWT e Swing – Alessandro Cerqueira - 20/8/2007

Janela j1 = new Janela("Janela 1",50,50);


Janela j2 = new Janela("Janela 2",200,100);
}
}
7

Estratégia de Implementação
(Regra 2)

• Para cada elemento gráfico (menu, botões, rótulos, etc.)


que se deseja adicionar à Janela, deveremos adicionar um
atributo na classe para o seu mapeamento. Dentro de
AWT existem uma série de classes que implementam os
COMPONENTES gráficos que podem existir na janela.
• Ex.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– Button,
Button, Label,
Label, MenuBar,
MenuBar, Menu, Canvas,
Canvas, CheckBox,
CheckBox, TextField,
TextField,
TextArea,
TextArea, etc.

• Estes atributos devem ser instanciados e adicionados no


construtor da Janela. Para a adição, devemos utilizar o
método add de Frame
8
Exemplo
(Regra 2)
package face;

import java.
java.awt.*;
awt.*;

public class Janela extends Frame


{
// Atributos da Classe
private Button btOk;
btOk;
private Button btCancela;
btCancela;
private Button btAjuda;
btAjuda;
AWT e Swing – Alessandro Cerqueira - 20/8/2007

// Construtor
public Janela(String titulo)
{
// Chamada ao construtor de Frame
super(titulo);
// Instancio um objeto da classe Font,
Font, declaro a variá
variável
// local fontePadrão e faç
faço com que esta variá
variável aponte
// para o novo objeto Font criado
Font fontePadrao = new Font("
Font("TimesRoman
TimesRoman",
", Font.BOLD,
Font.BOLD, 14);
// determino o padrão de fonte para a janela
this.
this.setFont(
setFont(fontePadrao);
fontePadrao);
// Determino a cor de fundo da janela
this.
this.setBackground (Color.WHITE);
Color.WHITE);
continua...
9

Exemplo
(Regra 2)
continuaç
continuação...
// Instancio um novo objeto Button e faç
faço com que o atributo Ok
// da janela aponte para este novo Button
this.
this.btOk
btOk = new Button("
Button("Ok
Ok");
");
// Instancio um novo objeto Button e faç
faço com que o atributo
// Cancela da janela aponte para este novo Button
this.
this.btCancela
btCancela = new Button("Cancela");
Button("Cancela");
// Instancio um novo objeto Button e faç
faço com que o atributo
// Ajuda da janela aponte para este novo Button
this.
this.btAjuda
btAjuda = new Button("Ajuda");
Button("Ajuda");
AWT e Swing – Alessandro Cerqueira - 20/8/2007

// Adiciono o botão Ok à Janela na região OESTE


this.
this.add(
add(this.
this.btOk
btOk, BorderLayout.WEST);
BorderLayout.WEST);
// Adiciono o botão Cancela à Janela na região CENTRO
this.
this.add(
add(this.
this.btCancela
btCancela,, BorderLayout.CENTER);
BorderLayout.CENTER);
// Adiciono o botão Ajuda à Janela na região LESTE
this.
this.add(
add(this.
this.btAjuda
btAjuda,
, BorderLayout.EAST);
BorderLayout.EAST);
// Redimensiono o tamanho da Janela
this.
this.setSize(300,100);
setSize(300,100);
// Torno a janela Visí
Visível
this.
this.setVisible(
setVisible(true);
true);
}
}
10

Exemplo
(Regra 2)
package controle;
import face.*;
public class Programa
{
public static void main(String
main(String args[])
args[])
{
Janela j = new Janela("Janela com Botões");
AWT e Swing – Alessandro Cerqueira - 20/8/2007

}
}
11

ActionListener
• 1 - O botão foi pressionado.
• 2 - O objeto JButton sabe que foi peticionado, entretanto o có
código de aç
ação de resposta não esta escrito na classe JButton
JButton..
• 3 - Então o Botão faz o seguinte:
• Ele vai notificar a algué
alguém que ele foi pressionado e vai pedir a este que execute a aç
ação de resposta.
• 4 - A notificaç
notificação do JButton e feita para um LISTENER
LISTENER,, contudo o botão tem que saber quem e este listener previamente. Avisamos a
ele atravé
através do mé
método addActionListener
addActionListener..
• 5 Como o JButton vai notificar o Listener
Listener??
• Só há uma forma de comunicaç
comunicação entre os objetos: Envio de mensagem!
• A mensagem que o botão manda chama se: actionPerformed
actionPerformed..
• 6 - Sabemos que a mensagem ActionPerformed foi enviada, então o seu receptor deve executar o mé
método ActionPerformed
ActionPerformed..
• 7 - Então a classe do receptor deve ter um mé
método ActionPerformed codificado
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• Como garantimos que esta classe tem este mé


método?
todo?ActionListener
ActionListener
• <<INTERFACE>>
• Public void actionPerformed
actionPerformedJanelaPrincipal
JanelaPrincipal
• ...
• Public void actionPerformed
actionPerformedRealiza
Realizaçção
• Implementaçção
Implementa
• O mé
método AddActionListener requer que o parâmetro seja uma implementaç
implementação da interface AddActionListener
AddActionListener;; em outras palavra, a
classe deve obrigatoriamente ter no cabeç
cabeçalho implementsActionListener e codificar os mé
métodos abstratos presentes nesta interface.
• 8 - A interface Actionslistener tem um único mé
método abstrato:
• Public void actionPerformed (actionEvents e);
• Assim, a classe que implementar esta interface deverá
deverá ter este mé
método.
• Uma Interface é uma especializaç
especialização de um SERVI
SERVIÇÇO que pode ser
• REALZADO por uma ou mais classes.
12
Estratégia de Implementação
(Regra 3)

• Se é necessá
necessário monitorar e tratar eventos que ocorrem na janela,
então a sua classe deverá
deverá implementar uma ou mais Interfaces
Listener (dependendo do tipo de aç
ação a ser tratada)
• O conceito de interface em Java e na UML é semelhante a uma
classe abstrata, que não possui atributos nem có
código de mé
métodos,
descrevendo somente as assinaturas dos mé métodos que deverão ser
codificados pelas classes que implementarem (realizarem) as
AWT e Swing – Alessandro Cerqueira - 20/8/2007

interfaces.
• No pacote java.
java.awt.
awt.event encontramos uma sé
série de Interfaces
Listener que podem ser implementadas, como:
– ActionListener:
ActionListener: destinado a manipular os eventos padrão dos componentes
(ex. Botão pressionado).
– MouseListener:
MouseListener: destinado a manipular os eventos gerados pelo mouse sobre
os componentes.
– KeyboardListener:
KeyboardListener: destinado a manipular os eventos gerados pelo teclado
sobre os componentes.
13
Estratégia de Implementação
(Regra 3)

• Toda interface Listener é especialização de


java.util.EventListener.
• Para que uma classe implemente uma interface, devemos
utilizar a palavra reservada implements
public class Janela extends Frame
implements ActionListener,
ActionListener, MouseListener
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• Para cada componente cujos eventos necessita ser


monitorados, deveremos enviar uma mensagem
addXXXXListener passando como parâmetro this (ou seja,
informando que o XXXXListener dele é a própria janela).
• Quando ocorrer um evento sobre o componente, a janela
será notificada e receberá um objeto evento (especialização
de java.util.EventObject) que descreve o evento ocorrido.
14

Estratégia de Implementação
(Regra 3)
• Estrututa de Funcionamento:

– Fonte (source
Fonte
object)
– Evento (event
evento
AWT e Swing – Alessandro Cerqueira - 20/8/2007

object)
– Receptor de
Eventos (event listener listener
listener) listener

• Um evento é sempre gerado


por apenas uma fonte.
15

Estratégia de Implementação
(Regra 3)

• Assim como há o addXXXListener() , temos também o


removeXXXListener().
• Hierarquia das classes de evento:
EventObject
AWT e Swing – Alessandro Cerqueira - 20/8/2007

AW TEvent

ActionEvent AdjustmentEvent ComponentEvent ItemEvent TextEvent

ContainerEvent FocusEvent InputEvent WindowEvent

MouseEvent KeyEvent

• Todas as classes estão definidas em java.awt.event


16
Estratégia de Implementação
(Regra 3)

• Eventos de Baixo Nível:


– Eventos indivisí
indivisíveis, geralmente emitidos pelo sistema operacional,
como: movimentaç
movimentação do mouse, pressionamento e liberaç
liberação dos
botões do mouse, pressionamento e liberaç
liberação de teclas, mudanç
mudança
do foco do teclado, ou mudanç
mudança do estado de uma janela.

Componente é redimensionado, movido, exibido ou


AWT e Swing – Alessandro Cerqueira - 20/8/2007

ComponentEvent
escondido

KeyEvent Tecla é pressionada ou solta

Botão do mouse é pressionado, solto, o mouse é


MouseEvent
movimentado ou arrastado

FocusEvent Componente ganha ou perde o foco do teclado

Janela é ativada, desativada, minimizada ou


WindowEvent
fechada
17
Estratégia de Implementação
(Regra 3)

• Eventos Semânticos:
– Eventos compostos de outros eventos de baixo-
baixo-nível,
possivelmente emitidos pelo pró
próprio componente a partir da
observaç
observação dos eventos de baixo-
baixo-nível. É uma boa prá
prática
de programaç
programação tratar apenas de eventos semânticos, para
garantir a portabilidade do có
código Java
AWT e Swing – Alessandro Cerqueira - 20/8/2007

Componente fonte sofre alguma aç


ação padrão
ActionEvent
(p.ex. botão pressionado)
Novo valor escolhido entre uma faixa de valores
AdjustmentEvent
possíveis (p.ex. scrollbar)
possí
Item selecionado dentre um conjunto de itens
ItemEvent
(p.ex. checkbox)

TextEvent Texto alterado (p.ex. caixa de texto)


18

Estratégia de Implementação
(Regra 3)
• Exemplo:
– ActionEvent (botão pressionado)
1. cursor do mouse entra na área retangular do botão
2. botão do mouse é pressionado
3. cursor do mouse pode sair e entrar na área retangular do botão
4. botão do mouse é liberado dentro da área retangular do botão
• Adaptadores
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– Provêm implementaç
implementações vazias ( { } ) para todos os
métodos de uma interface Listener
WindowListener WindowAdapter
MouseListener MouseAdapter
MouseMotionListener MouseMotionAdapter
KeyListener KeyAdapter
ComponentListener ComponentAdapter
FocusListener FocusAdapter
19
Exemplo
(Regra 3)
• Pegue o exemplo da regra 2 e faça as seguintes
alterações:

– Na declaração da classe:
public class MinhaJanela extends Frame
implements ActionListener
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– No construtor adicionar as seguintes linhas (entre a


instanciação dos atributos e o this.setVisible(true) )
this.
this.btOk.
btOk.addActionListener(
addActionListener(this);
this);
this.
this.btCancela.
btCancela.addActionListener(
addActionListener(this);
this);
this.
this.btAjuda.
btAjuda.addActionListener(
addActionListener(this);
this);
20

Exemplo
(Regra 3)
–Adicionar o seguinte mé
método na classe:
public void actionPerformed(
actionPerformed(ActionEvent evento)
{
if(evento.getSource
if(evento.getSource()
() == this.
this.btOk)
btOk)
{
System.out.
System.out.println
println(
(“Botão OK pressionado”
pressionado”);
}
AWT e Swing – Alessandro Cerqueira - 20/8/2007

if(umaAcao
if(umaAcao.
.getSource()
getSource() == this.
this.btCancela)
btCancela)
{
System.out.
System.out.println
println(
(“Botão CANCELA pressionado”
pressionado”);
}
if(umaAcao
if(umaAcao.
.getSource()
getSource() == this.
this.btAjuda)
btAjuda)
{
System.out.
System.out.println
println(
(“Botão AJUDA pressionado”
pressionado”);
}
}
21
Estratégia de Implementação
(Regra 3)
• Implementar algumas interfaces Listener na classe da
janela pode requerer implementar métodos que não
gostaríamos de tratar.
• Ex: Tratamento do botão fechar da janela
class Janela extends Frame implements WindowListener
{
...
AWT e Swing – Alessandro Cerqueira - 20/8/2007

public void windowClosing(


windowClosing(WindowEvent e)
{
System.
System.exit(0);
exit(0);
}
public void windowClosed(
windowClosed(WindowEvent e) { } // implementaç
implementação vazia
public void windowActivated(
windowActivated(WindowEvent e) { } // implementaç
implementação vazia
public void windowDeactivated(
windowDeactivated(WindowEvent e) { } // implementaç
implementação vazia
public void windowIconified(
windowIconified(WindowEvent e) { } // implementaç
implementação vazia
public void windowDeiconified(
windowDeiconified(WindowEvent e) { } // implementaç
implementação vazia
public void windowOpened(
windowOpened(WindowEvent e) { } // implementaç
implementação vazia
}
22
Estratégia de Implementação
(Regra 3)
• Uma solução para isto é utilizar uma classe interna que
seja especialização de uma classe adaptadora.
• Classe Interna (Inner Class)
– Classe que é declarada dentro do escopo de outra classe.

• Assim, ao invés da classe da janela implementar uma


AWT e Swing – Alessandro Cerqueira - 20/8/2007

interface Listener que contenha vários métodos,


podemos criar uma classe interna como especialização
de uma classe adaptadora e nos métodos
addXXXXListener passar como parâmetro uma instância
da classe interna.
23
Exemplo
(Regra 3 – Uso de Classes Internas)
class Janela extends Frame
{
Janela( ) // No Construtor
{
...
this.
this.addWindowListener(
addWindowListener( new MeuWindowListener(
MeuWindowListener( ) );
...
}

...
AWT e Swing – Alessandro Cerqueira - 20/8/2007

public class MeuWindowListener extends WindowAdapter // Classe Interna


{
// Redefiniç
Redefinição do mémétodo windowClosing
public void windowClosing(
windowClosing(WindowEvent e)
{
System.
System.exit(0);
exit(0);
}
}
}
OBS: Observe os arquivos de bytecode que foram gerados!!!
24

Estratégia de Implementação
(Regra 3)

• Classe Interna Anônima


– É quando eu instancio um objeto e juntamente
faço uma redefinição de um ou mais métodos da
classe.
– Funciona como sendo “uma especialização para um
AWT e Swing – Alessandro Cerqueira - 20/8/2007

único objeto onde é feita a redefinição de


métodos”
– A vantagem é que não é necessário ter que criar
explicitamente uma classe interna
25
Exemplo
(Regra 3 – Uso de Classes Adaptadoras e
Classes Internas Anônimas)
...
this.
this.addWindowListener(
addWindowListener( new WindowAdapter()
WindowAdapter()
{
public void windowClosing(
windowClosing(WindowEvent evt)
evt)
{
System.
System.exit(0);
exit(0);
}
}
);
AWT e Swing – Alessandro Cerqueira - 20/8/2007

...

• O que é isto????
– Indico quem é o WindowListener da janela
– Instancio um objeto de WindowAdapter.
WindowAdapter. Apesar de ser uma classe
abstrata, isto é permitido pois juntamente com a instanciaç
instanciação, estamos
redefinindo o mé
método windowClosing.
windowClosing.
– Na prá
prática, o compilador cria com esta declaraç
declaração uma classe interna
“sem nome”
nome” (o nome é dado automaticamente). A geraç
geração do bytecode é
semelhante ao caso da classe Interna com nome.
26
Estratégia de Implementação
(Regra 4)
• Cada janela deverá ter o seu Gerente Layout que é um
objeto que gerencia a disposição dos componentes na janela.
• Gerente Layout (Layout Managers)
– Classes que determinam a posiç
posição dos componentes dentro de
um container
– Implementam a interface LayoutManager
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– O Layout para uma janela é estabelecido por:


this.
this.setLayout(
setLayout(LayoutManager)
LayoutManager)
• Exemplos: BorderLayout, GridLayout, FlowLayout,
CardLayout, GridBagLayout.
• Funcionamento:
– A cada componente que é inserido em um container, o gerente
de layout recalcula a posiç
posição de cada componente (...)
27

Estratégia de Implementação
(Regra 4)
– Quando a janela é redimensionada, o gerente mais uma vez
se encarrega de arrumar os componentes
– Alguns gerentes de layout se utilizam de informaç
informações do
componente como:
• getMininumSize()
getMininumSize() e
• getPreferredSize().
getPreferredSize().
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• BorderLayout É o default para as Janelas (Frames). Ele


divide a Janela em cinco regiões genéricas: North, South,
Center (default), East e West. Ao adicionarmos os
componentes, podemos indicar em que região estes
ficarão.
28
Exemplo
(Regra 4 - BorderLayout)
class Janela extends Frame Implements ActionListener
{
Button btNorte,
btNorte, btLeste,
btLeste, btOeste,
btOeste, btSul,
btSul, btCentro;
btCentro;

public Janela( String títítulo )


{
super(tí
super(título);
this.
this.btNorte = new Button("Norte");
Button("Norte");
this.
this.add(
add(this.
this.btNorte,
btNorte, BorderLayout.NORTH
BorderLayout.NORTH );
this.
this.btSul = new Button("Sul");
Button("Sul");
AWT e Swing – Alessandro Cerqueira - 20/8/2007

this.
this.add(
add(this.
this.btSul,
btSul, BorderLayout.SOUTH
BorderLayout.SOUTH );
this.
this.btLeste = new Button(
Button(“Leste");
this.
this.add(
add(btLeste,
btLeste, BorderLayout.EAST
BorderLayout.EAST );
this.
this.btOeste = new Button("Oeste");
Button("Oeste");
this.
this.add(
add(btOeste,
btOeste, BorderLayout.WEST
BorderLayout.WEST );
this.
this.btCentro = new Button("Centro");
Button("Centro");
this.
this.add(
add(btCentro,
btCentro, BorderLayout.CENTER
BorderLayout.CENTER );
this.
this.setSize(300,100);
setSize(300,100);
this.
this.show();
}
...
}
29

Estratégia de Implementação
(Regra 4)

• O GridLayout apresenta uma disposição semelhante a uma


tabela. Para sua construção informamos o número de
linhas e colunas que o Grid terá e em cada célula
podemos colocar um componente.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
30

Exemplo
(Regra 4 - GridLayout)
class MinhaFrame extends Frame implements ActionListener
{
Button btGrid[];
btGrid[];

minhaFrame(String
minhaFrame(String tí título)
{
super(tí
super(título);
this.
this.setLayout(
setLayout( new GridLayout(4,2)
GridLayout(4,2) ); // Indico que o gerente layout é
// o objeto GridLayout criado
AWT e Swing – Alessandro Cerqueira - 20/8/2007

this.
this.btGrid = new Button[8];
Button[8];
for(int contador=0;contador<8;contador++)
{
this.
this.btGrid[contador]
btGrid[contador] = new Button("Botão
Button("Botão "+(1+contador));
this.
this.add(
add(btGrid[contador]);
btGrid[contador]); // Não determino a posiç
posição. da
// A ordem será
será esquerda para
// direita
direita e de cima para baixo
}
this.
this.setSize(300,200);
setSize(300,200);
this.
this.show();
}
...
31

Estratégia de Implementação
(Regra 4)

• O FlowLayout é um Layout seqüencial; ou


seja, ele vai adicionando os componentes de
cima para baixo, da esquerda para a direita.
Caso o componente não caiba na “linha”, ele
passa a “linha” abaixo.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
32

Estratégia de Implementação
(Regra 4)

• CardLayout
– Enquanto outros layout managers mostram todos
os componentes de uma só vez na tela, o
CardLayout exibe um de cada vez.
– Produz uma espécie de visualizador de slides dos
componentes.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– Somente um componente (“slide”) é visualizado


de cada vez.
– Geralmente usado com painéis (a frente)
– A ordem dos componentes segue a ordem de
inserção dos mesmos no container
33

Estratégia de Implementação
(Regra 4)
• Navegação
– Seguindo a ordem de inserção, a classe permite a
navegação através dos métodos:
• first(Container)
• previous(Container)
• next(Container)
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• last(Container)
– Acesso a um dado slide
• É possível especificar um nome ao slide quando
adicionado ao container
• A partir desse nome, o CardLayout pode
mostrar o slide
– show(Container,String)
AWT e Swing – Alessandro Cerqueira - 20/8/2007 34

(Regra 4)
Estratégia de Implementação
35

Estratégia de Implementação
(Regra 5)

• Quando nenhum gerente de Layout implementa o que


desejamos para a janela somos obrigados a fazer uma
composição de Panels.
• Para cada região podemos implementar um Layout
específico com o uso de Panels. Esta classe é um
container no qual podemos adicionar componentes
AWT e Swing – Alessandro Cerqueira - 20/8/2007

seguindo um Layout próprio para a região.


• O exemplo apresenta um jogo da velha implementado
com BorderLayout e Panels (clique sobre o ícone).
36
Desconsiderando as Regras 4 e 5
(Trabalhando sem Layouts)
• Para criar uma container sem layout manager use null no
argumento do método setLayout().
• Na maioria das vezes não e uma boa idéia desabilitar o
layout manager, pois o que aparece muito bonito em
uma plataforma, pode aparece um desastre em outra.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• Para mostrar os componentes num container sem layout,


devemos especificar sua posição e tamanho.
• Exemplo:
this.
this.setLayout(
setLayout(null);
null);
Button ok = new Button(
Button(“ok”
ok”);
this.
this.add(
add(ok);
ok);
ok.
ok.setBounds(10,10,30,15);
setBounds(10,10,30,15); // posicionando o botão na janela
37

Classes e Componentes AWT


• Também conhecidos como
– Elementos de controle da interface de usuá
usuário
– Widgets (window gadgets – dispositivos de janela)

• São elementos da interface que podem ser


apresentados ao usuário
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– E responder ao mouse e ao teclado

• Classe abstrata Component é a principal


– Define aspectos comuns a todos os componentes:
Fonte, cor, painting,
painting, reshaping e tratamento de eventos

• Containers
– Podem conter outros componentes, inclusive outros
containers.
containers.
38
Classes AWT
(Hierarquia)
Button

Canvas
Object
Checkbox

Component Choice Panel Applet


AWT e Swing – Alessandro Cerqueira - 20/8/2007

Container ScrollPane

Label Window Dialog FileDialog

Classes List
Frame
abstratas
Scrollbar
TextArea
TextComponent
TextField
39
Classes AWT
(Frame)
• É uma janela que possui barra de título e bordas.
• Frames são containers, portanto podemos adicionar
componentes.
• Quando criamos uma janela, ela é inicialmente invisível.
Usamos o método setVisible(true) para mostrá-la na tela
e o método setVisible(false) para escondê-la.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• O layout padrão de um frame é o BorderLayout.


• A classe Frame implementa a interface MenuContainer,
podendo assim conter barra de menus.
• Usualmente cria-se uma nova classe que estende de
Frame. Obtém-se:
– Uma janela para apresentaç
apresentação grá
gráfica da aplicaç
aplicação
– Um container para dispor os componentes GUI da aplicaç
aplicação.
40
Classes AWT
(Panel)
• É um container  Permite dispor outros
componentes, inclusive outros painéis
• A utilização deste componente oferece grande
versatilidade na disposição dos componentes na
interface da aplicação
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• O painel não tem uma aparência física, é apenas uma


área retangular em que podemos trabalhar.
• O gerente de layout padrão do painel é o
FlowLayout.
41
Classes AWT
(Panel)
• A classe Color do AWT permite definir e
trabalhar com cores.
• Java permite usar o mesmo objeto Color em
qualquer plataforma, mas não garante que irá
ser tratado da mesma forma pelo diferentes
AWT e Swing – Alessandro Cerqueira - 20/8/2007

displays.
• Tem constantes pré-definidas, que são usadas
como qualquer outra variável de classe, por
exemplo Color.red é uma constante
representando a cor vermelha.
42
Classes AWT
(Insets)
• Prove mecanismo de encapsular o gerenciamento das
margens dos quatro lados de um Container.
• Podemos obter os valores de margem de um Container
através do método getInsets() que retorna um objeto
Insets.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• As margens são criadas com valores em pixels, que são


armazenados nas variáveis top, botton, left e right.
• O container pode utilizar o espaço reservado pelo Insets
para desenhar, através do método paint().
• Se o gerenciador de layout do container não “olhar” para
o insets, as operações serão totalmente ignoradas.
43
Classes AWT
(Label)
• É uma simples linha de texto estático.
• Útil para colocar título ou mensagem próximos a
outros componente da interface.
• Segue o layout do container em que foi
adicionado, sendo facilmente alinhado.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• A classe Label tem métodos que permitem


configurar o texto, alinhamento e o tipo de fonte.
• Exemplo:
Label titulo =
new Label(
Label(“ComponentesAWT”
ComponentesAWT”, Label.CENTER
Label.CENTER);
);
44
Classes AWT
(Button)
• Botões costumam ser bastante utilizados em interfaces
gráficas
• Quando pressionados, é disparado um evento que é
tratado pelo método actionPerformed().
• O acionamento do botão é visualmente indicado por um
efeito de afundamento da superfície
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• A aparência de um botão depende da plataforma sobre a


qual a aplicação está rodando
• O que pode ser alterado:
– O texto e fonte que o botão mostra,
– Cores de fundo e texto,
– Habilitar e desabilitar o botão
• Exemplo: add(new Button(“exemplo”));
45
Classes AWT
(TextField e TextArea)
• Subclasses de TextComponent:
• Inserir texto
• Obter texto
• Selecionar texto
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• Marcar como somente de leitura


• O TextField é um componente que mostra apenas
uma linha de texto. Seu tamanho pode ser
especificado, porém pode ser alterado pelo gerente
de layout corrente.
• O texto do TexField aparece alinhado à esquerda
46
Classes AWT
(TextField e TextArea)
• No TextField, podemos ocultar os caracteres digitados
usando o método setEchoCharacter(char c).
• O TextArea é um componente de texto com múltiplas
linhas
• A aparência da scrollbar no TextArea pode ser
AWT e Swing – Alessandro Cerqueira - 20/8/2007

controlada. Com a ajuda de algumas constantes,


podemos remover ou mudar de lugar as scrollbars.
Quando a scrollbar horizontal não aparece, o
wordwrap é automático.
• Fonte e Cores podem ser facilmente alterados em
ambos componentes
47
Classes AWT
(Dialogs)
• Representa uma janela que aparece por pouco
tempo, por exemplo, para mostrar avisos, fazer
perguntas...
– “Arquivo modificado, Deseja salvar ?”
• Pode ser modal, via construtor ou pelo método
AWT e Swing – Alessandro Cerqueira - 20/8/2007

setModal(true)
• Uma dialog box modal impossibilita entradas para
qualquer uma das outras janelas da tela até que
ela seja fechada (janela modal).
48
Classes AWT
(Dialogs)
• O AWT oferece dois tipos de dialog box, a classe
Dialog, que oferece uma caixa de dialogo
genérica, e a classe FileDialog, que é específica
para manipulação de arquivos.
• São vinculadas, através do construtor, a janelas já
AWT e Swing – Alessandro Cerqueira - 20/8/2007

existentes.
• Todas as janelas são invisíveis quando criadas
49
Classes AWT
(CheckBox e CheckBoxGroup)
• Todo Checkbox tem um texto, que pode ser vazio, e
um estado(selecionado ou não selecionado).
• Quando Checkboxs são associadas a um
CheckboxGroup, só um pode estar selecionado.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

Para um Checkbox fazer parte


de um grupo, basta passar o
argumento correspondente ao
CheckboxGroup no construtor
do primeiro.
50
Classes AWT
(Choice)
• Permite escolher uma opção de uma lista
• A lista fica aberta somente enquanto é feita a
escolha.
• A seleção de um item, automaticamente,
AWT e Swing – Alessandro Cerqueira - 20/8/2007

desfaz a seleção do item previamente


escolhido
• O objeto Choice é criado vazio. Os itens são
adicionados através do métodos:
– addItem(String item) ou
– insert(String item, int index);
51
Classes AWT
(Choice)
• Podemos ainda:
– saber quantos elementos tem na lista,
– obter um item dado um índice,
– remover um item,
– obter a posição do elemento selecionado, etc.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
52
Classes AWT
(List)

• Permite a exibição de lista de itens


– Os itens não podem ser editados diretamente
– Uma barra de rolagem é exibida automaticamente quando o
número de itens excede o tamanho do componente
– Pode ser configurado para permitir seleç
seleção de um único item
AWT e Swing – Alessandro Cerqueira - 20/8/2007

ou mú
múltiplos
– Quando se clica num item selecionado este passa a estar
selecionado e vice-
vice-versa

• O modo de operação pode ser configurado através do


construtor ou do método setMultipleMode(Boolean)
53
Classes AWT
(ScrollPane)
– Pode conter componentes maiores que ele
– Apenas um único componente deve ser adicionado
ao ScrollPane
– Apresenta scrollbar horizontal/vertical quando
necessário
AWT e Swing – Alessandro Cerqueira - 20/8/2007
54
Classes AWT
(ScrollBar)
• Scrollbars servem para manipular um intervalo de valores.
• Podem ser horizontais ou verticais
• Basicamente, se obté
obtém ou define um valor para a Scrollbar
• Scroolbar não possui texto associado
• Áreas de texto e listas já
já vêm com suas pró
próprias barras de
AWT e Swing – Alessandro Cerqueira - 20/8/2007

rolagem.
55
Classes AWT
(Image)
• É uma classe abstrata, mas é utilizada por outros
componentes para possibilitar renderização de
imagens.
• Alguns métodos recebem como parâmetro o objeto
ImageObserver. É uma interface geralmente
representada pelo container da imagem.
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– getHeigth(ImageObserver)
– getWidth(ImageObserver)
• A classe Toolkit é geralmente utilizada para obter
uma imagem.
image =
Toolkit.
Toolkit.getDefaultToolkit().
getDefaultToolkit().getImage
getImage(nomeArquivo);
(nomeArquivo)
56
Classes AWT
(Canvas)
• Representa uma área retangular destinada a suportar
operações de desenho, e monitorar eventos
realizados pelo usuário.
• É uma classe base para criação de novas classes.
• Embora sejamos tentados a desenhar diretamente no
AWT e Swing – Alessandro Cerqueira - 20/8/2007

Container, a maneira mais apropriada é utilizando


esta classe. Containers não tomam conhecimento dos
desenhos feitos nele.
• O Canvas é criado sem tamanho definido. Ao colocá-
lo num gerente de layout, este se encarrega de
dimensionar o Canvas para você.
57
Classes AWT
(MenuBar, Menu e MenuItem)

MenuComponent

MenuItem MenuBar
AWT e Swing – Alessandro Cerqueira - 20/8/2007

MenuContainer

CheckboxMenuItem Menu

MenuShortcut
58
Classes AWT
(Menu)
• Menu é o container para MenuItem
• Como Menu é uma subclasse de MenuItem, um Menu
pode aparecer dentro de outro Menu.
• CheckboxMenuItem é um tipo especial de MenuItem
que pode ser marcado como fazemos com o
AWT e Swing – Alessandro Cerqueira - 20/8/2007

checkbox.
• Adicionamos itens com o método
– add(String
add(String label)
label), ou com
– insert(String
insert(String label,
label, int index)
index), que insere o item na posiç
posição
dada.
59
Classes AWT
(Menu)
• É simples criar uma aplicação com menu
– Adicionar barra de menu a janela (Frame)
– Adicionar menus suspensos
– Adicionar itens de menu
AWT e Swing – Alessandro Cerqueira - 20/8/2007
60
Classes AWT
(Menu)
• Para associar funcionalidade
aos itens de menu é
necessário um tratamento
de eventos adequado.
• Podemos ainda:
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– saber quantos itens tem o


primeiro nível de um Menu;
– obter um item do Menu dado
um índice;
– adicionar separadores; etc.
61
Classes AWT
(Menu)
• Adicionando atalhos...
– Cria-se uma instância de MenuItem que recebe
uma instância de MenuShortcut
• MenuItem miSair = new MenuItem(“Sair”,new
MenuShortcut(KeyEvent.VK_R));
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– O menu será acionado pressionando CTRL+R


– As combinações se restringem as teclas
CTRL+qualquer por questões de compatibilidade
entre plataformas
62
Classes AWT
(PopMenu)
• Permite associar um menu a um contexto
específico.
• Para associar um popmenu a um componente
use o método add(PopMenu)
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• Assim como acontece com a classe Menu, o


PopMenu também é criado vazio e os itens são
adicionados depois.
• Para mostrar o menu na tela, use o método
show().
63
Classes AWT
(Outras Classes Úteis)
• Classes que representam estruturas e recursos úteis
• Lidam com formas geométricas
– Classe Dimension
– Classe Insets
– Classe Point
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– Classe Polygon
– Classe Rectangle
– Classe Shape

• Lidam com cores


– Classe Color,
Color, representa uma entre 16.777.216 cores
– Classe SystemColor,
SystemColor, representa cores do sistema p/texto,
etc
64
Classes AWT
(Outras Classes Úteis)
• Recursos diversos
– Classe Cursor, formato do mouse pointer
– Classe Font,
Font, representa um fonte
– Classe FontMetrics,
FontMetrics, dimensões e espaç
espaçamentos do fonte
– Classe Graphics,
Graphics, representa um contexto grá
gráfico
AWT e Swing – Alessandro Cerqueira - 20/8/2007

– Classe Image,
Image, representa uma imagem
– Interface PrintGraphics,
PrintGraphics, usado para imprimir
– Classe PrintJob,
PrintJob, usado para imprimir
– Classe Toolkit,
Toolkit, ferramentas para windowing,
windowing, exemplo:
resoluç
resolução e tamanho da tela, lista de fontes, etc
65

Swing
• API baseada no AWT para construção de interfaces
– Padrão a partir do JDK 1.2
AWT e Swing – Alessandro Cerqueira - 20/8/2007

• Basicamente, as classes Swing possuem o mesmo


nome que as classes AWT, porém tendo um “J” à
frente do nome.
• Pacote: javax.swing
66
Swing
Componentes
JApplet JButton JCheckBox JCheckBoxMenuItem

JColorChooser JColorBox ImageIcon JDialog


AWT e Swing – Alessandro Cerqueira - 20/8/2007

JFileChooser JInternalFrame JLabel JList


67
Swing
Componentes
JMenu JMenuBar JOptionPane JPopupMenu

JProgressBar JRadioButton JRadioButtonMenuItem JScrollBar


AWT e Swing – Alessandro Cerqueira - 20/8/2007

JScrollPane JSlider JSplitPane JTabbedPane


68
Swing
Componentes
JTable JTextArea JTextField JToggleButton

JToolBar JToolTip JTree JPanel e JFrame


AWT e Swing – Alessandro Cerqueira - 20/8/2007
69
Swing
JFrame e JApplet
• Diferenç
Diferenças Prá
Práticas
– Para adicionar um componente em um JFrame devemos enviar a
mensagem add para o ContentPane do Frame ao invé
invés do pró
próprio Frame:
• Antes:
minhaJanela.add(comp);
minhaJanela.add(comp);
• Agora:
minhaJanela.getContentPane().add(comp);
minhaJanela.getContentPane().add(comp);
– Podemos ter applets implementados com Swing. Entretanto,
Entretanto, como Swing
AWT e Swing – Alessandro Cerqueira - 20/8/2007

só se tornou parte da JFC com Java 2, nem todos os browsers suportam


diretamente o código.
digo. É necessá
necessário possuir um plug-
plug-in que permita a
visualizaç
visualização destes applets como objetos embutidos:
embutidos:

<EMBED type="application/x-
type="application/x-java-
java-applet;version=1.2.2" width="500" height="300"
align="baseline" code="Fetcher.class" codebase="."
codebase="."
pluginspage="http://java.sun.com/products/plugin/1.2/plugin
pluginspage="http://java.sun.com/products/plugin/1.2/plugin--install.html">
<NOEMBED> No Java 2 support for APPLET!!
</NOEMBED></EMBED>