O documento discute gerenciadores de layout no Java AWT, incluindo cinco gerenciadores principais (FlowLayout, GridLayout, BorderLayout, CardLayout e GridBagLayout) e como implementar tratamento básico de eventos. É explicado que gerenciadores de layout controlam o posicionamento de componentes e que eventos estão relacionados à parte dinâmica de uma interface. O modelo de gerenciamento de eventos no AWT é baseado nos métodos deliverEvent() e postEvent().
Gerenciadores de Layout e Tratamento de Eventos no Java AWT
1. 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
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 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
4. 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
5. 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
6. 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
7. 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
8. 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
10. 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
11. 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
12. 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
13. 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
14. 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
15. 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
16. 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
17. 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
18. 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
19. 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
20. 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
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
27. 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
28. 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
29. 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
30. 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
32. 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
33. 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
34. 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
35. 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
36. 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
37. 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
38. 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
39. 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
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 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
42. 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
43. 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
44. 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
45. 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
46. 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
47. 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
48. 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
49. 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
50. 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
51. 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
54. 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
55. 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
56. 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
57. 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
58. 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
59. 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
60. 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
61. 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
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 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
64. 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
65. 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