O documento introduz o framework Swing para interfaces gráficas em Java. Swing fornece uma coleção rica de componentes visuais leves e independentes de plataforma. Swing usa o padrão MVC para separar a lógica da interface do usuário da apresentação e comportamento. Os principais conceitos introduzidos incluem componentes, contêineres, gerenciadores de layout, tratamento de eventos e classes de eventos.
3. INTRODUÇÃO
• SWING:
• Coleção de classes e interfaces
• Rico conjunto de componentes visuais:
• Botões de ação
• Campos de texto
• Barras de rolagem
• Caixas de seleção
• Árvores
• Tabelas
• Menus
4. INTRODUÇÃO
• Evento
• É um recurso Java
• É o mecanismo pelo qual o programa é notificado sobre
iterações do usuário
• AWT
• Abstract Window Toolkit
• Sistema de interface gráfica original do Java
• Dependente de plataforma
5. INTRODUÇÃO
• AWT
• Componentes pesados
• Interface gráfica usável, porém limitada
• Problemas com o uso de janelas nativas específicas da
plataforma (ou pares nativos):
• Um componente pode aparecer e agir de forma
diferente em cada sistema operacional que executar;
• Aparência fixa sem possibilidade de alteração;
• Componentes pesados são sempre opacos;
• etc.;
7. INTRODUÇÃO
• SWING
• Componentes leves:
• O componente é escrito em Java
• Usa a janela fornecida por um predecessor pesado
• Não tem um par nativo
• Eficientes e Flexíveis
• Formas geométricas diversas
• Componentes leves são transformados em pares
específicos da plataforma, mas a aparência é
determinada pelo swing
8. INTRODUÇÃO
• SWING
• Cada componente swing é gerado por código Java e não
por pares específicos de plataforma
• Aparência e lógica são separadas
• Aparência:
• Permite alterar a maneira como o componente é
gerado sem afetar outros aspectos
• Conecta uma nova aparência a qualquer componente
sem criar efeitos colaterais no código
• Metal e Motif
9. INTRODUÇÃO
• SWING
• Aparência Metal:
• Disponível para todos
• Independente de plataforma
• Aparência padrão
• MVC:
• Model-View-Control
• Arquitetura de componentes clássica
• Permite a aparência adaptável
10. INTRODUÇÃO
• SWING
• MVC:
• Model: informações de estado associadas ao
componente
• View: determina como o componente será exibido na tela
• Control: determina como o componente reagirá ao
usuário
• Exemplo: quando alguém clicar em uma caixa de
seleção, o CONTROLADOR reagirá alterando o
MODELO para refletir a escolha, resultando na
atualização da VISUALIZAÇÃO
11. INTRODUÇÃO
• SWING
• Arquitetura modelo-delegação de UI:
• Arquitetura modelo separável
• Swing usa MVC mas não a versão clássica
• Swing usa uma versão modificada de MVC que
combina view e control na mesma entidade lógica
(delegação UI)
• Swing é fácil de usar e NÃO substitui o AWT
• AWT ainda faz parte do JAVA e SWING se baseia nele
13. COMPONENTES E CONTEINERES
• Dois importantes itens
• Todos os contêineres também são componentes
• Componentes:
• É um controle visual independente
• Botão de ação, controle deslizante, etc.
• Contêineres:
• Contém um grupo de componentes
• Tipo especial de componente
• Projetado para conter outros componentes
14. COMPONENTES E CONTEINERES
• Toda interface gráfica terá pelo menos UM CONTEINER
• Contêineres podem conter outros contêineres
• Hierarquia de contenção: Deve haver um contêiner de nível
superior
15. COMPONENTES E CONTEINERES
• Componentes:
• Componentes swing derivam de Jcomponent
• JComponent:
• Fornece funcionalidade comum a todos os
componentes
• Herda as classes Container e Component de AWT
• Pacote: javax.swing (representação dos
componentes)
• Um componente Swing se baseia e é compatível com
um componente do AWT
17. COMPONENTES E CONTEINERES
• Contêineres de nível superior:
• JFrame, JApplet, JWindow e JDialog
• Não herdam de JComponent
• Herdam de Component e Container de AWT
• São componentes pesados
• Estão no topo de uma hierarquia de contenção
• Não podem estar contidos em outros contêineres
• JFrame é o mais usado para aplicativos
19. PAINÉIS DO CONTEINER
• Cada contêiner de nível superior define um conjunto de
painéis
• JROOTPANE:
• Topo da hierarquia
• Container leve
• Gerencia outros painéis
• Ajuda a gerenciar a barra de menus
• Painel de vidro, painel de conteúdo e painel em
camadas: painéis que compõem o painel raiz
20. PAINÉIS DO CONTEINER
• Painel de vidro:
• Painel de nível superior
• Fica acima de todos os outros painéis
• Cobre totalmente os outros painéis
• Permite o gerenciamento de eventos do mouse que afetam o
contêiner inteiro ou a geração de algo acima de outro
componente
21. PAINÉIS DO CONTEINER
• Painel em CAMADAS:
• Permite que os componentes recebam valores de
profundidade
• O valor de profundidade determina como os componentes
são sobrepostos
• Contem o painel de conteúdo e a barra de menus que é
opcional
22. PAINÉIS DO CONTEINER
• Painel de conteúdo:
• Painel que a sua aplicação interagirá
• É a este painel que serão adicionados componentes
visuais
• Contem os componentes com os quais o usuário interage
• Muito do que acontece com esses painéis é em segundo plano e
não teremos de usar diretamente
24. GERENCIADORES DE LAYOUT
• Controla a posição dos componentes dentro de um
contêiner
• Determina o local dos controles dentro de um contêiner
• Todos os gerenciadores de layout são instancias de
uma classe que implementa a interface
LAYOUTMANAGER
25. GERENCIADORES DE LAYOUT
• FlowLayout:
• Layout simples
• Posiciona os componentes da esquerda para a direita e
de cima para baixo
• BorderLayout:
• Layout padrão para um painel de conteúdo
• Posiciona os componentes no centro ou nas bordas do
contêiner
26. GERENCIADORES DE LAYOUT
• GridLayout:
• Dispõe os componentes dentro de uma grade
• GridBagLayout:
• Dispõe os componentes de tamanhos diferentes dentro
de uma grade flexível
27. GERENCIADORES DE LAYOUT
• BoxLayout:
• Dispõe os componentes vertical ou horizontalmente
dentro de uma caixa
• SpringLayout:
• Dispõe os componentes de acordo com um conjunto de
restrições
29. EXEMPLO
• JFrame: contêiner de nível superior
• JLabel: componente que cria um rótulo e exibe informação.
É um componente passivo
30. EXEMPLO
• Programas swing são acionados por eventos
• O evento gerado é passado para o aplicativo com uma chamada
a um tratador de eventos que o aplicativo define
• O tratador é executado na THREAD de despacho do evento
fornecida pelo Swing e não na THREAD principal do aplicativo
• Tratadores de eventos são chamados em uma THREAD que não
foi criada por eles
31. EXEMPLO
• Duas THREADs diferentes não podem atualizar o mesmo
componente ao mesmo tempo.
• Todos os componentes de GUI devem ser criados e atualizados
a partir da THREAD de despacho do evento E NÃO da THREAD
PRINCIPAL do aplicativo
• MAIN é executado na thread principal e NÃO pode instanciar
diretamente um objeto GUI.
• Main deve criar um objeto RUNNABLE para ser executado na
THREAD de despacho do evento e fazer esse objeto criar a GUI.
32. EXEMPLO
• Swing Utilities
• Dois métodos para criar thread no despacho de evento
• invokeLater(Runnable objeto): retorna
imediatamente
• invokeAndWait(Runnable objeto): espera até o
objeto.run() retornar
34. TRATAMENTO DE EVENTOS
• Modelo de delegação de eventos:
• Mecanismo de tratamento de eventos
• Uma fonte gera um evento e o envia para um ou mais
ouvintes
• O ouvinte apenas espera até receber um evento
• Ao receber o evento, o ouvinte processa o evento e
retorna
35. TRATAMENTO DE EVENTOS
• A lógica que processa eventos fica claramente separada da
lógica da interface de usuário que os gera
• Um elemento da interface de usuário pode DELEGAR o
processamento de um evento para um código separado
• Os ouvintes devem SE registrar em uma fonte para receber
a notificação de um evento
37. EVENTOS
• O evento é o objeto que descreve uma mudança de estado
em uma fonte
• Java.ultil.EventObject: super classe de todos os eventos
• Java.awt.evento e javax.swing.event: classes de eventos
39. FONTES DE EVENTOS
• É um objeto que gera um evento.
• Quando um evento é gerado, a fonte deve envia-lo para
todos os ouvintes registrados.
• addTipoListener(TipoListener tl): método usado pelos
ouvintes para se registrarem em uma fonte
• Cada tipo de evento tem o seu próprio método de registro.
40. FONTES DE EVENTOS
• addKeyListener(): método que registra um ouvinte que
recebe eventos de pressionamento de teclas no teclado
• addMouseMotionListener(): método que registra um ouvinte
de movimento do mouse
• Quando ocorre um evento, todos os ouvintes registrados
são notificados.
41. FONTES DE EVENTOS
• removeTipoListener(TipoListener tl): método fornecido pela
FONTE para que um ouvinte possa cancelar interesse em
um tipo específico de evento
• removeKeyListener(): remove um ouvinte de
pressionamento de teclas
• A fonte que gera os eventos deve fornecer os métodos para
adicionar e remover ouvintes
43. OUVINTES DE EVENTOS
• Um OUVINTE é um objeto que é notificado quando um
evento ocorre.
• Dois requisitos:
• 1) precisa ter registro em uma ou mais fontes para ser
notificado sobre um tipo de evento
• 2) deve implementar métodos para o recebimento e
processamento desse evento
44. OUVINTES DE EVENTOS
• Um OUVINTE é um objeto que é notificado quando em
evento ocorre.
• Dois requisitos:
• 1) precisa ter registro em uma ou mais fontes para ser
notificado sobre um tipo de evento
• 2) deve implementar métodos para o recebimento e
processamento desse evento
45. OUVINTES DE EVENTOS
• Os métodos que recebem e processam eventos são
definidos em um conjunto de interfaces.
• ActionListener:
• Interface que define um método que recebe notificação
quando uma ação ocorre
• Qualquer objeto pode receber e processar esse evento
46. OUVINTES DE EVENTOS
• Um tratador de eventos deve executar sua tarefa
rapidamente e retornar.
• Quando uma operação demorada é necessária, uma
THREAD separada é criada para esse fim.
• Uma operação longa não deve ser executada por um
tratador de eventos pois isso retardaria a aplicação inteira.
48. CLASSES DE OUVINTES
• EventObject:
• superclasse de todos os eventos
• faz parte de java.útil
• AWTEvent:
• subclasse de EventObject.
• superclasse de todos os eventos em AWT
49. JAVA.AWT.EVENT
Classe de
Eventos
Geração Ouvinte de
eventos
ActionEvent Quando uma ação
ocorre dentro de um
controle
ActionListener
Adjustment
Event
Quando uma barra de
rolagem é manipulada
AdjustmentEvent
FocusEvent Quando um
componente ganha ou
perde foco
FocusEvent
50. JAVA.AWT.EVENT
Classe de
Eventos
Geração Ouvinte de
eventos
ItemEvent Quando um item é
selecionado
ItemListener
KeyEvent Quando uma entrada
do teclado é recebida
KeyListener
MouseEvent Arrastar, mover, clicar,
pressionar, soltar.
Quando o mouse
entra ou sai de um
componente
MouseListener e
MouseMotionList
ener
51. JAVA.AWT.EVENT
Classe de
Eventos
Geração Ouvinte de
eventos
Mouse
WhellEvent
Quando a roda do
mouse é movida
Mouse
WhellEvent
WindowEvent Quando um janela é
ativada, fechada,
desativada,
deiconificada,
iconificada, aberta ou
abandonada
WindowListener
52. JAVA.SWING.EVENT
Classe de
Eventos
Geração Ouvinte de
eventos
AncestorEvent Quando o predecessor
de um componente
tiver sido adicionado,
movido ou removido
AncestorListener
ChangeEvent Quando um
componente muda seu
estado
ChangeListener
53. JAVA.SWING.EVENT
Classe de
Eventos
Geração Ouvinte de
eventos
Hyperlink
Event
Quando um hyperlink
é acessado
HyperlinkEvent
ListDataEvent Quando o conteúdo
de uma lista muda
ListDataListener
ListSelection
Event
Quando a seleção em
uma lista muda
ListSelection
Event
MenuEvent Quando ocorre uma
seleção no menu
MenuListener
54. JAVA.SWING.EVENT
Classe de
Eventos
Geração Ouvinte de
eventos
Table
ModelEvent
Quando o modelo
tabela muda
Tabel
ModelEvent
Tree
Expansion
Event
Quando uma árvore é
expandida ou
recolhida
Tree
ExpansionEvent
55. JAVA.SWING.EVENT
Classe de
Eventos
Geração Ouvinte de
eventos
Tree
ModelEvent
Quando um modelo
de árvore é
expandida ou
recolhida
Tree
ModelListner
Tree
SelectionEvent
Quando um nó de
uma árvore é
selecionado
Tree
SelecionListener
57. CLASSES ADAPTADORAS
• Fornecem uma implementação vazia dos métodos das interfaces
de ouvintes de eventos
• São uteis para receber e processar apenas alguns dos eventos
associados a uma interface de eventos específica
• Uma nova classe pode ser definida para agir como um ouvinte
de eventos, estendendo uma das classes adaptadoras e
implementando somente os métodos que forem interessantes
58. CLASSES ADAPTADORAS
• Isso permite diminuir a quantidade de métodos vazios
desnecessários
• Nem todas as interfaces tem uma classe adaptadora
correspondente
• Normalmente existem classes adaptadoras para aqueles
ouvintes que tem mais de dois métodos
59. CLASSES ADAPTADORAS
• MouseMotionListener:
• mouseDragged()
• mouseMoved()
• MouseMotionAdapter fornece implementações vazias destes
dois métodos
• Se o interesse estiver apenas na ação de arrastar o mouse,
então:
• Estender MouseMotionAdapter
• Implementar mouseDragged()
60. CLASSES ADAPTADORAS
Classe adaptadora Implementa
FocusAdapter FocusListener
KeyAdapter KeyListener
MouseAdapter MouseListener
MouseMotionAdapter MouseMotionListener
MouseInputAdapter MouseListener e
MouseMotionListener
WindowsAdapter WindowsListener
62. BOTÃO DE AÇÃO
• É um dos controles mais simples e mais usados
• É uma instancia de JBUTTON
• JBUTTON herda a classe abstrata ABSTRACTBUTTON
• ABSTRACTBUTTON define a funcionalidade comum a todos os
botões
• Botões podem conter: texto, imagens ou ambos
63. BOTÃO DE AÇÃO
• Quando um botão de ação é pressionado, ele gera um
ACTIONEVENT
• addActionListener(ActionListener AL):
• adiciona ouvinte de ação
• AL: objeto que receberá as notificações do evento
• removeActionListener(ActionListener AL):
• remove ouvinte de ação
• AL: objeto que receberá as notificações do evento
64. BOTÃO DE AÇÃO
• Sintaxe de JBUTTON:
• JButton(String msg)
• msg: texto que será exibido no botão
• Exemplo: JButton jb1 = new JButton(“Botão1");
65. BOTÃO DE AÇÃO
• ActionListener defie um método:
• actionPerformed(ActionEvent ae)
• Este método sempre é chamado quando um botão é
pressionado. TRATADOR DE EVENTOS
66. BOTÃO DE AÇÃO
• Comando de ação:
• getActionCommand()
• Identifica qual botão foi pressionado
• Obtém-se o comando de ação chamando este método
67. BOTÃO DE AÇÃO
• Sempre que um botão é pressionado, ele gera um evento de
ação e todos os ouvintes registrados são notificados com
uma chamada ao método ActionPERFORMED()
• O objeto ACTIONEVENT que representa o evento de botão
é passado como parâmetro. O evento que ocorreu é
passado via ACTIONEVENT
• O comando de ação associado ao botão que gerou o evento
é obtido com uma chamada a GETACTIONCOMMAND()
70. JTEXTFIELD
• Permite que o usuário insira uma linha de texto
• Herda da classe abstrata JTEXTCOMPONENT
• JTEXTCOMPONENT:
• Superclasse de todos os componentes de texto
• Obtém entradas do usuário baseadas em texto
71. JTEXTFIELD
• Sintaxe
JTextField(int cols)
• Cols:
• largura do campo de texto em colunas
• Tamanho físico do campo de texto na tela
• Uma string maior que o número de colunas pode ser
inserida
72. JTEXTFIELD
• ActionEvent é gerado quando a tecla ENTER é pressionada:
• addActionListener()
• removeActionListener()
• actionPerformed()
• getText(): obtém a string exibida atualmente no campo de texto
73. JTEXTFIELD
• JTEXTFIELD também possui uma string de comando de
ação
• O comando de ação é o conteúdo atual do campo de texto
• setActionCommand(String cmd): permite configurar um
comando de ação de acordo com sua necessidade
75. CLASSES INTERNAS ANONIMAS
• Tratamento de eventos:
• Abordagem simples e direta
• MAIN implementa a interface de ouvinte
• Todos os eventos são enviados para uma instancia
dessa classe
• MAIS FORMAS DE TRATAR EVENTOS
76. CLASSES INTERNAS ANONIMAS
• Classes de ouvinte separadas:
• Classes diferentes tratariam eventos distintos e ficariam
separadas da MAIN
• Implementar ouvintes com classes internas anônimas
77. CLASSES INTERNAS ANONIMAS
• CLASSE INTERNA:
• É uma classe não estática declarada dentro de outra
classe
• É uma classe aninhada
• Uma classe interna não existe de forma independente da
classe que a contem
• Uma classe interna tem acesso a todas as variáveis e
métodos de sua classe externa e pode referencia-los
diretamente
78. CLASSES INTERNAS ANONIMAS
• CLASSE INTERNAANONIMA:
• É uma classe interna que não tem um nome
• A instancia da classe é gerada dinamicamente quando
necessário
• Facilitam a implementação de alguns tratadores de
eventos
• Vantagem: o componente que chama os métodos da
classe já é conhecido
79. CLASSES INTERNAS ANONIMAS
• CLASSE INTERNAANONIMA:
jb1.addActionListener (
new ActionListener () {
public void actionPerformed(ActionEvent ae){
//tratamento das ações
}
}
);
80. CLASSES INTERNAS ANONIMAS
• CLASSE INTERNAANONIMA:
jb1.addActionListener (
new ActionListener () {
public void actionPerformed(ActionEvent ae){
//tratamento das ações
}
}
);
Não há necessidade de chamar GETACTIONCOMMAND()
para determinar que componente gerou o evento, porque a
implementação de actionPerformed() só será chamada por
eventos gerados por JB1.