Você está na página 1de 17

Aplicaes versus Applets

H duas maneiras diferentes de correr um programa Java: Como Aplicao: programa independente e autnomo (stand-alone) que pode ser invocado da linha de comandos. Como Applet: programa embebido numa pgina Web, que corre quando a pgina visualizada por um browser. Aplicaes e Applets diferem nos privilgios de execuo e no modo como indicam onde comear a execuo. Browsers de pginas Web assim como o appletviewer tratam cdigo HTML (HyperText Markup Language). Assim como h tags html para colocar texto em bold, ou incluir imagens, tambm h tags html para correr um applet Java existente num ficheiro .class. Um exemplo de cdigo HTML (colocado, por exemplo, no ficheiro exApplet.html) que invoca um applet existente no ficheiro exApplet.class mostra-se a seguir: <title> Exemplo de um Applet </title> <applet code=exApplet.class width=300 height=50> </applet> Os campos width e height (largura e altura) so obrigatrios, e so medidos em pixeis (pontos de resoluo no ecr do computador). Os applets correm num objecto janela, e necessrio indicar ao browser o tamanho da janela no qual o applet deve comear. Os applets e as aplicaes so invocados de maneira diferente. As aplicaes comeam a execuo num mtodo pblico designado main() com uma assinatura especfica, de um modo semelhante linguagem C. Quando a aplicao corre, main() executado e a partir de main() implementado o comportamento que se pretende que o programa tenha. A conveno para os applets diferente e envolve a reescrita (override) de certos mtodos que so automaticamente chamados pelo browser. Estes mtodos existem definidos na classe Applet, sem qualquer funcionalidade. O programa de um applet deve criar mtodos que anulem os correspondentes mtodos definidos na classe Applet (tendo a mesma assinatura), para executar as tarefas especficas pretendidas. Quando um applet carregado, Java cria uma instncia da classe carregada (que um objecto Applet) e uma srie de mtodos especiais Applet so chamados nessa instncia. Os cinco mtodos mais importantes na execuo de um applet so: public void init() public void start() public void stop() public void destroy() public void paint(Graphics g)

126

1. O browser ou o appletviewer carrega o applet no sistema e comea por chamar o mtodo init() mtodo nunca chamado pelo programa. Este mtodo chamado quando o applet carregado pela primeira vez ou recarregado (load ou reload). O mtodo init() normalmente usado para criar os objectos grficos de interface com o utilizador (GUI Graphical User Interface) e threads. 2. Em seguida automaticamente chamado o mtodo start() mtodo nunca chamado pelo programa. S se usa se se necessitar de iniciar qualquer coisa tal como threads. 3. Depois automaticamente chamado o mtodo paint() mtodo que em geral nunca directamente chamado pelo programa. Normalmente o programa chama outro mtodo, repaint(), que por sua vez chama o mtodo paint(). O mtodo paint() recebe como parmetro um objecto da classe Graphics, criado e passado ao mtodo paint() pelo browser. Este objecto grfico contm o estado grfico do applet, isto , as caractersticas correntes da superfcie de desenho. Desenhando neste objecto, desenha-se no applet e os resultados aparecem no ecr. Porque um applet uma janela Java no usa o input/output standard. Usa as facilidades disponveis para janelas, tais como desenhar uma string em determinadas coordenadas. O mtodo paint() o lugar onde o trabalho do applet realmente ocorre. Painting pode ocorrer muitas vezes durante o ciclo de vida de um applet, depois de um applet ser inicializado, se o browser colocado detrs de outra janela no ecr e depois trazido outra vez para a frente, se a janela do browser movida para uma posio diferente do ecr, ou se chamado pelo programa do applet para, por exemplo, realizar animao. Como paint() recebe como argumento uma instncia da classe Graphics, se se usa este mtodo necessrio importar a classe Graphics para o cdigo do applet, atravs da seguinte instruo: import java.awt.Graphics; 4. Se o browser deixa a pgina, isso causa uma chamada automtica ao mtodo stop() mtodo nunca chamado pelo programa. Neste mtodo pode-se parar threads que tenham sido lanadas pelo applet. Se o browser regressa pgina que contm o applet, isto causa uma chamada automtica ao mtodo start() e o fluxo de actividade continua a partir do ponto 2 acima. 5. Se o browser descarrega a pgina causa uma chamada ao mtodo destroy() mtodo nunca chamado pelo programa. Este mtodo informa o applet que deve terminar tudo.

