Módulo V
AWT e Swing – Alessandro Cerqueira - 20/8/2007
AWT e Swing
Objetivo Apresentar como Implementar Interfaces Gráficas em Java Utilizando AWT e Swing
2
Abstract Windowing Toolkit
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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
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: AWT e Swing – Alessandro Cerqueira - 20/8/2007
– setResizable( setResizable(boolean modificavel) modificavel) – setBackground( setBackground(Color cor) • “Constantes” Constantes” definidas na classe Color: 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
public class Janela extends Frame
• Todas as classes em Java são direta ou indiretamente especializações da classe
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) { AWT e Swing – Alessandro Cerqueira - 20/8/2007
//Chamada ao construtor definido na classe Frame super(titulo);
// 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.*;
AWT e Swing – Alessandro Cerqueira - 20/8/2007
public class Programa { public static void main(String main(String args[]) args[]) {
// Instancio dois objetos Janela
Janela j1 = new Janela("Janela 1",50,50); Janela j2 = new Janela("Janela 2",200,100);
} }
7
Estratégia de Implementação (Regra 2)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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. – 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.*;
AWT e Swing – Alessandro Cerqueira - 20/8/2007
public class Janela extends Frame { // Atributos da Classe private Button btOk; btOk; private Button btCancela; btCancela; private Button btAjuda; btAjuda; // 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(" TimesRoman", ", Font.BOLD, Font("TimesRoman 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
(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. Ok"); "); this.btOk btOk = new Button(" Button("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"); // 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. , BorderLayout.CENTER); this.add( add(this. this.btCancela btCancela, BorderLayout.CENTER); // Adiciono o botão Ajuda à Janela na região LESTE this. , BorderLayout.EAST); this.add( add(this. this.btAjuda btAjuda, 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;
AWT e Swing – Alessandro Cerqueira - 20/8/2007
import face.*; public class Programa { public static void main(String main(String args[]) args[]) { Janela j = new Janela("Janela com Botões"); } }
11
AWT e Swing – Alessandro Cerqueira - 20/8/2007
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
•
Como garantimos que esta classe tem este mé método? todo?ActionListener ActionListener
•
<>
•
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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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 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 AWT e Swing – Alessandro Cerqueira - 20/8/2007
public class Janela extends Frame implements ActionListener, ActionListener, MouseListener
• 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:
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Fonte (source object)
Fonte
– Evento (event object) – Receptor de Eventos (event listener) • Um evento é sempre gerado por apenas uma fonte.
evento
listener
listener listener
15
Estratégia de Implementação (Regra 3)
• Assim como há o addXXXListener() , temos também o removeXXXListener(). • Hierarquia das classes de evento: AWT e Swing – Alessandro Cerqueira - 20/8/2007
EventObject
AW TEvent
ActionEvent
AdjustmentEvent
ContainerEvent
ComponentEvent
FocusEvent
ItemEvent
InputEvent
MouseEvent
TextEvent
WindowEvent
KeyEvent
• Todas as classes estão definidas em java.awt.event
16
Estratégia de Implementação (Regra 3)
• Eventos de Baixo Nível:
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– 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. ComponentEvent KeyEvent
Componente é redimensionado, movido, exibido ou escondido Tecla é pressionada ou solta
MouseEvent
Botão do mouse é pressionado, solto, o mouse é movimentado ou arrastado
FocusEvent
Componente ganha ou perde o foco do teclado
WindowEvent
Janela é ativada, desativada, minimizada ou fechada
17
Estratégia de Implementação (Regra 3)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Eventos Semânticos: – Eventos compostos de outros eventos de baixobaixo-nível, possivelmente emitidos pelo pró próprio componente a partir da observaç observação dos eventos de baixobaixo-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 ActionEvent AdjustmentEvent
Componente fonte sofre alguma aç ação padrão (p.ex. botão pressionado) Novo valor escolhido entre uma faixa de valores possí possíveis (p.ex. scrollbar)
ItemEvent
Item selecionado dentre um conjunto de itens (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 AWT e Swing – Alessandro Cerqueira - 20/8/2007
4. botão do mouse é liberado dentro da área retangular do botão
• Adaptadores – 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:
AWT e Swing – Alessandro Cerqueira - 20/8/2007
public class MinhaJanela extends Frame implements ActionListener
– 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
–Adicionar o seguinte mé método na classe: public void actionPerformed( actionPerformed(ActionEvent evento) { if(evento.getSource () == this. if(evento.getSource() this.btOk) btOk) { System.out. println( (“Botão OK pressionado” System.out.println pressionado”); } if(umaAcao .getSource() if(umaAcao. getSource() == this. this.btCancela) btCancela) { System.out. println( (“Botão CANCELA pressionado” System.out.println pressionado”); } if(umaAcao .getSource() if(umaAcao. getSource() == this. this.btAjuda) btAjuda) { System.out. println( (“Botão AJUDA pressionado” System.out.println 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.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Ex: Tratamento do botão fechar da janela class Janela extends Frame implements WindowListener { ... 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Classe que é declarada dentro do escopo de outra classe.
• Assim, ao invés da classe da janela implementar uma 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
class Janela extends Frame { Janela( ) // No Construtor { ... this. this.addWindowListener( addWindowListener( new MeuWindowListener( MeuWindowListener( ) ); ... } ... 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– É 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 único objeto onde é feita a redefinição de métodos” – A vantagem é que não é necessário ter que criar explicitamente uma classe interna
Exemplo
25
(Regra 3 – Uso de Classes Adaptadoras e Classes Internas Anônimas) ...
AWT e Swing – Alessandro Cerqueira - 20/8/2007
this. this.addWindowListener( addWindowListener(
);
new WindowAdapter() WindowAdapter() { public void windowClosing( windowClosing(WindowEvent evt) evt) { System. System.exit(0); exit(0); } }
...
• 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 AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Implementam a interface LayoutManager – 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 AWT e Swing – Alessandro Cerqueira - 20/8/2007
• getPreferredSize(). getPreferredSize().
• 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
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"); 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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.
30
Exemplo
(Regra 4 - GridLayout)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
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 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
(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.
32
Estratégia de Implementação (Regra 4)
• CardLayout
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– 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. – 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Navegação
(Regra 4)
– Seguindo a ordem de inserção, a classe permite a navegação através dos métodos: • first(Container) • previous(Container) • next(Container) • 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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 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().
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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. • 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• São elementos da interface que podem ser apresentados ao usuário – 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
Object
Checkbox Component
Classes abstratas
Choice
Panel
Container
ScrollPane
Label
Window
List
Applet
Dialog Frame
Scrollbar TextArea TextComponent
TextField
FileDialog
39
Classes AWT (Frame)
• É uma janela que possui barra de título e bordas.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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. • 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• É um container Permite dispor componentes, inclusive outros painéis
outros
• A utilização deste componente oferece grande versatilidade na disposição dos componentes na interface da aplicação • 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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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 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.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Podemos obter os valores de margem de um Container através do método getInsets() que retorna um objeto Insets. • 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.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Ú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. • 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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 • 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 AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Selecionar texto • 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).
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• O TextArea é um componente de texto com múltiplas linhas • A aparência da scrollbar no TextArea pode ser 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...
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– “Arquivo modificado, Deseja salvar ?” • Pode ser modal, via construtor ou pelo método
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)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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á 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).
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Quando Checkboxs são associadas a um CheckboxGroup, só um pode estar selecionado.
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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• A lista fica aberta somente enquanto é feita a escolha. • A seleção de um item, automaticamente, 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, AWT e Swing – Alessandro Cerqueira - 20/8/2007
– remover um item, – obter a posição do elemento selecionado, etc.
52
Classes AWT (List)
• Permite a exibição de lista de itens – Os itens não podem ser editados diretamente
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– 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 ou mú múltiplos – Quando se clica num item selecionado este passa a estar selecionado e vicevice-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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Apenas um único componente deve ser adicionado ao ScrollPane – Apresenta scrollbar horizontal/vertical quando necessário
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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Scroolbar não possui texto associado • Áreas de texto e listas já já vêm com suas pró próprias barras de rolagem.
55
Classes AWT (Image)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• É 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. – getHeigth(ImageObserver) – getWidth(ImageObserver) • A classe Toolkit é geralmente utilizada para obter uma imagem. image = Toolkit. getImage( (nomeArquivo) Toolkit.getDefaultToolkit(). getDefaultToolkit().getImage nomeArquivo);
56
Classes AWT (Canvas)
• Representa uma área retangular destinada a suportar operações de desenho, e monitorar eventos realizados pelo usuário.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• É uma classe base para criação de novas classes. • Embora sejamos tentados a desenhar diretamente no 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
MenuItem
MenuBar
MenuContainer CheckboxMenuItem
Menu
MenuShortcut
58
Classes AWT (Menu)
• Menu é o container para MenuItem
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• 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 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 AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Adicionar itens de menu
60
Classes AWT (Menu)
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Para associar funcionalidade aos itens de menu é necessário um tratamento de eventos adequado. • Podemos ainda: – 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...
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Cria-se uma instância de MenuItem que recebe uma instância de MenuShortcut • MenuItem miSair = new MenuItem(“Sair”,new MenuShortcut(KeyEvent.VK_R));
– 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.
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Para associar um popmenu a um componente use o método add(PopMenu) • 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Classe Insets – Classe Point – 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 AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Classe Graphics, Graphics, representa um contexto grá gráfico – 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
– Padrão a partir do JDK 1.2
• 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
AWT e Swing – Alessandro Cerqueira - 20/8/2007
Componentes JApplet
JButton
JCheckBox
JCheckBoxMenuItem
JColorChooser
JColorBox
ImageIcon
JDialog
JFileChooser
JInternalFrame
JLabel
JList
67
Swing
AWT e Swing – Alessandro Cerqueira - 20/8/2007
Componentes JMenu
JMenuBar
JOptionPane
JPopupMenu
JProgressBar
JRadioButton
JRadioButtonMenuItem
JScrollBar
JScrollPane
JSlider
JSplitPane
JTabbedPane
68
Swing
AWT e Swing – Alessandro Cerqueira - 20/8/2007
Componentes JTable
JTextArea
JTextField
JToggleButton
JToolBar
JToolTip
JTree
JPanel e JFrame
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);
AWT e Swing – Alessandro Cerqueira - 20/8/2007
• Agora: minhaJanela.getContentPane().add(comp); minhaJanela.getContentPane().add(comp);
– Podemos ter applets implementados com Swing. Entretanto, Entretanto, como Swing só se tornou parte da JFC com Java 2, nem todos os browsers suportam diretamente o código. digo. É necessá necessário possuir um plugplug-in que permita a visualizaç visualização destes applets como objetos embutidos: embutidos: <EMBED type="application/xtype="application/x-javajava-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"> No Java 2 support for APPLET!!