6. WINDOW TOOLKITAs ferramentas de controle de janelas do java também conhecidas por AWT (Abstract Window Toolkit) são uns dos pontos fortes do java. Estas ferramentas fornecem toda a funcionalidade que se podia esperar de um sistema moderno de janelas. O AWT contem os mais usados componentes das interfaces gráficas atuais portanto habilita a aplicação a ser executada em sistemas gráficos completamente diferentes. Neste capitulo apresentaremos os seguintes componentes: Buttom, Canvas, Checkbox, Container, Label, List, Scrollbar e TextComponent. Mas para um bom entendimento destes componentes é necessário primeiro ter uma base sobre manuseio de eventos.
6.1. EventosUm evento é uma comunicação do mundo externo para o programa que alguma coisa aconteceu. Podemos citar como exemplos o clique ou ainda o movimento do mouse. Uma das mais importantes coisas a se entender sobre o AWT é como é feito o manuseio/tratamento destes eventos. Sem eventos sua aplicação não poderia responder as ações do usuário.
Exemplo 1: import java.awt.*; import java.applet.Applet;
public class ex5_1 extends Applet { Button botão;
public void init() { botão = new Button("Clique Aqui!"); add(botão); }
public boolean action (Event evt, Object algum) { if (evt.target == botão) { botão.setLabel("OK!!"); return true; } else return false; } }
Quando um componente que tem a ele uma ação associada é manipulado pelo usuário, o método action() daquele componente é chamado. Neste caso nos estamos usando um botão ao invés de usar uma subclasse de nossa autoria. O tratador de eventos tenta tratar o evento dentro da classe botão, mas como ele não acha o tratador que iria manusear o evento ele passa o evento para cima para o container que contem o componente e assim por diante até que alguém trate o evento. Vamos dar uma olhada de perto no método action(): public boolean action(Event evt, Object algum) { Todos tratadores de eventos tem uma forma similar a esta. Eles aceitam um parâmetro do tipo Event que prove informação detalhada sobre o evento. Segundo eles retornam um valor Boolean indicando True se o evento foi tratado, ou False caso contrario. if (evt.target == botão) { Aqui o alvo do evento é e checado para se saber se é ou não o botão. Porque evt.target e botão são ambos objetos, nos podemos checar se ambos são o mesmo objeto. botão.setLabel("OK!!"); Já que o botão foi pressionado vamos mudar o seu titulo.
return true; } else return false; Finalmente, se o evento foi tratado é retornado true, caso contrário é retornado false. 6.1.1. Tratamento de Eventos em DetalheEm quase todos os casos podemos usar os métodos tratadores de eventos que são fornecidos na linguagem Java. Estes estão na tabela abaixo. Mas lembre-se que tudo é relativo ao componente. Por exemplo, o método mouseMove() de um componente é chamado quando o mouse é movido dentro daquele componente.
Eventos do Java TIPO MÉTODO Ação tomada action(Event evt, Object algum) Botão do mouse pressionado mouseDown(Event evt, int x, int y) Botão do mouse liberado mouseUp(Event evt, int x, int y) Movimento do mouse mouseMove(Event evt, int x, int y) Arrasto do mouse mouseDrag(Event evt, int x, int y) Mouse entra em componente mouseEnter(Event evt, int x, int y) Mouse sai de componente mouseExit(Event evt, int x, int y) Tecla pressionada keyDown(Event evt, int key) Tecla liberada keyUp(Event evt, int key)
Quando você deve usar outros métodos em detrimento do action()? A resposta é quando você quer trocar o comportamento do componente, action() não é suficiente. Ele apenas reporta eventos que são essenciais para o componente como um clique do mouse num botão. Vamos adicionar ao programa exemplo anterior algumas mudanças de comportamento:
Exemplo 2: import java.awt.*; import java.applet.Applet;
public class ex5_2 extends Applet { Button botão;
public void init() { botão = new Button("Clique Aqui !!"); add(botão); }
public boolean mouseEnter(Event evt, int x, int y) { botão.setLabel("Va Embora !!"); return true; }
public boolean mouseExit(Event evt, int x, int y) { botão.setLabel("Fique Longe !!"); return true; }
public boolean action (Event evt, Object algum) { if (evt.target == botão) { botão.setLabel("OK"); return true; } else return false; } } Agora por aonde que o usuário mova o mouse na applet, o mesmo é instigado a não clicar no botão. Antes, o botão era usado de uma maneira completamente normal, agora nos mudamos seu comportamento/funcionalidade.
6.1.2. handleEvent() ou action()Geralmente, uma combinação do método action() com outros pré-construidos tratadores de eventos trabalharão bem. Para aquelas vezes que você necessita tomar um controle completo handleEvent() é usado. O método handleEvent() tem vantagens e desvantagens. No lado positivo, você é quem tem o completo controle. E no lado negativo, você é quem tem o completo controle. Isto significa que você deve ter muito cuidado quando esta montando um handleEvent() ou sua aplicação pode começar ficar confusa e cheia de bugs muito rapidamente. Exemplo 3:
: public boolean mouseEnter (Event evt, int x, int y) { setText("Sai fora!!"); }
public boolean handleEvent (Event evt) { if (evt.id == KEY_PRESS) { setText("Pressionado"); return true; } else return false; } :
Eventos do AWT TIPO MÉTODO Ação tomada ACTION_EVENT Botão do mouse pressionado MOUSE_DOWN Arrasto do mouse MOUSE_DRAG Mouse entra em componente MOUSE_ENTER Mouse sai de componente MOUSE_EXIT Botão do mouse liberado MOUSE_UP Movimento do mouse MOUSE_MOVED Tecla pressionada KEY_PRESS Tecla liberada KEY_RELEASE 6.1.3. Criando EventosOcasionalmente o programa tem que criar seus próprios eventos. Pode até parecer estranho, mas as vezes o programa fica muito mais simples. Um simples evento pode ser criado assim: Event evt = new Event(obj_alvo, id, arg); Aonde obj_alvo é o objeto para o qual o evento deve ser mandado, id é um inteiro que representa o tipo do evento (pode-se usar as constantes acima) e arg é um argumento para ser incluído no evento se ha alguma informação extra que você gostaria que o tratador de eventos recebesse. Normalmente a definição de um evento é feita como o exemplo abaixo:
Exemplo 4: : : public boolean keyDown(Event evt, int key) { if (key == 49) { deliverEvent(new Event(oneKey, Event.MOUSE_DOWN, null)); return true; } ... } : :
6.1.4. FocoQuando um usuário clica em um componente da interface, este item fica "selecionado". Quando um text field é selecionado, o usuário pode digitar no campo de texto. Quando um componente recebe o foco, o método getFocus() do componente é chamado: public boolean getFocus(Event evt, Object what) { ... } Quando um componente perde o foco, o método lostFocus() do componente é chamado: public boolean lostFocus(Event evt, Object what) { ... } É comum em um programa a necessidade de manter o foco em determinado componente. Por exemplo se um text field para mostrar dados e não para receber dados, você provavelmente não quer que o text field esteja apto a receber o foco. Para este caso existe o método requestFocus(): public void requestFocus() { ... } Isto pode ser colocado em um componente que contem o text field para que este componente fique com o foco.
6.2. Componentes AWTAntes de começarmos é bom sabermos que: 1. Todos os componentes tem uma posição e tamanho 2. Todos os componentes tem uma cor e uma cor de fundo 3. Componentes podem ser habilitados ou desabilitados 4. Existe uma interface standard para os componentes tratarem eventos Componentes AWT podem ser divididos em três partes: · Componentes da Interface Componentes da Interface abrangem todos os widgets e controles associados a uma interface gráfica. Exemplos destes componentes são: buttons, text labels, scrollbars, pick list e campos text-entry. · Containers Containers abrangem áreas nas quais os componentes da interface podem ser postos. Isto habilita os componentes a serem agrupados e formarem um objeto mais coeso e fácil de ser manipulado. Um Panel é um exemplo deste tipo de componente. · Windows Windows são um tipo muito especial da classe Component. Todos os outros componentes são adicionados dentro de uma window. Normalmente quando se programa applets, windows não são usadas.
6.2.1. Componentes da InterfaceBUTTON Botão. Pode ser customizado para ter um texto ou ainda ser branco. Construtores: Button() Þ cria um botão sem label Button(String etiq) Þ Cria um Button com label igual ao conteúdo de etiq Métodos específicos: String getLabel()Þ retorna o label(etiqueta) do botão void setLabel(String etiq) Þ ajusta label do botão para o conteúdo de etiq Ação: Cria um evento quando pressionado. Exemplo: Button botão = new Button("OK");
CANVAS Canvas é um componente completamente genérico. Ele existe como fundação para outras subclasses. Este componente não é muito útil para usuários iniciantes ou intermediários, mas é extremamente útil para criar seus próprios componentes. Construtores: Canvas()Þ cria um canvas Métodos específicos: void paint(Graphics g) Þ desenha um canvas com a cor de fundo default Ação: nenhuma por default Exemplo: Canvas x = new Canvas();
CHECKBOX Checkbox é uma caixa pequena com um label ao lado. O usuário pode clicar on ou off. Isto é útil quando você tem uma variedade de atributos que podem ser ligados ou não. Alem disto, mais de uma checkbox podem ser agrupadas com um CheckboxGroup para possibilitar que apenas um dos itens seja selecionado ao mesmo tempo. Construtores: Checkbox()Þ cria uma checkbox branca com opção false Checkbox(String lbl) Þ cria uma checkbox com label lbl com opção false Checkbox(String lbl, CheckboxGroup group, boolean state) Þ cria uma checkbox com a opção lbl em true contida no grupo CheckGroup. Métodos específicos: String getLabel()Þ retorna o label da checkbox String setLabel(String lbl) Þ ajusta o label da checkbox para lbl boolean getState()Þ retorna o estado da checkbox void setState(boolean est) Þ ajusta o estado da checkbox para est CheckboxGroup getCheckboxGroup()Þ retorna o grupo que a checkbox pertence void setCheckboxGroup(CheckboxGroup g) Þ ajusta nova CheckboxGroup(grupo) que pertence a checkbox Ação: Cria um evento quando o estado muda Exemplo: Checkbox aBox = new Checkbox("SHOW");
LABEL Um label é simplesmente um texto que pode ser colocado em um componente. Construtores: Label()Þ cria um label vazio Label(String lbl, int alin) Þ cria um label com o texto contido em lbl e com o alinhamento especificado em alin, podendo ser: Label.LEFT alinhamento a esquerda Label.CENTER centraliza texto Label.RIGHT alinhamento a direita Métodos específicos: int getAlignment()Þ retorna o alinhamento do label void setAlignment(int alinha) Þ ajusta o alinhamento do label para alinha. String getText()Þ retorna o texto do label void setText(String lbl) Þ ajusta o texto do label para lbl Ação: Nenhuma, por default Exemplo: Label aLabel = new Label("Hello!");
LIST List é uma lista de itens aonde o usuário pode escolher um item ou mais. Construtores: List()Þ cria uma lista nova sem linhas visíveis, desabilitando múltiplas seleções List(int nlin, boolean scr) Þ cria uma lista nova com um numero visível de linhas nlin e com múltiplas seleções se scr for True Métodos: void addItem(String item) Þ adiciona um item no final da lista void addItem(String item, int pos) Þ adiciona um item no na posição pos void clear()Þ Limpa a lista int countItems()Þ retorna o numero de itens da lista void delItem(int num) Þ deleta item na posição num String getItem(int num) Þ retorna o nome do item na posição num void replaceItem(String new_item, int num) Þ ajusta o item na posição num para new_item Exemplos: List alist = new List(); alist.addItem("Primeiro"); alist.addItem("Segundo");
CHOICE Choice é um menu de escolha. Por default o primeiro item adicionado a um menu choice é o item default. Construtores: public Choice()Þ cria menu de escolha, inicialmente vazio. Métodos: void addItem(String item); Þ adiciona item ao menu de escolha int countItems();Þ retorna o numero de itens do menu String getItem(int num); Þ retorna nome do item na posição num int getSelectedIndex();Þ retorna índice do item selecionado String getSelectedItem();Þ retorna o nome do item selecionado void select(int num); Þ ajusta o item selecionado para num void select(String str); Þ ajusta o item selecionado para str
SCROLLBAR Scrollbar é uma barra deslizante. É geralmente usada quando o usuário precisa se locomover rapidamente numa grande área. Pode ser orientada verticalmente ou horizontalmente. Construtores: Scrollbar()Þ Cria scrollbar orientada verticalmente Scrollbar(int ori) Þ Cria scrollbar orientada por ori, sendo que ori pode ser: Scrollbar.HORIZONTAL Scrollbar.VERTICAL Scrollbar(int ori, int val, int vis, int min, int max) Þ Cria uma scrollbar com orientação ori, item default val, tamanho da pagina vis, mínimo min e máximo max. Métodos: int getOrientation()Þ retorna a orientação da Scrollbar void setValue(int val) Þ ajusta o valor da scrollbar para item na posição val int getMinimum()Þ retorna o valor mínimo de itens da Scrollbar int getMaximum()Þ retorna o valor máximo de itens da Scrollbar Exemplo: ScrollBar x = new Scrollbar(Scrollbar.HORIZONTAL);
TEXTFIELD TextField é um componente que habilita o usuário entrar com uma linha de texto. Isto é o suficiente para quase todas as entradas de dados. Mesmo o nome sendo TextField números não aceitos também. Construtores: public TextField()Þ cria um campo de texto public TextField(int tam) Þ cria um campo de texto com tamanho tam public TextField(String txt) Þ cria um campo de texto ajustado com a string txt public TextField(String txt, int tam) Þ cria um campo de texto ajustado com a string txt e com o tamanho tam Métodos: int getColumns()Þ retorna o numero de colunas(tamanho) do TextField String getText()Þ retorna o texto contido no TextField void setText(String txt) Þ ajusta o texto da TextField para txt Exemplo: TextField atexto = new TextField("35",5);
TEXTAREA TextArea é um componente parecido com TextField, a diferença é que TextArea pode ter varias linhas de texto. Construtores: TextArea()Þ Cria um campo de texto TextArea(int lin, int col) Þ Cria um campo de texto com lin linhas e col colunas TextArea(String txt,int lin, int col) Þ Cria um campo de texto com o conteúdo txt, lin linhas e col colunas Métodos: int getColumns()Þ retorna o numero de colunas do TextField int getRows()Þ retorna o numero de linhas do TextField String getText()Þ retorna o texto contido no TextField void setText(String txt) Þ ajusta o conteúdo do TextField para a string txt Exemplo: TextArea texto = new TextArea("OK", 5, 40);
Exemplo 5: import java.awt.*; import java.applet.Applet;
public class ex5_3 extends Applet { Button botão; Checkbox cbox; Label texto; List lista; Scrollbar barra_rolagem; TextField campo_texto; TextArea area_texto;
public void init() { botão = new Button("Ok"); cbox = new Checkbox("Show"); texto = new Label("Hello!"); lista = new List(); barra_rolagem = new Scrollbar(Scrollbar.HORIZONTAL); campo_texto = new TextField("37",5); area_texto = new TextArea("Ok",5,40); lista.addItem("Primeiro"); lista.addItem("Segundo"); add(botão); add(cbox); add(texto); add(lista); add(barra_rolagem); add(campo_texto); add(area_texto); } }
CONTAINERS Containers são simplesmente componentes que podem conter outros componentes. Pense como uma maneira de subdividir uma área para construir a interface com o usuário, aonde os componentes podem ser colocados. Existem dois tipos de containers: Panels e Windows. A maior diferença entre eles é que um Panel é definido como uma área em uma janela já existente e Window é uma janela completamente nova. Quando a aplicação é uma Applet o único container que pode ser aplicado é o Panel.
Exemplo: import java.awt.*; import java.applet.Applet;
public class ex5_6 extends Applet { Frame aframe;
public void init() { aframe = new Frame("Exemplo de Frame"); aframe.show(); } }
LAYOUTS Layout pode ser definido como uma mascara que é colocada sobre um container para definir como os seus componentes serão adicionados. Normalmente é usado o layout BorderLayout(), baseado nos pontos cardeais.
Exemplo: import java.awt.*; import java.applet.Applet;
public class ex5_7 extends Applet { Button botão1, botão2, botão3, botão4, botão5;
public void init() { setLayout(new BorderLayout()); botão1 = new Button("Norte"); botão2 = new Button("Sul"); botão3 = new Button("Leste"); botão4 = new Button("Oeste"); botão5 = new Button("Centro"); add("North",botão1); add("South",botão2); add("East",botão3); add("West",botão4); add("Center",botão5); } }
MÉTODOS COMUNS A TODOS OS COMPONENTES void resize(int width, int height) Þ Tamanho do componente void move(int x, int y) Þ Mover componente void setForeground(Color x) Þ Cor do componente void setBackground(Color y) Þ Cor de Fundo do componente void disable() Þ Desabilitando componente void enable() Þ Habilitando componente
VARIÁVEIS DE COR DEFINIDAS NO JAVA black blue cyan darkGray gray green lightGray magenta orange pink red white yellow Exemplo de Interface de uma calculadora: import java.awt.*; import java.applet.Applet;
public class ex5_7 extends Applet { Label display; Panel bottom; Panel num_panel; Panel func_panel; Button number[] = new Button[10]; Button function[] = new Button[6];
public void init() { setLayout(new BorderLayout()); display = new Label("0", Label.RIGHT); add("North", display);
bottom = new Panel(); bottom.setLayout(new BorderLayout());
num_panel = new Panel(); num_panel.setLayout(new GridLayout(4,3));
for (int x=9; x>=0; x--) { number[x] = new Button((new String()).valueOf(x)); num_panel.add(number[x]); }
function[4] = new Button("."); num_panel.add(function[4]);
function[5] = new Button("="); num_panel.add(function[5]);
bottom.add("Center", num_panel);
func_panel = new Panel(); func_panel.setLayout(new GridLayout(4,1));
function[0] = new Button("+"); function[1] = new Button("-"); function[2] = new Button("*"); function[3] = new Button("/");
for (int x=0; x<4; x++) func_panel.add(function[x]);
bottom.add("East", func_panel);
add("Center",bottom); } }
6.3. GráficosA linguagem Java contem um numero grande de primitivas gráficas que possibilitam ao usuário criar gráficos facilmente e rapidamente. Abaixo uma pequena relação dos métodos mais úteis da classe Graphics:
dispose() limpa contexto corrente do objeto
clearRect(int x, int y, int width, int height) limpa a área do retângulo especificado com a cor atual int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura
drawLine(int x1, int y1, int x2, int y2) desenha uma linha int x1 Þ coordenada x inicial int y1 Þ coordenada y inicial int x2 Þ coordenada x final int y2 Þ coordenada y final
drawRect(int x, int y, int width, int height) desenha um retângulo int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura
drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) desenha um retângulo com as bordas arredondadas int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura int arcWidth Þ diâmetro horizontal do arco nos 4 cantos int arcHeight Þ diâmetro vertical do arco nos 4 cantos
drawOval(int x, int y, int width, int height) desenha um circulo int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura
draw3DRect(int x, int y, int width, int height, boolean raised) desenha um retângulo em 3 dimensões int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura boolean raised Þ se True retângulo aparece aumentado, senão diminuído
drawPolygon(int xPoints[], int yPoints[], int nPoints) desenha um polígono. Qualquer polígono criado tem que conter um ponto que o fecha. Java não cria polígonos fechados automaticamente, então tenha sempre certeza que os pontos inicial e final são iguais. int xPoints[]Þ array de coordenadas x int yPoints[]Þ array de coordenadas y int nPoints[]Þ numero de pontos
drawString(String str, int x, int y) desenha string com a fonte e tamanho correntes String str Þ string a ser desenhada int x Þ coordenada x int y Þ coordenada y
fillRect(int x, int y, int width, int height) preenche um retângulo com a cor corrente int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura
fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) preenche um retângulo com bordas arredondadas com a cor corrente int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura int arcWidth Þ diâmetro horizontal do arco nos 4 cantos int arcHeight Þ diâmetro vertical do arco nos 4 cantos
fill3DRect(int x, int y, int width, int height, boolean raised) preenche um retângulo 3D com a cor corrente int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura boolean raised Þ se True retângulo aparece aumentado, senão diminuído
fillOval(int x, int y, int width, int height) preenche um circulo com a cor corrente int x Þ coordenada x inicial int y Þ coordenada y inicial int width Þ largura int height Þ altura
fillPolygon(int xPoints[], int yPoints[], int nPoints) preenche um polígono com a cor corrente int xPoints[]Þ array de coordenadas x int yPoints[]Þ array de coordenadas y int nPoints[]Þ numero de pontos
Color getColor() retorna a cor corrente
setColor(Color c) ajusta a cor corrente Color c Þ nova cor corrente
Font getFont() retorna a fonte corrente
setFont(Font f) ajusta a fonte corrente Font f Þ nova fonte corrente
Muito mais em: Procure por classe Graphics() em http://www.javasoft.com/doc/index.html
|