127

Grficos, Fontes e Cores Grficos Para desenhar no ecr em Java necessrio um contexto grfico. Um contexto grfico mantido num objecto da classe Graphics e controla o modo como a informao desenhada. Objectos da classe Graphics contm mtodos para desenhar, manipular fontes e cores. necessrio usar um objecto da classe Graphics para se desenhar. Um objecto da classe Graphics passado pelo sistema ao mtodo paint() como argumento, quando uma operao paint ocorre. O mtodo paint() normalmente no directamente chamado pelo programador. Quando um applet inicialmente executado, o mtodo paint() automaticamente chamado ( depois da chamada dos mtodos init() e start() ). Para que paint() volte novamente a ser chamado necessrio que ocorra um evento tal como um redimensionamento (resizing) do applet. Se o programador necessita de chamar um mtodo que efectue o painting, deve chamar o mtodo repaint() ( public void repaint() ) que efectua um clear seguido de um paint. O browser cria um objecto grfico (um objecto da classe Graphics) que contm o estado grfico do applet as caractersticas correntes da superfcie de desenho, tais como cores de foreground e background e passa este objecto ao mtodo paint() sempre que invoca a sua execuo. O mtodo paint() tem o seguinte formato: public void paint( Graphics g) { .............. } Por este motivo necessrio importar a classe Graphics para o cdigo do applet: import java.awt.Graphics; Para desenhar objectos no ecr, chamam-se mtodos de desenho disponveis na classe Graphics. Todos os mtodos de desenho tm argumentos representando pontos no sistema de coordenadas do applet. O sistema de coordenadas do applet Java tem a origem (0, 0) no canto superior esquerdo. Valores positivos da coordenada x correspondem a pontos situados direita da origem e valores positivos da coordenada y correspondem a pontos situados abaixo da origem. (0, 0) x

y 128

Desenho e Preenchimento (Filling) A classe Graphics possui um conjunto de primitivas grficas para desenhar, incluindo: 1. 2. 3. 4. 5. 6. Linhas, Rectngulos, Rectngulos arredondados, Polgonos, Ovais, Arcos.

1. Desenho de Linhas Mtodo drawLine - classe Graphics

public void drawLine( int x1, int y1, int x2, int y2) => desenha uma linha entre os pontos [x1, y1] e [x2, y2].

2. Desenho de Rectngulos Mtodo Mtodo Mtodo drawRect fillRect clearRect - classe Graphics - classe Graphics - classe Graphics

public void drawRect( int x, int y, int width, int heigh) public void fillRect( int x, int y, int width, int heigh) public void clearRect( int x, int y, int width, int heigh) => Estes mtodos desenham um rectngulo com o canto superior esquerdo nas coordenadas [x, y] e de largura width e altura heigh.

drawRect() - desenha o rectngulo com uma linha na cor corrente. fillRect() - desenha o rectngulo slido na cor corrente. clearRect() - desenha o rectngulo slido na cor corrente do background.

3. Desenho de Rectngulos Arredondados rectngulos com cantos arredondados Mtodos drawRoundRect e fillRoundRect - classe Graphics public void drawRoundRect(int x, int y, int width, int heigh, int arcWidth, int arcHeigh) public void fillRoundRect( int x, int y, int width, int heigh, int arcWidth, int arcHeigh) => Estes mtodos desenham um rectngulo com cantos arredondados, situado dentro de um rectngulo com o canto superior esquerdo nas coordenadas [x, y] e de largura width e altura heigh. As ovais que formam os cantos do rectngulo tm largura arcWidth e altura arcHeigh.

