Universidade Presbiteriana Mackenzie
Aula 8b: Gerenciadores de Layout
Prof. Ms. Daniel Arndt Alves
Faculdade de Computação e Informática
Linguagem de
Programação II
Daniel Arndt Alves Gerenciadores de Layout 1
Tópicos da Aula
• Gerenciadores de Layout
• Modelo de gerenciamento de
eventos no Java AWT
• Implementação básica de tratamento de
eventos
Daniel Arndt Alves Gerenciadores de Layout 2
O posicionamento de componentes pode ser controlado
através de gerenciadores de layout. O AWT possui
cinco gerenciadores de layout:
• FlowLayout
• GridLayout
• BorderLayout
• CardLayout
• GridBagLayout
Daniel Arndt Alves Gerenciadores de Layout 3
Gerenciadores de layout
Utilização dos gerenciadores
Uma vez instanciado o gerenciador, a atribuição deste a
um container é feita através da chamada:
container.setLayout(Instância do gerenciador);
A partir deste ponto, utiliza-se o método add para
adicionar os componentes dentro do container,
obedecendo-se as características de cada gerenciador.
Daniel Arndt Alves Gerenciadores de Layout 4
FlowLayout
Trata o container como um conjunto de linhas. A
altura das linhas é determinada pela altura dos
itens nelas contidos.
A classe FlowLayout possui três construtores:
public FlowLayout() (alinhamento CENTER)
public FlowLayout(int alinhamento)
public FlowLayout(int alinhamento,
int espaçamento horizontal,
int espaçamento vertical)
Daniel Arndt Alves Gerenciadores de Layout 5
FlowLayout
Alinhamento LEFT
Frame f=new Frame("Exemplo de Dialogo");
FlowLayout fluxo=new FlowLayout(FlowLayout.LEFT);
f.setLayout(fluxo);
Daniel Arndt Alves Gerenciadores de Layout 6
FlowLayout
Alinhamento CENTER
Frame f=new Frame("Exemplo de Dialogo");
FlowLayout fluxo=new flowLayout(FlowLayout.CENTER);
f.setLayout(fluxo);
Daniel Arndt Alves Gerenciadores de Layout 7
FlowLayout
Alinhamento RIGHT
Frame f=new Frame("Exemplo de Dialogo");
FlowLayout fluxo=new FlowLayout(FlowLayout.RIGHT);
f.setLayout(fluxo);
Daniel Arndt Alves Gerenciadores de Layout 8
FlowLayout
Espaçamento
Frame f=new Frame("Exemplo de Dialogo");
FlowLayout fluxo=new flowLayout(FlowLayout.CENTER, 5, 15);
f.setLayout(fluxo);
Daniel Arndt Alves Gerenciadores de Layout 9
GridLayout
Trata o container como uma matriz de linhas e colunas.
Possui dois construtores:
public GridLayout(int linhas, int colunas)
public GridLayout(int linhas, int colunas,
int espaçamento horizontal,
int espaçamento vertical)
Daniel Arndt Alves Gerenciadores de Layout 10
GridLayout
Frame f=new Frame("Exemplo de Dialogo");
GridLayout grid=new GridLayout(2, 3, 20, 10);
f.setLayout(grid);
Daniel Arndt Alves Gerenciadores de Layout 11
BorderLayout
Divide o container em até cinco partes, cujos
identificadores são:
North
West Center East
South
Container
Daniel Arndt Alves Gerenciadores de Layout 12
BorderLayout
Frame frame=new Frame("Exemplo de Dialogo");
frame.setLayout(new BorderLayout());
add("North", new Button("Norte"));
add("South", new Button("Sul"));
add("East", new Button("Leste"));
add("West", new Button("Oeste"));
add("Center", new Button("Centro"));
Daniel Arndt Alves Gerenciadores de Layout 13
CardLayout
Trata o container como uma pilha de fichas. Cada
componente é considerado uma ficha separada, e
apenas uma delas é visível de cada vez.
Possui o seguinte construtor básico:
public CardLayout()
Daniel Arndt Alves Gerenciadores de Layout 14
CardLayout
Frame frame=new Frame("Exemplo de Dialogo");
frame.setLayout(new CardLayout());
add(new Button("Norte"));
add(new Button("Sul"));
add(new Button("Leste"));
add(new Button("Oeste"));
add(new Button("Centro"));
Daniel Arndt Alves Gerenciadores de Layout 15
CardLayout
Cada um dos componentes adicionados segundo o
gerenciador CardLayout pode ser acessado
segundo os seguintes métodos:
public void first(Container pai);
public void last(Container pai);
public void next(Container pai);
public void previous(Container pai);
public void show(Container pai, String nome);
Daniel Arndt Alves Gerenciadores de Layout 16
CardLayout
Exemplo de Acesso
Frame frame=new Frame("Exemplo de Dialogo");
CardLayout ger=new CardLayout();
frame.setLayout(ger);
frame.add(new Button("Norte"));
frame.add(new Button("Sul"));
frame.add(new Button("Leste"));
frame.add(new Button("Oeste"));
frame.add(new Button("Centro"));
ger.first(frame); // Acessa o primeiro componente
ger.next(frame); // Acessa o próximo componente
Daniel Arndt Alves Gerenciadores de Layout 17
GridBagLayout
Funciona como o GridLayout, dividindo o container
em linhas e colunas. Porém, um componente pode
ocupar mais de uma célula. Ao adicionar um
componente num gerenciamento por
GridBagLayout, ele recebe uma
GridBagConstraint, que tem instruções de
posicionamento e dimensionamento.
O construtor da classe é bem simples:
public GridBagLayout()
Daniel Arndt Alves Gerenciadores de Layout 18
GridBagConstraint
Classe que especifica os detalhes de inserção de
componentes em containers, segundo o gerenciador
GridBagLayout.
Algumas atributos importantes da classe são:
• gridwidth: número de células em uma linha para
exibição do componente
• gridheight: número de células em uma coluna
para exibição do componente
O valor padrão de cada um destes atributos é 1.
Daniel Arndt Alves Gerenciadores de Layout 19
GridBagConstraint
Os atributos gridwidth e gridweight também podem
assumir valores especiais, indicados por:
• GridBagConstraints.REMAINDER : especifica que o
componente é último da linha.
• GridBagConstraints.RELATIVE : especifica que o componente é
o próximo numa linha/coluna.
Daniel Arndt Alves Gerenciadores de Layout 20
GridBagConstraint
Para atribuir uma “constraint” a um componente, faz-se:
1. Instancia-se a classe GridBagConstraints
2. Altera-se os atributos destas instância
3. Utiliza-se o método setContraints, da classe
GridBagLayout, com os seguintes parâmetros:
void setContraints(Component c,
GridBagConstraints g)
Daniel Arndt Alves Gerenciadores de Layout 21
GridBagLayout
Daniel Arndt Alves Gerenciadores de Layout 22
GridBagLayout
import java.awt.*;
import java.util.*;
import java.applet.Applet;
public class GridBagEx1 extends Applet {
void makebutton(String name,
GridBagLayout gridbag,
GridBagConstraints c) {
Button button = new Button(name);
gridbag.setConstraints(button, c);
add(button);
}
Daniel Arndt Alves Gerenciadores de Layout 23
GridBagLayout
public void init() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c =
new GridBagConstraints();
setFont(new Font("Helvetica", Font.PLAIN, 14));
setLayout(gridbag);
// Distribuição horizontal de espaço
c.weightx = 1.0;
makebutton("Button1", gridbag, c);
makebutton("Button2", gridbag, c);
makebutton("Button3", gridbag, c);
Daniel Arndt Alves Gerenciadores de Layout 24
GridBagLayout
c.gridwidth = GridBagConstraints.REMAINDER;
makebutton("Button4", gridbag, c);
c.weightx = 0.0;
makebutton("Button5", gridbag, c);
c.gridwidth = GridBagConstraints.RELATIVE;
makebutton("Button6", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER;
makebutton("Button7", gridbag, c);
Daniel Arndt Alves Gerenciadores de Layout 25
GridBagLayout
c.gridwidth = 1;
c.gridheight = 2;
c.weighty = 1.0; // Distribuição vertical de espaço
makebutton("Button8", gridbag, c);
c.weighty = 0.0;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = 1;
makebutton("Button9", gridbag, c);
makebutton("Button10", gridbag, c);
setSize(300, 100);
}
Daniel Arndt Alves Gerenciadores de Layout 26
Não há necessidade de se ficar vinculado
exclusivamente às classes de gerenciamento vistas
anteriormente.
Classes que definem gerenciamento de layout
implementam uma das seguintes interfaces:
• LayoutManager : layout sem constraints
• LayoutManager2: layout com constraints
Daniel Arndt Alves Gerenciadores de Layout 27
Implementação de gerenciadores de
Layout
Eventos estão relacionados com a parte dinâmica
de uma interface. Por exemplo, se houve um
clique de mouse em cima de um botão da
interface, diz-se que ocorreu um evento de
mouse.
O Java AWT implementa um mecanismo
bastante robusto para gerenciamento de
eventos.
Daniel Arndt Alves Gerenciadores de Layout 28
Eventos
Java AWT consegue gerenciar diretamente os seguintes
tipos básicos de eventos:
• eventos de mouse
• eventos de teclado
• eventos de ação
• eventos de foco
Daniel Arndt Alves Gerenciadores de Layout 29
Tipos de Eventos
Modelo de gerenciamento de eventos em Java AWT
A notificação de ocorrência e tratamento do evento
é baseada em dois métodos da classe
java.awt.Component:
• deliverEvent() : despacha o evento para o
componente
• postEvent() : chama o método
handleEvent() para verificar se o
componente poderia tratar o evento.
Daniel Arndt Alves Gerenciadores de Layout 30
Container
Componente Componente
Container
Componente Componente Componente
Container
Componente Componente
Evento
Daniel Arndt Alves Gerenciadores de Layout 31
Modelo de gerenciamento de eventos em Java AWT
Modelo de gerenciamento de eventos em Java AWT
Componente
Container
Componente Container
Componente Componente Componente Container
Componente Componente
deliverEvent()
deliverEvent()
deliverEvent()
deliverEvent()
Daniel Arndt Alves Gerenciadores de Layout 32
Componente
Container
Componente Container
Componente Componente Componente Container
Componente Componente
postEvent()
postEvent()
*
*
**
postEvent()
* if (handleEvent(Event) == false)
super.postEvent()
** handleEvent(Event)== true)
Daniel Arndt Alves Gerenciadores de Layout 33
Modelo de gerenciamento de eventos em Java AWT
Tratamento de eventos
Existem várias maneiras que um componente
pode implementar seu tratamento para um
determinado evento.
O ponto importante é entender que o método
handleEvent(Event) é o despachante de
eventos central para um componente.
Daniel Arndt Alves Gerenciadores de Layout 34
Método handleEvent
O método handleEvent é definido segundo o
seguinte protótipo:
public boolean handleEvent(Event evt);
Event é uma classe do AWT que abstrai as
características do evento e já vem instanciada
na chamada do método.
Daniel Arndt Alves Gerenciadores de Layout 35
Classe Event
A classe Event possui três atributos
importantes no tratamento de eventos:
• Object target : alvo do evento
• int id : tipo do evento (constantes)
• int key : código de tecla pressionada
Daniel Arndt Alves Gerenciadores de Layout 36
Atributo id
A consulta ao atributo id geralmente é feita via
constantes da classe Event:
Event.MOUSE_ENTER Event.MOUSE_EXIT
Event.MOUSE_MOVE Event.MOUSE_DOWN
Event.MOUSE_DRAG Event.MOUSE_UP
Event.MOUSE_UP Event.KEY_PRESS
Event.KEY_ACTION Event.KEY_RELEASE
Event.KEY_ACTION_RELEASE Event.ACTION_EVENT
Event.GOT_FOCUS Event.LOST_FOCUS
Daniel Arndt Alves Gerenciadores de Layout 37
Método handleEvent
O comportamento padrão do método handleEvent é
determinar se ocorreu (na seguinte ordem) os
eventos:
1. De mouse
2. De teclado
3. De ação (usuário quer que alguma ação ocorra)
4. De foco no componente
5. De perda de foco no componente
e chamar o método de tratamento correspondente.
Daniel Arndt Alves Gerenciadores de Layout 38
Eventos de mouse
Os eventos de mouse tratados pelo AWT são:
• entrar com mouse num componente
(id=Event.MOUSE_ENTER)
• sair com mouse de um componente
(id=Event.MOUSE_EXIT)
• movimentar o mouse sobre um componente
(id=Event.MOUSE_MOVE)
Daniel Arndt Alves Gerenciadores de Layout 39
Eventos de mouse
• Apertar botão do mouse sobre um componente
(id=Event.MOUSE_DOWN)
• Arrastar mouse com botão pressionado sobre um
componente (id = Event.MOUSE_DRAG)
• soltar botão do mouse sobre um componente
(id=Event.MOUSE_UP)
Daniel Arndt Alves Gerenciadores de Layout 40
Event.MOUSE_ENTER
Pode ser tratado dentro do método:
public boolean mouseEnter(Event evt, int x, int y)
(x, y) : coordenadas de entrada
Daniel Arndt Alves Gerenciadores de Layout 41
Event.MOUSE_EXIT
Pode ser tratado dentro do método:
public boolean mouseExit(Event evt, int x, int y)
(x, y) : coordenada de saída
Daniel Arndt Alves Gerenciadores de Layout 42
Event.MOUSE_MOVE
Pode ser tratado dentro do método:
public boolean mouseMove(Event evt, int x, int y)
(x, y) : coordenada do movimento
Daniel Arndt Alves Gerenciadores de Layout 43
Event.MOUSE_DOWN
Pode ser tratado dentro do método:
public boolean mouseDown(Event evt, int x, int y)
(x, y) : coordenada de pressionamento do botão
Daniel Arndt Alves Gerenciadores de Layout 44
Event.MOUSE_DRAG
Pode ser tratado dentro do método:
public boolean mouseDrag(Event evt, int x, int y)
(x, y) : coordenada de arrasto
Daniel Arndt Alves Gerenciadores de Layout 45
Event.MOUSE_UP
Pode ser tratado dentro do método:
public boolean mouseUp(Event evt, int x, int y)
(x, y) : coordenada onde botão foi solto
Daniel Arndt Alves Gerenciadores de Layout 46
Ainda dentro dos eventos de mouse, o método
handleEvent faz a verificação na
sequência:
1. MOUSE_ENTER
2. MOUSE_EXIT
3. MOUSE_MOVE
4. MOUSE_DOWN
5. MOUSE_DRAG
6. MOUSE_UP
Daniel Arndt Alves Gerenciadores de Layout 47
Ordem de Verificação
Exemplo
// Botão com todos os tratamentos de evento
import java.awt.*;
public class botao
extends Button{
botao(String rotulo){
// Construtor
super(rotulo);
}
Daniel Arndt Alves Gerenciadores de Layout 48
Exemplo
public boolean mouseEnter(Event evt, int x, int y){
System.out.println("Entrou no componente");
return(true);
}
public boolean mouseExit(Event evt, int x, int y){
System.out.println("Saiu do componente");
return(true);
}
public boolean mouseMove(Event evt, int x, int y){
System.out.println("Movimento sobre botão");
return(true);
}
Daniel Arndt Alves Gerenciadores de Layout 49
Exemplo
public boolean mouseDown(Event evt,int x,int y){
System.out.println(“Clique no componente”);
return(true);
}
public boolean mouseDrag(Event evt,int x,int y){
System.out.println(“Arrasto em cima do componente”);
return(true);
}
public boolean mouseUp(Event evt,int x,int y){
System.out.println(“Soltou em cima do botão”);
return(true);
}
} // Botão
Daniel Arndt Alves Gerenciadores de Layout 50
Eventos de teclado
Dois tipos de evento podem ocorrer no teclado:
• pressionar teclas
– Event.KEY_PRESS : teclas ASCII
– Event.KEY_ACTION : teclas não-ASCII
• soltar teclas
– Event.KEY_RELEASE : teclas ASCII
– Event.KEY_ACTION_RELEASE: teclas não-ASCII
Daniel Arndt Alves Gerenciadores de Layout 51
Event.KEY_PRESS
Event.KEY_ACTION
Podem ser tratados dentro do método:
public boolean keyDown(Event evt, int key)
key : código da tecla pressionada
Daniel Arndt Alves Gerenciadores de Layout 52
Event.KEY_RELEASE
Event.KEY_ACTION_RELEASE
Podem ser tratados dentro do método:
public boolean keyUp(Event evt, int key)
key : código da tecla pressionada
Daniel Arndt Alves Gerenciadores de Layout 53
Ordem de Verificação
Ainda dentro dos eventos de teclado, o método
handleEvent faz a verificação na seqüência:
1. KEY_PRESS e KEY_ACTION
2. KEY_RELEASE e KEY_ACTION_RELEASE
Daniel Arndt Alves Gerenciadores de Layout 54
Exemplo
// Botão com tratamento de teclado no botão
import java.awt.*;
public class botao
extends Button{
botao(String rotulo){
// Construtor
super(rotulo);
}
Daniel Arndt Alves Gerenciadores de Layout 55
Exemplo
public boolean keyDown(Event evt,int key){
if (key=='a')
setLabel("Tecla a pressionada");
else if (key==Event.LEFT)
setLabel("Seta esquerda pressionada");
else if (key==Event.RIGHT)
setLabel("Seta direita pressionada");
return(true);
}
}// botao
Daniel Arndt Alves Gerenciadores de Layout 56
Eventos de ação
Quando ocorre um evento de ação
(Event.ACTION_EVENT), o tratamento pode ser
colocado dentro do método:
public boolean action(Event evt, Object arg)
arg - depende do componente onde ocorreu a ação
Daniel Arndt Alves Gerenciadores de Layout 57
Argumento do evento de ação
Componente arg
Button Rótulo do botão
Checkbox Estado do checkbox
Choice Opção escolhida
List Opção escolhida
com duplo clique
TextField Conteúdo após
return pressionado
Daniel Arndt Alves Gerenciadores de Layout 58
Exemplo
public boolean action(Event evt,Object arg){
// Verifica se foi ação no botão
if (evt.target instanceof Button)
// Mostra rótulo do botão em maiúsculas
System.out.println(((String) arg).toUpperCase());
return(true);
}
Daniel Arndt Alves Gerenciadores de Layout 59
Evento de ganho de foco
Quando ocorre um evento de ganho de foco
(Event.GOT_FOCUS), o tratamento pode ser
colocado dentro do método:
public boolean gotFocus(Event evt, Object arg)
arg - depende do componente onde ocorreu a ação
Daniel Arndt Alves Gerenciadores de Layout 60
Evento de perda de foco
Quando ocorre um evento de perda de foco
(Event.LOST_FOCUS), o tratamento pode ser
colocado dentro do método:
public boolean lostFocus(Event evt, Object arg)
arg - depende do componente onde ocorreu a ação
Daniel Arndt Alves Gerenciadores de Layout 61
Outros Eventos
Alguns eventos, porém, não possuem uma rota
de tratamento bem definida como nos eventos
anteriores.
Neste caso, uma solução bem simples é alterar a
implementação do método handleEvent para
direcionar o tratamento de tais eventos.
Daniel Arndt Alves Gerenciadores de Layout 62
Exemplo 1
Tratamento de barras de rolagem
import java.awt.*;
class exemplo
extends Frame{
Scrollbar barra=new Scrollbar();
...
public boolean handleEvent(Event evt){
if (evt.target==barra)
barra.setValue(((Integer) evt.arg).intValue());
return(true);
}
}
Daniel Arndt Alves Gerenciadores de Layout 63
Exemplo 2
Tratamento de fechamento da janela principal
import java.awt.*;
class exemplo
extends Frame{
Scrollbar barra=new Scrollbar();
...
public boolean handleEvent(Event evt){
if (evt.id==Event.WINDOW_DESTROY)
System.exit(0);
return(true);
}
}
Daniel Arndt Alves Gerenciadores de Layout 64
Tratamento mais complexo de eventos
Para um tratamento mais complexo de eventos podem ser
implementados métodos de várias interfaces de eventos
do pacote java.awt.Event. Por exemplo:
• MouseListener
• ActionListener
• WindowListener
Daniel Arndt Alves Gerenciadores de Layout 65
Daniel Arndt Alves Gerenciadores de Layout 66
Daniel Arndt Alves Gerenciadores de Layout 67
Imagens
• http://www.goldb.org/goldblog/cmg_images/
real_programmers_binary.jpg
• http://sandersconsulting.com/Portals/58319/i
mages/checklist.jpg
Daniel Arndt Alves Gerenciadores de Layout 68
Obrigado
Daniel Arndt Alves
http://www.progdan.pro.br/
daniel.alves@mackenzie.br
progdan@progdan.pro.br
Daniel Arndt Alves Gerenciadores de Layout 69

