6. WINDOW TOOLKIT

            As 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. Eventos

            Um 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 Detalhe

            Em 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 Eventos

            Ocasionalmente 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. Foco

            Quando 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 AWT

            Antes 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 Interface

BUTTON

            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áficos

            A 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

 

Free Web Hosting