129

drawRoundRect() fillRoundRect()

- desenha o rectngulo arredondado. - desenha o rectngulo arredondado slido.

O canto superior esquerdo especificado na chamada destes mtodos est a alguma distncia acima e esquerda da linha oval do canto.

4. Desenho de Polgonos Mtodo Mtodo drawPolygon fillPolygon - classe Graphics - classe Graphics

Pode-se escolher o modo como indicar a lista de coordenadas dos pontos vrtices do polgono: ou como arrays de coordenadas x e coordenadas y ou como uma instncia da classe Polygon. Usando o primeiro modo, os mtodos drawPolygon() e fillPolygon() recebem 3 argumentos. Java automaticamente fecha o polgono. Para deixar a linha incompleta, tem de se usar o mtodo drawPolyline(). public void drawPolygon( int xPoints[], int yPoints[], int points) public void fillPolygon( int xPoints[], int yPoints[], int points) => Estes mtodos desenham um polgono na cor corrente com o nmero de pontos points, em que a coordenada x de cada ponto est especificada no array xPoints e a coordenada y no correspondente elemento do array yPoints.

Usando o 2 modo necessrio primeiro criar um objecto Polygon. public void drawPolygon( Polygon p) public void fillPolygon( Polygon p) public Polygon( int xValues[], int yValues[], int numberOfPoints) => Este construtor constri um novo objecto polgono com o nmero de lados numberOfPoints em que cada ponto tem uma coordenada x do array xValues e coordenada y do array yValues.

Para desenhar uma linha poligonal aberta usa-se o mtodo drawPolyline() que funciona como o 1 modo de desenhar polgonos.

5. Desenho de Ovais: elipses ou crculos Mtodo Mtodo drawOval fillOval - classe Graphics - classe Graphics

public void drawOval( int x, int y, int width, int height ) public void fillOval( int x, int y, int width, int height)

130

=>

Estes mtodos desenham uma oval (elpse ou crculo) na cor corrente situada dentro de um rectngulo com o canto superior esquerdo no ponto [x, y] e de largura width e altura height. - desenha uma linha oval na cor corrente. - desenha uma oval slida na cor corrente.

drawOval() fillOval()

O canto superior esquerdo especificado na chamada destes mtodos est a alguma distncia acima e esquerda da linha oval. mais simples pensar na posio do rectngulo no qual a oval fica inscrita.

6. Desenho de Arcos Mtodo drawArc e fillArc - classe Graphics

Um arco parte de uma oval. O modo mais simples de pensar num arco como uma seco de uma oval completa. Um arco desenhado entre 2 ngulos: o ngulo de partida e o ngulo do arco. Os ngulos dos arcos so medidos em graus. Zero graus corresponde posio de um ponteiro nas 3 horas, graus positivos correspondem ao sentido contrrio ao do movimento dos ponteiros do relgio, e graus negativos correspondem ao sentido do movimento dos ponteiros do relgio. public void drawArc( int x, int y, int width, int height, int startAngle, int arcAngle) public void fillArc( int x, int y, int width, int height, int startAngle, int arcAngle) => Estes mtodos desenham um arco na cor corrente que parte de uma oval situada dentro de um rectngulo com o canto superior esquerdo no ponto [x, y] e de largura width e altura height. O arco comea no ngulo startAngle e estende-se arcAngle ngulos. - desenha a linha de um arco, parte de uma oval, na cor corrente. - desenha um arco preenchido, parte de uma oval slida, na cor corrente.

drawArc() fillArc()

