Aplicações JAVA
Modo Gráfico Standalone
Paulo Vinícius Wolski Radtke
PUC PR - radtke@ppgia.pucpr.br
Aplicações Standalone Gráficas
• Trabalham com componentes de interface
gráfica;
• Tais componentes fazem parte do Abstract
Windows Toolkit (AWT);
• É um pacote de classes dedicado a interface
gráfica, eventos, etc;
• A partir do JDK 1.2 (1.1 opcional) há o
pacote Swing para interface.
AWT - Janelas
Hierarquia da Classe Window
Container
Window
Frame
Dialog
FileDialog
AWT - Exemplo de Aplicação
StandAlone Gráfica
public class App
{
Button b;
public App()
{
this(“”);
}
public App(String titulo)
{
super(titulo);
b = new Button(“Ok”);
enableEvents(WindowEvent.WINDOW_CLOSING);
pack():
}
public void processWindowEvent(WindowEvent e)
{
switch (e.getID())
{
case e.WINDOW_CLOSING:
system.exit(0);
return;
default:
super.processWindowEvent(e);
}
public static void main(String args[])
{
App a = new App(“Janela”);
a.setVisible(true);
}
}
• obs: no exemplo acima o código system.exit(0) encerra a aplicação. No
caso de uma janela modal, o correto seria setVisible(false) para fechar a
janela e entregar o controle à janela principal da aplicação.
AWT - Janelas
• A classe Window fornece apenas o
comportamento geral de uma janela, não
podemos instanciá-la ;
• Normalmente utilizamos instâncias de
Frame ou Dialog.
AWT - Janelas
• Frame fornece um título para a janela,
caixas para fechá-la, e outras características
específicas de plataforma ;
• Frame também permite que sejam
adicionados menus.
AWT - Janelas
• Dialog é uma forma mais limitada de
Frame, que tipicamente não tem um título;
• FileDialog é uma subclasse de dialog, que
fornece suporte para seleção de arquivos.
AWT - Frames
• Frames são janelas que são independentes
de um applet e do browser que os contém ;
• Frames podem ter menus ;
• Um frame é uma janela com título, menu e
outras características de uma janela.
AWT - Frames
• Para criarmos um frame utilizamos :
– new Frame() : cria um frame sem um título ;
– new Frame(String str) : cria um frame com o
título indica por srt.
• Frames se comportam de maneira parecida
com panels ;
• Layouts são selecionados e componentes
são adicionados da mesma maneira.
AWT - Frames
• No exemplo abaixo, criamos um frame,
definimos um layout e inserimos dois
botões :
win = new Frame(“Minha Janela”);
win.setLayout(new GridLayout(2,1);
win.add(new Button(“Botão 1”));
win.add(new Button(“Botão 2”));
• Podemos determinar o tamanho do frame
utilizando o método resize.
AWT - Frames
• Outro método é, ao invés de usar o resize,
fazer com que o frame tenha o tamanho
mínimo para conter todos os seus
componentes ;
• O método pack implementa essa
funcionalidade ;
• Devemos chamar esse método apenas
depois de adicionarmos os componentes.
AWT - Frames
• Um frame normalmente está invisível
quando o criamos ;
• Para exibi-lo, precisamos usar o método
setVisible do frame :
win.setVisible(true);
• Para esconder o frame utilizamos o mesmo
método :
win.setVisible(false);
AWT - Frame
• Apesar da janela aparecer, não há um
método para destruí-la ;
• Caso ela estivesse visível na tela quando o
browser fosse fechado, ela continuaria a
rodar ;
• A única maneira então é destruir a tarefa no
gerenciador de tarefas.
AWT - Frame
• Para habilitarmos a capacidade da janela se
destruir, precisamos capturar o evento do
fechamento da janela (X no canto superior
direito da janela).
AWT - Frame
• Para capturarmos esse evento, tratamos um
evento de WindowListner ou habilitamos a
janela para tratar de evento;
• Para habilitarmos o tratamento de eventos
(mais simples em código), utilizamos o
seguinte código no construtor:
enableEvents(WindowEvent.WINDOW_CLOSING);
AWT - Frame
• Também devemos implementar o seguinte
método:
public void processWindowEvent(WindowEvent e)
{
switch (e.getID())
{
case e.WINDOW_CLOSING:
setVisible(false);
return;
default:
super.processWindowEvent(e);
}
}
AWT - Menus
• Cada janela criada pode ter a sua própria
barra de menu ;
• Cada barra de menu pode ter diversos
menus ;
• Cada menu pode ter itens de menu ;
• Cada um desses itens são representados
pelas classes MenuBar, Menu e MenuItem.
AWT - Menus
Hierarquia dos Componentes de um Menu
MenuComponent
MenuBar
MenuItem
Menu
CheckBoxMenuItem
AWT - Menus
• Para criar um menu para uma dada janela,
crie uma nova instância da classe MenuBar:
MenuBar mbar = new MenuBar();
• Para ver este menu como o menu default
para a janela, use o método setMenuBar()
da classe Frame.
AWT - Menus
• Para adicionar menus individuais é
necessário criá-los e efetivamente adicionálos ao menu :
Menu myMenu = new Menu(“Arquivo”);
mbar.add(myMenu);
• Os itens serão adicionados da esquerda para
a direita.
AWT - Menus
• Alguns sistemas fornecem um menu especial para
ajuda, que é desenhado no canto direito da barra ;
• Podemos indicar que um menu em específico é um
help menu utilizamos o método setHelpMenu() :
Menu help = new Menu(“Help”);
mbar.add(help);
mbar.setHelpMenu(helpmenu);
AWT - Menus
• Se por algum motivo quisermos evitar que o
usuário selecione um menu, utilizamos o
método disable() do menu, e enable() para
torná-lo disponível novamente :
myMenu.disable();
myMenu.enable();
AWT - Menus
• Há quatro tipos de itens de menus que
podemos adicionar :
– MenuItem : itens regulares de menu ;
– CheckBoxMenuItem : itens de menu que
podem ser marcados/desmarcados ;
– Outros menus, com seus próprios itens ;
– Separadores, que separam grupos uns dos
outros.
AWT - Menus
• Itens de menu são adicionados usando a
classe MenuItem ;
• Adicionamo-os a um menu com o método
add :
Menu meumenu = new Menu(“Arquivo”);
meumenu.add(new MenuItem(“Abre”);
meumenu.add(new MenuItem(“Fecha”);
AWT - Menus
• Para adicionarmos um submenu ao menu,
criamos um novo menu e o adicionamos ao
menu :
Menu meumenu = new Menu(“Arquivo”);
meumenu.add(new MenuItem(“Abre”);
meumenu.add(new MenuItem(“Fecha”);
Menu recente = new Menu(“Recentes”);
meumenu.add(recente);
AWT - Menus
• Para criarmos um item de menu que seja
selecionável, criamos uma intância de
CheckBoxMenuItem ;
• O criamos como um item de menu e o
adicionamos ;
CheckBoxMenuItem coords = new
CheckBoxMenuItem(“Mostra Coordenadas”);
meumenu.add(coords);
AWT - Menus
• O último elemento que podemos inserir
num menu são os separadores ;
• É uma linha que separa grupos de itens de
menu ;
• O separador é um item com um “-” :
MenuItem separador = new Menuitem(“-”);
meumenu.add(separador);
AWT - Menus
• A ação de selecionar um item de menu gera
um evento ;
• O tratamento deve ser feito no método com
os listners ActionListner (itens de menu) e
ItemListner (CheckboxMenuItem).
Aplicações Standalone Gráficas
Tamanho da Janela
• Para descobrirmos o tamanho, utilizamos o
método getSize, e as variáveis width e
height da clase Dimension retornada ;
• getSize().heigth retorna a altura do applet ;
• getSize().width retorna a largura do applet;
• Para modificarmos o tamanho da janela,
utilizamos o método setSize.
JAVA - Interfaces com AWT
• AWT fornece :
– Um conjunto completo para interface gráfica,
incluindo menus, scrollbars, botões, etc;
– Suporte a containers de interface gráfica;
– Um sistema de eventos para gerenciar eventos
de sistema e do usuário entre os componentes
AWT;
– Mecanismos para dispor componentes que
permitem independência de plataforma.
JAVA - Interfaces com AWT
• A idéia básica por trás de AWT é que um
programa JAVA com interface gráfica é um
aninhamento de componentes, começando
na janela mais externa e descendo até o
menor componente de interface;
• Todas as classes componentes da AWT
estão no pacote java.awt.
JAVA - Interfaces com AWT
• Os componentes que podemos trabalhar em
AWT são :
– Containers :são componentes AWT gerais que podem
conter outros componentes AWT, incluindo outros
containers. O container mais comum é o panel, que é
um container que pode ser exibido na tela.
– Canvas : Um canvas é uma superfície para “desenhos”.
Mesmo que você possa “desenhar” em containers
(todos exemplos até agora foram feitos assim), canvas
são preferíveis para desenhar imagens ou outras
operações gráficas.
JAVA - Interfaces com AWT
– Componentes de Interface Usuário : São os
botões, listas, menus pop-up, check boxes e
outros elementos típicos de interface gráfica ;
– Componentes de Construção de Janela : São as
janelas, frames, barras de menu, etc. Eles são
separados dos componente anteriores por não
serem usados em applets.
JAVA - Interfaces com AWT
Hierarquia AWT
Component
Canvas
TextComponent
Container
Panel
Applet
Window
Frame
TextField
Dialog
Button
AWT - Componentes Básicos
• Componentes Básicos de Interface :
– O componente AWT mais simples é o
componente de interface usuário ;
– É possível inserí-los sem grandes dificuldades
num applet no método init.
AWT - Componentes Básicos
• Tipos de componentes IU básicos :
–
–
–
–
–
Labels ;
Botões ;
Check boxes ;
Menus de escolha ;
Text fields.
AWT - Componentes Básicos
• Exemplo : Adicionando um botão a um
applet :
public void init()
{
Button b = new Button(“OK”);
add(b);
}
AWT - Componentes Básicos
• Apesar de ser possível utilizar o código
anterior para inserir um componente, este é
desaconselhável;
• Mais tarde, se for necessário referenciar o
botão, não haverá uma instância acessível
para os métodos do applet;
• É preferível ter um atributo da classe para
armazenar as referências.
AWT - Componentes Básicos
Class App extends Applet
{
Button b;
public void init()
{
b = new Button(“OK”);
add(b);
}
...
AWT - Componentes Básicos
• O código anterior apenas cria uma instância
de botão com o texto “OK” impresso sobre
a sua face;
• O botão é simplesmente inserido no applet,
na primeira posição livre (isto é, sem
componentes).
AWT - Labels
• Componente mais simples;
• Consiste de um texto (uma string) que é
desenhada na tela;
• Um label não é editável, é apenas mais um
componente na tela.
AWT - Labels
• Um label tem vantagens sobre uma string
ordinária desenhada na tela:
– Não é preciso redesenhar labels manualmente,
AWT cuida disso;
– Labels seguem um layout, e podem ser
alinhados com outros elementos (o que veremos
mais tarde);
AWT - Labels
• Para criarmos um label, utilizamos um dos
seguintes construtores:
– Label() : cria um label sem nenhum texto;
– Label(String) : cria um label com um texto
especificado por String;
– Label(String, int) : cria um label com o texto
especificado por String e alinhado.
AWT - Labels
• No último construtor, o parâmetro inteiro
indica um alinhamento do texto ;
• Tal parâmetro pode ser obtido da própria
classe Label, através das constantes :
– Label.LEFT;
– Label.RIGHT;
– Label.CENTER.
AWT - Labels
• Métodos de um label :
– getText() : retorna o texto associado a um label;
– setText(String) : armazena um String específica
no label;
– getAlignment() : retorna um inteiro
representando o alinhamento do label;
– setAlignment(int) : Muda o alinhamento do
texto.
AWT - Botões
• Botões são componentes simples de
interface usuário que disparam alguma ação
quando são pressionados ;
• Por exemplo, uma aplicação pode ter um
botão EXIT que feche a aplicação quando
pressionado.
AWT - Botões
• Para criar-se um botão, podemos usar um
dos seguintes construtores :
– Button() : cria um botão sem nenhum texto
impresso na face ;
– Button(String) : cria um botão com o texto
especificado em String impresso em sua face.
AWT - Botões
• Exemplo para criar-se botões :
public void init()
{
add(new Button(“Ok”);
add(new Button(“Cancel”);
}
AWT - Check Boxes
• Check boxes são componentes que tem dois
estados : ligado ou desligado.
• A mudança de estado no check box dispara
um evento;
• Seu estado será utilizado em um evento,
como característica opcional.
AWT - Check Boxes
• Check boxes são usadas de duas maneiras:
– Não-exclusivas : dada uma série de
checkboxes, qualquer uma delas pode ser
selecionada ;
– Exclusivas : em uma série de checkboxes,
apenas uma delas pode ser selecionada (radiobuttons).
AWT - Check Boxes
• Uma check box pode ser criada de uma das
seguintes maneiras :
– Checkbox() : cria uma checkbox, não selecionada ;
– Checkbox(String) : cria uma checkbox não
selecionada com um texto especificado por String ;
– Checkbox(String, null, boolean) : cria uma
checkbox que é selecionada ou não de acordo com
o valor booleano passado.
AWT - Check Boxes
• Exemplo : adicionando check boxes :
Checkbox cb1, cb2, cb3;
void init()
{
add(cb1 = new Checkbox(“Bold”));
add(cb2 = new Checkbox(“Italic”));
add(cb3 = new Checkbox(“Underline”));
}
AWT - Check Boxes
• Métodos de check boxes :
– getLabel() : retorna a String associada ao label
da check box ;
– setLabel() : Troca o texto do label da check
box;
– getState() : Retorna true ou false de acordo com
o estado da check box ;
– setState(boolean) : muda o estado da check box.
AWT - Radio Buttons
• Radio buttons tem a mesma aparência que
check boxes, porém apenas um deles pode
ser selecionado de cada vez;
• Para adicionarmos um radio button
precisamos primeiro criar um grupo para os
radio buttons.
AWT - Radio Buttons
• Tal grupo é criado num CheckboxGroup ;
• A declaração é feita utilizando-se o
construtor da classe, que não recebe
nenhum parâmetro :
CheckboxGroup cbg = new CheckboxGroup();
AWT - Radio Buttons
• Para criarmos um grupo de radio buttons,
procederíamos da seguinte maneira :
public void init()
{
CheckboxGroup cbg = new CheckboxGroup();
add(new Checkbox(“Caro”, cbg, false));
add(new Checkbox(“Aceitável”, cbg, false));
add(new Checkbox(“Barato”, cbg, false));
}
AWT - Radio Buttons
• Todos os método de check box são válidos
para radio buttons ;
• Na verdade, radio buttons são um tipo de
check buttons (os exclusivos).
AWT - Radio Buttons
• Conhecendo o grupo, podemos verificar o
estado dos componentes em busca de qual
está marcado;
• Outra opção é comparar as referências de
instância com a retornada por getCurrent,
um método de CheckboxGroup.
AWT - Menus de Escolha
• Menus de escolha são menus pull-down que
fornecem uma lista da qual o usuário é
permitido escolher um valor ;
• A funcionalidade é a mesma, mas entre
diferentes plataformas a aparência pode
mudar.
AWT - Menus de Escolha
• Para criarmos um menu de escolha, criamos
uma instância de Choice ;
• Para adicionarmos opções ao menu
utilizamos o método addItem(String), que
adiciona o texto indicado por String ao
menu ;
• Feito isto adicionamos o menu ao panel.
AWT - Menus de Escolha
• Exemplo :
public init()
{
Choice c = new Choice();
c.addItem(“Maçã”);
c.addItem(“Pêra”);
c.addItem(“Mamão”);
add(c);
}
AWT - Menus de Escolha
• Mesmo após termos adicionado o menu ao
painel, ainda podemos continuar
adicionando Strings a ele.
AWT - Menus de Escolha
• Método importantes :
– getItem(int) : retorna a String do ítem indicado em
int ;
– countItems() : retorna o número de itens no menu ;
– getSelectedIndex() : retorna o índice do ítem
selecionado ;
– getSelectedItem(): retorna a string selecionada;
– select(int) : seleciona o ítem indicado por int ;
– select(String) : seleciona o ítem que possui String.
AWT - Text Fields
• Todos os componentes vistos até agora
permitem ações ou seleção de opções sobre
eles;
• Text Fields permitem entrada de dados
neles;
• São áreas nas quais é possível editar texto,
ao contrário de labels, que apenas exibem
textos.
AWT - Text Fields
• Para criarmos um text field, utilizamos um
dos seguintes construtores :
– TextField () : cria um TextField que tem 0
caracters de largura(vai ser redimensionado
para o tamanho do manager) ;
– TextField(int) : cria um text field vazio com
int caracteres mínimo para mostrar caracteres;
AWT - Text Fields
– TextField(String) : cria um text field que é
preenchido com String. A largura é
dimensionada pelo manager ;
– TextField(String, int) : cria um text field que é
preenchido com String e que pode exibir o
número indicado por int de caracteres.
AWT - Text Fields
• Por exemplo, as seguintes linhas criam um
text field com 30 caracteres de largura com
a String “Entre seu nome” :
TextField tf = new TextField(“Entre seu nome”, 30) ;
AWT - Text Fields
• Métodos importantes :
–
–
–
–
getText() : retorna o texto contido no text field ;
setText(String) : Coloca a String no text field ;
getColumns() : retorna a largura do text field ;
select(int, int) : seleciona o texto entre as posições
passadas nos inteiros (a partir de 0) ;
– selectAll() : seleciona o texto no text field ;
– isEditable() : retorna true ou false se o campo
for editável ou não ;
AWT - Text Fields
– setEditable(boolean) : seta o texto para ser
editado (true, valor default) ou não (false) ;
– getEchoChar() : retorna o caracter usado para
mascarar entrada ;
– setEchoCharacter() : seta o caracter usado para
mascarar a entrada (estilo senha) ;
– echoCharIsSet() : retorna true ou false se há um
caracter de máscara selecionado.
AWT - Text Fields
• Ao editarmos o texto contido no TextField
são gerados dois eventos:
– Um para o indicar a tecla pressionada;
– Um segundo para indicar que a tecla foi
liberada.
AWT
Eventos com Componentes
• Apesar de ser possível no exercício anterior
até editar um texto no text edit ou selecionar
o check box, a aplicação não possui
nenhuma funcionalidade ;
• Ao pressionarmos o botão, não ocorre
nenhuma ação aparente no programa ;
• Porém há um evento AWT associado ao
pressionamento do botão.
AWT
Eventos com Componentes
• Para realizarmos alguma ação ao
pressionarmos o botão, precisamos tratar o
evento ;
• Eventos ocorrem quando um componente é
ativado (pressionado, selecionado, texto é
digitado, etc).
AWT
Eventos com Componentes
• A noção de tratamento de eventos é similar
a empregada em outros ambientes gráficos,
como Windows 95 ;
• Uma nota importante no tratamento de
eventos é que estes trabalham de maneira
semelhante a interrupções.
AWT
Eventos com Componentes
• Ao invés do programa monitorar o
pressionamento de um botão ou um caracter
ser digitado num text field, o evento “avisa”
o programa ;
• Isso muda o estilo de programação, pois ao
invés do programa esperar por uma entrada
de dados, ele fica ocioso até que a entrada
seja disponibilizada para ele.
AWT
Eventos com Componentes
• Todos os componentes de interface (a
exceção de labels, que não geram eventos)
tem diferentes tipos de ações;;
• Botões, por exemplo, geram ações quando
são pressionados.
AWT
Eventos com Componentes
• Check boxes, sejam exclusivas ou não
exclusivas, geram ações quando seu estado
é modificado;
• Menus de escolha geram uma ação quando
um elemento é selecionado.
AWT
Eventos com Componentes
• Text fields geram uma ação quando é
pressionada alguma tecla dentro deles ;
• Note que se num text field o usuário
pressionar a tecla TAB para mudar de
componente (ou fazê-lo utilizando o mouse)
não é gerado nenhum evento.
Eventos AWT
• Para o JDK1.0.2, o tratamento de eventos
era feito baseado no método handleEvent
(eventos simples) e action (eventos em
componentes);
• O eventos eram processados apenas em
instâncias do tipo Component;
• JDK1.1.X trabalha com listeners.
Eventos AWT
• Para cada tipo de componente/elemento há
um tipo de listener associado;
• Para que um applet possa receber eventos
de um certo tipo, é necessário:
– 1: possuir um listener instalado no applet;
– 2: o componente ou elemento deve ter indicado
nele QUEM é o listener das ações sobre ele, no
caso, o applet.
Eventos AWT
• Ao contrário de JAVA 1.0.2, podemos
definir elementos de uma classe qualquer
para gerenciar os eventos;
• Também podemos, como em JAVA1.0.2,
definir elementos derivados de Component
ou de outros componentes (como botão e
outros), obtendo funcionalidades próprias.
Eventos AWT
• Para que uma classe possa “escutar”
eventos, ela deve implementar um listener;
• um listener em java é disponibilizado em
uma interface;
• Veremos mais tarde como funcionam
interfaces, basta por enquanto saber que
estes disponibilizam atributos e métodos
para adicionar funcionalidades em uma
classe.
Eventos AWT
• Para que uma classe implemente uma
interface, utilizamos a palavra reservada
implements;
• Esta palavra é um modificador da classe;
• Para implementarmos uma classe que
implemente ActionListener, a declaramos:
class Aplicacao extends Applet implements Action Listener
Eventos AWT
• Tipos de listener (e quais tipos tratam):
– ActionListener: Button, List, MenuItem e
TextField;
– ItemListener: Checkbox, CheckboxMenuItem e
Choice;
– WindowListener: Dialog e Frame;
– ComponentListener: Dialog e Frame;
– AdjustmentListner: Scrollbar;
Eventos AWT
–
–
–
–
–
–
MouseMotionListener: mov. do mouse e drag;
MouseListener: pressionar botões;
KeyListner: Component;
FocusListner: Component;
ContainerListener;
TextListener.
• Os listeners estão no pacote java.awt.event;
ActionListener
• Este listener é invocado quando ocorerm
eventos em instâncias de Button
(pressionamento), List (seleção de um ítem)
e MenuItem;
• O método invocado quando é executada
uma ação é actionPerformed, que recebe
uma instância de Actionvent.
ActionListener
• Para tratarmos de eventos capturados por
um ActionListener, devemos:
– 1: a classe deve impelmentar ActionListener;
– 2: o componente deve ter seu listener mudado
para a classe em questão;
– 3: o método actionPerformed deve ser
implementado e possuir código para tratar do
evento.
ActionListener
• Por questões de elegância, o melhor é que o
código do actionPerformed apenas capture o
evento e faça um tratamento para descobrir
QUAL é o evento;
• O tratamento do evento em si deve ser feito
em um método à parte, para evitar a geração
de código confuso e difícil de tratar mais
tarde.
ActionListener
• Exemplo de classe:
public class App extends Applet implements ActionListener
{
Button b1;
void init()
{
add(b1=new Button(“OK”));
b1.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
if( (Button)evt.getSource() == b1)
{ // Processa o evento }
}
}
ItemListener
• Este listener serve trata dos seguintes tipos
de eventos:
– Mudança de estado em um Checkbox;
– Mudança de estado em um Choice;
– Mudança de estado em um ítem de menu do
estilo check.
ItemListener
• Para tratarmos de eventos capturados por
ItemListener, devemos:
– 1: a classe deve implementar ItemListener;
– 2: o componente deve ter seu listener mudado
para a classe em questão;
– 3: o método itemStateChanged deve ser
implementado e possuir código para tratar do
evento.
ItemListener
• O método itemStateChanged recebe ao ser
invocado uma instância de ItemEvent;
• Este objeto contém informações
importantes do evento, como a font que o
gerou além do tipo do evento;
• Para recuperar-se a fonte, utiliza-se o
método getSource.
ItemListener
• Para determinarmos o tipo do evento
(importante em alguns casos), utilziamos o
método getID;
• Os valores retornados possíveis são:
– ItemEvent.SELECTED: o elemento foi
selecionado;
– ItemEvent.DESELECTED: o elemento foi
desmarcado.
ItemListener
• Exemplo de classe:
public class App extends Applet implements ItemListener
{
Checkbox c1;
void init()
{
add(c1=new Checkbox(“Opção”));
c1.addItemListener(this);
}
public void itemStateChanged(ItemEvent evt)
{
if( (Checkbox)evt.getSource() == c1)
{ // Processa o evento }
}
}
Operador instanceof
• O evento gerado pode ser sobre diversos
componentes, de diversos tipos;
• Uma maneira para organizar o processo
consiste em verificar a qual classe a fonte
do evento pertence;
• Isto pode, além de organizar, acelerar o
processo, separando os componentes em
grupos.
Operador instanceof
• Este operador é o instanceof, e sua sintaxe
é a seguinte:
<instância> instanceof <Classe>
• O resultado da operação é true se instância
for uma instância de Classe.
Operador instanceof
• Por exemplo:
if( fonte instanceof Button)
{
...
}
• Irá entrar na condicional se fonte for uma
instância de Button.
KeyListener
• Destinado a tratar de eventos relacionados a
teclado;
• Se aplica sobre instâncias de Component;
• Há três tipos de eventos possíveis:
– Pressionamento de uma tecla;
– Liberação de uma tecla;
– Digitar uma tecla (pressionar seguido de
liberar).
KeyListener
• Para cada um destes tipos de evento, há um
método associado:
– keyTyped;
– keyPressed;
– keyReleased.
KeyListener
• Todos os métodos recebem como
argumento uma instância de KeyEvent;
• Alguns métodos importantes:
– getKeyChar: retorna o código ASCII da tecla
pressionada;
– getKeyCode: retorna o código virtual da tecla
pressionada;
– getKeyText: retorna um texto associado à tecla
pressionada.
KeyListener
• E herdados da classe InputEvent:
– isAltDown: retorna true ou false dependendo da
tecla ALT estar pressionada ou não;
– isCtrlDown: para CONTROL, similar ao acima;
– isShifDown: ídem para SHIFT.
KeyListener
• Exemplo de classe:
public class App extends Applet implements KeyListener
{
TextArea t1;
void init()
{
add(t1=new TextArea());
t1.addKeyListener(this);
}
public void keyPressed(KeyEvent evt)
{
if( (TextArea)evt.getSource() == t1)
{ // Processa o evento }
}
}
KeyListener
• Caso seja implementado apenas um dos
métodos definidos pela interface, é
necessário implementar os outros também;
• É uma obrigação, para que a classe seja
possível de ser compilada (não há código
associado na interface);
• O código pode ser vazio, mas há a
necessidade de sua criação.
AWT - Panels e Layouts
• Panels (applets são panels) podem conter
componentes de interface ou outros panels ;
• A pergunta é : como organizar esses
elementos?
• Apenas adicioná-los na tela pode ser
suficiente em termos de funcionalidade,
mas em termos de aparência não.
AWT - Panels e Layouts
• Normalmente, em sistemas orientados a
janelas, elementos são organizados
utilizando-se coordenadas absolutas em
pixels ;
• Uma interface AWT pode ser exibida numa
variedade muito grande de sistemas, com
diferentes tipos de fontes de sistema e
métricas.
AWT - Panels e Layouts
• Dessa maneira, JAVA não trabalha
preferencialmente com referências absolutas
a coordenadas de tela ;
• JAVA possui layout managers que permitem
que componentes sejam distribuídos na tela
sem necessidade de coordenadas absolutas.
AWT - Layout Manager
• A aparência de como os componentes AWT
são exibidos na tela depende de dois fatores:
– Como os componentes são adicionados ao painel
que os possui (ordem dos add);
– O layout manager que controla a disposição dos
componentes que são adicionados. O manager
determina como porções da tela serão selecionadas
e como os componentes serão adicionados.
AWT - Layout Manager
• Cada panel na tela pode ter seu próprio
layout manager;
• Se aninharmos panels um dentro do outro e
utilizarmos os devidos layout managers em
cada um deles, obtemos uma interface
independente de plataforma que irá ter uma
aparência semelhante onde quer que o
applet rode.
AWT - Layout Manager
• AWT possui cinco tipos de layout manager:
–
–
–
–
–
FlowLayout;
GridLayout;
BorderLayout;
CardLayout;
GridBagLayout.
AWT - Layout Manager
• Para criar um layout manager para um
panel, basta criar uma instância do layout
manager e utilizar o método setLayout para
o panel:
• Ex :
public void init
{
setLayout(new FlowLayout());
}
AWT - Layout Manager
• Como a criação de componentes de
interface (instanciação) e inserção no panel
são preferíveis de serem feitas no método
init do applet, a definição de um layout
segue a mesma regra;
• Para que os componentes sigam o layout,
temos que primeiro criar o layout e depois
inserir os componentes.
AWT
Layout Manager - FlowLayout
• FlowLayout é o layout mais simples em
JAVA (default) ;
• Usando flow layout os componentes são
inseridos um ao lado do outro, da esquerda
para a direita, linha a linha ;
• Caso não seja possível inserir um
componente na mesma linha, o layout troca
para a próxima linha.
AWT
Layout Manager - FlowLayout
• Um layout pode ter um alinhamento, que
pode ser :
– FlowLayout.CENTER : valor default, os
componentes são inseridos centralizados ;
– FlowLayout.LEFT : os componentes são
inseridos alinhados à esquerda ;
– FlowLayout.RIGHT : os componentes são
inseridos alinhados à direita.
AWT
Layout Manager - FlowLayout
• Também podemos especificar um
espaçamento (gap) vertical e horizontal
entre os componentes ;
• Esse espaçamento será utilizado para
separar um elemento do outro, e é dado em
pixels ;
• O valor de espaçamento é de 3 pixels.
AWT
Layout Manager - FlowLayout
• Em FlowLayout, cada componente tem seu
tamanho definido por si só (tamanho do
texto do botão, número de caracteres do
Textedit, etc).
AWT
Layout Manager - FlowLayout
• Há três contrutores :
– FlowLayout() : cria um flow layout centralizado
e com gap de três pixels ;
– FlowLayout(int alinha) : cria um flow layout com
o alinhamento especificado.
– FlowLayout(int alinha, int hor, int ver) : cria um
flow layout com o alinhamento especificado em
alinha, e gap horizontal e vertical especificado
por hor e vert, respectivamente.
AWT
Layout Manager - GridLayout
• Grid layouts oferecem maior controle no
posicionamento de componentes no panel;
• Ele trabalha numa matriz (grid), onde os
componentes são inseridos;
• Cada componente adicionado é inserido
numa célula, começando pela célula acima
mais a esquerda, indo para a direita e
trocando de linha quando necessário.
AWT
Layout Manager - GridLayout
• Esse tipo de layout apesar de ser mais
poderoso em termos de onde os componentes
são posicionados, tem a desvantagem de que o
componente preenche TODA a área da célula
reservada a ele no grid.
AWT
Layout Manager - GridLayout
• O grid ocupa toda a área do applet ;
• Também podemos definir um gap entre cada
componente num grid layout.
AWT
Layout Manager - GridLayout
• Contrutores :
– GridLayout(int lin, int col) : cria um grid layout
com lin linhas e col colunas.
– GridLayout(int lin, int col, int hgap, int vgap) :
cria um grid layout don lin linhas e col colunas,
tendo um gap horizontal hgap e vertical hgap.
AWT
Layout Manager - BorderLayout
• Border layouts diferem muito de flow
layouts e grid layouts, porque ao invés de
inserirmos componentes numa ordem, os
inserimos com uma direção geográfica.
AWT
Layout Manager - BorderLayout
• Tais direções podem ser :
–
–
–
–
–
South (para baixo);
West (a esquerda);
North (para cima) ;
East (a direita);
Center.
AWT
Layout Manager - BorderLayout
• É possível utilizarmos gaps também, mas
isto irá reduzir o espaço disponível para
outros componentes;
• Um problema com este tipo de layout
manager é que é possível inserir apenas um
componente por região geográfica.
AWT
Layout Manager - BorderLayout
• Para utilizarmos o layout, primeiro o
selecionamos e inserimos elementos (add)
utilizando as coordenadas.
• Ex :
public void init() {
setLayout(new BorderLayout());
add(“North”, new Button(“Um”));
add(“East”, new Button(“Dois”));
add(“South”, new Button(“Três”));
....
}
AWT
Layout Manager - CardLayout
• Card layouts se comportam de maneira
BEM diferente dos outros layouts ;
• Num layout, todos os componentes são
visíveis simultaneamente ;
• Num card layout apenas um dos
componentes é visível de cada vez.
AWT
Layout Manager - CardLayout
• Card layouts são como tab controls na API
Win 32;
• Para navegar entre cada card, há métodos para
avançar para o próximo, anterior, primeiro e
último;
• É interessante adicionar-se panels dentro do
card ao invés de um componente simples, de
maneira que cada card tenha sua aparência.
AWT
Layout Manager - CardLayout
• Quando criamos um card layout, damos um
nome para cada card;
• Podemos selecionar um card para ser
exibido utilizando o seu nome;
• Uma utilidade para cards são programas de
instalação (estilo Install Shield).
AWT
Layout Manager - CardLayout
setLayout(new CardLayout());
// adiciona os cards
Panel um = new Panel();
add(“primeiro”, um);
Panel dois = new Panel();
add(“segundo”, dois);
Panel tres = new Panel();
add(“terceiro”, tres);
// mostra os panels
show(this, “segundo”);
show(this, “terceiro”);
previous(this, first);
first(this);
AWT
Aninhando Panels e Componentes
• Apenas adicionar componentes num applet
é suficiente para aplicações simples;
• Porém em aplicações complexas, o uso de
um simples layout não é suficiente ;
• Nesses casos, precisamos aninhar um panel
dentro de um layout.
AWT
Aninhando Panels e Componentes
• Dessa maneira, obtemos as seguintes
características :
– Applets com layouts complexos, visto que cada
um dos panels possui seu próprio layout;
– Cada panel pode ter sua própria cor de fundo;
– Cada panel pode processar seus eventos ou
repassá-los para um nível superior.
AWT
Aninhando Panels e Componentes
• Para criarmos um panel dentro de um
applet, o código abaixo seria suficiente
(apesar de não ter muita funcionalidade por
enquanto) :
setLayout(new GridLayout(1, 2, 10, 10);
Panel panel1 = new Panel();
Panel panel2 = new Panel();
add(panel1);
add(panel2);
AWT
Aninhando Panels e Componentes
• Lembrando, os eventos são tratados por
listeners;
• Destas maneira, não importa em qual panel
e em qual ordem hierárquica esteja o
componente, o listener irá tratar do evento;
• Isto difere de JAVA1.0.2, aonde apenas
panels poderiam tratar os eventos, e estes
eram repassados na hierarquia.
AWT
Aninhando Panels e Componentes
• Para organizar os panels, é interessante
extender a classe panel e criar uma classe
especializada para cada um dos panels a serem
aninhados ;
• Não é necessário obrigatoriamente, mas caso
seja necessário um método paint específico
para o panel, precisamos então criar a classe
extendida e sobrescrever o método paint
default.
AWT
Aninhando Panels e Componentes
• Um panel aninhado não tem método init, e
muito menos este é chamado, as
inicializações devem ser feitas no
construtor.
AWT
Layout Manager - GridBagLayout
• É o layout manager mais poderoso;
• Ao mesmo tempo é o mais complexo de ser
utilizado;
• Seu funcionamento lembra o de grid layout;
• Porém é possível controlar o tamanho do
componente na célula, espaçamento, proporção
entre linhas e colunas e o arranjo do
componente nas células.
AWT
Layout Manager - GridBagLayout
• Para criarmos um grid bag layout, utilizamos
duas classes :
– GridBagLayout, que é o layout manager em si;
– GridBagConstraints, que definem as propriedades
de cada componente no grid, como alinhamento,
dimensões, etc.
• O relacionamento entre o grid bag, as
restrições e os componentes definem o layout.
Exemplo - Projetando o Grid
• Projetar o grid ;
• Crie o método :
void montaRestricoes(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx,
int wy, int fill)
{
gbc.gridx = gx ;
gbc.gridy = gy;
gbc.gridwidth = gw;
gbc.gridheight = gh;
gbc.weightx = wx;
gbc.weighty = wy;
gbc.fill = fill;
}
Exemplo - Projetando o Grid
• Crie no método init :
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
setLayout(gbl);
Exemplo - Projetando o Grid
• Os valores possíveis para fill são os
seguintes :
– HORIZONTAL : o componente deve preencher o grid
na horizontal na sua totalidade, a altura é a mínima do
componente (interessante para nosso text field);
– VERTICAL : o componente preenche na totalidade a
altura do grid. A largura é a mínima do componente ;
– BOTH : o componente preenche o grid por completo
em ambas as direções ;
– NONE : o componente possuírá seu tamanho mínimo.
Exemplo - Projetando o Grid
• No método monta restrições :
– O primeiro parâmetro é uma referência a
gridBagConstraints ;
– Os dois parâmetros seguintes indicam QUAL
posição no grid o elemento ocupa ;
– O quarto e quinto indicam quantas células ele
ocupa na vertical e horizontal ;
– Os dois parâmetros seguintes dizem a
proporção do uso do espaço alocado.
Exemplo - Projetando o Grid
– Por fim, o último parâmetro, fill, indica o
preenchimento do componente na célula;
Exemplo - Projetando o Grid
• Crie as restrições para cada um dos componentes e
adicione-os ;
• Mais tarde veremos como ajustar as proporções;
Exemplo - Projetando o Grid
• Componentes que fazem parte:
–
–
–
–
Label: “Usuário” ;
TextField;
checkbox: “Visível a outros usuários”;
Button: “Ok”.
Exemplo - Projetando o Grid
• Posicionamento (todos uma célula na vertical):
–
–
–
–
Label : (0,0), ocupa 1 célula ;
TextEdit : (1,0), ocupa 1 célula ;
CheckBox: (0,1), ocupa 2 células na horizontal
Botão : (0,2), ocupa 2 células. na horizontal
Exemplo:
montaRestricoes(gbc, 0, 0, 1, 1, 100, 100,
GridBagConstraints.BOTH) ;
gbl.setConstraints(label, gbc);
add(label);
• Execute e verifique o resultado.
Código
import java.awt.*;
import java.applet.*;
public class BridBag extends Form1
{
Label label;
TextField textField;
Checkbox checkbox;
Button button;
public void init()
{
super.init();
addNotify();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
setLayout(gbl);
Código
label = new Label("Usuário:");
textField = new TextField();
checkbox = new Checkbox("Visível a outros usuários", null, true);
button = new Button("Ok");
montaRestricoes(gbc, 0, 0, 1, 1, 100, 100,GridBagConstraints.BOTH);
gbl.setConstraints(label, gbc);
add(label);
montaRestricoes(gbc, 1, 0, 1, 1, 100, 100,GridBagConstraints.BOTH);
gbl.setConstraints(textField, gbc);
add(textField);
montaRestricoes(gbc, 0, 1, 2, 1, 100, 100,GridBagConstraints.BOTH);
gbl.setConstraints(checkbox, gbc);
add(checkbox);
montaRestricoes(gbc, 0, 2, 2, 1, 100, 100,GridBagConstraints.BOTH);
gbl.setConstraints(button, gbc);
add(button);
}
Código
void montaRestricoes(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy, int fill)
{
gbc.gridx = gx ;
gbc.gridy = gy;
gbc.gridwidth = gw;
gbc.gridheight = gh;
gbc.weightx = wx;
gbc.weighty = wy;
gbc.fill = fill;
}
}
Exemplo - Projetando o Grid
• Podemos observar claramente a divisão do
grid entre os componentes ;
• Agora precisamos modificar as proporções
do grid para que os componentes sejam
distribuídos corretamente ;
• A idéia da proporção é em relação a soma
total da linha/coluna.
Exemplo - Projetando o Grid
• Devemos então distribuir pesos para os
componentes ;
• Ex :
–
–
–
–
Label : 20,30 ;
Text Field : 80, 30 ;
Checkbox : 100, 20 ;
Button : 100, 30.
• Execute o programa e observe o resultado.
Exemplo - Projetando o Grid
• Agora, substitua na linhas de criação das
restrições o último parâmetro para
GridBagConstraints.NONE;
• Agora os componentes encontram-se com o
seu tamanho mínimo;
• Exeperimente o valor
GridBagConstraints.VERTICAL para o
TextField.
Exemplo - Projetando o Grid
• Podemos utilizar o campo fill de
GridBagConstraints para cada uma das
células, obtendo um layout complexo dessa
maneira.
• Podemos também incluir panels nessas
células.
AWT - Mais Componentes
• Além dos componentes básicos de interface,
temos alguns outros componentes :
–
–
–
–
–
Text Areas ;
Scrolling Lists ;
Scrollbars ;
Sliders ;
Canvas.
AWT - TextArea
• TextAreas são conceitualmente iguais a text
fieds;
• Também é possível inserir texto e obter o
texto armazenado na text area;
• A diferença para um text field é que text
area trabalha com múltiplas linhas de
edição.
AWT - TextArea
• Os construtores são :
– TextArea() : cria um text area vazio com tamanho zero,
que será redimensionado baseado no layout.
– TextArea(String str) : cria um text area com a String
str.
– TextArea(int lin, int col) : cria um text area vazio com
tamanho de lin linhas e col colunas.
– TextArea(String, int lin, int col) : cria um text area com
a String str que tem o tamanho de lin linhas e col
colunas.
AWT - TextArea
• Os métodos específicos (além dos de text
field) são:
– getColumns() : retorna um valor inteiro que
contém o número de colunas da text area ;
– getRows() : retorna um valor inteiro que
contém o número de linhas da text area ;
– insertText(String str, int pos) : insere a String
str na posição indicada por pos (valores
iniciando em 0).
AWT - TextArea
– replaceText(String str, int pos1, int pos2) :
Substitui o texto entre as posições pos1 e pos2
pelo texto em str.
– appendText(String str) : concatena a String str
depois da última posição de caracter na text
area.
AWT - TextArea
• Eventos:
– KeyListner;
– FocusListner.
AWT - List
• Choice menus permite seleciona elementos
de uma lista ;
• Lists são semelhantes a choice menus,
diferindo por dois pontos :
– Não são menus pop-up. É uma lista da qual podemos
escolher um ou mais itens. Se o número de intens é
maior que a lista comporta, uma barra de rolagem
automaticmante é disponibilizada ;
– Podemos selecionar um ou mais elementos na lista, ao
passo que choice menus escolhemos apenas um.
AWT - List
• Ações sobre uma list ocorrem quando clicamos
duas vezes com o mouse sobre um elemento ;
• Há eventos associados ao marcarmos ou
desmarcarmos um elemento, porém são tratados
de uma maneira um pouco diferente das ações
vistas anteriormente.
• O evento é do tipo (id) LIST_SELECTED e
LIST_DESELECT.
AWT - List
• Métodos construtores :
– List() : cria uma lista vazia, que permite
selecionar apenas um elemento de cada vez.
– List(int num, boolean mult) : cria uma lista
vazia que permite ver simultâneamente na lista
num elementos (não há limite quanto ao
número de elementos a serem adicionados). O
argumento mult indica se a lista permite
múltipla seleção (true) ou não (false).
AWT - List
• Métodos :
– getItem(int num) : retorna a String associada a
posição num da lista ;
– countItems() : retorna o número de itens na lista
;
– getSelectedIndex() : retorna o índice do
elemento selecionado (para listas sem seleção
múltipla) ;
AWT - List
– getSelectedIndexes() : retorna uma matriz dos
elementos selecionados (apenas para listas com
seleção múltipla) ;
– getSelectedItem() : retorna a String do ítem
selecionado (seleção única) ;
– getSelectedItems() : retorna uma matriz de Strings
dos itens selecionados (seleção múltipla) ;
– select(int num) : seleciona o ítem indicado por num ;
– select(String str) : seleciona o ítem com a String str.
AWT - List
• Eventos:
– ItemListner.
AWT - Scrollbar
• Text areas e lists vem com scrollbars
associadas ;
• Também podemos criar scrollbars para
manipular intervalos de valores ;
• Scrolbars são utilizadas para selecionar
valores entre um máximo e um mínimo.
AWT - Scrollbar
• Os construtores são :
– Scrollbar() : cria uma scrollbar com valores
máximo e mínimo 0, na vertical.
– Scrollbar(int or) : cria uma scrollbar com
valores máximos e mínimo 0, porém com a
orientação especificada por or. Essa orientação
pode ser Scrollbar.VERTICAL ou
Scrollbar.HORIZONTAL.
AWT - Scrollbar
– Scrollbar(int or, int init, int esp, int max, int
min) : cria uma scrollbar, seguindo :
• A orientação especificada por or ;
• O valor inicial da indicação, dado por init (o valor
deve estar entre os valores máximos e mínimos) ;
• A espessura da caixa de exibição da scrollbar.
Quanto maior a caixa, maior a faixa exibida ;
• Os valores máximo e mínimo inidicados por max e
min respectivamente.
AWT - Scrollbar
• Métodos :
– getMaximum() : retorna o valor máximo da
scrollbar ;
– getMinimum() : retorna o valor mínimo da
scrollbar ;
– getOrientation() : retorna a orientação da
scrollbar ;
– getValue() : retorna o valor atual da scrollbar.
AWT - Scrollbar
– setValue(int i) : muda o valor da scrollbar para
o valor indicado por i ;
– setLineIncrement(int inc) : seta o valor do
incremento quando clicamos com o mouse
sobre as setas da scrollbar para inc ;
– getLineIncrement() : retorna o valor do
incremento quando clicamos nas setas.
AWT - Scrollbar
– setPageIncrement(int inc) : muda o valor do
incremento no valor da scrollbar quando
clicamos no corpo desta ;
– getPageIncrement() : retorna o valor do
incremento de quando clicamos no corpo da
scrollbar.
AWT - Scrollbar
• Eventos:
– AdjustmentListner.
AWT - Canvas
• Quando desenhamos um texto num applet
nos exemplos anteriore, o fizemos sobre um
panel ;
• Um panel serve para diversas finalidades,
entre elas desenhar sobre ele ;
• Um canvas é um elemento que serve
praticamente APENAS para desenhar sobre
eles.
AWT - Canvas
• É um componente sobre o qual temos eventos ;
• Canvas não podem conter componentes sobre
eles;
• Podemos criar animações nestes ou mostrar
imagens ;
• Se um panel for destinado apenas para
desenhos, um canvas é mais apropriado e mais
leve em termos de execução.
AWT - Canvas
• Para criarmos um canvas bastaria num
método init :
Canvas canvas = new Canvas();
add(canvas);
Download

Aplicações Gráficas Standalone - Apostila v1.0