Gerenciadores de Layout

  • 1.
    Universidade Presbiteriana Mackenzie Aula8b: Gerenciadores de Layout Prof. Ms. Daniel Arndt Alves Faculdade de Computação e Informática Linguagem de Programação II Daniel Arndt Alves Gerenciadores de Layout 1
  • 2.
    Tópicos da Aula •Gerenciadores de Layout • Modelo de gerenciamento de eventos no Java AWT • Implementação básica de tratamento de eventos Daniel Arndt Alves Gerenciadores de Layout 2
  • 3.
    O posicionamento decomponentes pode ser controlado através de gerenciadores de layout. O AWT possui cinco gerenciadores de layout: • FlowLayout • GridLayout • BorderLayout • CardLayout • GridBagLayout Daniel Arndt Alves Gerenciadores de Layout 3 Gerenciadores de layout
  • 4.
    Utilização dos gerenciadores Umavez instanciado o gerenciador, a atribuição deste a um container é feita através da chamada: container.setLayout(Instância do gerenciador); A partir deste ponto, utiliza-se o método add para adicionar os componentes dentro do container, obedecendo-se as características de cada gerenciador. Daniel Arndt Alves Gerenciadores de Layout 4
  • 5.
    FlowLayout Trata o containercomo um conjunto de linhas. A altura das linhas é determinada pela altura dos itens nelas contidos. A classe FlowLayout possui três construtores: public FlowLayout() (alinhamento CENTER) public FlowLayout(int alinhamento) public FlowLayout(int alinhamento, int espaçamento horizontal, int espaçamento vertical) Daniel Arndt Alves Gerenciadores de Layout 5
  • 6.
    FlowLayout Alinhamento LEFT Frame f=newFrame("Exemplo de Dialogo"); FlowLayout fluxo=new FlowLayout(FlowLayout.LEFT); f.setLayout(fluxo); Daniel Arndt Alves Gerenciadores de Layout 6
  • 7.
    FlowLayout Alinhamento CENTER Frame f=newFrame("Exemplo de Dialogo"); FlowLayout fluxo=new flowLayout(FlowLayout.CENTER); f.setLayout(fluxo); Daniel Arndt Alves Gerenciadores de Layout 7
  • 8.
    FlowLayout Alinhamento RIGHT Frame f=newFrame("Exemplo de Dialogo"); FlowLayout fluxo=new FlowLayout(FlowLayout.RIGHT); f.setLayout(fluxo); Daniel Arndt Alves Gerenciadores de Layout 8
  • 9.
    FlowLayout Espaçamento Frame f=new Frame("Exemplode Dialogo"); FlowLayout fluxo=new flowLayout(FlowLayout.CENTER, 5, 15); f.setLayout(fluxo); Daniel Arndt Alves Gerenciadores de Layout 9
  • 10.
    GridLayout Trata o containercomo uma matriz de linhas e colunas. Possui dois construtores: public GridLayout(int linhas, int colunas) public GridLayout(int linhas, int colunas, int espaçamento horizontal, int espaçamento vertical) Daniel Arndt Alves Gerenciadores de Layout 10
  • 11.
    GridLayout Frame f=new Frame("Exemplode Dialogo"); GridLayout grid=new GridLayout(2, 3, 20, 10); f.setLayout(grid); Daniel Arndt Alves Gerenciadores de Layout 11
  • 12.
    BorderLayout Divide o containerem até cinco partes, cujos identificadores são: North West Center East South Container Daniel Arndt Alves Gerenciadores de Layout 12
  • 13.
    BorderLayout Frame frame=new Frame("Exemplode Dialogo"); frame.setLayout(new BorderLayout()); add("North", new Button("Norte")); add("South", new Button("Sul")); add("East", new Button("Leste")); add("West", new Button("Oeste")); add("Center", new Button("Centro")); Daniel Arndt Alves Gerenciadores de Layout 13
  • 14.
    CardLayout Trata o containercomo uma pilha de fichas. Cada componente é considerado uma ficha separada, e apenas uma delas é visível de cada vez. Possui o seguinte construtor básico: public CardLayout() Daniel Arndt Alves Gerenciadores de Layout 14
  • 15.
    CardLayout Frame frame=new Frame("Exemplode Dialogo"); frame.setLayout(new CardLayout()); add(new Button("Norte")); add(new Button("Sul")); add(new Button("Leste")); add(new Button("Oeste")); add(new Button("Centro")); Daniel Arndt Alves Gerenciadores de Layout 15
  • 16.
    CardLayout Cada um doscomponentes adicionados segundo o gerenciador CardLayout pode ser acessado segundo os seguintes métodos: public void first(Container pai); public void last(Container pai); public void next(Container pai); public void previous(Container pai); public void show(Container pai, String nome); Daniel Arndt Alves Gerenciadores de Layout 16
  • 17.
    CardLayout Exemplo de Acesso Frameframe=new Frame("Exemplo de Dialogo"); CardLayout ger=new CardLayout(); frame.setLayout(ger); frame.add(new Button("Norte")); frame.add(new Button("Sul")); frame.add(new Button("Leste")); frame.add(new Button("Oeste")); frame.add(new Button("Centro")); ger.first(frame); // Acessa o primeiro componente ger.next(frame); // Acessa o próximo componente Daniel Arndt Alves Gerenciadores de Layout 17
  • 18.
    GridBagLayout Funciona como oGridLayout, dividindo o container em linhas e colunas. Porém, um componente pode ocupar mais de uma célula. Ao adicionar um componente num gerenciamento por GridBagLayout, ele recebe uma GridBagConstraint, que tem instruções de posicionamento e dimensionamento. O construtor da classe é bem simples: public GridBagLayout() Daniel Arndt Alves Gerenciadores de Layout 18
  • 19.
    GridBagConstraint Classe que especificaos detalhes de inserção de componentes em containers, segundo o gerenciador GridBagLayout. Algumas atributos importantes da classe são: • gridwidth: número de células em uma linha para exibição do componente • gridheight: número de células em uma coluna para exibição do componente O valor padrão de cada um destes atributos é 1. Daniel Arndt Alves Gerenciadores de Layout 19
  • 20.
    GridBagConstraint Os atributos gridwidthe gridweight também podem assumir valores especiais, indicados por: • GridBagConstraints.REMAINDER : especifica que o componente é último da linha. • GridBagConstraints.RELATIVE : especifica que o componente é o próximo numa linha/coluna. Daniel Arndt Alves Gerenciadores de Layout 20
  • 21.
    GridBagConstraint Para atribuir uma“constraint” a um componente, faz-se: 1. Instancia-se a classe GridBagConstraints 2. Altera-se os atributos destas instância 3. Utiliza-se o método setContraints, da classe GridBagLayout, com os seguintes parâmetros: void setContraints(Component c, GridBagConstraints g) Daniel Arndt Alves Gerenciadores de Layout 21
  • 22.
    GridBagLayout Daniel Arndt AlvesGerenciadores de Layout 22
  • 23.
    GridBagLayout import java.awt.*; import java.util.*; importjava.applet.Applet; public class GridBagEx1 extends Applet { void makebutton(String name, GridBagLayout gridbag, GridBagConstraints c) { Button button = new Button(name); gridbag.setConstraints(button, c); add(button); } Daniel Arndt Alves Gerenciadores de Layout 23
  • 24.
    GridBagLayout public void init(){ GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setFont(new Font("Helvetica", Font.PLAIN, 14)); setLayout(gridbag); // Distribuição horizontal de espaço c.weightx = 1.0; makebutton("Button1", gridbag, c); makebutton("Button2", gridbag, c); makebutton("Button3", gridbag, c); Daniel Arndt Alves Gerenciadores de Layout 24
  • 25.
    GridBagLayout c.gridwidth = GridBagConstraints.REMAINDER; makebutton("Button4",gridbag, c); c.weightx = 0.0; makebutton("Button5", gridbag, c); c.gridwidth = GridBagConstraints.RELATIVE; makebutton("Button6", gridbag, c); c.gridwidth = GridBagConstraints.REMAINDER; makebutton("Button7", gridbag, c); Daniel Arndt Alves Gerenciadores de Layout 25
  • 26.
    GridBagLayout c.gridwidth = 1; c.gridheight= 2; c.weighty = 1.0; // Distribuição vertical de espaço makebutton("Button8", gridbag, c); c.weighty = 0.0; c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = 1; makebutton("Button9", gridbag, c); makebutton("Button10", gridbag, c); setSize(300, 100); } Daniel Arndt Alves Gerenciadores de Layout 26
  • 27.
    Não há necessidadede se ficar vinculado exclusivamente às classes de gerenciamento vistas anteriormente. Classes que definem gerenciamento de layout implementam uma das seguintes interfaces: • LayoutManager : layout sem constraints • LayoutManager2: layout com constraints Daniel Arndt Alves Gerenciadores de Layout 27 Implementação de gerenciadores de Layout
  • 28.
    Eventos estão relacionadoscom a parte dinâmica de uma interface. Por exemplo, se houve um clique de mouse em cima de um botão da interface, diz-se que ocorreu um evento de mouse. O Java AWT implementa um mecanismo bastante robusto para gerenciamento de eventos. Daniel Arndt Alves Gerenciadores de Layout 28 Eventos
  • 29.
    Java AWT conseguegerenciar diretamente os seguintes tipos básicos de eventos: • eventos de mouse • eventos de teclado • eventos de ação • eventos de foco Daniel Arndt Alves Gerenciadores de Layout 29 Tipos de Eventos
  • 30.
    Modelo de gerenciamentode eventos em Java AWT A notificação de ocorrência e tratamento do evento é baseada em dois métodos da classe java.awt.Component: • deliverEvent() : despacha o evento para o componente • postEvent() : chama o método handleEvent() para verificar se o componente poderia tratar o evento. Daniel Arndt Alves Gerenciadores de Layout 30
  • 31.
    Container Componente Componente Container Componente ComponenteComponente Container Componente Componente Evento Daniel Arndt Alves Gerenciadores de Layout 31 Modelo de gerenciamento de eventos em Java AWT
  • 32.
    Modelo de gerenciamentode eventos em Java AWT Componente Container Componente Container Componente Componente Componente Container Componente Componente deliverEvent() deliverEvent() deliverEvent() deliverEvent() Daniel Arndt Alves Gerenciadores de Layout 32
  • 33.
    Componente Container Componente Container Componente ComponenteComponente Container Componente Componente postEvent() postEvent() * * ** postEvent() * if (handleEvent(Event) == false) super.postEvent() ** handleEvent(Event)== true) Daniel Arndt Alves Gerenciadores de Layout 33 Modelo de gerenciamento de eventos em Java AWT
  • 34.
    Tratamento de eventos Existemvárias maneiras que um componente pode implementar seu tratamento para um determinado evento. O ponto importante é entender que o método handleEvent(Event) é o despachante de eventos central para um componente. Daniel Arndt Alves Gerenciadores de Layout 34
  • 35.
    Método handleEvent O métodohandleEvent é definido segundo o seguinte protótipo: public boolean handleEvent(Event evt); Event é uma classe do AWT que abstrai as características do evento e já vem instanciada na chamada do método. Daniel Arndt Alves Gerenciadores de Layout 35
  • 36.
    Classe Event A classeEvent possui três atributos importantes no tratamento de eventos: • Object target : alvo do evento • int id : tipo do evento (constantes) • int key : código de tecla pressionada Daniel Arndt Alves Gerenciadores de Layout 36
  • 37.
    Atributo id A consultaao atributo id geralmente é feita via constantes da classe Event: Event.MOUSE_ENTER Event.MOUSE_EXIT Event.MOUSE_MOVE Event.MOUSE_DOWN Event.MOUSE_DRAG Event.MOUSE_UP Event.MOUSE_UP Event.KEY_PRESS Event.KEY_ACTION Event.KEY_RELEASE Event.KEY_ACTION_RELEASE Event.ACTION_EVENT Event.GOT_FOCUS Event.LOST_FOCUS Daniel Arndt Alves Gerenciadores de Layout 37
  • 38.
    Método handleEvent O comportamentopadrão do método handleEvent é determinar se ocorreu (na seguinte ordem) os eventos: 1. De mouse 2. De teclado 3. De ação (usuário quer que alguma ação ocorra) 4. De foco no componente 5. De perda de foco no componente e chamar o método de tratamento correspondente. Daniel Arndt Alves Gerenciadores de Layout 38
  • 39.
    Eventos de mouse Oseventos de mouse tratados pelo AWT são: • entrar com mouse num componente (id=Event.MOUSE_ENTER) • sair com mouse de um componente (id=Event.MOUSE_EXIT) • movimentar o mouse sobre um componente (id=Event.MOUSE_MOVE) Daniel Arndt Alves Gerenciadores de Layout 39
  • 40.
    Eventos de mouse •Apertar botão do mouse sobre um componente (id=Event.MOUSE_DOWN) • Arrastar mouse com botão pressionado sobre um componente (id = Event.MOUSE_DRAG) • soltar botão do mouse sobre um componente (id=Event.MOUSE_UP) Daniel Arndt Alves Gerenciadores de Layout 40
  • 41.
    Event.MOUSE_ENTER Pode ser tratadodentro do método: public boolean mouseEnter(Event evt, int x, int y) (x, y) : coordenadas de entrada Daniel Arndt Alves Gerenciadores de Layout 41
  • 42.
    Event.MOUSE_EXIT Pode ser tratadodentro do método: public boolean mouseExit(Event evt, int x, int y) (x, y) : coordenada de saída Daniel Arndt Alves Gerenciadores de Layout 42
  • 43.
    Event.MOUSE_MOVE Pode ser tratadodentro do método: public boolean mouseMove(Event evt, int x, int y) (x, y) : coordenada do movimento Daniel Arndt Alves Gerenciadores de Layout 43
  • 44.
    Event.MOUSE_DOWN Pode ser tratadodentro do método: public boolean mouseDown(Event evt, int x, int y) (x, y) : coordenada de pressionamento do botão Daniel Arndt Alves Gerenciadores de Layout 44
  • 45.
    Event.MOUSE_DRAG Pode ser tratadodentro do método: public boolean mouseDrag(Event evt, int x, int y) (x, y) : coordenada de arrasto Daniel Arndt Alves Gerenciadores de Layout 45
  • 46.
    Event.MOUSE_UP Pode ser tratadodentro do método: public boolean mouseUp(Event evt, int x, int y) (x, y) : coordenada onde botão foi solto Daniel Arndt Alves Gerenciadores de Layout 46
  • 47.
    Ainda dentro doseventos de mouse, o método handleEvent faz a verificação na sequência: 1. MOUSE_ENTER 2. MOUSE_EXIT 3. MOUSE_MOVE 4. MOUSE_DOWN 5. MOUSE_DRAG 6. MOUSE_UP Daniel Arndt Alves Gerenciadores de Layout 47 Ordem de Verificação
  • 48.
    Exemplo // Botão comtodos os tratamentos de evento import java.awt.*; public class botao extends Button{ botao(String rotulo){ // Construtor super(rotulo); } Daniel Arndt Alves Gerenciadores de Layout 48
  • 49.
    Exemplo public boolean mouseEnter(Eventevt, int x, int y){ System.out.println("Entrou no componente"); return(true); } public boolean mouseExit(Event evt, int x, int y){ System.out.println("Saiu do componente"); return(true); } public boolean mouseMove(Event evt, int x, int y){ System.out.println("Movimento sobre botão"); return(true); } Daniel Arndt Alves Gerenciadores de Layout 49
  • 50.
    Exemplo public boolean mouseDown(Eventevt,int x,int y){ System.out.println(“Clique no componente”); return(true); } public boolean mouseDrag(Event evt,int x,int y){ System.out.println(“Arrasto em cima do componente”); return(true); } public boolean mouseUp(Event evt,int x,int y){ System.out.println(“Soltou em cima do botão”); return(true); } } // Botão Daniel Arndt Alves Gerenciadores de Layout 50
  • 51.
    Eventos de teclado Doistipos de evento podem ocorrer no teclado: • pressionar teclas – Event.KEY_PRESS : teclas ASCII – Event.KEY_ACTION : teclas não-ASCII • soltar teclas – Event.KEY_RELEASE : teclas ASCII – Event.KEY_ACTION_RELEASE: teclas não-ASCII Daniel Arndt Alves Gerenciadores de Layout 51
  • 52.
    Event.KEY_PRESS Event.KEY_ACTION Podem ser tratadosdentro do método: public boolean keyDown(Event evt, int key) key : código da tecla pressionada Daniel Arndt Alves Gerenciadores de Layout 52
  • 53.
    Event.KEY_RELEASE Event.KEY_ACTION_RELEASE Podem ser tratadosdentro do método: public boolean keyUp(Event evt, int key) key : código da tecla pressionada Daniel Arndt Alves Gerenciadores de Layout 53
  • 54.
    Ordem de Verificação Aindadentro dos eventos de teclado, o método handleEvent faz a verificação na seqüência: 1. KEY_PRESS e KEY_ACTION 2. KEY_RELEASE e KEY_ACTION_RELEASE Daniel Arndt Alves Gerenciadores de Layout 54
  • 55.
    Exemplo // Botão comtratamento de teclado no botão import java.awt.*; public class botao extends Button{ botao(String rotulo){ // Construtor super(rotulo); } Daniel Arndt Alves Gerenciadores de Layout 55
  • 56.
    Exemplo public boolean keyDown(Eventevt,int key){ if (key=='a') setLabel("Tecla a pressionada"); else if (key==Event.LEFT) setLabel("Seta esquerda pressionada"); else if (key==Event.RIGHT) setLabel("Seta direita pressionada"); return(true); } }// botao Daniel Arndt Alves Gerenciadores de Layout 56
  • 57.
    Eventos de ação Quandoocorre um evento de ação (Event.ACTION_EVENT), o tratamento pode ser colocado dentro do método: public boolean action(Event evt, Object arg) arg - depende do componente onde ocorreu a ação Daniel Arndt Alves Gerenciadores de Layout 57
  • 58.
    Argumento do eventode ação Componente arg Button Rótulo do botão Checkbox Estado do checkbox Choice Opção escolhida List Opção escolhida com duplo clique TextField Conteúdo após return pressionado Daniel Arndt Alves Gerenciadores de Layout 58
  • 59.
    Exemplo public boolean action(Eventevt,Object arg){ // Verifica se foi ação no botão if (evt.target instanceof Button) // Mostra rótulo do botão em maiúsculas System.out.println(((String) arg).toUpperCase()); return(true); } Daniel Arndt Alves Gerenciadores de Layout 59
  • 60.
    Evento de ganhode foco Quando ocorre um evento de ganho de foco (Event.GOT_FOCUS), o tratamento pode ser colocado dentro do método: public boolean gotFocus(Event evt, Object arg) arg - depende do componente onde ocorreu a ação Daniel Arndt Alves Gerenciadores de Layout 60
  • 61.
    Evento de perdade foco Quando ocorre um evento de perda de foco (Event.LOST_FOCUS), o tratamento pode ser colocado dentro do método: public boolean lostFocus(Event evt, Object arg) arg - depende do componente onde ocorreu a ação Daniel Arndt Alves Gerenciadores de Layout 61
  • 62.
    Outros Eventos Alguns eventos,porém, não possuem uma rota de tratamento bem definida como nos eventos anteriores. Neste caso, uma solução bem simples é alterar a implementação do método handleEvent para direcionar o tratamento de tais eventos. Daniel Arndt Alves Gerenciadores de Layout 62
  • 63.
    Exemplo 1 Tratamento debarras de rolagem import java.awt.*; class exemplo extends Frame{ Scrollbar barra=new Scrollbar(); ... public boolean handleEvent(Event evt){ if (evt.target==barra) barra.setValue(((Integer) evt.arg).intValue()); return(true); } } Daniel Arndt Alves Gerenciadores de Layout 63
  • 64.
    Exemplo 2 Tratamento defechamento da janela principal import java.awt.*; class exemplo extends Frame{ Scrollbar barra=new Scrollbar(); ... public boolean handleEvent(Event evt){ if (evt.id==Event.WINDOW_DESTROY) System.exit(0); return(true); } } Daniel Arndt Alves Gerenciadores de Layout 64
  • 65.
    Tratamento mais complexode eventos Para um tratamento mais complexo de eventos podem ser implementados métodos de várias interfaces de eventos do pacote java.awt.Event. Por exemplo: • MouseListener • ActionListener • WindowListener Daniel Arndt Alves Gerenciadores de Layout 65
  • 66.
    Daniel Arndt AlvesGerenciadores de Layout 66
  • 67.
    Daniel Arndt AlvesGerenciadores de Layout 67
  • 68.
  • 69.