Arcos slidos (preenchidos) so desenhados como se fossem seces de ovais: ambos os pontos extremos se juntam ao centro da oval. O canto superior esquerdo, largura e altura especificados na chamada destes mtodos no so o ponto de partida, largura e altura dos arcos desenhados no ecr. Eles determinam a forma da oval da qual o arco uma parte. Os ltimos 2 argumentos determinam os pontos inicial e final do arco. O penltimo argumento o ngulo do ponto inicial e o ltimo argumento indica a amplitude do varrimento e o sentido do arco ao longo da oval, e no indica o ngulo do ponto final.

131

Fontes e Texto Pode-se imprimir texto no ecr usando a classe Graphics em conjuno com a classe Font. Para desenhar texto no ecr, primeiro necessrio criar uma instncia da classe Font. Os objectos da classe Font representam uma fonte individual, isto , o nome, estilo (plain, bold, italic) e tamanho em points. Os nomes das fontes so strings representativas da famlia da fonte, como por exemplo TimesRoman, Courier, ou Helvetica. Os estilos das fontes so constantes do tipo inteiro definidas na classe Font com as designaes Font.PLAIN, Font.BOLD, e Font.ITALIC. Para criar uma fonte usa-se o construtor de 3 argumentos, como no exemplo: Font f = new Font (TimesRoman, Font.BOLD, 14); necessrio importar a classe Font antes de usar este construtor: import java.awt.Font Como os estilos de fontes so constantes inteiras podem ser adicionados para criar estilos combinados. Por exemplo Font.BOLD + Font.ITALIC produz uma fonte que ao mesmo tempo bold e italic. A fonte corrente parte do estado (contexto) grfico que mantido pelo objecto grfico no qual se est a desenhar. Sempre que se desenha texto no ecr, Java desenha esse texto na fonte corrente. Para mudar a fonte de texto, necessrio primeiro criar um objecto Fonte e em seguida coloc-la como fonte corrente, usando o mtodo setFont() aplicvel a objectos da classe Graphics. Ex.: import java.awt.Font; import java.awt.Graphics; public class ExemploFont extends java.applet.Applet { public void paint(Graphics g) { Font f = new Font("TimesRoman", Font.PLAIN, 72); g.setFont(f); g.drawString("This is a big font", 10, 100); } }

Cores Uma cor representada como uma combinao de vermelho, verde e azul (Red, Green and Blue RGB). Cada componente da cor pode ter um valor entre 0 e 255. Preto (0,0,0) e branco (255, 255, 255). Na classe Color existem definidos um conjunto de objectos representando cores standards, para facilitar o uso das cores mais vulgares, tais como:

132

Nome da cor: Color.white Color.black Color.gray Color.red Color.green Color.blue Color.yellow Color.pink Color.orange

R(ed) 255 0 128 255 0 0 255 255 255

G(reen) 255 0 128 0 255 0 255 175 200

B(lue) 255 0 128 0 0 255 0 175 0

Para desenhar um objecto numa cor particular, deve-se criar uma instncia da classe Color para representar essa cor. Se a cor que se pretende usar no um objecto Color standard, pode-se criar um objecto Color com qualquer combinao de valores para red, green e blue, atravs do construtor Color(red, green, blue), como no exemplo: Color c = new Color(140, 140, 140) Para desenhar um objecto ou texto numa determinada cor necessrio primeiro criar um objecto cor correspondente cor pretendida, e em seguida coloc-lo como a cor corrente, usando o mtodo setColor() aplicvel a objectos da classe Graphics. Para alm de ser possvel colocar uma cor corrente para o contexto grfico, tambm possvel colocar as cores de background e foreground do prprio applet usando os mtodos setBackground() e setForeground() definidos na classe java.awt.Component, que so herdados pela classe Applet e pelas classes por ns criadas. Exemplo: import java.awt.Graphics; import java.awt.Color; public class ExemploCor extends java.applet.Applet { public void init() { setBackground(Color.white); } public void paint(Graphics g) { g.setColor(Color.red); g.drawString("Window text is this color", 20, 50); g.setColor(Color.green); g.fillRect(5, 60, 180, 20); } }

