Introdução a Applets
Por Francisco Demontiê dos Santos Junior
(demontie@dsc.ufcg.edu.br)
Você já viu pequenos programas Java embutidos em páginas HTML? Ficou curioso sobre como desenvolver esses aplicativos? No PETNews deste mês você aprenderá um pouco sobre Applets.

Um Applet é um pequeno software que é executado, geralmente na forma de um plug-in, dentro de um programa maior. No âmbito de Java, os Applets são programas que podem ser facilmente inseridos em páginas HTML (ou seja, o programa é executado no contexto de um web browser). Esse recurso pode tornar sua página web mais interativa e trazer funcionalidades que o HTML não possui. Os Applets, geralmente, utilizam a biblioteca gráfica AWT, o que os torna bastante poderosos para o desenvolvimento de pequenas aplicações (sejam elas simples ou complexas).

Para iniciar o desenvolvimento de applets, vamos ver um clássico "Hello World".

import java.applet.Applet;
import java.awt.Graphics;

public class HelloWorld extends Applet {

	@Override
	public void paint(Graphics g) {
		g.drawString("Hello World!", 50, 50);
	}

}

Note que, como todo programa Java, os applets devem possuir pelo menos uma classe pública para que possam ser executados. A classe principal dos applets deve estender a classe Applet do pacote java.applet. Agora, vamos entender esse primeiro exemplo passo a passo.

As duas primeiras linhas importam as classes necessárias para a compilação do programa: java.applet.Applet e java.awt.Graphics. A primeira contém os atributos e métodos necessários para um applet simples; a segunda (uma classe da biblioteca gráfica AWT) é usada para exibir objetos na tela, desde retas e polígonos a imagens.

Nesse exemplo, a classe HelloWorld possui apenas um método, chamado paint. Esse é responsável por exibir os componentes gráficos na tela. Aqui, usamos o método drawString, da classe java.awt.Graphics, que recebe uma String para ser exibida, e dois inteiros representando a posição.

O resultado desse exemplo é um retângulo branco com o texto "Hello World!", como na applet a seguir.

Agora que já tivemos um primeiro contato com a programação de applets, vamos partir para um exemplo um pouco mais sofisticado. Nesse exemplo, iremos construir um simples joguinho de "ping-pong", cujo objetivo é não deixar a bola cair. Observe o código abaixo.

import java.applet.Applet;
import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;

public class PingPong extends Applet implements Runnable {
	
	// Applet
	private int larguraTela;
	private int alturaTela;
	
	// Cores
	private final Color preto = new Color(0,0,0);
	private final Color azul = new Color(0,0,155);
	private final Color cinza = new Color(200,200,200);
	
	// Bola
	private final int BOLA_RAIO = 30;
	private int bolaX;
	private int bolaY;
	private int moveBolaY;
	private int moveBolaX;
	// Para o movimento da bola
	Thread t;
	boolean movendo;
	
	// Barra
	private int barraX;
	private int barraY;
	private final int BARRA_W = 80;
	private final int BARRA_H = 15;
	
	@Override
	public void init() {
		setBackground(cinza);
		
		larguraTela = this.getWidth();
		alturaTela = this.getHeight();
		
		barraX = larguraTela/2 - BARRA_W/2;
		barraY = alturaTela - BARRA_H;
		
		bolaX = larguraTela/2 - BOLA_RAIO/2;
		bolaY = BOLA_RAIO/2;
		
		moveBolaX = 2;
		moveBolaY = 2;
		t = new Thread(this);
		movendo = false;
	}
	
	@Override
	public void paint(Graphics g) {
		g.setColor(azul);
		g.fillArc(bolaX, bolaY, BOLA_RAIO, BOLA_RAIO, 0, 360);
		g.setColor(preto);
		g.fillRect(barraX, barraY, BARRA_W, BARRA_H);
	}
	
	@Override
	public boolean keyDown(Event e, int tecla) {
		if (tecla == Event.RIGHT){
			moveDireita();
		}
		if (tecla == Event.LEFT){
			moveEsquerda();
		}
		if (!movendo){
			movendo = true;
			t.start();
		}
		return true;
	}
	
	private void moveDireita(){
		if (barraX + BARRA_W < larguraTela)
			barraX += 2;
	}
	
	private void moveEsquerda(){
		if (barraX > 0)
			barraX -= 2;
	}
	
	private void moveBola(){
		if (bolaY + BOLA_RAIO >= barraY && barraX <= bolaX + BOLA_RAIO 
				&& bolaX <= barraX + BARRA_W)
			moveBolaY *= -1;
		if (bolaY <= 0)
			moveBolaY *= -1;
		if (bolaX + BOLA_RAIO >= larguraTela)
			moveBolaX *= -1;
		if (bolaX <= 0)
			moveBolaX *= -1;
		bolaY += moveBolaY;
		bolaX += moveBolaX;
	}

	@Override
	public void run() {
		while (true) {
			moveBola();
			repaint();
			try {
				Thread.sleep(60);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}

Nesse exemplo, além de importar aquelas duas classes do exemplo anterior, importamos, também, as classes java.awt.Color e java.awt.Event. O primeiro é usado para setar cores de objetos e do background (aqui, utilizamos o construtor que recebe três parâmetros inteiros, entre 0 e 255, representando a quantidade de cada componente do sistema de cores RGB); o segundo é usado na captura de eventos em geral (como teclas pressionadas e movimentação do mouse). Agora vamos ter uma visão geral de cada método implementado nesse exemplo.

No método init, da classe Applet, colocamos todo o código que deve ser rodado assim que o programa é inicializado. No exemplo, utilizamos esse método para mudar a cor de fundo, determinar as posições iniciais da bola e da barra, inicializar as variáveis de incremento de posição da bola e criar uma nova thread, que será utilizada para atualizar a posição da bola e redesenhar os objetos na tela com o método repaint (vide método run). O uso de thread se fez necessário pois precisamos atualizar a posição da bola independente dos eventos que ocorram. Por isso, a classe do exemplo implementa a interface Runnable.

O método paint tem exatamente a mesma função que no exemplo anterior, a única diferença é que usamos outros dois métodos da classe java.awt.Graphics. São estes, fillArc e fillRect que desenham um círculo e um retângulo, respectivamente, preenchendo-os com a cor atual (definimos essas cores com uma chamada ao método setColor antes de desenhar cada objeto).

Os movimentos da bola e da barra são feitos pelos métodos moveBola, para a bola, e moveEsquerda e moveDireita, para a barra. O método que movimenta a bola é chamado dentro de um laço no método run. A cada iteração do laço, os objetos na tela são redesenhados. Os métodos que movimentam a barra são chamados dependendo da tecla que foi pressionada. Para isso, implementamos o método keyDown. Note que, ao pressionar alguma das duas teclas, seta para a esquerda e seta para a direita, pela primeira vez, a thread é iniciada e o jogo começa.

Confira, abaixo, o resultado do nosso segundo exemplo.

Por fim, podemos incluir um applet numa página HTML de uma forma bastante simples. Basta que compilemos a classe principal do aplicativo e utilizemos uma tag especial como mostrado a seguir.



Como exercício, acrescente mais um jogador ao exemplo anterior (uma barra localizada no canto superior da tela e controlada pelas teclas 'a' e 'd') e exiba os pontos de cada um deles.