133

Eventos
As aplicaes grficas so guiadas por eventos; no fazem nada at que o utilizador mova o rato, clique um boto ou prima uma tecla. Um programa guiado por eventos estruturado volta do modelo de processamento de eventos. H 2 modelos de processamento de eventos correspondentes a 2 verses da linguagem Java: 1.0 e 1.1. Os eventos so gerados e fluem no sistema de um modo semelhante em qualquer um dos modelos. Os dois modelos diferem no modo como o programa que construmos recebe e processa os eventos. Tratamento dos Eventos O sistema operativo reporta aos programas que esto a correr, os eventos que ocorrem. Cada programa decide o que fazer com esses eventos. Visual Basic esconde a fila de eventos (event queue) do programador. Cada componente grfico de interface com o utilizador responde a um conjunto fixo de eventos (sendo impossvel mudar os eventos a que responde um componente Visual Basic). Cada componente tem um procedimento associado a cada evento a que responde e Vbasic activa o cdigo desse procedimento em resposta ocorrncia do evento. No C standard, em contraste com a simplicidade do Visual Basic, um programa guiado por eventos necessita de filtrar constantemente a fila de eventos reportada pelo sistema operativo. Deste modo muito mais difcil de programar mas tem a vantagem de no limitar os eventos a que se pode responder como no Vbasic. Java usa uma aproximao intermdia entre o C standard e Visual Basic resultando uma tcnica poderosa com uma complexidade intermdia. possvel responder a todos os eventos conhecidos pelo AWT e especificar a que eventos um dado componente responde. Modelo de Eventos 1.0 Em Java 1.02 todos os eventos so representados pela classe Event. Esta classe tem variveis instncia que descrevem o evento. Uma destas variveis, id, especifica o tipo de evento. Na classe Event define-se um nmero de constantes que so os possveis valores do campo id. O campo target especifica o objecto que gera o evento, ou no qual o evento ocorreu. Em Java 1.02 a ocorrncia de um evento causa a chamada do mtodo handleEvent() (classe Component): public boolean handleEvent(Event evt)

134

A implementao, por omisso, deste mtodo verifica o campo id do objecto Event, e para os tipos de eventos mais vulgarmente usados chama um dos mtodos especficos (definidos na classe Component): id = ACTION_EVENT id = GOT_FOCUS id = LOST_FOCUS id = KEY_PRESS id = KEY_RELEASE id = MOUSE_DOWN id = MOUSE_UP id = MOUSE_ENTER id = MOUSE_EXIT id = MOUSE_DRAG id = MOUSE_MOVE public boolean action(Event evt, Object arg) public boolean gotFocus(Event evt, Object what) public boolean lostFocus(Event evt, Object what) public boolean keyDown(Event evt, int key) public boolean keyUp(Event evt, int key) public boolean mouseDown(Event evt, int x, int y) public boolean mouseUp(Event evt, int x, int y) public boolean mouseEnter(Event evt, int x, int y public boolean mouseExit(Event evt, int x, int y) public boolean mouseDrag(Event evt, int x, int y) public boolean mouseMove(Event evt, int x, int y)

Para processar um destes eventos deve-se reescrever (override) o respectivo mtodo. Deve ser criado uma subclasse para definir o comportamento pretendido.

Nem todos os tipos de eventos so encaminhados por handleEvent() para mtodos mais especficos. Por isso se se est interessado num evento para o qual no existe nenhum mtodo especfico (como por exemplo eventos para scroll bars), deve-se reescrever (override) o mtodo handleEvent(). Se se reescreve handleEvent() na classe que implementamos, nenhum dos mtodos mais especficos ser chamado por omisso, a no ser que sejam chamados explicitamente no corpo de handleEvent(). A melhor maneira de ultrapassar este problema testar o evento no qual estamos interessados, e se o evento no esse, chamar super.handleEvent() para que a superclasse que define handleEvent() possa processsar todos os outros eventos. Exemplo: public boolean handleEvent(Event evt) { if (evt.id == Event.MOUSE_DOWN) { // processar o evento mouse down return true; } else return super.handleEvent(evt); } O mtodo handleEvent(), e todos os mtodos especficos de determinados tipos de eventos, retornam valores booleanos. Se um mtodo de tratamento de eventos retorna false, como todos fazem por omisso, significa que o evento no foi tratado, portanto ele vai ser passado ao container do componente corrente para ver se esse container est interessado no seu processamento.

135

Se um mtodo retorna true significa que o evento foi tratado e no necessrio mais processamento sobre esse evento. O facto de os eventos no tratados serem passados para o container o que permite, por exemplo, tratar os eventos do tipo ACTION_EVENT que so gerados pelos botes (componentes grficos de interface com o utilizador), reescrevendo o mtodo action().

O sistema de gesto de eventos do AWT (Abstract Window Toolkit) funciona como um sistema de filtragem de eventos. Um dos eventos mais comuns num applet o clique no mouse. Eventos de clique no mouse ocorrem quando o utilizador clica no mouse algures dentro do applet. Podem-se interceptar os cliques do mouse para desencadear alguma aco ou podem ser usados em conjunto com movimentos do mouse para efectuar outras aces. Quando se clica no mouse geram-se dois eventos: um evento mouse down quando o boto premido, e um evento mouse up quando o boto libertado. Estes dois eventos so gerados porque em certas situaes associam-se aces diferentes (embora relacionadas) a cada um destes dois eventos. Por exemplo num menu pull-down, o evento mouse down estende o menu e o evento mouse up selecciona um item. Para tratar eventos do mouse deve-se reescrever a definio dos mtodos apropriados no applet. Quando ocorre um evento mouse down o browser ou o viewer chamam o seguinte mtodo: public boolean mouseDown(Event evt, int x, int y) Quando ocorre um evento mouse up chamado o mtodo: public boolean mouseUp(Event evt, int x, int y) Estes mtodos recebem 3 parmetros: o evento e as coordenadas x e y onde o evento (mouse down ou mouse up) ocorreram. Sempre que o mouse se move um simples pixel em qualquer direco um evento mouse move gerado. Como um evento gerado por cada pixel de movimento do mouse, mover o mouse de um lado do applet para o outro resulta em centenas de eventos. H 2 tipos de movimentos do rato: mouse drags onde o movimento ocorre com o boto do mouse premido, que produzem eventos que originam a chamada do mtodo public boolean mouseDrag(Event evt, int x, int y)

136

e movimentos do mouse sem o boto do mouse premido que produzem eventos que originam a chamada do mtodo public boolean mouseMove(Event evt, int x, int y) Para estes 2 mtodos "mouseUp() e mouseDrag() os argumentos das coordenadas x e y so as novas localizaes do mouse e no so a localizao de partida. Exemplo: Construa um applet que desenhe um crculo azul quando se clica com o mouse dentro do applet at um mximo de 10 crculos. Cada crculo deve ser desenhado volta do ponto onde se clica com um dimetro de 20 pixels. import java.awt.Graphics; import java.awt.Color; import java.awt.Event; public class Pintas extends java.applet.Applet { final int MAX = 10; int xPintas[] = new int[MAX]; int yPintas[] = new int[MAX]; int nPintas = 0; public void init() { setBackground(Color.white); } public boolean mouseDown(Event evt, int x, int y) { if (nPintas < MAX) { adicionaPinta(x,y); return true; } else return false; } void adicionaPinta(int x,int y) { xPintas[nPintas] = x; yPintas[nPintas] = y; nPintas++; repaint(); } public void paint(Graphics g) { g.setColor(Color.blue); for (int i = 0; i < nPintas; i++) { g.fillOval(xPintas[i] - 10, yPintas[i] - 10, 20, 20); } } }

137

A cor de fundo colocada no mtodo init(), e no no paint(), porque uma aco que s executada uma vez. O mtodo paint() deve ser chamado sempre que um novo pinta adicionada; se a cor de fundo fosse colocada no mtodo paint(), este mtodo tornar-se-ia desnecessariamente mais lento. Sempre que ocorre um evento mouse down o programa verifica se a quantidade de pintas menor que 10, adiciona as coordenadas aos respectivos arrays, incrementa a varivel que armazena a quantidade de pintas e chama repaint(). O mtodo repaint() efectua um clear e depois chama o mtodo paint(). Por este motivo necessrio de cada vez que uma pinta adicionada, pintar todas. Para pintar todas as pintas sempre que uma adicionada, necessrio guardar as coordenadas de todas. Exemplo: Construa um applet que permita desenhar segmentos de recta no ecr, at o mximo de 10, arrastando o rato de um ponto (incio) at outro (extremidade do segmento de recta). Enquanto o rato est a ser arrastado para desenhar uma linha, essa linha deve ser mostrada, na cor azul, desde o ponto de partida at posio corrente do mouse. import java.awt.Graphics; import java.awt.Color; import java.awt.Event; import java.awt.Point; public class Linhas extends java.applet.Applet { final int MAX = 10; Point inicios[] = new Point[MAX]; Point fins[] = new Point[MAX]; Point ancora; // principio da linha corrente Point pontoCorrente; // fim actual da linha corrente int nLinhas = 0; // numero de linhas public void init() { setBackground(Color.white); } public boolean mouseDown(Event evt, int x, int y) { if (nLinhas < MAX) { ancora = new Point(x,y); return true; } else return false; } public boolean mouseUp(Event evt, int x, int y) { if (nLinhas < MAX) { adicionaLinha(x,y); return true; } else return false; }

138

public boolean mouseDrag(Event evt, int x, int y) { if (nLinhas < MAX) { pontoCorrente = new Point(x,y); repaint(); return true; } else return false; } void adicionaLinha(int x,int y) { inicios[nLinhas] = ancora; fins[nLinhas] = new Point(x,y); nLinhas++; pontoCorrente = null; ancora = null; repaint(); } public void paint(Graphics g) { // desenha as linhas existentes for (int i = 0; i < nLinhas; i++) { g.drawLine(inicios[i].x, inicios[i].y, fins[i].x, fins[i].y); } // desenha a linha corrente g.setColor(Color.blue); if (pontoCorrente != null) g.drawLine(ancora.x,ancora.y, pontoCorrente.x, pontoCorrente.y); } } A classe Point usada para representar as coordenadas x e y de um ponto encapsuladas num simples objecto. Este applet trata 3 eventos (se o nmero de segmentos de recta armazenados ainda menor que 10): mouse down: -para colocar o ponto ancora para a linha corrente. mouse drag: - para criar objectos referenciados por pontoCorrente contendo a extremidade actual da linha que est a ser desenhada e actualizar o desenho (repaint()). mouse up: - para armazenar uma nova linha que une o ponto ancora at ao ponto onde ocorreu este evento e actualizar o desenho. Para animar a linha que est a ser desenhada, quando se arrasta o mouse, movendo-o desordenadamente, necessrio desenhar a linha constantemente entre o ponto ancora e o ponto corrente do mouse o que se faz efectuando repaint() sempre que ocorre mouse drag. Enquanto no se est a desenhar uma linha, o mtodo paint() no deve efectuar o desenho da linha corrente, para o que se coloca anchor e pontoCorrente com o valor null.

139

Exemplo: /* Construa um applet que permita ao utilizador desenhar (sarrabiscar) com o rato. */ import java.awt.*; import java.applet.*; public class Scribble1 extends Applet { public boolean mouseDrag(Event evt, int x, int y) { Graphics g = getGraphics(); g.fillOval(x, y, 4, 4); return true; } }

// Outras verses import java.awt.*; import java.applet.*; public class Scribble2 extends Applet { int x=0, y=0; public boolean mouseDown(Event evt, int x1, int y1) { x = x1; y = y1; return true; } public boolean mouseDrag(Event evt, int x1, int y1) { Graphics g = getGraphics(); g.drawLine(x, y, x1, y1); x = x1; y = y1; return true; } }

import java.awt.*; import java.util.Vector; import java.applet.*; public class Scribble3 extends Applet { Vector linhas = new Vector(100, 100); Vector linCorrente; public boolean mouseDown(Event evt, int x, int y) { linCorrente = new Vector(100, 100); linhas.addElement(linCorrente); linCorrente.addElement(new Point(x,y)); return true; }

140

public boolean mouseDrag(Event evt, int x1, int y1) { Point p = (Point) linCorrente.lastElement(); Graphics g = getGraphics(); g.drawLine(p.x, p.y, x1, y1); linCorrente.addElement(new Point(x1,y1)); return true; } public void paint(Graphics g) { for (int j=0; j < linhas.size(); j++) { linCorrente = (Vector) linhas.elementAt(j); Point p = (Point) linCorrente.elementAt(0); for (int i=1; i<linCorrente.size(); i++) { Point p1 = (Point) linCorrente.elementAt(i); g.drawLine(p.x, p.y, p1.x, p1.y); p = p1; } } } }

Modelo de Eventos 1.1


H objectos (componentes grficos de interface com o utilizador) que podem produzir eventos. Um evento a que se pretende responder enviado para outro objecto que sabe responder convenientemente a esse evento. Este modelo de tratamento de eventos um modelo de delegao de eventos que permite uma maior flexibilidade de programao. No processamento de um evento intervm 3 objectos: 1) Um objecto fonte do evento no qual ocorre o evento; um objecto que pode registar objectos listener para serem notificados se determinados eventos ocorrem. 2) Um objecto listener instncia de uma classe que implementa um interface apropriado listener interface o qual, para ser registado, usado como argumento de um mtodo do objecto fonte do evento. 3) Um objecto evento, criado pelo objecto fonte do evento quando ocorre o evento, que enviado (pelo objecto fonte do evento) para todos os objectos listeners registados para esse evento (invocando o mtodo apropriado do objecto listener e passando-lhe o objecto evento). A ocorrncia de um evento destina-se a causar uma aco, que pode ser realizada pelo prprio objecto ou por outro qualquer objecto. Assim o objecto mais adequado para realizar as aces a serem executadas quando ocorre um evento o objecto que deve ser registado como listener. O objecto listener ao implementar o interface apropriado significa que possui mtodos com as assinaturas correctas para responderem ocorrncia dos eventos.

141

Classes internas (Inner classes) Uma classe interna (inner class) tem acesso aos membros da classe que a contm. A classe interna mantm uma referncia ao objecto particular da classe que a contm e que criou o objecto. Um acesso a um membro da classe envolvente usa essa referncia (escondida) para seleccionar esse membro. Um objecto de uma classe interna s pode ser criado em associao com um objecto da classe envolvente. O processo de construo requer a inicializao da referncia ao objecto da classe envolvente e o compilador dar erro se no pode aceder a essa referncia. Uma referncia ao objecto da classe exterior obtm-se atravs do nome da classe exterior seguido de ponto e seguido de this. As 3 pginas seguintes contm tabelas dos principais eventos gerados nos componentes grficos, dos correspondentes interfaces que devem ser implementados pelos objectos listeners, e dos mtodos invocados para os objectos listeners (passando-lhe o objecto evento como parmetro) quando os eventos ocorrem.

142