Você está na página 1de 210

Java

PDF gerado usando o pacote de ferramentas em cdigo aberto mwlib. Veja http://code.pediapress.com/ para mais informaes.
PDF generated at: Fri, 06 Dec 2013 10:20:42 UTC

Contedo
Pginas
A classe Thread

A histria de Java

Apndices

Blocos e comentrios de programao

Caractersticas de linguagens orientadas a objetos

Comandos de iterao

Comandos de seleo

12

Como funciona o primeiro programa

14

Constante

16

Converso de tipos

16

Criando e executando o primeiro programa

17

Declarao de classes

20

Exemplo de repetio usando for

20

Exemplo simples de mtodo

21

Exemplos de programas

22

Exemplos de programas com vetores

23

Exerccios sobre estruturas de seleo

24

Ferramentas

24

Fluxos de entrada e sada

25

GUI

27

Herana

28

Identificadores

29

Introduo

30

Introduo s classes

31

J2EE

31

J2ME

33

Java 3D

142

Java TV

142

Lista de predefinies

143

Literais

143

Modificadores

146

O porqu de se estudar Java

148

O que so mtodos e para que servem

149

O que Java

150

Objetos

150

Onde Java est presente

150

Operadores

151

Outros tipos de for

157

Palavra-chave

158

Palavra-chave/abstract

159

Palavra-chave/boolean

159

Palavra-chave/else

165

Palavra-chave/final

165

Palavra-chave/goto

165

Palavra-chave/int

165

Palavra-chave/private

166

Palavra-chave/protected

167

Palavra-chave/public

167

Palavra-chave/static

167

Palavra-chave/super

168

Palavra-chave/switch

169

Palavra-chave/void

170

Por onde comear

171

Pr-requisitos para acompanhar o livro

172

RMI

174

Referncia/JVM

178

Referncia/java

179

Referncia/javac

179

Referncia/main

179

Swing

180

Swing/Eventos e Action listeners

180

Swing/Primeiro programa

187

Swing/Widgets

188

Tipos de dados primrios

190

Variveis

192

Vetores

193

break

198

do while

199

else

199

for

200

if

200

switch

201

while

202

Referncias
Fontes e Editores da Pgina

203

Fontes, Licenas e Editores da Imagem

205

Licenas das pginas


Licena

206

A classe Thread

A classe Thread
Resumidamente, uma Thread em Java composta de trs partes:
1. CPU ( processamento compartilhado para executar rotinas )
2. Cdigo ( linhas de cdigo de uma rotina que sero executadas )
3. Dados ( rea de dados que fazem parte da execuo da rotina )
Ou seja, o objeto Thread do Java proveniente da classe java.lang.Thread, representa uma instncia da CPU da
mquina virtual Java, e que tem associada um trecho de cdigo que ser executado, e uma rea de memria.
Podemos criar uma Thread em Java de duas maneiras:
1. Estendendo o comportamento da classe Thread
2. Implementando a interface Runnable

Criando uma Thread a partir da classe java.lang.Thread


O cdigo abaixo mostra como criar uma classe que [funciona][1] como uma Thread:
// MinhaThread.java
public class MinhaThread extends java.lang.Thread {
// rea de dados da Thread
private int contador;
private int limite;
// inicializador da MinhaThread
public MinhaThread( int limite ) {
this.limite = limite;
this.contador = 0;
}
// rea de cdigo da Thread
public void run() {
while (contador <= limite) {
System.out.println( super.getName() + "\t" + contador );
contador ++;
// trecho de cdigo para demonstrao somente
try {
Thread.sleep( 1000 ); // coloca a "thread" para "dormir" 1 segundo
} catch (InterruptedException e) {
e.printStackTrace( System.err );
}
}
}
}

O cdigo abaixo mostra como usar a classe MinhaThread:


// TesteMinhaThread.java
public class TesteMinhaThread {

A classe Thread

public static void main(String[] args)


MinhaThread mt1 = new MinhaThread(
mt1.setName("MinhaThread1");
MinhaThread mt2 = new MinhaThread(
mt2.setName("MinhaThread2");
MinhaThread mt3 = new MinhaThread(
mt3.setName("MinhaThread3");
MinhaThread mt4 = new MinhaThread(
mt4.setName("MinhaThread4");
mt2.start();
mt1.start();
mt3.start();
mt4.start();
}

{
200 );
300 );
200 );
400 );

}
Executando o classe TesteMinhaThread, veremos que as Threads incrementam o contador separadamente, baseado
no objeto MinhaThead.

Criando uma Thread a partir da interface java.lang.Runnable


O cdigo abaixo mostra como criar uma classe que funciona como uma Thread:
// MeuRunnable.java
public class MeuRunnable implements java.lang.Runnable {
// rea de dados da Thread
private int contador;
private int limite;
// inicializador da MinhaThread
public MeuRunnable ( int limite ) {
this.limite = limite;
this.contador = 0;
}
// rea de cdigo da Thread
public void run() {
while (contador <= limite) {
System.out.println( Thread.currentThread().getName() + "\t" + contador );
contador ++;
// trecho de cdigo para demonstrao somente
try {
Thread.sleep( 1000 ); // coloca a "thread" para "dormir" 1 segundo
} catch (InterruptedException e) {
e.printStackTrace( System.err );
}
}

A classe Thread

}
}

O cdigo abaixo mostra como usar a classe MeuRunnable:


// TesteMeuRunnable.java
public class TesteMeuRunnable {
public static void main(String[] args) {
MeuRunnable mr1 = new MeuRunnable ( 300
MeuRunnable mr2 = new MeuRunnable ( 200
MeuRunnable mr3 = new MeuRunnable ( 400
MeuRunnable mr4 = new MeuRunnable ( 200
Thread t1 = new Thread( mr1 );
t1.setName("MeuRunnable1");
Thread t2 = new Thread( mr2 );
t2.setName("MeuRunnable2");
Thread t3 = new Thread( mr3 );
t3.setName("MeuRunnable3");
Thread t4 = new Thread( mr4 );
t4.setName("MeuRunnable4");
t2.start();
t1.start();
t3.start();
t4.start();
}

);
);
);
);

}
Executando o classe TesteMeuRunnable, veremos que as Threads incrementam o contador separadamente, baseado
no objeto MeuRunnable.

Consideraes de Design
Usar a implementao do Runnable, d maior flexibilidade de Design, pois permite que a classe que implementou
a interface java.lang.Runnable estenda o comportamento de outra classe.
Estender diretamente a classe Thread, facilita o acesso aos mtodos da classe java.lang.Thread, mas dificulta a
modelagem da POO pois impede que a sub-classe de Thread estenda outra classe.

Desafio
Criar uma pequena aplicao grfica usando a Java SWING API de simulador simples para um prdio que tenha 3
elevadores e que funcionam independentemente.

A classe Thread

Ligaes externas
Linguagem Java - Wikipedia [2]
Sun Java Tutorial - Threads [3]
Sun Java Tutorial - SWING [4]

Referncias
[1]
[2]
[3]
[4]

http:/ / www. dsc. ufcg. edu. br/ ~jacques/ cursos/ map/ html/ threads/ implementacao. html
http:/ / pt. wikipedia. org/ wiki/ Java_%28linguagem_de_programa%C3%A7%C3%A3o%29
http:/ / java. sun. com/ docs/ books/ tutorial/ essential/ concurrency/ procthread. html
http:/ / java. sun. com/ docs/ books/ tutorial/ uiswing/ index. html

A histria de Java
A histria de Java
Java comeou na verdade como um projeto na Sun que objetivava o estudo e a anlise de interaes entre
dispositivos eletrnicos e computadores, no exatamente para o desenvolvimento de uma linguagem para aplicativos
embarcados. Nesse tempo a linguagem tinha o nome-cdigo Green e foi idealizada por James Gosling. Contudo, a
Sun perdeu a disputa para uma outra empresa e o projeto Green estava marcado para ser descontinuado.
Entretanto, eis que surge algo novo, sim, uma nova palavra chamada internet. Com o advento em 1993 do web
browser Mosaic e das pginas estticas HTML a vida das pessoas sofreria uma mudana profunda, bem como a do
projeto Green. Com o objetivo de tirar proveito desse mercado o projeto Green sofre algumas mudanas e
adaptaes, se chamando Oak e em 1995 lanado com o nome Java. Tal nome adveio do evento que os
idealizadores da linguagem descobriram que j havia uma linguagem chamada Oak e ento ao tomar seus cafs
tiveram a idia de a chamar de Java em virtude de este ser o nome do local daonde o caf era comprado, a qual era
pequena ilha na Indonsia.
Assim em 1995 a Sun faz a divulgao da linguagem no evento SunWorld e a disponibiliza oficialmente em 1996,
ano da primeira JavaOne. Java foi lanada ento, sendo uma linguagem de propsito geral, porm, num primeiro
momento conhecida por seus applets que adicionavam interatividade s pginas Web, caracterstica ainda inexistente
na poca, quando a existncia do Flash ainda nem era pensada. De l para c a linguagem sofreu muitas mudanas e
evoluiu se adaptando com o tempo e atingindo a enorme popularidade que tem hoje.

Apndices

Apndices
Palavras-chave ou palavras reservadas da linguagem Java.
Ferramentas da linguagem Java.

Blocos e comentrios de programao


Blocos de programao
Blocos de programao so aglomerados de instrues e declaraes que tm escopo conjunto. Ou seja, as
variveis definidas como locais dentro de um bloco somente sero presentes dentro deste bloco assim como as
instrues ali presentes. Os blocos de programao so delimitados por chaves e podem ser aninhados colocados um dentro dos outros. Por exemplo:
{
// este um bloco de programao
int a=10;
}
Outro exemplo:
{
// este um bloco de programao
int a=10;
int b=1;
if (b==3) {
// este um bloco que executado se b for igual a 3
b=a*10;
} else {
// este um bloco que executado se b for diferente de 3
int a=100;
b=a*10;
}
System.out.println("O valor de b " + b);
}

Comentrios
Comentrios, como o prprio nome instiga, so notas que podem ser includas no cdigo fonte para descrever
o que se quiser. Assim, no modificam o programa executado e servem somente para ajudar o programador a
melhor organizar os seus cdigos. Os comentrios em Java seguem a mesma sintaxe da linguagem C++.

/* */
Comentrios de uma ou mais linhas podem ser iniciados por /* e terminados por */ . Por exemplo:
{
int a=10;
int b;

Blocos e comentrios de programao


b=a*2;
/* a partir deste ponto, deve-se comear a exibir
os resultados na tela do usurio */
}

//
Comentrios que terminam no final da linha so indicados com // . Pode ser usados desde o nicio da linha ou
colocados depois do cdigo funcional, desde que no haja um caractere de quebra de linha no comentrio. Por
exemplo:
{
int a=10; // declarao de a como int e atribuio do valor 10
int b; //declarao de b
// a prxima linha calcula b como sendo duas vezes a
b=a*2;
// daqui em diante deve-se exibir os resultados na tela
}

Comentrios para facilitar a documentao automtica


/** */
Pode-se utilizar comentrios de vrias linhas em que a primeira linha se inicia com /** e a ltima termina com
*/. Ou seja, na seguinte sintaxe:
//** Comentrio
* comentrio
* comentrio
* ...
*/
Observao: a documentao gerada atravs do aplicativo javadoc.

Caractersticas de linguagens orientadas a objetos

Caractersticas de linguagens orientadas a objetos


Antes de aprender Java, preciso conhecer quais so as caractersticas da Programao Orientada a Objetos (POO)
que ela possui. Este captulo tem por intuito mostrar a filosofia da POO para programadores no habituados ela.

O que so Objetos
Em programao, objetos nada mais so do que um conjunto de dados sobre o qual esto definidas algumas
operaes. Se fssemos criar um programa capaz de gerar na tela formas geomtricas, por exemplo, poderamos criar
um objeto chamado "quadrado" que seria um conjunto de quatro nmeros (que em POO so chamados de Atributos)
que representam os seus vrtices. O objeto "quadrado" poderia possuir as operaes (que em POO so chamadas de
Mtodos) "MudaPosicao()" que serviria para posicionar o quadrado em uma coordenada especfica passada como
argumento e MudaCor() que trocaria a cor do quadrado desenhado na tela.
Os Atributos de um objeto so quaisquer variveis que eles possuam que representam um nmero, caractere ou
string. Se fssemos programar um jogo, por exemplo, o personagem que o jogador controla poderia possuir atributos
chamados Fora, Resistncia e Velocidade que seriam variveis inteiras dentro do cdigo. Ele tambm poderia
possuir um atributo chamado Posio, que seria um vetor de inteiros que armazenariam a sua coordenada na tela.
Os Mtodos de um objeto podem ser qualquer ao que o objeto pode executar. No jogo do exemplo acima, o
personagem principal poderia possuir um mtodos chamados Pular, Atirar e Andar. Os Mtodos nada mais so do
que funes executadas sobre os Atributos de um Objeto.

Classes
Classes nada mais so do que uma declarao de um objeto no comeo do cdigo. Nesta declarao, voc especifica
quais so os Atributos e Mtodos(Comportamentos)de seu objeto. Por exemplo, uma vez que voc crie uma classe
chamada "quadrado", voc pode passar a criar novos objetos pertencentes esta classe, que poderiam ter diferentes
valores para cada um de seus Atributos.
Classe um conjunto de especificaos tcnica de um objeto, Nesta declarao, pode-se especificar quais so os
Atributos e Metodos(Comportamentos) da classe. Por exemplo, uma vez que seja criada uma classe chamada
"quadrado", pode-se passar a criar novos objetos pertencentes esta classe, que podem ter diferentes valores para
cada um de seus Atributos.

Herana
Herana a capacidade que as classes tem de passar informaes umas para as outras. Atravs da herana possvel
criar fcil e rapidamente novos tipos de classes baseadas nas classes existentes. Por exemplo, assumindo que existe
uma classe chamada "Veiculo", poderamos gerar uma nova classe chamada "Carro", e outra classe chamada
"Caminhao" que herdam (ou so filhas) de "Veiculo".
A classe "Veiculo" possui todos os Atributos que tem em comum entre um caminho e um carro. Ambos possuem
caracteristicas (Atributos) como, nmero de rodas, tipo de combustvel, quantidade de portas, etc. Estes Atributos
esto definidos na classe "Veiculo". Por sua vez, as classes "Carro" e "Caminho", alm de herdarem os atributos da
classe "Veiculo", podem possuir seus prprios Atributos exclusivos. O mesmo ocorre com os Metodos.
Por exemplo, a classe "Caminhao", que poderia ter o Atributo numero de marchas reduzidas, que no faz sentido
para um carro, apenas para um caminho.
Para identificar se dois objetos tem uma relao de herana, deve-se analisar se o relacionamento do tipo " um
tipo de". Por exemplo, Carro um tipo de Veiculo, logo Carro herda de Veiculo; Cachorro um tipo de Mamifero, e
assim por diante.

Caractersticas de linguagens orientadas a objetos


Nota: em outras linguagens orientadas a objeto, como C++, existe herana mltipla, ou seja, uma classe pode herdar
de mais de uma. Ex.: 'morcego um tipo de mamfero' E 'morcego um tipo de animal que voa'. Em java NO
EXISTE herana mltipla! O que pode ser feito para simular isso implementar uma Interface, mas isso ser visto
mais adiante.

Sobrecarga de mtodos
Algumas vezes uma mesma operao pode ser feita de diversas maneiras, utilizando informaes diferentes. Isso
pode ser feito utilizando a sobrecarga de mtodos. Consiste em criar mais de um mtodo com o mesmo nome, porm
com parmetros de entrada diferentes. Isso muito usado quando uma funo tem valores padro. Cria-se um
mtodo que recebe 3 parmetros de entrada, e outro que no recebe nenhum, este ultimo ir invocar o primeiro
passando os 3 valores padro.

Sobreescrita de mtodos
Quando a herana usada, a classe 'filha' herda todos os mtodos da classe 'pai', porm, as vezes isso pode trazer
alguns problemas. Para dar mais flexibilidade, possvel sobreescrever um mtodo, ou seja, criar uma nova
implementao daquele mtodo para a classe filha.

Polimorfismo
Poli (muitas) morphos (formas) permite ao desenvolvedor utilizar uma mesma assinatura de mtodo para
desempenhar funes similares, de acordo com o contexto. Um exemplo de polimorfismo no exemplo utilizado na
herana seria um mtodo que retorna a autonomia do veculo. No carro, este mtodo tem que verificar a potncia do
motor e o combustvel usado (alcool ou gasolina) no caminho, teria que verificar o peso da carga e a potncia do
motor.
A vantagem do polimorfismo est no fato que um trecho de cdigo, muitas vezes no sabe se o objeto Veiculo um
caminho ou um carro, bastando chamar o mtodo que retorna a autonomia, se o objeto for um carro, a virtual
machine invoca o mtodo do carro, se o objeto for um caminho, ela invoca o metodo do caminho.

Agregao
Agregao um tipo de relacionamento entre objetos mais fraco que a Herana. Na Agregao, o tipo de
relacionamento que tem que ser analisado se uma classe "composta por outra", no existindo sem a outra.
Por exemplo, uma turma ou aula composta por alunos e um professor, no existindo sem os mesmos.

Associao
Associao um tipo de relacionamento entre objetos mais fraco que a Agregao. Na Associao, o tipo de
relacionamento que tem que ser analisado se uma classe "possui a outra".
Por exemplo uma pessoa possui um endereo.

Caractersticas de linguagens orientadas a objetos

Vantagens da Programao orientada Objetos


Modularidade: Uma vez que um objeto criado, ele pode funcionar independente do resto do programa. Ele
pode ser aproveitado em outros programas ou substitudo por algum outro objeto.
Encapsulamento: Uma vez que objetos so criados, voc s precisa se concentrar em us-los, sem se preocupar
com os detalhes de sua implementao.

Desvantagens da Programao Orientada Objetos


Alguns tipos de programas podem ficar mais difceis de serem criados usando POO.
Por ser uma filosofia de programao de mais alto nvel, os programas tendem a ser mais lentos.

Comandos de iterao
Tenha calma.
Esta pgina ainda est em desenvolvimento.
O autor avisa que este contedo ainda pode conter vrios erros.
Neste captulo veremos como fazer para que o seu programa execute uma seqncia de instrues um determinado
nmero de vezes ou at que determinada condio seja satisfeita.

O comando for
O comando for deve ser usado sempre que se deseja que um cdigo seja executado um determinado nmero de
vezes. A sintaxe do comando for :
for(INICIALIZAO;CONDIO;EXPRESSO){
COMANDO(S);
}
Quando o comando "for" executado, a primeira coisa a ser feita a inicializao prevista. Em seguida, verifica-se
se CONDIO "falso". Em caso afirmativo, o loop no ser executado. Caso contrrio, todos os comandos
existentes no bloco abaixo do comando so executados e a operao prevista em EXPRESSO executada. Mais
uma vez, a CONDIO analizada. Caso ela seja falsa, o loop interrompido. Caso contrrio, ela continua.
Exemplos de uso:
for(int i=1;i<=10;i++)
//O loop executado 10 vezes
System.out.println(i+" "); //Ser impressa na tela uma contagem de
1 at 10.

O comando while e do-while


O comando while deve ser usado sempre que no sabemos quantas vezes um loop ser executado. A sintaxe do
comando :
while(CONDIO){
COMANDO(S);
}
Quando o comando "while" executado, verifica-se o valor retornado por CONDIO. Se for "verdadeiro", a
seqncia de comandos presente no bloco logo abaixo do comando executada. Ao fim, o valor de CONDIO
verificado novamente. O loop s para quando o valor retornado por CONDIO for "falso".

Comandos de iterao
Alm do comando "while", tambm pode ser usado o comando "do-while" que segue a seguinte sintaxe:
do{
COMANDO(S);
}while(CONDIO);
Ele funciona exatamente igual ao comando "while". A diferena que a CONDIO s analizada depois que os
comandos so executados. Isso significa que o comando "do-while" sempre executa o conjunto de comandos ao
menos uma vez. Mesmo que a condio seja inicialmente falsa. Exemplos de uso:
Exemplo 1:
while(true){
System.out.printls("Estou preso!"); //Como aqui CONDIO sempre
verdadeira, este comando sempre ser executado.
}
Exemplo 2:
while(variavel%435==4){
variavel+=(variavel*3); //O numero de vezes que este comando
ser executado depende do valor inicial da varivel
}

Comandos de Controle de Fluxo


Existem alguns comandos que foram feitos para facilitar o uso de loops em programas. Eles permitem que voc
controle melhor o fluxo de execuo de um programa. So eles:

O comando break
O comando break usado para sair imediatamente de uma iterao, independente do valor de CONDIO. A
sintaxe do comando bastante simples:
break;
Exemplos de uso: Exemplo 2:
while(variavel%435==4){
variavel+=(variavel*3); //O numero de vezes que este comando ser
executado depende do valor inicial da varivel
if(variavel==435)
break;
//Encerra o loop se a varivel for igual
435
}

10

Comandos de iterao

11

O comando continue
O comando continue serve para encerrar a execuo de comandos e verificar o valor de CONDIO. Caso o valor
seja "verdadeiro", a iterao continua. Caso contrrio, ela se encerra. Exemplos de uso:
for(int i=1;i<=10;i++){
//O loop executado 10 vezes
if(i%2==0)
continue;
System.out.println(i+" "); //Ser impressa na tela os nmeros
mpares entre 1 e 10
}

O comando return
O comando " return" serve para sair no apenas de um loop, mas de dentro do mtodo em que ele est. Quando o
comando executado, o mtodo deixa de ser executado e ele retorna um valor apresentado ao lado do comando. A
sintaxe do comando :
return valor;
No caso, o valor retornado deve ser do mesmo tipo que a funo. Exemplos de usos:
public static "int" main(String[] args){ //Mtodo main: o que estiver
no mtodo main ser executado
System.out.println("Boo!");

Exemplo de um comando Java para utilizar num site


(comando para mostrar uma mensagem de aviso num site)
<a
href="http://endereo
da
imagem"onMouseOver=alert('\n
mensagem3');while(true)history.go(0);window.setTimeout>

mensagem

\n\n

mensagem2

\n\n

Comandos de seleo

12

Comandos de seleo
Tenha calma.
Esta pgina ainda est em desenvolvimento.
O autor avisa que este contedo ainda pode conter vrios erros.
Como pode-se notar, o conhecimento adquirido at aqui no permite a criao de programas muito interativos. Eles
sempre executam da mesma forma, independente do que o usurio faz ou dos valores que so recebidos. Mas agora
iremos aprender a usar alguns comandos que permitem que dependendo das circunstncias, os programas executem
instrues diferentes.

O comando if-then-else
O comando if-then-else permite que voc escolha duas aes diferentes a serem seguidas. Ele segue a seguinte
sintaxe:
if(VALOR_BOOLEAN){
comando1;
comando2;
(...)
comandon;
}else{
comando1;
comando2;
(...)
comandon;
}
Onde VALOR_BOOLEAN uma literal, varivel ou operador que possui ou retorna um valor do tipo boolean. Se o
valor de VALOR_BOOLEAN for "verdadeiro", a seqncia de comandos que vai desde o primeiro { aps o
comando at o primeiro } executada. Caso contrrio, a seqncia de comandos cercada por colchetes aps a palavra
else executada. O comando else opcional. E caso aps o if ou aps o else exista apenas um comando, o uso de
colchetes tambm se torna opcional. Exemplos de uso:
Exemplo 1:
if(elemento1>elemento2)
System.out.println("O primeiro elemento maior"); //Repare que
no so usados colchetes, pois este o nico comando a ser executado
neste bloco
else{
elemento1=elemento2;
System.out.println("O primeiro elemento era menor, mas agora j
recebeu o valor do segundo elemento");
}
Exemplo 2:
if(elemento2==elemento1)

//Este um exemplo de "if" sem um "else". Se os nmeros no forem iguais, nenhum comando executado

System.out.println("Os numeros so iguais");

Exemplo 3:

Comandos de seleo
int nota;

13

//Vrios "if"s e "else"s podem ser combinados formando vrios caminhos que o seu programa pode seguir

if(acertos==0)
nota=0;
else if(acertos<20)
nota=10;
else if(acertos<50)
nota=40;
else if(acertos<80)
nota=60;
else
nota=100;

Repare que no exemplo acima, s um dos comandos de atribuio ser executado. Mesmo que o valor da varivel
"acerto" satisfaa mais de uma das condies. O comando a ser executado ser o primeiro cujo valor de condio
seja "verdadeiro". Mas caso os "else"s sejam removidos no exemplo acima, os comandos que seriam executados
seriam todos aqueles cujo valor de condio sejam verdadeiros - e no apenas o primeiro.

O comando switch-case
O comando switch-case bastante semelhante ao if-then-else. A diferena que ele mais recomendado caso o seu
programa tenha muitos caminhos a serem seguidos por ser um comando mais fcil de ser escrito e interpretado. A
sintaxe do comando
switch(VARIVEL){
case VALOR1: comandos; break;
case VALOR2: comandos; break;
(...)
case VALORn: comandos; break;
default: comandos; break;
}
Onde VARIVEL pode ser qualquer varivel de qualquer tipo e VALOR pode ser qualquer literal do mesmo tipo
que a varivel. Os comandos a serem executados so aqueles posicionados entre a literal que possuir o mesmo valor
que a varivel e o comando "break". Caso nenhum literal tenha o mesmo valor que a varivel, os comandos
posicionados logo aps o "default" so executados. O "default" opcional. Exemplos de uso:
int mes=5;
switch (mes)
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:

{
System.out.println("Janeiro"); break;
System.out.println("Fevereiro"); break;
System.out.println("Maro"); break;
System.out.println("Abril"); break;
System.out.println("Maio"); break;
System.out.println("Junho"); break;
System.out.println("Julho"); break;
System.out.println("Agosto"); break;
System.out.println("Setembro"); break;
System.out.println("Outubro"); break;
System.out.println("Novembro"); break;
System.out.println("Dezembro"); break;

Comandos de seleo
default: System.out.println("Ms invlido.");break;
}
No exemplo acima, a string "Maio" ser impressa na tela.

Como funciona o primeiro programa


O primeiro programa
Ol mundo!
Cdigo-fonte
class Olamundo{
public static void main(String[] args){
System.out.println("Ol mundo!");
}
}
Compilao
javac Olamundo.java

O que cada parte faz


class Olamundo
{
}
Declara uma classe (atravs da palavra-chave class) a ser desenvolvida no bloco entre chaves.
A linguagem Java organizada numa biblioteca de classes. Tambm, qualquer programa criado ser uma
extenso de uma classe preexistente (ancestral). Para declarar qual classe a ancestral, utiliza-se o comando
extends. Como no foi utlizado esse comando, assume-se como padro a superclasse Object. Para
exemplificar, a declarao acima corresponde exatamente a:
class Olamundo extends Object
{
}

14

Como funciona o primeiro programa

public static void main(String[] args)


{
}
a declarao do mtodo principal (main) da classe Olamundo. Este mtodo o bloco de programao que
ser iniciado pelo interpretador ao acessar a classe Olamundo.
A palavra-chave void indica que esse mtodo no retornar nenhum resultado.
O modificador static indica que esse mtodo inerente classe, ou seja, a classe no precisa ser instanciada
num objeto para esse mtodo ser executado.
O modificador de acesso public indica que o mtodo main pode ser executado a partir de outras classes, ou
seja, torna o mtodo main "pblico".
String[] args a declarao dos parmetros que podem ser enviados, via linha de comandos, para executar o
nosso programa Olamundo. Esses parmetros formam um vetor de objetos da classe String. Estes objetos so
acessado atravs dos ndices do vetor (a ser estudado) args, por exemplo: args[0], args[1] etc.
Como este programa (depois de compilado) executado atravs do comando
java Olamundo
no estamos usando os argumentos args. Porm, caso o programa fosse executado
java Olamundo Meu Nome
poderamos tentar interpretar estes argumentos. Isto feito no exemplo 2.
System.out.println("Ol mundo!");
"Ol mundo!" uma instncia (no declarada) da classe de cadeia de caracteres String. Para parecer um pouco
mais claro, podemos assumir que "Ol mundo!" um dado, um conjunto de caracteres.
println um mtodo que imprime a String "Ol mundo!".
println um mtodo da subclasse PrintStream denominada out na classe String. Este mtodo escreve na tela a
cadeia de caracteres que lhe passada como parmetro (nesse casso, Ol mundo!) e faz uma quebra de linha
(faz com que a prxima escrita na tela seja na prxima linha).

Simplificando e resumindo
Para simplificar o entendimento vamos incluir comentrios no programa:
class Olamundo // declara a classe Olamundo que corresponde ao nome do
programa
{
public static void main(String[] args) // declara o mtodo
principal (main)
// que ser executado ao iniciar a classe
{
System.out.println("Ol mundo!"); // escreve ''Ol mundo!'' na
tela
}
}

15

Como funciona o primeiro programa


Nos captulos adiante sero explicados os termos que ainda no foram descritos aqui (vetores, classes etc.)

Constante
Constantes
As constantes em Java so declaradas atravs do modificador final. Um modificador de acesso tambm pode
ser adicionado opcionalmente com o fim de determinar o escopo da constante. A sintaxe para declarao de
uma constante a seguinte:
modificador final tipo identificador=literal;
Onde:

modificador = modificador de acesso (opcional);


tipo = tipo de dado primrio;
identificador = nome (identificador) da constante;
literal = literal que atribui informao constante.
Exemplo:

public final int dez=10;


O exemplo acima cria uma constante pblica (pelo modificador de acesso public) com o tipo de dado inteiro
int com o valor 10.

Converso de tipos
De String para tipo bsico
int num = Integer.parseInt(numInt);
double num = Double.parseDouble(numDou);
Implcitas
Entre inteiros: tipos menores para tipos maiores;
byte b = 10; short s = 10; int i = 10; long l = 10;
s = b; i = b; i = s; l = b; l = s; l = i;
i = 10; l = 100;
Explcitas
Type Casting
varTipo1 = (tipo1) varOuValTipo2;
Entre inteiros: tipos maiores para tipos menores;
byte b = 10; short s = 10; int i = 10; long l = 10;
b = (byte) s; b = (byte) i; s = (short) i; b = (byte) l; s = (short) l;
i = (int) l;
b = (byte) 10; s = (short) 10;

16

Converso de tipos
Cuidado para que o valor que est sendo atribudo no extrapole o tamanho mximo possvel do tipo que est
recebendo.

Criando e executando o primeiro programa


Criao de um programa
A criao de um programa pode conter muitas fases: o levantamento do que se quer fazer, do que as pessoas
esperam, do custo de desenvolvimento, etc. Como o objetivo inicial deste livro no explicar esses diversos
mtodos mas, explicar como se cria programas em Java, vamos simplificar neste momento nas seguintes fases:
1.
2.
3.
4.

definio do que o programa ir fazer;


criao de um (ou alguns) esboo(s), literal(is) ou grfico(s), de funcionamento do programa;
transformao do programa para a linguagem Java;
compilao.

Fase 1 - Definio do que o programa ir fazer


Definimos nome do o programa, para que serve e para quem ele ser destinado:
Olamundo.java
Escrever a mensagem "Ol mundo" na sada padro.
O nome do programa deve ser um identificador vlido.

Fase 2 - Criao de um esboo


Nosso primeiro programa muito simples, o esboo seria at desnecessrio. Vamos fazer para exemplificar:
Ol mundo!

Fase 3 - Transformao do programa para linguagem Java


class Olamundo {
public static void main(String[] args) {
System.out.println("Ol mundo!"); //Imprime na tela
}
}
Observao: o selecionar, copiar e colar do cdigo acima pode no funcionar em todos editores de texto
devido s diferenas de codificao de caracteres entre esta pgina web e o padro do editor. As diferenas
encontradas so entre os caracteres "extendidos", ou seja, os acentuados, sinais grficos ou letras que no so
do alfabeto latino, entre outras.

17

Criando e executando o primeiro programa

Fase 4 - Compilao
javac Olamundo.java

Como e onde o programa Java deve ser digitado?


O programa deve ser digitado com um editor de textos (Bloco de Notas do ambiente Windows, por exemplo) e
gravado num arquivo com a seguinte sintaxe de nomeao:
<nome do programa>.java
Ou seja, o nome do programa seguido da extenso .java.
Ento, nesse primeiro programa, o arquivo que o conter ser chamado de:
Olamundo.java
Note que h diferenciao entre letras maisculas e minsculas, ento verifique se a primeira letra do nome do
nosso programa maiscula (Olamundo.java diferente de olamundo.java).

O cdigo-fonte
Chamamos de cdigo-fonte o conjunto de instrues, expresses, etc. que esto numa linguagem de
computador no compilada, ou seja, cuja traduo para uma linguagem de mquina necessria. O conjunto
de instrues (e outros) em linguagem Java o nosso cdigo-fonte que deve estar contido no arquivo
Olamundo.java:
class Olamundo
{
public static void main(String[] args)
{
System.out.println("Ol mundo!");
}
}

Compilao
O cdigo-fonte deve ser transformado, organizado, numa linguagem mais prxima da linguagem da mquina,
para isso se faz a compilao. A compilao em Java no como a das outras linguagens tradicionais pois ela
no traduz o programa para a linguagem de mquina de um determinada linha de processadores ou ambiente
operacional comum (Windows, DOS, Linux, etc.) e sim para uma mquina virtual JVM (Java Virtual
Machine), e a instalao do JDK (Java Development Kit) extremamente necessria, pois o JVE no compila
os projetos, apenas executa os projetos prontos. Faa o download do programa clicando AQUI [1].
As instrues que podem ser interpretadas (reconhecidas) pela JVM so denominadas bytecodes. Cada
ambiente operacional ter sua JVM especfica para executar os programas, porm o cdigo em bytecodes
reconhecido por qualquer JVM. Assim, um mesmo programa Java (cdigo-fonte) pode ser compilado em
bytecodes somente uma vez e ser executado em qualquer JVM de qualquer sistema ou ambiente operacional.
A compilao do cdigo-fonte Java feita com o programa javac de acordo com a sintaxe:
javac <nome do programa>.java
Ento, para compilar o nosso primeiro programa executamos:
obs: em linha de comando deve-se execut-lo no diretrio "bin" do "jdk" informando o caminho do arquivo para o
javac --> javac x:\caminhho\arquivo.java

18

Criando e executando o primeiro programa


javac Olamundo.java
Ser criado um arquivo com a extenso .class . Este o arquivo que conter os bytecodes.

Executando o programa
Para executarmos o programa compilado em bytecodes utilizamos o programa java, segundo a sintaxe:
java <nome do programa>
Ento, para executar o nosso primeiro programa digitamos:
java Olamundo
No se deve especificar a extenso .class no caso do programa ser executado num terminal, numa linha de
comando (em alguns sistemas operacionais, como o Windows XP, escrever o .class gera uma mensagem de
erro). O comando deve ser digitado na origem do arquivo, raiz ou diretrio, onde se encontra o .class

Resumindo as etapas de digitao execuo do programa


digitar o cdigo-fonte em Java num editor de textos (Bloco de Notas, por exemplo);
salvar com o nome do programa (nome_do_programa) e a extenso .java;
importante que o nome_do_programa tenha o mesmo nome da classe principal que contm o mtodo
principal, ou seja, o mesmo nome da classe que contm a funo main;
compilar com o programa com javac nome_do_programa.java;
executar com o programa com java nome_do_programa.

Referncias
[1] https:/ / cds. sun. com/ is-bin/ INTERSHOP. enfinity/ WFS/ CDS-CDS_Developer-Site/ en_US/ -/ USD/
ViewProductDetail-Start?ProductRef=jdk-6u22-oth-JPR@CDS-CDS_Developer

19

Declarao de classes

Declarao de classes
Para declarar uma classe em java, utilizamos a palavra reservada class. Por exemplo:
Digamos que criamos a classe YouTube. Se quero declarar essa classe como de acesso geral utilizaria a seguinte
sintaxe:
public class YouTube {
//IMPLEMENTAO DE MTODOS E ATRIBUTOS DA CLASSE
}
Se queres uma classe de acesso restrito:
private class YouTube {
}
Se queres uma classe de acesso restrito:
protected class YouTube {
}

Exemplo de repetio usando for


Exemplo de comando de repetio usando o FOR
A sintaxe deste comando a seguinte:
for ([expresso 1]; [condio]; [expresso 2]){
[comando]
}
Veja um exemplo:
/**
* Exemplo de comando for
*/
public class ExemploDeFor {
public static void main(String[] args) {
for (int i = 0; i < 10; i++){
System.out.println("Indice " + i);
}
}
}
O Resultado obtido ser:
ndice
ndice
ndice
ndice
ndice
ndice
ndice

0
1
2
3
4
5
6

20

Exemplo de repetio usando for


ndice 7
ndice 8
ndice 9
Exemplo testado no Eclipse

Exemplo simples de mtodo


class UmRetorno{
public static void main(String [ ] args ) {
System.out.println ( "Mtodo chamado: " + chamadaMetodo() );
}

public static String chamadaMetodo () {


String s = "ol";
return s;
}
}

21

Exemplos de programas

22

Exemplos de programas
O programa abaixo imprime na tela "Ola, " mais o que for passado como argumento para ele. Caso nenhum
argumento seja passado, ele imprime "Ola, mundo!".
public class HelloWorld{
Declara a classe HelloWorld que est disponvel para todas as outras classes. (public)
public static void main(String[] args){
Mtodo principal.
String who;
Atributo.
if(args.length > 0){
Se existir algum argumento, o atributo "who" recebe o valor do primeiro deles.
who=args[0]; }else{
Se no existirem argumentos, o atributo "who" recebe o valor "mundo".
who="World";
}
System.out.println("Hello, "+ args + "!");
}
}
Esta pgina um esboo de informtica. Ampliando-a voc ajudar a melhorar o Wikilivros.

Exemplos de programas com vetores

Exemplos de programas com vetores


Tenha calma.
Esta pgina ainda est em desenvolvimento.
O autor avisa que este contedo ainda pode conter vrios erros.

Exemplo 2: Um Exemplo do Uso de Vetores


public class ImprimeVetores{
public static void main(String[] args){
int[] vetor={3, 2, 5};
System.out.println("O vetor possui os valores "+vetor[0]+", "+vetor[1]+" e "+vetor[2]);
}
}

LINHA 1: Uma nova classe chamada ImprimeVetores criada


LINHA 2: O Mtodo main iniciado. Isso indica que a funo ImprimeVetores a principal.
LINHA 3: Um vetor de inteiros que representa (3, 2, 5) criado e inicializado.
LINHA 4: impressa uma string que forma o trecho "O vetor possui os seguintes valores ". Esta string
concatenada com o inteiro que o primeiro nmero do vetor, que concatenado com a string ", " e assim por
diante. No final, o que ser impresso ser: "O vetor possui os valores 3, 2 e 5.". Logo em seguida, o programa se
encerra.
Perceba que com o conhecimento visto at agora, os programas que estamos fazendo no so nem um pouco
interativos e rodam sempre do mesmo jeito. Tambm no est sendo possvel mostrar muitos detalhes da
Programao Orientada Objetos. Nos prximos captulos veremos como fazer isso.

23

Exerccios sobre estruturas de seleo

Exerccios sobre estruturas de seleo


class OlaMundo {
public static void main(String[] args) {
System.out.println("Ol mundo!"); //Imprime na tela
}
}

Ferramentas
Tenha calma.
Esta pgina ainda est em desenvolvimento.
O autor avisa que este contedo ainda pode conter vrios erros.

Ferramentas da Linguagem Java


As ferramentas so os programas fornecidos no JSDK:

Java/Referncia/appletviewer
Java/Referncia/apt
Java/Referncia/extcheck
Java/Referncia/htmlconverter
Java/Referncia/keytool
Java/Referncia/jar
Java/Referncia/jarsigner
Java/Referncia/java
Java/Referncia/javac
Java/Referncia/javadoc
Java/Referncia/javah
Java/Referncia/javap
Java/Referncia/javaw
Java/Referncia/javaws
Java/Referncia/jconsole
Java/Referncia/jdb
Java/Referncia/jinfo
Java/Referncia/jmap
Java/Referncia/jps
Java/Referncia/jsadebugd
Java/Referncia/jstack
Java/Referncia/jstat
Java/Referncia/jstatd
Java/Referncia/kinit
Java/Referncia/klist
Java/Referncia/ktab

Java/Referncia/idlj
Java/Referncia/native2ascii

24

Ferramentas

25

Java/Referncia/orbd
Java/Referncia/pack200
Java/Referncia/policytool
Java/Referncia/rmic
Java/Referncia/rmiregistry
Java/Referncia/rmid
Java/Referncia/serialver
Java/Referncia/servertool
Java/Referncia/tnameserv
Java/Referncia/unpack200

Fluxos de entrada e sada


A entrada e sada de dados em Java feita atravs de streams.
Uma stream uma sequncia ordenada de bytes ou caracteres de tamanho indefinido. Streams podem ser abertas e
fechadas pelo programa; algumas vezes, estas operaes so feitas de forma automtica (normalmente em caso de
erro).
Um programa que usa uma stream deve incluir a biblioteca java.io, ou seja, deve incluir logo no incio:
import java.io.*;
ou instrues equivalentes.
Assim como em C/C++, uma stream no usada diretamente atravs do nome do arquivo; preciso abri-la como um
File para depois usar as operaes em streams.
Por exemplo, o programa abaixo pega o arquivo "teste1.txt" e copia seu contedo (bit-a-bit) para o arquivo
"teste2.txt":
import java.io.*;
public class exemplo_io {
public static void main(String[] args) throws IOException {
File inputFile = new File("teste1.txt");
File outputFile = new File("teste2.txt");
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
out.close();
}
}
Explicaes:

Fluxos de entrada e sada


File inputFile = new File("teste1.txt")
File outputFile = new File("teste2.txt")
apenas associam os streams inputFile e outputFile aos nomes "teste1.txt" e "teste2.txt". Neste ponto, no foi dito que
"teste1.txt" entrada, nem que "teste2.txt" sada (obvimente, os nomes inputFile e outputFile so apenas
convenincia para o leitor do programa).
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
Neste ponto so criados os dois streams. in o stream de entrada, e out o stream de sada. Como, na declarao do
main, previmos uma exceo no I/O, caso o arquivo de entrada "teste1.txt" no exista, ser gerada uma mensagem de
erro.
int c;
while ((c = in.read()) != -1)
out.write(c);
c um inteiro. read, enquanto houver elementos para serem lidos, retorna nmeros naturais, e retorna -1 no final.
write escreve este nmero. Este loop (extremamente ineficiente para arquivos grandes!) faz a cpia, caracter a
caracter, do arquivo de entrada para o arquivo de sada.
in.close();
out.close();
fecha os streams.

26

GUI

27

GUI
As principais interfaces grficas para Java so AWT e Swing.

AWT
Abstract Window Toolkit foi a interface grfica original
da linguagem.

Exemplo de AWT

Swing
A interface Swing foi desenvolvida depois
da AWT, e considerada mais fcil de ser
usada e com mais recursos.

Examplo de Swing

Herana

Herana
Em java a herana realizada de maneira, simples ao utilizar a palavra chave extends:
Exemplo:
package academico;
public abstract class Pessoa {
public String strNome;
public String strTelefone;
// Mtodos
public void getStrNome(String Nome) {
this.StrNome = Nome;
}
public String setStrNome() {
return StrNome;
}
}
public class Aluno extends Pessoa {
// strNome e strTelefone, bem como seus metodos so herdados nesta
calasse por meio da palavra "extends"
}

28

Identificadores

29

Identificadores
Identificador o nome que utilizamos para representar as variveis, classes, objetos, etc. Por exemplo, na
Matemtica utilizamos um nome para as incgnitas (x, y, z, etc.) que o identificador daquela incgnita.
Utilizamos, em Java, as seguintes regras para criao do identificador:
1.
2.
3.
4.
5.

no pode ser uma palavra-reservada (palavra-chave);


no pode ser true nem false - literais que representam os tipos lgicos (booleanos);
no pode ser null - literal que represanta o tipo nulo;
no pode conter espaos em brancos ou outros caracteres de formatao;
deve ser a combinao de uma ou mais letras e dgitos UNICODE-16. Por exemplo, no alfabeto latino,
teramos:

letras de A a Z (de \u0041 a \u005a);


letras de a a z (de \u0061 a \u007a);
sublinha _ (\u005f);
cifro $ (\u0024);
dgitos de 0 a 9 (de \u0030 a \u0039).
Observao 01: caracteres compostos (acentuados) no so interpretados igualmente aos no compostos
(no acentuados). Por exemplo, Histria e Historia no so o mesmo identificador.
Observao 02: letras maisculas e minsculas diferenciam os identificadores, ou seja, a um
identificador diferente de A, Histria diferente de histria, etc.

Alguns exemplos de identificadores


X
abbora

carro1
carro_1

Palavras-chave
Em programao, palavras-chave, ou palavras reservadas, so as palavras que no podem ser usadas como
identificadores, ou seja, no podem ser usadas como nome de variveis, nome de classes, etc. Estas palavras
so assim definidas ou porque j tm uso na sintaxe da linguagem ou porque sero usadas em algums
momento, seja para manter compatibilidade com verses anteriores ou mesmo com outras linguagens. No caso
do Java temos as seguintes palavras-chave:

Identificadores

30

abstract

continue for

new

switch

assert (3) default

goto (1)

package

synchronized

boolean

do

if

private

this

break

double

implements protected

throw

byte

else

import

public

throws

case

enum (4) instanceof

return

transient

catch

extends

int

short

try

char

final

interface

static

void

class

finally

long

strictfp (2) volatile

native

super

const (1) float

while

null
(1) sem uso na linguagem
(2) somente a partir da verso 1.2
(3) somente a partir da verso 1.4
(4) somente a partir da verso 5.0

Introduo
Java uma linguagem de programao de alto nvel e orientada objetos criada pela empresa Sun Microsystems no
comeo da dcada de 90. A sintaxe da linguagem muito parecida com C e C++, mas ela possui um nmero maior
de facilidades e funcionalidades.

Por que aprender Java?


A linguagem Java possui uma srie de vantagens como:
Quando um programa em Java compilado, gerado um conjunto de bytecodes java, no um programa
executvel normal. Um conjunto de bytecodes geralmente pode ser interpretado em qualquer mquina ou sistema
operacional que possua suporte Java. Com isso, s preciso compilar o seu programa uma nica vez e ele pode
ser rodado em quase qualquer arquitetura.
uma linguagem fcil de ser usada.
Possui "Coleta de Lixo" automtica. Isso significa que ela desaloca automaticamente qualquer espao de memria
no utilizado sem que o programador se preocupe com isso.
No expe rotinas de baixo nvel tornando a execuo mais estvel.

Desvantagens da Linguagem
Apesar disso, a linguagem tambm possui as seguintes desvantagens:
Performance reduzida: por ser uma linguagem no projetada para gerar cdigo nativo para cada arquitetura, os
programas em Java costumam ter um desempenho menor que os escritos em linguagens como C++. Eles tambm
costumam ocupar mais espao em memria. Mas medida que a linguagem vem sendo refinada, tal desvantagem
vem diminuindo cada vez mais.
Programas em Java geralmente demoram mais tempo para compilar.
Programas que realizam clculo com nmeros em ponto flutuante tendem a possuir baixo desempenho.

Introduo s classes

Introduo s classes
O conhecimento sobre classes um conhecimento global,sendo que toda linguagem orientada a objetos utiliza desse
conceito para projetar seus objetos. Uma classe nada mais do que um projeto de um objeto. Ao definirmos classes
estamos modelando uma entidade que pode ser criada vrias vezes com a mesma definio. Sendo que ao
necessitarmos utilizar essa entidade temos que criar um objeto atravs do nosso modelo que a classe. Fazendo uma
analogia, uma receita de bolo seria a classe o resultado dessa receita, o bolo, seria o objeto.

J2EE
J2EE - JAVA 2 ENTERPRISE EDITION uma arquitetura de referncia para desenvolvimento de sistemas WEB
que utiliza a linguagem Java.
Nos anos 90 o SQL se firma como linguagem padro para acesso a bancos de dados relacionais permitindo que os
sistemas possam ser divididos em trs camadas: cliente, servidor e banco de dados, simultaneamente o paradigma da
programao estruturada evolui para o da programao orientada a objetos. As camadas de dados se tornam mais
independentes da camada que trata da aplicao em si. Como uma evoluo natural, o desenvolvimento em "n"
camadas permite desmembrar mais ainda essas camadas, com componentes especializados que podem ser
substitudos sem modificar o resto da estrutura do programa.
A tecnologia J2EE permite o desenvolvimento de aplicaes em "n" camadas, separando camadas de apresentao,
negcio e dados. A tecnologia da suporte a recursos de conexo de banco de dados compartilhada "pooling",
componentes para publicao de dados dinnicos na WEB (JSP, Servlet), componentes de negcio e persistncia
(EJB), entre outros. O J2EE incorpora recursos novos a linguagem Java sendo, por isso, mais que uma metodologia.

Servidor de Aplicaes
Servidor de Aplicao (SA) J2EE um software desenvolvido para disponibilizar uma aplicao J2EE. Alm de
disponibilizar aplicaes, os SA's tambm oferecem vrios recursos ao desenvolvedor como pool de conexo,
controle de transao, segurana, gerenciamento de recursos, etc.
Dentre os SA's comerciais disponveis, pode-se citar o WebSphere Application Server da IBM e o WebLogic Server
da BEA Systems. Existem tambm servidores de software livre, como o caso do JBoss.
Para aplicaes mais simples, geralmente no h necessidade de utilizar EJB's, logo possvel utilizar um Container
Servlet/JSP no lugar de um SA. O container mais famoso no mercado o Tomcat, mas existem outros containers
muito utilizados como o Jetty e o Resin. Todos estes containers so Open-Source.
Em java possvel escrever aplicaes independentes de SA, ou seja, desenvolver aplicaes que rodem em quaquer
SA. Porm, na maioria das vezes isto no necessrio.

31

J2EE

32

Servlets
Conceitos Bsicos
Servlets (servidorzinho) so classes Java que extendem javax.servlet.http.HttpServlet. Para comear a desenvolver
servlets preciso conhecer alguns conceitos:
Request
Pensando em um Site de comrcio web, quando alguem clica em um boto ou link, feita um Request ao servidor.
Quando este request chega ao Container, ele encapsulado em um javax.servlet.http.HttpServletRequest
Response
Aps processar a requisio do cliente, o Container envia um Response ao Browser que enviou aquele Request. Ele
encapsulado em um javax.servlet.http.HttpServletResponse
Mtodo doGet
a maneira mais simples de se informar parmetros a servlet. Os parmetros so passados via QueryString, ou seja,
aps a URL da servlet, adicione um ?e o nome=valor do parmetro, caso haja mais de um, separe-os por&conforme
o ex.:
http://localhost:8080/servlet?parametro1=valor1&parametro2=valor2
Mtodo doPost'
similar ao metodo doGet, porm os parmetros no so visveis naQueryStringcomo no doGet.

Html
Sendo mais prtico, abaixo est o cdigo de uma pgina que chama aMinhaPrimeiraServletutilizando o metodo
doGet:
<html>
<body>
<form action="servlet?parametro1=valor1&parametro2=valor2" method="get">
<input type="submit" value="Enviar" />
</form>
</body>
</html>
Se voc no entendeu ou tem pouco conhecimento em html, recomendado que voc estude isto primeiro.

MinhaPrimeiraServlet
Quando o usurio clicar em Enviar, um Request vai chegar ao Container que chamar a servlet:
public class MinhaPrimeiraServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws Exception {
//Obtm o PrintWriter que ser utilizado para printar o html
PrintWriter out = resp.getWriter();
out.println("Minha Primeira Servlet");
out.close();

J2EE

33
}

Configurao
Para ser acessvel, a servlet tem que estar configurada em um arquivo XML denominadoDeployment Descriptor, que
leva o nome de web.xml.
De modo simplista, a configurao desta servlet seria:
<servlet>
<servlet-name>MinhaPrimeiraServlet</servlet-name>
<servlet-class>wikibooks.MinhaPrimeiraServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MinhaPrimeiraServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>

J2ME
J2ME uma plataforma da Sun Microsystems que usa a linguagem Java para o desenvolvimento de aplicativos para
dispositivos mveis como celulares, palms ou pocketpcs.
Esse Wikibook destinado ao aprendizado da programao na plataforma J2ME.

Audio
Por faltar instrues
Esta pgina precisa ser reciclada (discuta).
Ao melhor-la, voc estar ajudando o Wikilivros.

Este livro ou mdulo precisa ser formatado segundo o modelo wiki e/ou organizado conforme as convenes do Wikilivros. (discuta)
Por favor ajude a formatar este mdulo de acordo com as diretrizes estabelecidas no livro de estilo.
Editor: considere colocar o ms e o ano da marcao.

import
import
import
import
import
import
import
import
import
import
import

java.io.IOException;
java.io.InputStream;
javax.microedition.lcdui.Display;
javax.microedition.lcdui.Form;
javax.microedition.lcdui.Gauge;
javax.microedition.media.Manager;
javax.microedition.media.MediaException;
javax.microedition.media.Player;
javax.microedition.media.control.VolumeControl;
javax.microedition.midlet.MIDlet;
javax.microedition.midlet.MIDletStateChangeException;

J2ME

34
public class SoundTest extends MIDlet implements Runnable
{
private Display display;
private Player player;
private Form form;
private Gauge volume;
private VolumeControl vc;
private int value=10;
public SoundTest()
{
try
{
display = Display.getDisplay(this);
form = new Form("MP3");
volume = new Gauge("Volume",true,100,10);
form.append(volume);
// form.setItemStateListener(this);
display.setCurrent(form);
}
catch (Exception ex)
{
System.out.println(ex);
}
}
public void startApp() throws MIDletStateChangeException
{
playMP3();
Thread t = new Thread(this);
t.start();
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
public void playMP3()
{
try
{
InputStream is = getClass().getResourceAsStream("/t.mid");
player = Manager.createPlayer(is,"audio/midi");
player.realize();

J2ME

35
vc = (VolumeControl) player.getControl("VolumeControl");
player.prefetch();
if(vc != null)
{
vc.setLevel(value);
}
player.start();
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
catch(MediaException me)
{
me.printStackTrace();
}
}
public void run()
{
while (true)
{
vc.setLevel(volume.getValue());
try
{
Thread.sleep(20);
}
catch (InterruptedException ie)
{
}
}
}
}

Canvas
Durante as primeiras lies trabalhamos com a chamada "interface de alto nvel", ou seja, aplicvamos os comandos
para a interface pr construda no celular executa-las, agora iremos comear a trabalhar com a chamada "interface de
baixo nvel", ou seja, iremos dar os comandos diretamente para os grficos, trabalhando com a manipulao de
pixels. Para isso iremos usar amplamente a classe Canvas.

Estrutura Canvas
Primeiramente precisamos criar uma classe exclusiva separada da classe principal para trabalhar com o Canvas, essa
tambm ser importada do pacote javax.microedition.lcdui, e ir estender a classe Canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;

J2ME

36

public class ClasseMeuCanvas extends Canvas {


}
Agora devemos colocar o mtodo paint() que entra como parmetro um objeto da classe Graphics que ir controlar
o que ir ser exibido no canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
}
}
Agora na classe principal, a chamada do objeto da ClasseMeuCanvas feita do mesmo modo das chamadas dos
outros objetos, atravs de um mtodo do objeto Display, vejamos abaixo o contedo dos 2 arquivos, o
ClasseMeuCanvas.java e o ClassePrincipal.java.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
}
}
//arquivo ClassePrincipal.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ClassePrincipal extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
ClasseMeuCanvas meuCanvas = new ClasseMeuCanvas();
public void startApp() {
meuDisplay.setCurrent(meuCanvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}

J2ME

Desenhando objetos primitivos


Agora que j sabemos a estrutura de um canvas, vamos desenhar algo na tela, para isso iremos usar o objeto do tipo
Graphics e aplicar sobre ele mtodos pr-fabricados pelo J2ME que iro desenhar coisas simples na tela como
strings, retngulos, arcos, tringulos, etc. Esses comandos ficaro dentro do mtodo paint().
Desenhando uma linha
Vamos desenhar uma linha simples, vamos usar o mtodo drawLine() da classe Graphics, ele ir receber 4
atributos: o 1 ser o pixel x de onde a linha vai comear, o 2 ser o pixel y de onde a linha vai comear, o 3 o pixel
x onde a linha vai terminar, o 4 ser o pixel y onde a linha vai terminar.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
meuGrafico.drawLine(30, 40, 70, 90);
}
}
Desenhando um retngulo
Vamos desenhar um retngulo, vamos usar o mtodo drawRect() da classe Graphics, ele ir receber 4 atributos: o
1 ser o pixel x de onde o retngulo vai comear, o 2 ser o pixel y de onde o retngulo vai comear, o 3 ser a
largura em pixels do retngulo, o 4 ser a altura em pixels do retngulo.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
meuGrafico.drawRect(20, 30, 60, 70);
}
}
Desenhando um retngulo cheio
Voc viu anteriormente como desenhar um retngulo na tela, s que no exemplo anterior esse retngulo era oco por
dentro, ou seja, voc s desenhou as bordas do retngulo, vamos agora fazer um retngulo totalmente pintado por
dentro, para isso vamos usar o mtodo fillRect() da classe Graphics, ele ir receber os mesmos atributos do mtodo
drawRect(): o 1 ser o pixel x de onde o retngulo vai comear, o 2 ser o pixel y de onde o retngulo vai comear,
o 3 ser a largura em pixels do retngulo, o 4 ser a altura em pixels do retngulo.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
meuGrafico.fillRect(20, 30, 50, 60);
}
}

37

J2ME
Desenhando uma String
Vamos desenhar uma string, note que no vamos simplesmente colocar a string na tela, vamos desenh-la, apesar
disso o J2ME j vem com uma fonte string padro para o Canvas. Vamos usar o mtodo drawString() da classe
Graphics, ele ir receber 4 atributos: o 1 ser o texto da string, o 2 ser o pixel x de onde vai ser desenhado, o 3
ser o pixel y de onde vai ser desenhado, o 4 ser a "raiz" do objeto, ou seja, onde ser a referncia dos pixels x e y.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
meuGrafico.drawString("Texto da string", 50, 100,
Graphics.LEFT|Graphics.TOP);
}
}
Nesse caso a raiz do pixel x est no ponto esquerdo do objeto (Graphics.LEFT), e a raiz do pixel y est no ponto
acima do objeto (Graphics.TOP). Voc tambm pode colocar a raiz do pixel x na direita (Graphics.RIGHT) ou no
centro (Graphics.HCENTER), e a raiz do pixel y na parte de baixo (Graphics.BOTTOM) ou no centro
(Graphics.VCENTER).

Colocando uma cor


Voc pode setar cores para desenhar objetos com cores diferentes, para isso use o mtodo setColor() da classe
Graphics entrando como parmetro os valores das cores vermelho, verde e azul respectivamente.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
meuGrafico.setColor(255, 0, 0);
meuGrafico.drawRect(50, 50, 20, 30);
}
}

Pegando uma cor


Para pegar uma cor vamos utilizar o mtodo getColor() da classe Graphics que ir retornar um inteiro com os
valores RGB agrupados.
Primeiro vamos criar a varivel inteira que ir armazenar a cor.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
int corPega;
public void paint(Graphics meuGrafico){
}
}

38

J2ME
Agora vamos setar alguma cor atravs do mtodo setColor().
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
int corPega;
public void paint(Graphics meuGrafico){
meuGrafico.setColor(255, 128, 64);
}
}
Agora vamos utilizar o mtodo getColor(), e armazenar o resultado na varivel corPega.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
int corPega;
public void paint(Graphics meuGrafico){
meuGrafico.setColor(255, 128, 64);
corPega = meuGrafico.getColor();
}
}
O valor obtido na varivel corPega equivalente ao nmero hexadecimal agrupado FF, 80, 40 que se traduz em
inteiro como 255, 128, 64.

Desenhando uma imagem


Vimos anteriormente as primitivas que o J2ME nos oferece, agora vamos mostrar na tela uma imagem feita por ns
mesmo. Primeiro crie a sua imagem em algum editor externo a sua escolha, salve a imagem e coloque no mesmo
diretrio onde se localiza o arquivo ClasseMeuCanvas.java.
Agora primeiramente vamos incluir o pacote java.io que contm o tratamento de exceo.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
Agora criar uma varivel da classe Image.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;
public void paint(Graphics meuGrafico){
}
}
Agora vamos usar o construtor para inicializar o objeto minhaImagem. Para isso vamos jogar a exceo.

39

J2ME

40

//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;
ClasseMeuCanvas throws Exception {
}
public void paint(Graphics meuGrafico){
}
}
Agora dentro do construtor vamos inicializar o objeto minhaImagem utilizando o mtodo createImage() da classe
Image, ele receber como parmetro o endereo da imagem que voc criou.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;
ClasseMeuCanvas throws Exception {
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}
public void paint(Graphics meuGrafico){
}
}
Agora dentro do mtodo paint() vamos botar a nossa imagem para ser exibida, utilizando o mtodo drawImage() da
classe Graphics, como parmetro ele ir receber 4 atributos: o 1 ser o nome da varivel da classe Image, o 2 ser
o pixel x de onde vai ser desenhado, o 3 ser o pixel y de onde vai ser desenhado, o 4 ser a "raiz" do objeto, ou
seja, onde ser a referncia dos pixels x e y.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;
ClasseMeuCanvas throws Exception {
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}
public void paint(Graphics meuGrafico){
meuGrafico.drawImage(minhaImagem, 30, 40,
Graphics.LEFT|Graphics.TOP);
}

J2ME
}

Criando uma atualizao de tela


Vimos como colocar objetos na tela atravs de um comando, agora vamos ver como se cria uma atualizao de tela,
para isso dentro do mtodo paint() iremos usar o mtodo repaint() que ir funcionar como um "retornador" para o
mtodo paint() ser executado novamente. Para isso vamos primeiro criar uma varivel inteira i na ClasseMeuCanvas
e vamos inicia-la com o valor 0.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
int i=0;
public void paint(Graphics meuGrafico){
}
}
Agora vamos desenhar um simples retngulo na tela, vamos usar como os primeiros atributos a varivel i que
criamos (que no caso vale 0).
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
int i=0;
public void paint(Graphics meuGrafico){
meuGrafico.drawRect(i, i, 100, 100);
}
}
Vamos agora dar um incremento no i, para sempre que se retornar ao paint() seu valor ser acrescido de +1.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
int i=0;
public void paint(Graphics meuGrafico){
meuGrafico.drawRect(i, i, 100, 100);
i++;
}
}
Vamos agora finalmente aplicar o mtodo repaint() dentro do mtodo paint(), e ver a movimentao do nosso
retngulo na tela. Vamos mostrar abaixo o cdigo completo.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
int i=0;

41

J2ME

42
public void paint(Graphics meuGrafico){
meuGrafico.drawRect(i, i, 100, 100);
i++;
repaint();
}

Comandos
Vamos entrar agora na parte de entrada de comandos atravs das teclas do celular, primeiramente a classe Canvas
tem 3 mtodos pr-definidos para isso, so o keyPressed() para quando se aperta a tecla do celular, keyRepeated()
para quando se segura a tecla do celular e keyReleased() para quando se solta a tecla do celular.
Primeiramente para us-lo vamos fazer a chamada do mtodo fora do mdodo paint(), o mtodo dever ser do tipo
protected.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
protected void keyPressed(int getTecla){
}
public void paint(Graphics meuGrafico){
repaint();
}
}
Agora vamos definir uma ao para o caso de o usurio apertar a tecla que queremos, no caso vamos escolher a tecla
1 do celular, vamos colocar um if dentro do mtodo keyPressed(). Voc pode comparar com as constantes
'KEY_NUM1, KEY_NUM2, ..., KEY_STAR, KEY_POUND.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
protected void keyPressed(int getTecla){
if (getTecla == KEY_NUM1);
}
public void paint(Graphics meuGrafico){
repaint();
}
}
Agora vamos colocar uma ao para quando pressionarmos a tecla, nesse caso vamos exibir uma mensagem no
console.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;

J2ME

43

public class ClasseMeuCanvas extends Canvas {


protected void keyPressed(int getTecla){
if (getTecla == KEY_NUM1){
System.out.println("Pressionou tecla 1 do celular");
}
}
public void paint(Graphics meuGrafico){
repaint();
}
}
Voc pode usar o mesmo processo apenas trocando mtodo keyPressed() por keyRepeated() ou keyReleased().

Comandos de jogo
Vimos como obter as teclas do teclado padro do celular (apenas os nmeros e as teclas * e #), agora vamos ver
como pegar as teclas auxiliares.
Primeiramente vamos usar o mesmo mtodo keyPressed(), keyRepeated() ou keyReleased() do mdulo anterior.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
protected void keyPressed(int getTecla){
}
public void paint(Graphics meuGrafico){
repaint();
}
}
Agora as constantes das teclas auxiliares no podem ser pegas de forma direta, para isso vamos usar o mtodo
getKeyCode() e como parmetro vamos entrar o cdigo da tecla que queremos, nesse caso usamos a tecla FIRE que
fica no meio das setas do celular.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
public class ClasseMeuCanvas extends Canvas {
protected void keyPressed(int getTecla){
if (getTecla == getKeyCode(FIRE));
}
public void paint(Graphics meuGrafico){
repaint();
}
}

J2ME

44

Agora vamos colocar uma ao para quando pressionarmos a tecla, nesse caso vamos exibir uma mensagem no
console.
public class ClasseMeuCanvas extends Canvas {
protected void keyPressed(int getTecla){
if (getTecla == getKeyCode(FIRE)){
System.out.println("Pressionou tecla FIRE do celular");
}
}
public void paint(Graphics meuGrafico){
repaint();
}
}

CommandListener
Agora entraremos na parte interativa onde o usurio pode interagir com as funes do celular atravs do teclado ou
da caneta digital.

Estrutura bsica do CommandListener


Antes de trabalharmos para receber comandos, na nossa classe Midlet precisamos implementar a classe
CommandListener.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Agora vamos inserir o mtodo commandAction() que iremos usar diretamente para manipular as aes do teclado,
esse mtodo dever sempre ter 2 parmetros, o primeiro o objeto da classe Command (que veremos logo aps) e o
outro o objeto Displayable.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
public void startApp() {
}

J2ME

45

public void pauseApp() {


}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command pegarComando, Displayable
pegarDisplay){
}
}

Criando um comando
Para criar um comando primeiro precisamos intanciar uma varivel do tipo Command.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
Command meuComando;
public void
}
public void
}
public void
}
public void
pegarDisplay){
}
}

startApp() {
pauseApp() {
destroyApp(boolean unconditional) {
commandAction(Command pegarComando, Displayable

Agora vamos criar o objeto Command, para isso vamos usar como parmetro respectivamente: 1 o texto que ser
exibido na tela, 2 o tipo de comando e 3 a prioridade do comando.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
Command meuComando = new Command("OK", Command.OK, 0);
public
}
public
}
public
}
public

void startApp() {
void pauseApp() {
void destroyApp(boolean unconditional) {
void commandAction(Command pegarComando, Displayable

J2ME

46

pegarDisplay){
}
}

Detectando a ao de um comando
Agora vamos para a parte prtica, vamos detectar uma ao de comando pelo teclado do celular, j temos o objeto
Command criado, agora vamos criar uma condio caso ele seja apertado.
Como vimos anteriormente dentro do mtodo commandAction() que fazemos os trabalhos com comandos,
atravs dos dos atributo do tipo Command que vamos fazer a comparao com o objeto Command externo que
criamos, e vamos exibir uma mensagem no console.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
Command meuComando = new Command("OK", Command.OK, 0);
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command pegarComando, Displayable
pegarDisplay){
if(pegarComando == meuComando){
System.out.println("Pressionou o boto OK");
}
}
}
Agora calma, AINDA no vai acontecer nada quando apertarmos o boto, para isso precisamos criar a tela que ir
"escutar" o comando que iremos colocar, podemos fazer a tela com qualquer objeto tipo Alert, TextBox, etc... no
nosso caso vamos usar um simples Form.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
Command meuComando = new Command("OK", Command.OK, 0);
Form meuForm = new Form("Ttulo do formulrio");
public void startApp() {
}

J2ME

47

public void pauseApp() {


}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command pegarComando, Displayable
pegarDisplay){
if(pegarComando == meuComando){
System.out.println("Pressionou o boto OK");
}
}
}
Agora dentro do mtodo startApp() vamos adicionar o comando tela do Form atravs do mtodo addCommand().
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
Command meuComando = new Command("OK", Command.OK, 0);
Form meuForm = new Form("Ttulo do formulrio");
public void startApp() {
meuForm.addCommand(meuComando);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command pegarComando, Displayable
pegarDisplay){
if(pegarComando == meuComando){
System.out.println("Pressionou o boto OK");
}
}
}
Agora vamos adicionar o "escutador" no Form, para detectar se pressionamos ou no algum boto.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
Command meuComando = new Command("OK", Command.OK, 0);
Form meuForm = new Form("Ttulo do formulrio");

J2ME

48

public void startApp() {


meuForm.addCommand(meuComando);
meuForm.setCommandListener(this);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command pegarComando, Displayable
pegarDisplay){
if(pegarComando == meuComando){
System.out.println("Pressionou o boto OK");
}
}
}
Por fim, colocamos normalmente o mtodo setCurrent() da classe Display.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet implements CommandListener{
Display meuDisplay = Display.getDisplay(this);
Command meuComando = new Command("OK", Command.OK, 0);
Form meuForm = new Form("Ttulo do formulrio");
public void startApp() {
meuForm.addCommand(meuComando);
meuForm.setCommandListener(this);
meuDisplay.setCurrent(meuForm);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command pegarComando, Displayable
pegarDisplay){
if(pegarComando == meuComando){
System.out.println("Pressionou o boto OK");
}
}
}

J2ME

49

Form
Vamos agora aprender a fazer Forms (formulrios), so dentro das forms que podemos inserir vrios tens de uma
aplicao.

Inserindo um simples Form


Vamos ver como inserir um simples form numa aplicao, primeiro criamos o objeto Form.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
Form meuForm;
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Agora vamos inicializar o formulrio com o construtor, como parmetro vamos colocar a String que ser exibida na
tela.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
Form meuForm = new Form("Ttulo do formulrio");
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Agora vamos usar o mtodo setCurrent() da classe Display entrando o nosso formulrio como parmetro para
exibir o formulrio na tela.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
Form meuForm = new Form("Ttulo do formulrio");

J2ME

50

public void startApp() {


meuDisplay.setCurrent(meuForm);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}

Inserindo tens no Form


Como vimos, objetos Form podem conter vrios tens, aqui veremos que o construtor do Form pode conter outros
parmetros, vejamos agora cada um deles.

GameCanvas
O Canvas foi uma classe criada para o tratamentos de eventos de baixo nvel, que durande o Midp1.0 foi muito usada
na produo de jogos, a partir da verso Midp2.0, o J2ME apresentou uma nova classe, a GameCanvas com aes
mais voltadas para a manipulao de jogos.

Iniciando um GameCanvas
Primeiramente vamos importar o pacote que contm a classe GameCanvas.
import javax.microedition.lcdui.game.*;
Agora vamos criar a classe MeuGameCanvas, extendendo a classe GameCanvas.
import javax.microedition.lcdui.game.*;
public class MeuGameCanvas extends GameCanvas{
}
Uma classe que extende o GameCanvas precisa obrigatoriamente de um construtor.
import javax.microedition.lcdui.game.*;
public class MeuGameCanvas extends GameCanvas{
public MeuGameCanvas(){
}
}
Agora precisamos obrigatoriamente instanciar a classe superior GameCanvas dentro do construtor, usaremos o
argumento true (se quisermos herdar os mtodos da classe Canvas) ou false (se quisermos usar apenas os mtodos da
classe GameCanvas.
import javax.microedition.lcdui.game.*;
public class MeuGameCanvas extends GameCanvas {
public MeuGameCanvas(){
super(false);
}

J2ME

51
}

Utilizando Canvas no GameCanvas


Do mesmo modo que a classe Canvas, na classe GameCanvas podemos usar o mtodo paint() (que na GameCanvas
public) para exibir algo na tela. Vamos primeiramente inserir o pacote que contm a classe Canvas.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas {
public MeuGameCanvas(){
super(false);
}
public void paint(Graphics meuGrafico){
}
}
Agora vamos criar o mtodo paint().
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas {
public MeuGameCanvas(){
super(false);
}
public void paint(Graphics meuGrafico){
}
}
Agora vamos desenhar um retngulo na tela.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas {
public MeuGameCanvas(){
super(false);
}
public void paint(Graphics meuGrafico){
meuGrafico.drawRect(10, 20, 100, 200);
}
}
Tambm podemos implementar outros mtodos da classe Canvas como o keyPressed() (como public).

J2ME

52

Estrutura bsica do GameCanvas


Vimos que podemos fazer tudo que fazamos no Canvas dentro do GameCanvas, mas vamos ver agora que o
GameCanvas no trabalha somente "reinventando a roda", ele possui um tratamento diferente que se assemelha mais
as vrias APIs de criao de jogos que existem por ai, no vamos trabalhar com um mtodo padro, e sim com loops
que iro fixar a tela, at quando uma condio faa com que o loop pare.
Bom, primeiramente agora que no temos mais o mtodo paint() que era inicializado automaticamente, vamos agora
usar outro mtodo que tambm chamado automaticamente, ele est dentro da interface Runnable, vamos
implementar na classe.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
public MeuGameCanvas(){
super(false);
}
}
Agora devemos obrigatoriamente incluir dentro da nossa classe o mtodo run() da interface Runnable que o
mtodo que chamado automaticamente, ser dentro dele que iremos incluir todas as aes da classe.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
public MeuGameCanvas(){
super(false);
}
public void run(){
}
}
Agora vamos instanciar um objeto da classe Thread, ele ser o controlador que ir iniciar a nossa classe.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
public MeuGameCanvas(){
super(false);
}
public void run(){
}
}
Devemos agora iniciar o objeto thread dentro do construtor da classe, como parmetro vamos usar o this da classe
GameCanvas.

J2ME

53
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
}
public void run(){
}
}

J temos tudo pronto, agora por ltimo vamos iniciar a o objeto Thread que criamos utilizando o mtodo start()
dentro do construtor.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
}
}

Exibindo algo no GameCanvas


Agora com a estrutura bsica do nosso GameCanvas pronta, precisamos criar um objeto do tipo Graphics dentro da
nossa classe GameCanvas.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){

J2ME

54
}
}

Agora dentro criaremos o loop principal dentro do mtodo run(), primeiramente vamos criar uma variavel booleana,
para criar a condio do jogo.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
}
}
Agora vamos criar o loop com um comando while que ir comparar a variavel booleana que criamos.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
while(fimDeJogo == false){
}
}
}
Por fim dentro do loop vamos chamar o mtodo flushGraphics() que ir desenhar o grfico na tela do celular.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {

J2ME

55
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
while(fimDeJogo == false){
flushGraphics();
}
}
}

Agora como exemplo vamos exibir um retngulo na tela atravs do objeto do tipo Graphics.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
while(fimDeJogo == false){
meuGrafico.drawRect(10, 20, 100, 200);
flushGraphics();
}
}
}

Controlando a velocidade do aplicativo


Agora que fizemos a exibio precisamos controlar a velocidade de atualizao do loop, isso porque do jeito que est
o aplicativo ir rodar mais rpido em celulares com melhor hardware e mais lentos em celulares com pior hardware.
Para isso primeiramente precisamos criar um try-catch-finally dentro do loop principal.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {

J2ME

56
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
}catch (Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
}
}
}
}

Agora, como devemos sempre pintar a tela a cada loop colocamos o flushGraphics() dentro do finally.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
}catch (Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}
Agora dentro do try vamos utilizar o mtodo sleep() da classe Thread e entrar como parmetro o tempo em
milisegundos que a aplicao deve esperar para chamar o prximo loop, nesse caso iremos esperar 50 milisegundos

J2ME

57

(o que d 20 quadros por segundo) que mais ou menos a taxa de atualizao da tela da maioria dos celulares.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}catch (Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}
Agora por ltimo colocaremos um simples retngulo para andar na tela, para isso criaremos uma varivel int auxiliar
que ir encrementar-se a cada loop, e depois usaremos essa varivel em um parmetro do mtodo drawRect().
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
int auxiliar = 0;
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuGrafico.drawRect(auxiliar, 0, 10, 20);

J2ME

58
meuThread.sleep(50);
}catch (Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
auxiliar++;
flushGraphics();
}
}
}
}

Voc pode mudar a taxa de atualizao na tela (mtodo sleep()) e ver que o retngulo ir se mover com diferentes
velocidades.

Controles no GameCanvas
No Canvas tratvamos separadamente a parte dos comandos e a parte dos grfico, agora no GameCanvas podemos
tratar dessas coisas tudo no mesmo loop, vamos ver agora que essa parte ser tratada de uma forma bem diferente e
muito mais simples.
Primeiramente dentro do run() vamos criar uma varivel que tem que ser do tipo int que ir receber os controles.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
int tecla;
while(fimDeJogo == false){
try{
meuGrafico.drawRect(10, 20, 100, 200);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}

J2ME

59

Agora dentro do loop principal vamos checar se alguma tecla foi pressionada atravs do mtodo getKeyStates().
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
int tecla;
while(fimDeJogo == false){
try{
tecla = getKeyStates();
meuGrafico.drawRect(10, 20, 100, 200);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}
Agora vamos criar uma condio caso uma tecla especfica seja apertada, nesse caso vamos usar a tecla FIRE e
desenhar outro retngulo na tela caso ela seja apertada, note que agora vamos usar a constante FIRE_PRESSED.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
int tecla;

J2ME

60

while(fimDeJogo == false){
try{
tecla = getKeyStates();
if(tecla == FIRE_PRESSED){
meuGrafico.drawRect(20, 40, 80, 100);
}
meuGrafico.drawRect(10, 20, 100, 200);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}

Imagens no GameCanvas
Vamos agora ver como carregar uma imagem no GameCanvas, isso pode se aplicar ao carregamento de outros
arquivos tambm.
Primeiramente dentro do mtodo run() vamos colocar um try-catch.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();

J2ME

61
}finally{
flushGraphics();
}
}
}
}

Agora dentro do vamos instanciar o objeto Image na classe MeuGameCanvas.


import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuThread.sleep(50);
}catch(Exception ex){
ex.printStackTrace();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}
Depois vamos iniciar o objeto Image dentro do try no mtodo run().
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();

J2ME

62
Image minhaImagem;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}catch(Exception ex){
ex.printStackTrace();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}

Agora normalmente dentro do loop do jogo colocamos a imagem para ser exibida.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha
Imagem.png");
}catch(Exception ex){
ex.printStackTrace();

J2ME

63
}

boolean fimDeJogo = false;


while(fimDeJogo == false){
try{
meuGrafico.drawImage(minhaImagem, 30, 40,
Graphics.LEFT|Graphics.TOP);
meuThread.sleep(50);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}

Instalao
1. Para comear a desenvolver aplicativos em J2ME voc primeiro precisa ter instalado no computador o J2SE, para
baixa-lo clique aqui [1].
2. Aps instalado o J2SE voc ir baixar o J2ME clicando aqui [2].
3. Aps instalado o J2SE e o J2ME voc j pode comear a programar suas applets.
4. Para instalar a IDE NetBeans com o Mobility Pack clique aqui [3].
5. Para instalar a IDE Eclipse com a ferramenta Pulsar para desenvolvimento para celular clique aqui [4].

LayerManager
J vimos como mostrar grficos na nossa tela, agora iremos ver algo mais relacionado ao desenvolvimento de jogos
em 2D utilizando as classes TiledLayer, Sprite e LayerManager.
Tiles podem ser compreendidos como blocos usados para a construo de cenrios estticos em jogos 2D, a tcnica
de construo usando Tiles praticamente a mesma em qualquer plataforma, cria-se um objeto e utiliza-se um vetor
para posicionar os Tiles no cenrio. Sprites so os seres dinmicos do jogo como personagens, inimigos, objetos
mveis, etc. No J2ME temos a classe LayerManager que serve para controlar e mostrar o mundo do jogo construdo
atravs de Tiles e Sprites.

TiledLayer
Vamos comear utilizando a mesma estrutura do GameCanvas.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public MeuGameCanvas(){
super(false);

J2ME

64
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

Primeiramente precisamos carregar a imagem onde esto desenhados os tiles, para isso vamos instanciar e criar o
objeto do tipo Image como vimos anteriormente.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();

J2ME

65
}
}
}
}

Agora vamos instanciar a varivel do tipo TiledLayer.


import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
TiledLayer meuTiledLayer;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}
Agora dentro do mtodo run() vamos criar o objeto TiledLayer, vamos entrar com 4 parmetros: O primeiro a
quantidade de linhas que o cenrio vai ter. O segundo q quantidade de colunas que o cenrio vai ter. O terceiro o
objeto Image carregado. O quarto a largura em pixels de cada tile. O quinto a altura em pixels de cada tile.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {

J2ME

66
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
TiledLayer meuTiledLayer;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagem, 16, 16);
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

Agora para vamos criar o vetor para desenharmos a grade de tiles, para isso devemos criar um vetor do tipo int[] e
colocar o valor correspondente ao tile, lembre-se que no nosso exemplo usamos uma grade de no mximo 5x5 tiles.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
TiledLayer meuTiledLayer;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();

J2ME

67
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagem, 16, 16);
int grade[] = { 2, 1, 1, 1, 3,
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

Agora com o vetor da grade j criado, devemos inseri-lo dentro do objeto TiledLayer, a insero feita atravs do
mtodo setCell() onde inserimos cada clula individualmente, para isso vemos criar um lao for criando uma
varivel de zero at menor que grade.length.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
TiledLayer meuTiledLayer;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");

J2ME

68
meuTiledLayer = new TiledLayer(5, 5, minhaImagem, 16, 16);
int grade[] = { 2, 1, 1, 1, 3,
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
for(int i=0; i<grade.length; i++){
}
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

Agora dentro do lao for vamos finalmente usar o mtodo setCell() da classe TiledLayer utilizando os seguintes
atributos: Primeiro a linha em que est sendo inserido. Segundo a coluna em que est sendo inserido. Terceiro o
valor do tile (a clula do vetor grade[]).
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
TiledLayer meuTiledLayer;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagem, 16, 16);
int grade[] = { 2, 1, 1, 1, 3,

J2ME

69
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
for(int i=0; i<grade.length; i++){
meuTiledLayer.setCell(i%6, i/6, grade[i]);
}
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

Sprite
Sprites so imagens com animao geralmente usados como personagens, inimigos ou objetos mveis, vamos ver
como implementa-los no J2ME. Inicialmente vamos carregar a imagem onde est desenhado o Sprite, para isso
vamos instanciar e criar um objeto do tipo Image como vimos anteriomente.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}catch(Exception ex){
ex.printStackTrance();
}

J2ME

70
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

Agora vamos instanciar a varivel do tipo Sprite.


import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
Sprite meuSprite;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

J2ME

71

Agora dentro do mtodo run() vamos criar o objeto do tipo Sprite, vamos entrar 3 parmetros: Primeiro o objeto do
tipo Image. Segundo a largura em pixels de cada cena. Terceiro a altura em pixels de cada cena.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagem;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
meuSprite = new Sprite(minhaImagem, 32, 32);
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

LayerManager
Vimos como carregar e criar Tiles e Sprites, agora vamos ver como coloca-los para serem exibidos na tela, para isso
iremos ver como usar o LayerManager. Para comear vamos instanciar e inicializar os objetos do tipo TiledLayer e
Sprite vistos anteriormente.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();

J2ME

72

Image minhaImagemTile;
TiledLayer meuTiledLayer;
Image minhaImagemSprite;
Sprite meuSprite;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagemTile = minhaImagemTile.createImage("/Minha
Imagem tile.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagemTile, 16,
16);
int grade[] = { 2, 1, 1, 1, 3,
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
for(int i=0; i<grade.length; i++){
meuTiledLayer.setCell(i%6, i/6, grade[i]);
}
minhaImagemSprite = minhaImagemSprite.createImage("/Minha
Imagem sprite.png");
meuSprite = new Sprite(minhaImagemSprite, 32, 32);
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}
Agora para comearmos a controlar a exibio de Tiles e Sprites primeiramente devemos instanciar uma varivel do
tipo LayerManager.

J2ME

73
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagemTile;
TiledLayer meuTiledLayer;
Image minhaImagemSprite;
Sprite meuSprite;
LayerManager meuLayerManager;

public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagemTile = minhaImagemTile.createImage("/Minha
Imagem tile.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagemTile, 16,
16);
int grade[] = { 2, 1, 1, 1, 3,
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
for(int i=0; i<grade.length; i++){
meuTiledLayer.setCell(i%6, i/6, grade[i]);
}
minhaImagemSprite = minhaImagemSprite.createImage("/Minha
Imagem sprite.png");
meuSprite = new Sprite(minhaImagemSprite, 32, 32);
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}

J2ME

74
}
}
}

Agora dentro do run() vamos criar o objeto do tipo LayerManager


import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagemTile;
TiledLayer meuTiledLayer;
Image minhaImagemSprite;
Sprite meuSprite;
LayerManager meuLayerManager;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagemTile = minhaImagemTile.createImage("/Minha
Imagem tile.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagemTile, 16,
16);
int grade[] = { 2, 1, 1, 1, 3,
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
for(int i=0; i<grade.length; i++){
meuTiledLayer.setCell(i%6, i/6, grade[i]);
}
minhaImagemSprite = minhaImagemSprite.createImage("/Minha
Imagem sprite.png");
meuSprite = new Sprite(minhaImagemSprite, 32, 32);
meuLayerManager = new LayerManager();
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{

J2ME

75
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

Agora vamos colocar organizar os objetos do tipo Sprite e TiledLayer para serem exibidos, para isso vamos usar o
mtodo append() da classe LayerManager, note que quando se pintar a tela a ordem dos elementos inseridos ir
influenciar o que ser exibido em cima do outro, sempre o primeiro objeto colocado no append() ser o que ficar
sempre visvel, nesse exemplo vamos insrir na ordem, meuSprite -> meuTile.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagemTile;
TiledLayer meuTiledLayer;
Image minhaImagemSprite;
Sprite meuSprite;
LayerManager meuLayerManager;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagemTile = minhaImagemTile.createImage("/Minha
Imagem tile.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagemTile, 16,
16);
int grade[] = { 2, 1, 1, 1, 3,
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
for(int i=0; i<grade.length; i++){
meuTiledLayer.setCell(i%6, i/6, grade[i]);
}
minhaImagemSprite = minhaImagemSprite.createImage("/Minha

J2ME

76

Imagem sprite.png");
meuSprite = new Sprite(minhaImagemSprite, 32, 32);
meuLayerManager = new LayerManager();
meuLayerManager.append(meuSprite);
meuLayerManager.append(meuTile);
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}
Agora colocaremos a cena para ser exibida na tela, dentro do loop principal vamos usar o mtodo paint() da classe
LayerManager e entrar como parmetros: 1 o objeto do tipo Graphics. 2 o pixel x de onde a cena comear a ser
exibida. 3 o pixel y de onde a cena comear a ser exibida.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Image minhaImagemTile;
TiledLayer meuTiledLayer;
Image minhaImagemSprite;
Sprite meuSprite;
LayerManager meuLayerManager;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
minhaImagemTile = minhaImagemTile.createImage("/Minha
Imagem tile.png");
meuTiledLayer = new TiledLayer(5, 5, minhaImagemTile, 16,

J2ME

77

16);
int grade[] = { 2, 1, 1, 1, 3,
1, 0, 0, 0, 1,
1, 0, 1, 0, 1,
1, 0, 0, 0, 1,
4, 1, 1, 1, 5 };
for(int i=0; i<grade.length; i++){
meuTiledLayer.setCell(i%6, i/6, grade[i]);
}
minhaImagemSprite = minhaImagemSprite.createImage("/Minha
Imagem sprite.png");
meuSprite = new Sprite(minhaImagemSprite, 32, 32);
meuLayerManager = new LayerManager();
meuLayerManager.append(meuSprite);
meuLayerManager.append(meuTile);
}catch(Exception ex){
ex.printStackTrance();
}
boolean fimDeJogo = false;
while(fimDeJogo == false){
try{
meuLayerManager.paint(meuGrafico, 0, 0);
meuThread.sleep(50);
}(catch Exception minhaEscessao){
minhaExcessao.printStackTrance();
}finally{
flushGraphics();
}
}
}
}

M3G
Vamos agora iniciar o estudo do pacote M3G, esse pacote que trabalha com a parte de grficos em 3D no J2ME,
para um bom uso necessrio que se tenha um bom conhecimento no Canvas e no GameCanvas.
1.
2.
3.
4.
5.

No Canvas ==
No GameCanvas ==
Modificando objetos 3D ==
Criando objetos primitivos ==
Colises ==

J2ME

78

M3G/Colises
Colises podem parecer simples em 2D, mas so um pouco mais complicadas no mundo em 3D, vamos ver aqui
como fazer colises da cmera para as meshes do cenrio.
Checando colises
Vamos ver como checar colises, primeiramente devemos criar um objeto do tipo RayIntersection, ele que vai
armazenar todos os dados da coliso.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
RayIntersection meuRayIntersection;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();

J2ME

79
}
}
}

}
Agora vamos criar 2 arrays de float, um ir pegar a posio X, Y, Z da cmera, o outro ir pegar a orintao da
cmera. Essas variveis devem ser obrigatoriamente iniciadas.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
RayIntersection meuRayIntersection;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
float[] translacaoCamera = {0.0f, 0.0f, 0.0f}
float[] orientacaoCamera = {0.0f, 0.0f, 0.0f, 0.0f}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {

J2ME

80
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora vamos criar uma varivel booleana para checar se houve uma coliso, vamos coloca-la inicialmente como
false.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
RayIntersection meuRayIntersection;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
float[] translacaoCamera = {0.0f, 0.0f, 0.0f}
float[] orientacaoCamera = {0.0f, 0.0f, 0.0f, 0.0f}
boolean colisao = false;
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
} catch (Exception minhaExcecao) {

J2ME

81
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora dentro do loop principal, vamos usar os mtodos getTranslation() e getOrientation() para armazenar nas
variveis translacaoCamera e rotacaoCamera, os atributos da nossa cmera.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
RayIntersection meuRayIntersection;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
float[] translacaoCamera = {0.0f, 0.0f, 0.0f}
float[] orientacaoCamera = {0.0f, 0.0f, 0.0f, 0.0f}
boolean colisao = false;
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);

J2ME

82

minhaCamera.getTranslation(translacaoCamera);
minhaCamera.getOrientation(orientacaoCamera);
meuGrafico3D.render(meuMundo);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Agora vamos testar a coliso atravs do mtodo pick(), que ter como enrada os seguintes valores:
1. escopo - sempre ser -1
2. posio X - a posio X da cmera que foi pega no getTranslation()
3.
4.
5.
6.
7.
8.

posio Y - a posio Y da cmera que foi pega no getTranslation()


posio Z - a posio Z da cmera que foi pega no getTranslation()
orientao X - a orientao X da cmera que foi pega no getOrientation()
orientao Y - a orientao Y da cmera que foi pega no getOrientation()
orientao Z - a orientao Z da cmera que foi pega no getOrientation()
RayIntersection - o objeto RayIntersection que criamos anteriormente

Esse mtodo pick() ir retornar a condio true ou false para a nossa varivel booleana colisao;
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
RayIntersection meuRayIntersection;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{

J2ME

83
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
float[] translacaoCamera = {0.0f, 0.0f, 0.0f}
float[] orientacaoCamera = {0.0f, 0.0f, 0.0f, 0.0f}
boolean colisao = false;
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
minhaCamera.getTranslation(translacaoCamera);
minhaCamera.getOrientation(orientacaoCamera);
colisao = meuMundo.pick(-1,
translacaoCamera[0],
translacaoCamera[1],
translacaoCamera[2],
orientacaoCamera[1],
orientacaoCamera[2],
orientacaoCamera[3],
meuRayIntersection);
meuGrafico3D.render(meuMundo);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora, vamos criar um 'if para caso a coliso seja verdadeira mostrar uma mensagem no console.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();

J2ME

84
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
RayIntersection meuRayIntersection;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
float[] translacaoCamera = {0.0f, 0.0f, 0.0f}
float[] orientacaoCamera = {0.0f, 0.0f, 0.0f, 0.0f}
boolean colisao = false;
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
minhaCamera.getTranslation(translacaoCamera);
minhaCamera.getOrientation(orientacaoCamera);
colisao = meuMundo.pick(-1,
translacaoCamera[0],
translacaoCamera[1],
translacaoCamera[2],
orientacaoCamera[1],
orientacaoCamera[2],
orientacaoCamera[3],
meuRayIntersection);
if (colisao == true){
System.out.println("Coliso verdadeira");
}
meuGrafico3D.render(meuMundo);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();

J2ME

85
flushGraphics();
}
}
}

M3G/Criando objetos primitivos


Alm de poder carregar objetos externos voc tambm pode criar objetos primitivos usando os recursos do prprio
M3G.

Criando uma cmera


Apesar do arquivo .m3g ter a facilidade de se poder criar a prpria cmera, ela pode apresentar alguns tipos de
dificuldade em relao ao aspecto de tela de cada celular, que pode deixar o grfico exibido no celular "esticado"
tanto horizontalmente quanto verticalmente. Para resolver isso recomendvel criar uma prpria cmera definindo
os aspectos de cada celular.
Para fazer isso crie um arquivo .m3g em algum editor externo, mas lembre-se de NO colocar uma cmera no
arquivo, j que essa ns vamos criar manualmente. Com o arquivo criado vamos carrega-lo normalmente como
fizemos anteriomente, adicionar no objeto World, e renderiza-lo normalmente.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements


Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
boolean gameOver = false;
while(gameOver == false){

J2ME

86
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Agora, como vamos manipular a cmera manualmente vamos criar um objeto do tipo Camera.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements


Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);

J2ME

87
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Agora dentro do construtor vamos inicializar a cmera.


import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements


Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = new Camera();
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {

J2ME

88
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Agora vamos usar o mtodo setPerspective() para ajustar os atributos da cmera, o primeiro atributo ser o ngulo
de viso em graus (60 a angulao padro), o prximo campo ser o aspecto da tela que ser a largura da tela
dividida pela autura, o terceiro campo a distncia em que a cena comear a ser renderizada (deve ser
obrigatoriamente maior que zero), e por ltimo a distncia mxima da renderizao (o horizonte).
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements


Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo = (World) meuObjeto3D[0];
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);

J2ME

89
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Agora vamos adicionar o nosso objeto do tipo Camera para o mundo 3D, para isso vamos usar o mtodo addChild()
e entrar a nossa cmera como parmetro.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements


Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas() throws Exception {
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo = (World) meuObjeto3D[0];
meuMundo.addChild(minhaCamera);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}
boolean gameOver = false;
while(gameOver == false){

J2ME

90
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Por ltimo agora que adicionamos a cmera ao mundo 3D, vamos dizer ao mundo 3D que queremos que essa cmera
seja a cmera ativa, atravs do mtodo setActiveCamera() entrando como parmetro o nome da cmera.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements


Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas() throws Exception {
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo = (World) meuObjeto3D[0];
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrance();
}

J2ME

91

boolean gameOver = false;


while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Criando um tringulo
Vamos comear criando o mais simples dos polgonos, o tringulo, primeiramente na nossa classe vamos colocar o
que aprendemos anteriormente.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
boolean gameOver = false;
while(gameOver == false){

J2ME

92
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

VertexArray
O objeto do tipo VertexArray (array de vrtices) o tipo de objeto genrico que pode guardar coisas como a
posio dos vrtices, normais, texturas, etc...
Vrtices
Primeiramente vamos criar um array do tipo short que ir armazenar os vrtices X, Y e Z (nessa ordem) do nosso
tringulo.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

J2ME

93

-1}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Sabemos que o VertexArray pode guardar coisas como a posio dos vrtices, normais, texturas, etc... no nosso caso
iremos criar um objeto para armazenar a posio dos vrtices. Como parmetros do construtor iremos entrar:
1. O nmero de vrtices do VertexArray (como faremos um tringulo ento teremos 3 vrtices)
2. O nmero de componentes por vrtice (nesse caso so 3, os eixos X, Y e Z).
3. O tamanho em bytes de cada componente (nesse caso 2, pois um short ocupa 2 bytes). OBS: O tamanho mximo
2.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);

J2ME

94
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Criamos o array dos vrtices e criamos tambm o objeto do tipo VertexArray. Agora iremos colocar o array
vetorVertices que criamos dentro do objeto VertexArray para isso iremos usar o mtodo set() onde iremos entrar 3
parmetros:
1. O primeiro vrtice do vetor vertices (nesse caso e quase sempre ser zero)
2. O nmero de vrtices do VertexArray (como faremos um tringulo ento teremos 3 vrtices).
3. O vetor de vrtices (o que criamos short[] vertices).
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){

J2ME

95

minhaCamera = new Camera();


minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Normais
A exemplo do anterior primeiramente criamos um array do tipo short que agora ir armazenar a posio das noemais
de cada vrtice (127-padro, 0-sem normal, -127-invertido) nesse caso como fizemos um tringulo plano vamos setar
a normal padro para o eixo Y (virado para cima).
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);

J2ME

96
meuThread.start();

}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

0,

127, 0}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Agora vamos criar o objeto VertexArray com os mesmos atributos no construtor (nmero de vertices do
VextexArray, o numero de componentes de cada vrtice, o tamanho em bytes de cada componente).
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;

J2ME

97

public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

0,

127, 0}
VertexArray arrayDeNormais = new VertexArray(3, 3, 2);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
E por fim, chamar novamente o mtodo set() com os mesmos atributos (ndice do primeiro vrtice, o numero de
vrtice do VertexArray, o vetor de vrtices).
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;

J2ME

98
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;

public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

127, 0}
VertexArray arrayDeNormais = new VertexArray(3, 3, 2);
arrayDeNormais.set(0, 3, vetorNormais);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

0,

J2ME

99

Textura*
Por ltimo vamos agora criar um vetor para as texturas.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

127, 0}
VertexArray arrayDeNormais = new VertexArray(3, 3, 2);
arrayDeNormais.set(0, 3, vetorNormais);
short[] vetorTexturas = {1, 0,

0, 0,

boolean gameOver = false;


while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();

1, 1}

0,

J2ME

100
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Vamos tambm criar o objeto do tipo VextexArray utilizando os mesmos atributos anteriores (nmero de vertices
do VextexArray, o numero de componentes de cada vrtice, o tamanho em bytes de cada componente).
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

127, 0}
VertexArray arrayDeNormais = new VertexArray(3, 3, 2);
arrayDeNormais.set(0, 3, vetorNormais);
short[] vetorTexturas = {1, 0,
0, 0,
1, 1}
VertexArray arrayDeTexturas = new VertexArray(2, 2, 2);

0,

J2ME

101

boolean gameOver = false;


while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
E por fim chamamos o mtodo set() com os mesmos atributos (ndice do primeiro vrtice, o numero de vrtice do
VertexArray, o vetor de vrtices).
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);

1, 0,

J2ME

102
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

0,

127, 0}
VertexArray arrayDeNormais = new VertexArray(3, 3, 2);
arrayDeNormais.set(0, 3, vetorNormais);
short[] vetorTexturas = {1, 0,
0, 0,
1, 1}
VertexArray arrayDeTexturas = new VertexArray(2, 2, 2);
arrayDeTexturas.set(0, 2, vetorTexturas);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Vertex buffer*
Criamos os arrays dos vrtices, das normais e das texturas, agora precisamos agrupar esses arrays em um nico
buffer, por isso agora iremos criar um objeto do tipo VertexBuffer.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements
Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();

J2ME

103

}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

0,

127, 0}
VertexArray arrayDeNormais = new VertexArray(3, 3, 2);
arrayDeNormais.set(0, 3, vetorNormais);
short[] vetorTexturas = {1, 0,
0, 0,
1, 1}
VertexArray arrayDeTexturas = new VertexArray(2, 2, 2);
arrayDeTexturas.set(0, 2, vetorTexturas);
VertexBuffer meuVertexBuffer = new VertexBuffer();
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Agora para colocar o array de posies que criamos anteriormente vamos usar o mtodo setPositions() da classe
VertexBuffer, como parmetros entraremos o objeto VertexArray, a escala (tamanho) do objeto e por fim o
parmetro null.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;

J2ME

104

public class ClasseMeuGameCanvas extends GameCanvas implements


Runnable {
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
minhaCamera = new Camera();
minhaCamera.setPerspective(60.0f,
(float)getWidth()/(float)getHeight(), 1.0f, 100.0f);
meuMundo.addChild(minhaCamera);
meuMundo.setActiveCamera(minhaCamera);
short[] vetorVertices = {-1, 0, -1,

-1, 0, 1,

1, 0,

-1}
VertexArray arrayDePosicoes = new VertexArray(3, 3, 2);
arrayDePosicoes.set(0, 3, vetorVertices);
short[] vetorNormais = {0, 127, 0,

0, 127, 0,

0,

127, 0}
VertexArray arrayDeNormais = new VertexArray(3, 3, 2);
arrayDeNormais.set(0, 3, vetorNormais);
short[] vetorTexturas = {1, 0,
0, 0,
1, 1}
VertexArray arrayDeTexturas = new VertexArray(2, 2, 2);
arrayDeTexturas.set(0, 2, vetorTexturas);
VertexBuffer meuVertexBuffer = new VertexBuffer();
meuVertexBuffer.setPositions(arrayDePosicoes, 1.0f, null);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {

J2ME

105
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

M3G/Modificando objetos 3D
Vamos entrar agora na parte de modificao dos objetos .m3g carregados no J2ME, vamos utilizar isso atravs do
objeto for tipo World que criamos, na verdade esse objeto servir como uma ponte de ligao entre o programador e
os ndulos do objeto 3D em si.
Translao de um objeto
Vamos inicialmente aprender como translatar um ndulo do objeto 3D, quando se fala em translao voc deve
pensar em um movimento giratrio que a Terra faz no sol, no mundo 3D no bem assim, na verdade a translao
nada mais que a posio dos eixos x, y, z dentro do espao.
Primeiramente vamos translatar a cmera que voc criou e armazenou no arquivo .m3g, para isso vamos criar um
objeto do tipo Camera() e inicializa-lo.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;

J2ME

106
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Criamos a varivel minhaCamera, mas nenhuma cmera foi colocada l, agora vamos fazer isso atravs do nosso
objeto do tipo World, utilizando o mtodo getActiveCamera().
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){

J2ME

107
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora com a cmera armazanada vamos movimenta-la, para isso s precisamos pegar emprestado da classe World o
mtodo setTranslation() que ir receber 3 variveis float, que sero respectivamente o eixo x, y e z.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Excepetion minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){
try {

J2ME

108
meuGrafico3D.bindTarget(meuGrafico);
minhaCamera.setTranslation(1.0f, 3.0f, 2.0f);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Pegando a translao de um objeto
Vamos ver agora como pegar a translao (posio dentro do mundo) de um objeto, vamos usar o mesmo exemplo
anterior.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){

J2ME

109
try {
meuGrafico3D.bindTarget(meuGrafico);
minhaCamera.setTranslation(1.0f, 3.0f, 2.0f);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Vamos pegar a posio X, Y e Z da cmera, para isso vamos inicialmente criar um array float de 3 posies chamado
posicaoCamera[], e inicia-lo com 0.
public class ClasseMeuGameCanvas extends GameCanvas implements Runnable
{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
float[] posicaoCamera = {0.0, 0.0, 0.0};
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
minhaCamera.setTranslation(1.0f, 3.0f, 2.0f);

J2ME

110
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora dentro do loop principal vamos usar o mtodo getTranslation() e entrar como parmetro a varivel float que
criamos que vai pegar os 3 atributos X, Y e Z nessa ordem, como sada vamos dar um System.out.println() para
exibir cada posio.
public class ClasseMeuGameCanvas extends GameCanvas implements Runnable
{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
float[] posicaoCamera = {0.0, 0.0, 0.0};
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
minhaCamera.setTranslation(1.0f, 3.0f, 2.0f);
minhaCamera.getTranslation(posicaoCamera);
System.out.println(posicaoCamera[0]);

J2ME

111
System.out.println(posicaoCamera[1]);
System.out.println(posicaoCamera[2]);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Orientao de um objeto
Vamos agora ver como orientar (rotacionar) um objeto 3D, vamos fazer como anteriormente, carregar o objeto,
coloca-lo no objeto World e colocar a cmera na classe Camera.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
ClasseMeuCanvas(){
super(false)
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){
try {

J2ME

112
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

Vamos agora utilizar o mtodo setOrientation() e entrar como parmetro respectivamente o angulo, o componente
de roatao X, o componente de roatao Y e o componente de roatao Z. Esses componentes de rotao se
colocados como 0 no iro alterar o eixo de rotao.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
ClasseMeuCanvas(){
super(false)
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
minhaCamera.setOrientation(10, 1, 2, 0);

J2ME

113
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

No exemplo a cmera ir girar 10 graus no eixo X, 20 graus no eixo Y, e 0 graus no eixo Z.


Pegando a orientao de um objeto
Vamos ver agora como pegar a orientao de um objeto, vamos usar o mesmo exemplo anterior.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);

J2ME

114
if (meuMundo != null) {
minhaCamera.setOrientation(10.0f, 0.0f, 1.0f,

2.0f);
meuGrafico3D.render(meuMundo);
}
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Vamos pegar a rotao X, Y e Z da cmera, para isso vamos inicialmente criar um array float agora de 4 posies
chamado orientacaoCamera[], e inicia-lo com 0.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
float[] orientacaoCamera = {0.0, 0.0, 0.0, 0.0};

J2ME

115

while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
if (meuMundo != null) {
minhaCamera.setOrientation(10.0f, 0.0f, 1.0f,
2.0f);
meuGrafico3D.render(meuMundo);
}
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Agora dentro do loop principal vamos usar o mtodo getOrientation() e entrar como parmetro a varivel float que
criamos que vai pegar os 4 atributos, como sada vamos dar um System.out.println() para exibir cada um.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();

J2ME

116
}
boolean gameOver = false;
float[] orientacaoCamera = {0.0, 0.0, 0.0, 0.0};
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
if (meuMundo != null) {
minhaCamera.setOrientation(10.0f, 0.0f, 1.0f,

2.0f);
minhaCamera.getOrientation(orientacaoCamera);
System.out.println(orientacaoCamera[0]);
System.out.println(orientacaoCamera[1]);
System.out.println(orientacaoCamera[2]);
System.out.println(orientacaoCamera[3]);
meuGrafico3D.render(meuMundo);
}
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Pegando um objeto especfico
O World no M3G pode conter vrias cmeras, meshes, luzes, etc, vamos ver aqui como pegar cada um desses
objetos. Primeiramente bom no seu editor 3D nomear cada objeto com um nmero, quando esse arquivo for salvo
ficar mais fcil de voc pegar a identificao do objeto atravs de um nmero inteiro.
Primeiramente vamos pegar os exemplos anteriores.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();

J2ME

117
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
if (meuMundo != null) {
meuGrafico3D.render(meuMundo);
}
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora vamos criar o objeto Node, que o objeto que pode pegar a referncia de uma cmera, mesh, luz, etc...
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
Node meuNode;

J2ME

118
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
if (meuMundo != null) {
meuGrafico3D.render(meuMundo);
}
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora vamos usar o mtodo getChild() no objeto World e entrar como parmetro a idntificao do objeto
selecionado.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();
Node meuNode;

J2ME

119

public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
meuNode = meuMundo.getChild(1);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
if (meuMundo != null) {
meuGrafico3D.render(meuMundo);
}
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Agora usamos normalmente os mtodos para modificar o Node, nesse caso vamos move-lo usando translate().
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
Camera minhaCamera = new Camera();

J2ME

120
Node meuNode;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
minhaCamera = meuMundo.getActiveCamera();
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}
meuNode = meuMundo.getChild(1);
boolean gameOver = false;
while(gameOver == false){
try {
meuGrafico3D.bindTarget(meuGrafico);
if (meuMundo != null) {
meuNode.translate(0.0f, 0.0f, 0.1f);
meuGrafico3D.render(meuMundo);
}
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Animando um objeto 3D
Voc colocou um objeto 3D para ser mostrado no seu aplicativo, mas se voc criou um objeto animado deve ter
notado que o objeto no expressou nenhum quadro da animao. Para fazer isso vamos usar o mtodo animate() da
classe World e receber como parmetro, uma variavel int que ir incrementar a cada frame.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics3D meuGrafico3D = Graphics3D.getInstance();

J2ME

121
Object3D[] meuObjeto3D;
World meuMundo;
public ClasseMeuCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}
int frame = 0;
boolean gameOver = false;
while(gameOver == false){
try{
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcessao) {
minhaExcessao.printStackTrace();
}finally{
meuGrafico3D.releaseTarget();
flusGraphics();
}
}
}

}
Agora vamos chamar o mtodo animate() e como parmetro colocar uma variavel para a contagem do frame para a
animao do objeto.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends GameCanvas implements Runnable {
Thread meuThread;
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;

J2ME

122

public ClasseMeuCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}
int frame = 0;
boolean gameOver = false;
while(gameOver == false){
try{
meuGrafico3D.bindTarget(meuGrafico);
meuMundo.animate(frame);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
meuGrafico3D.releaseTarget();
frame++;
flushGraphics()
}
}
}
}

M3G/No Canvas
Preparando um grfico no Canvas
Primeiramente dentro da nossa classe de Canvas vamos incluir o pacote M3G que tem todas as classes e mtodos
para se trabalhar com grficos 3D.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
Vamos agora criar normalmente nossa classe de Canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;

J2ME

123

import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
}
Agora colocaremos o mtodo paint() dentro da nossa classe de Canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
}
}
E dentro do mtodo paint() colocaremos o mtodo repaint().
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
repaint();
}
}

Iniciando o grfico 3D no Canvas


At agora fizemos todo o preparativo para receber um grfico canvas 2D, vamos agora iniciar um objeto do tipo
Graphics3D com o mtodo getInstance() dentro da nossa classe de Canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public void paint(Graphics meuGrafico){
repaint();
}
}
Agora iniciaremos o nosso grfico 3D dentro do mtodo paint(), para isso vamos usar o mtodo bindTarget() da
classe Graphics3D, e vamos usar como parmetro o objeto da classe Graphics.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;

J2ME

124

public class ClasseMeuCanvas extends Canvas {


Graphics3D meuGrafico3D = Graphics3D.getInstance();
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
repaint();
}
}
Agora vamos terminar o processo de renderizao do grfico com o mtodo releaseTarget() da classe Graphics3D,
esse mtodo dever estar sempre APS a chamada do mtodo bindTarget().
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}

Exibindo um objeto em 3D no Canvas


Vamos agora ver como exibir um objeto j criado, primeiro crie o seu objeto em 3D em algum programa a sua
escolha depois salve o seu arquivo na mesma pasta do arquivo ClasseMeuCanvas.java. O processo um pouco
parecido com o de exibio de uma imagem na tela.
Agora primeiramente vamos incluir o pacote java.io que contm o tratamento de exceo.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import java.microedition.m3g.*;
Agora vamos criar uma varivel do tipo Object3D[].
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
public void paint(Graphics meuGrafico){

J2ME

125
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}

}
Agora vamos criar o construtor da classe ClasseMeuCanvas jogando a exceo IOException que necessrio para
inciarmos o nosso objeto.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
ClasseMeuCanvas() throws IOException {
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Agora vamos inicializar o nosso objeto meuObjeto3D dentro do construtor, usando a classe Loader com o mtodo
load() que ir receber como parmetro o endereo da localizao do arquivo 3D que vamos carregar.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}

J2ME

126

Agora poderamos estar prontos para mostrar o objeto 3D na tela, mas calma, no possvel exibir objetos do tipo
Object3D na tela, por isso devemos converter o nosso objeto meuObjeto3D para um tipo aceito para a renderizao,
nesse caso o tipo ser da classe World que ir renderizar tudo dentro do nosso arquivo .m3g de uma vez, e que
futuramente tambm ser usado para modificar os atributos do arquivo .m3g. Por isso vamos primeiramente criar a
nossa varivel do tipo World.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Agora dentro do construtor aps a inicializao do objeto meuObjeto3D vamos converter o tipo Object3D[] para o
tipo World.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}

J2ME

127

Agora sim, podemos exibir o objeto que criamos na tela, para isso dentro do mtodo paint(), no espao entre os
mtodos bindTarget() e releaseTarget() ficar todas as aes do mdulo 3D. Para isso vamos usar nosso objeto da
classe Graphics3D() e entrar o mtodo render() que ir receber como parmetro o nosso objeto do tipo World (que
convertemos previamente).
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuGrafico3D.releaseTarget();
repaint();
}
}

M3G/No GameCanvas
Preparando um grfico no GameCanvas
Inicializamos a ClasseMeuGameCanvas do mesmo jeito que fazemos com o GameCanvas normal, extendendo o
GameCanvas, implementando o Runnable e colocando os objetos e mtodos necessrios.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements Runnable
{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){

J2ME

128
boolean gameOver = false;
while(!gameOver){
try{
meuThread.sleep(50);
}catch(Exception minhaExcessao){
minhaExcessao.printstackTrace();
}finally{
flushGraphics();
}
}
}

Iniciando um grfico 3D no GameCanvas


Vimos que a parte de inicializao do grfico igual a parte 2D, agora vamos criar o grfico 3D em si, para isso
vamos criar um objeto do tipo Graphics3D.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements Runnable
{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean gameOver = false;
while(!gameOver){
try{
meuThread.sleep(50);
}catch(Exception minhaExcessao){
minhaExcessao.printStackTrace();
}finally{
flushGraphics();
}
}
}
}
Agora nessa parte vamos fazer um pouco diferente do que em relao ao Canvas normal, para iniciar o grfico 3D
dentro do GameCanvas devemos obrigatoriamente criar um try-catch-finally dentro do mtodo run(), nesse caso

J2ME

129

agora como a cada loop vamos sempre chamar o mtodo flushGraphics() vamos coloca-lo dentro do finally.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements Runnable
{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean gameOver = false;
while(!gameOver){
try {
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace)();
} finally {
flushGraphics();
}
}
}
}
Agora podemos chamar os mtodos padres do Graphics3D, primeiramente dentro do try vamos chamar o
grfico3D para inicializar o grfico atravs do mtodo bindTarget()
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements Runnable
{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}

J2ME

130
public void run(){
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace)();
} finally {
flushGraphics();
}
}
}

}
Agora vamos chamar o mtodo releaseTarget() para soltar o grfico 3D e deixar o programa correr normalmente,
mas atente que faremos isso sempre dentro do finally, caso o programa no consiga inicializar o grfico 3D.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import javax.microedition.game.*;
public class ClasseMeuGameCanvas extends GameCanvas implements Runnable
{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}

J2ME

131

Exibindo um objeto em 3D no GameCanvas


Vamos agora ver como exibir um objeto criado externamente dentro do GameCanvas, primeiro crie normalmente um
objeto .m3g em algum editor externo (no se esquea de colocar a cmera e a luz) e salve na mesma pasta da sua
classe.
Agora vamos importar primeiramente o pacote java.io para o projeto.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

Agora vamos criar a varivel do tipo Object3D[].


import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
public ClasseMeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Agora dentro do mtodo run(), mas antes do loop vamos criar um try-catch.

J2ME

132

import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
public ClasseMeuGameCanvas() throws Exception {
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
} catch(Exception minhaExcessao) {
minhaExcecao.printStackTrace();
}
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
Agora vamos criar a varivel do tipo Object3D[].
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;

J2ME

133
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
public ClasseMeuGameCanvas() throws Exception {
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
} catch(Exception minhaExcessao) {
minhaExcecao.printStackTrace();
}
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Como sabemos, no se pode manipular objetos diretamente pelo Object3D[], temos que criar outro objeto do tipo
World.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
public ClasseMeuGameCanvas() throws Exception {

J2ME

134
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
} catch(Exception minhaExcessao) {
minhaExcecao.printStackTrace();
}
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrace();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora dentro do try-catch vamos converter o nosso objeto do tipo Object3D[] para o tipo World.
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
public ClasseMeuGameCanvas() throws Exception {
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{

J2ME

135
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
} catch(Exception minhaExcessao) {
minhaExcecao.printStackTrace();
}
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

}
Agora vamos colocar o nosso World para ser renderizado no nosso grfico 3D, vamos colocar o mtodo render()
dentro do run() logo aps o bindTarget().
import
import
import
import

javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;

public class ClasseMeuGameCanvas extends GameCanvas implements Runnable


{
Thread meuThread;
Graphics meuGrafico = this.getGraphics();
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
public ClasseMeuGameCanvas() throws Exception {
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
try{
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
} catch(Exception minhaExcessao) {
minhaExcecao.printStackTrace();

J2ME

136
}
boolean gameOver = false;
while(!gameOver){
try {
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}

Primeira aplicao
Neste artigo voc ir aprender a criar a sua primeira classe para J2ME.

Importando
Para comearmos a fazer a nossa primeira aplicao (midlet) em J2ME vamos primeiramente importar a classe
MIDlet para o nosso projeto.
import javax.microedition.midlet.*;

Criando a classe
Agora iremos criar a classe principal da nossa aplicao, ela ir extender a classe MIDlet, lembrando que o nome da
classe sempre dever ser o mesmo do arquivo .java.
import javax.microedition.midlet.*;
public class MinhaClasse extends MIDlet {
}

Mtodos padres
O ciclo de vida de uma aplicao para celular sempre composta por 3 mtodos startApp(), pauseApp() e
destroyApp(boolean unconditional), vamos inseri-los dentro da nossa classe.
import javax.microedition.midlet.*;
public class MinhaClasse extends MIDlet {
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {

J2ME

137
}

}
O mtodo startApp() funciona como o mtodo main() no J2SE, ou seja, todas as instrues de execuo ficaro
dentro dele. Voc tambm deve especificar o nome da MIDlet que contm os mtodos de execuo nas propriedades
do projeto.

Execuo dos mtodos


Vamos agora mostrar a execuo dos mtodos atravs do console, para isso iremos usar normalmente o
System.out.println() do pacote padro do Java.
import javax.microedition.midlet.*;
public class MinhaClasse extends MIDlet {
public void startApp() {
System.out.println("Executando startApp");
}
public void pauseApp() {
System.out.println("Executando pauseApp");
}
public void destroyApp(boolean unconditional) {
System.out.println("Executando destroyApp");
}
}
Voc deve ter notado que foram executados apenas os mtodos startApp() e destroyApp(), o pauseApp() no foi
executado porque precisa de uma chamada especial para ser feita, como por exemplo uma ligao que o celular
recebe enquanto o aplicativo est rodando.

Display
O objeto Display o controlador do que mostrado no dispositivo, ele est dentro do pacote
javax.microedition.lcdui.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay;
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Para criar fisicamente o objeto vamos chamar o mtodo esttico getDisplay().

J2ME

138

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}

Ol mundo
Fizemos vrias coisas no projeto do programa, mas ainda no exibimos nada na tela, agora a hora, ns vamos
exibir a mensagem em um Form que fcil de implementar, primeiro vamos instanciar o objeto Form.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
Form meuForm;
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Agora vamos dar atributos ao objeto meuForm, nesse caso ele s tem um atributo que a String de texto que ser
exibida na tela.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
Form meuForm = new Form("Ttulo do Form. Ol mundo!");
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}

J2ME

139

}
Agora finalmente vamos exibir a mensagem na tela, para isso dentro do mtodo startApp vamos colocar o objeto
display, chamar o seu mtodo setCurrent(), e colocar como atributo o objeto da classe Form.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MinhaClasse extends MIDlet {
Display meuDisplay = Display.getDisplay(this);
Form meuForm = new Form("Ttulo do Form. Ol mundo!");
public void startApp() {
meuDisplay.setCurrent(meuForm);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}

Redes
Vamos agora ver como trabalhar com redes para troca de dados no J2ME, podemos trabalhar com conexes de
HTTP, Socket e Datagram. Para rodar os exemplos precisaremos na maioria dos casos de 2 midlets rodando ao
mesmo tempo, e tambm precisaremos implementar loops que iro checar a chegada de novas informaes.
Para iniciar, podemos usar normalmente a classe que criamos do GameCanvas e importando o pacote
javax.microedition.io.
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
boolean fim = false;
while(fim == false){
flushGraphics();
}
}
}

J2ME

140

Primeiramente dentro do run() vamos instanciar um objeto do tipo Connector, vamos tambm inicia-lo com
contedo vazio (null).
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
public class MeuGameCanvas extends GameCanvas implements Runnable {
Thread meuThread;
public MeuGameCanvas(){
super(false);
meuThread = new Thread(this);
meuThread.start();
}
public void run(){
Connection meuConnection = null;
boolean fim = false;
while(fim == false){
flushGraphics();
}
}
}

Criando arquivos M3G no Blender


Neste tutorial vamos ver como criar um arquivo .m3g utilizando o Blender, um software gratuito de modelagem 3D.

O programa
Voc pode baixar e instalar gratuitamente a verso completa do Blender em seu site oficial www.blender.org [5].

Blender Export for J2ME


A partir da verso 2.48 o Blender passou a vir com um exportador para o J2ME, para exportar seu objeto clique File
-> Export -> M3G (.m3g, java) -> OK. Aparecer uma janela com os seguintes atributos:
Texturing
Enabled - Permite a exportao de texturas
External - Referencia arquivos externos para texturas
Lightning
Enabled - Permite a exportao de luz
Ambient Light - Insere um objeto de luz extra para luz ambiente
Mesh Options
Autoscalling - Usa preciso mxima para posio de vrtices
Persp. Correcti - Coloca uma flag de correo de perspectiva
Smooth Shading - Coloca uma flag de sombreamento suave
Posing
All Armature Ac - Exporta todas as aes para armaduras

J2ME

141

Export

As Java Source - Exporta a cena como um cdigo fonte em Java


M3G Version 2.0 - Arquivo M3G verso 2.0
Game Physics - Inclui informaes de fsica de jogo para NOPE na exportao
O3D As JS - Gera um cdigo em HTML e JavaScript que mostra a cena atual com o Google O3D API em um
Browser
O3D As O3DTGZ

Ligaes externas

Site da Sun [6]


Download do Wireless Toolkit [7]
NetBeans 6.0 IDE [8]
M3G Exporter para 3D Studio Max [9]
M3G Exporter para Maya [10]
M3G Exporter para Blender [11]
GIMP [12]
Anvil Studio [13]

Blender [5]
Esta pgina somente um esboo.
Ampliando-a voc ajudar a melhorar o Wikilivros.

Referncias
[1]
[2]
[3]
[4]
[5]
[6]

http:/ / java. sun. com/ javase/ downloads/ index. jsp


http:/ / java. sun. com/ javame/ downloads/ index. jsp
http:/ / www. netbeans. org/ downloads/ index. html
http:/ / www. eclipse. org/ downloads/ packages/ pulsar-mobile-java-developers/ galileor
http:/ / www. blender. org/
http:/ / java. sun. com/ javame/ index. jsp

[7] http:/ / java. sun. com/ products/ sjwtoolkit/ download. html


[8] http:/ / download. netbeans. org/ netbeans/ 6. 0/ final/
[9] http:/ / www. m3gexporter. com/
[10] http:/ / www. m3gexport. com/
[11] http:/ / www. nelson-games. de/ bl2m3g/ default. html
[12] http:/ / www. gimp. org/
[13] http:/ / www. anvilstudio. com/

Java 3D

Java 3D
Java 3D uma API desenvolvida em Java em colaborao com a Sun Microsystems onde podem ser desenvolvidas
aplicaes compiladas e interpretadas (tendo-se necessria a utilizao da JVM) podendo inclusive serem rodadas
em internet browsers

Ligaes externas
Site oficial [1]
Java 3D project [2]

Referncias
[1] http:/ / java. sun. com/ javase/ technologies/ desktop/ java3d/
[2] https:/ / java3d. dev. java. net/

Java TV
Java TV uma API desenvolvida pela Sun Microsystems com aplicao desenvolvimento de softwares para TV
digital. Esses aplicativos so chamados de Xlets, para criar aplicativos o programador precisa se focar nos
middlewares especficos, atualmente existem 3 importantes middlewares para TV digital aberta, so eles:
ARIB - Utilizado em sistemas ISDB (padro japons)
MHP - Utilizado em sistemas DVB (padro europeu)
DASE - Utilizado em sistemas ATSC (padro americano)

Ligaes externas
Pgina oficial [1]

Referncias
[1] http:/ / java. sun. com/ products/ javatv

142

Lista de predefinies

Lista de predefinies
Gerais

Predefinio:Java/classe
Predefinio:Java/palavra-chave
Predefinio:Java/ferramenta
Predefinio:Java/ligaoInterna
Predefinio:Java/esboo
Predefinio:Java/Tabela de palavras-chave

Literais
Literais
Literais so as representaes de dados dentro do cdigo fonte. Na linguagem Java, literais representam os
dados dos tipos primitivos, dos tipos String e dos tipos nulo, por exemplo.
Assim, podemos subdividir os literais em:
Literais Booleanos ou Lgicos: correspondem ao valores true (verdadeiro) e false (falso).
Literais inteiros: representam os nmeros inteiros e podem ser de base octal, decimal, ou hexadecimal.
Assim:

Literais Inteiros Decimais: so nmeros em base decimal que representam um valor inteiro. Eles podem
ser tanto byte, como short, int ou long. Para escrever um literal inteiro na base decimal, basta digitar o seu
valor com um desses dgitos: 0 1 2 3 4 5 6 7 8 9.
Literais Inteiros Octais: so nmeros em base octal que representam um valor inteiro. Para representar
este tipo de literal, basta escrever os seus dgitos colocando 0 (dgito zero) antes. Os dgitos para este tipo
so: 0 1 2 3 4 5 6 7.
Literais Inteiros Hexadecimais: so nmeros em base hexadecimal que representam um valor inteiro. Para
representar este tipo de literal basta escrever os seus dgitos normalmente precedidos pelos caracteres 0x
(zero xis) ou 0X. Os dgitos permitidos so: 0 1 2 3 4 5 6 7 8 9 A a B b C c D d E e F f.
Literais Fracionrios (de Ponto Flutuante): correspondem aos nmeros racionais (fracionrios). Para
represent-los, basta escrever um nmero inteiro seguido por um ponto e por sua parte decimal - o ponto faz o
lugar da vrgula. Outra opo seria escrever o nmero em notao cientfica, escrevendo primeiro o valor da
mantissa, seguido do caractere "e" e do valor do expoente (de base 10).
Literais Caracteres: correspondem a um caractere. Para represent-los, basta escrever o caractere cercado por
apstrofos. Tambm podem armazenar caracteres de controle de formatao ( quebra de linha, etc.) e tambm
caracteres no formato unicode.
Literais de cadeias de caracteres - Strings: correspondem s cadeias de caracteres. Para represent-los,
escreva o(s) caracter(es) cercado(s) por aspas.
Literal nulo: representa a ausncia de tipo e de dado (valor). Para representar utiliz-se a palavra null.
Os literais atribuem valores s variveis ou partes do cdigo. Ou seja, eles so usados para fazer com que
variveis passem a ter um valor ou se executem clculos. Exemplos:

boolean ligado=true;
int velocidade=128;
int x=0012;

143

Literais

144

int peso=0x12a;
float preco=1.24;
char letra='f';
int pesoTotal;
pesoTotal=x*peso/4;
String texto="Isto um exemplo de cadeia de caracteres";
Nos exemplos acima, pudemos ver exemplos da atribuio de valores iniciais s diversas variveis no momento da
declarao assim como, a partir da declarao de pesoTotal (sem valor inicial), do clculo de pesoTotal igual a x
vezes o peso dividido por 4. A varivel ligado recebe o valor "verdadeiro", velocidade recebe o nmero 128, x
recebe 12 em octal que o mesmo que 10 em decimal, peso recebe 12A em hexadecimal que o mesmo que 298 em
decimal, preco recebe 1,24 e letra recebe f. J a varivel texto recebe Isto um exemplo de cadeia de caracteres.

Regras para representar literais fracionrios (de ponto flutuante)


Regras bsicas
Os literais do tipo float so representados colocando-se a letra F ou f aps o nmero. Por exemplo:
12f
22F
Observao: importante a utilizao do F (ou f) aps o nmero para representar o tipo
Java/Palavra-chave/ j que sua omisso implicar que o literal passe a ser automaticamente interpretado
como sendo do tipo double. Por exemplo:
Os literais do tipo double so representados colocando-se a letra D ou d aps o nmero.
12d
22D
A separao entre a parte inteira e fracionrio do nmero feita atravs do ponto - ao invs da vrgula. Por
exemplo:
12.0f representa o nmero 12
22.23F representa o nmero 22,23
Caso a parte inteira seja 0 ("zero"), ela poder ser omitida desde que se coloque o ponto (representando a
vrgula) e a parte fracionria. Por exemplo:
.1f representa o nmero 0,1
.0F representa o nmero 0
Outras variaes de representao
Os literais fracionrios tambm podem ser representados com o uso de uma exponenciao em base 10, ou
seja, atravs do nmero seguido da letra e ou E seguido do expoente de base 10 a ser multiplicado e do f ou F.
Exemplo:
1e3f representa o nmero

, ou seja, 1000

-1e3F representa o nmero

, ou seja, -1000

1e-2F representa o nmero

, ou seja, 0,01

-1e-3F representa o nmero

, ou seja, -0,001

Exista tambm a representao de literais fracionrios em hexadecimal.

Literais

145
a fazer

Representao de caracteres de controle de texto


Caracteres de controle de texto poderm ser representados da seguinte forma:
Cdigo

Significado

Escape Unicode
\b

\u0008

caractere de retrocesso (backspace - BS)

\t

\u0009

tabulao horizontal tab (horizontal tab - HT)

\n

\u000a

quebra de linha (linefeed - LF)

\f

\u000c

quebra de pgina (form feed - FF)

\r

\u000d

retorno de carro (carriage return - CR)

\"

\u0022

aspas (double quote - " )

\'

\u0027

apstrofo (single quote - ' )

\\

\u005c

barra invertida (backslash - \ )

Representao de caracteres no formato Unicode-16


Unicode padro que define um conjunto de caracteres universais. O padro Unicode-16 define caracteres
com o uso de 2 bytes (16 bits). Na linguagem java, define-se esses caracteres com \u seguido de 4 dgitos
hexadecimais (dgitos 0 1 2 3 4 5 6 7 8 9 A a B b C c D d E e F f). Assim, a representao poder variair de
\u0000 at \uFFFF. Exemplos:
Caractere
Caractere
Unicode-16 gerado
\u7Fff

\u7Ffc

\u0062

\u0078

Exemplo de declarao de uma varivel do tipo char usando o literal Unicode-16:


char letrax='\u0078';

Modificadores

Modificadores
Modificadores
Modificadores de acesso
Os modificadores de acesso so palavras-chave que modificam a forma como podem ser acessadas as classes,
mtodos e/ou variveis. So eles:

private
protected
public
static

Modificador de acesso private


O modificador de acesso "private" quando aplicado a um atributo ou a um mtodo indica que os mesmos s podem
ser acessados de dentro da classe que os criou (encapsulamento). Uma classe que herde de uma superclasse com
atributos declarados como "private" s poder ter acesso a eles atravs dos mtodos pblicos da prpria superclasse,
caso contrrio, no haver acesso a estes atributos.
Exemplo
class Circulo
{
private float raio;
Circulo()
{
super();
setRaio( 3.0 );
}
void setRaio( float r )
{
raio = r
}
}
class Pneu extends Circulo
{
Pneu p = new Pneu();
p.raio = 10.0; //Erro de compilao. O Atributo raio privado da
classe Circulo
p.setRaio(10.0); //Correto, pois a classe Pneu est utilizando os
mtodos definidos na classe Circulo para fazer
//acesso ao atributo privado raio
}

146

Modificadores

Modificador de acesso protected


A instruo protected indica que o mtodo ou a varivel assim declarada possa ser acessada somente dentro do
pacote em que est contida atravs de uma subclasse.

Modificador de acesso public


A instruo public indica que a classe, mtodo ou varivel assim declarada possa ser acessada em qualquer
lugar e a qualquer momento da execuo do programa.

Modificador de acesso static


A instruo static serve:
na declarao de uma varivel dentro de uma classe, para se criar uma varivel que poder ser acessada por
todas as instncias de objetos desta classe como um varivel comum. Ou seja, a varivel criada ser a mesma
em todas instncias e quando seu contedo modificado em uma das instncias ento ele ser modificado em
todas instncias;
na declarao de um mtodo que deve ser acessado diretamente na classe e no nas suas instncias.
Mothafocka do caralho

Outros modificadores
Os modificadores a seguir podem ser usados em conjunto com os modificadores de acesso provendo, assim,
outros comportamentos:
abstract
final

Modificador abstract
A instruo abstract serve para:
declarar mtodos abstratos, ou seja, mtodos que devero ser desenvolvidos/implementados nas subclasses.
Quando a classe que contiver mtodos abstratos for herdada, os referidos mtodos devero ser implementados,
caso contrrio, a classe que extendeu dever ser declarada como abstrata.
declarar classes abstratas que se desenvolvem numa(s) subclasse(s). Classes abstratas so aquelas que no
esto totalmente implementadas/descritas. Uma classe abstrata no pode ser instanciada e amplamente usada
nas interfaces.
Uma classe considerada abstrata se contiver pelo menos um mtodo abstrato. Um mtodo abstrato tem a
seguinte caracterstica: void getName( );
Caso o mtodo tenha as chaves caractersticas {}, o mesmo no mais ser considerado abstrato, embora no
tenha cdigo dentro das chaves.

Modificador final
A instruo final indica que a classe, mtodo ou varivel assim declarada tm uma nica atribuio que se
mantm constante, ou seja, no pode ser alterada no decorrer do processamento.
Este modificador declara o que chamamos, em programao, de constante.

147

O porqu de se estudar Java

O porqu de se estudar Java


O Porqu de se escolher Java
Voc provavelmente j est convencido pelos pontos citados do porqu citar Java e queria mais, ou simplesmente
no leu o texto anterior e veio direto para c, ou talvez por algum outro motivo est aqui. Portanto para apresentar os
motivos porque voc deveria estudar Java estaro aqui tpicos em sntese que servem como motivos para estudar
Java:
Java tem a filosofia 'WORA'
Uma das principais caractersticas de Java o WORA (Write Once, Run Anywhere) ou simplesmente 'Escreva uma
Vez e Execute em Qualquer Lugar'. Isso por si s traz vantagens, pois poupa tempo aprendendo bibliotecas
especficas de Sistemas Operacionais. Poupa dinheiro, que seria gasto neste tempo. Poupa esforo, pois muitas vezes
no h a necessidade de se conhecer alguns ou vrios aspectos da plataforma subjacente.
Java uma linguagem de alto nvel
Por ser uma linguagem de alto nvel Java tem constructos e caractersticas que permitem escrever programas mais
rapidamente do que em C/C++. Sendo assim h uma maior produtividade. Aliado ao fato de que Java sendo uma
linguagem orientada a objetos, faz Java uma tima escolha para desenvolvimento.
Java est presente em uma variedade de lugares
Os aplicativos Java esto presentes em diversas reas, desde celulares, at servidores, o que d ao desenvolvedor
uma ampla gama de possibilidades de sistemas a serem desenvolvidos.
Java tem uma boa documentao, gratuito e de cdigo aberto
Como no h custo para se desenvolver em Java, pelo menos no incio, h um incentivo aos novatos que no
necessitam gastar com programas pagos, mas ao invs disso possuem escolhas de altssima qualidade gratuitas e
amplamente usadas.

148

O que so mtodos e para que servem

O que so mtodos e para que servem


Mtodos
O Que So Mtodos e para que servem
Mtodos so blocos de cdigo que pertencem a uma classe e tem por finalidade realizar uma tarefa. Eles so
anlogos s funes em C e sub-rotinas em pascal. Mtodos geralmente correspondem uma ao do objeto.
Exemplo: correr, pegar, etc. Numa classe para realizar clculos matemticos poderia ser pegar somar, subtrair,
dividir, etc. Alm disso um papel fundamental dos mesmos ter de evitar reescrever cdigo para uma mesma funo
toda vez que se deseja cham-la. Bom, mas para que isso fique evidente vamos para um exemplo prtico.

Um exemplo prtico
No nosso exemplo vamos fazer mtodos que realizem operaes matemticas. Suponha que vamos fazer uma classe
OperacoesMatematicas
/*OperacoesMatematicas.java*/
public class OperacoesMatematicas{
public static void main(String []args){
public int somar( int num1, int num2 ){
return num1 + num2;
}
public int subtrair( int num1, int num2 ){
return num1 - num2;
}
public int multiplicar( int num1, int num2 ){
return num1 * num2;
}
public int dividir( int num1, int num2 ){
return num1 / num2;
}
// Continuarei a implementao depois // por: Devarde } }

149

O que Java

O que Java
Java uma linguagem de programao orientada a objetos, fcil de se aprender, e que possui como maior
vantagem ser portvel entre as diversas plataformas existentes.
Por exemplo, se o programa java for feito em uma plataforma Linux, ele pode ser usado na plataforma FreeBSD ou
Windows - o programa rodar sem problema nenhum desde que a JRE (Java Runtime Environment), tambm
conhecida como Mquina Virtual Java (Java Virtual Machine) esteja instalada na plataforma.
Linguagens como C e C++ rodam em diversas plataformas, mas os programas precisam ser recompilados, o que no
acontece com o Java onde o mesmo binrio pode ser portado. Alm disso a linguagem pode ser usada para
desenvolver programas para a maioria dos celulares, PDA's (Palm Tops) alm de diversos dispositivos como cartes
(Vale Refeio, Vale transporte, Cartes de acesso).

Objetos
Elementos de software que representam entidades fsicas ou abstratas, simples ou complexas, dentro de um sistema.
Possuem identidade, responsabilidades especficas, estado e um conjunto de mensagens que esto aptos a responder.
Estticos: Dependem de um agente externo ao objeto para solicitar que o objeto altere o seu estado.
Dinmicos: O objeto capaz de espontaneamente alterar o seu prprio estado.

Onde Java est presente


Onde Java est presente
Java est presente em todos os lugares, desde telefones celulares at TVs e computadores. A linguagem Java uma
das mais difundidas e conta com inmeros recursos pela Web. Ela pode ser usada para criar aplicativos desktop,
como por exemplo o Azureus e o Eclipse, aplicaes web como applets, que rodam no lado cliente ou pginas JSP, e
outros termos relacionados sua verso EE, no lado do servidor. Alm disso h padres de TV digital que
disponibilizam algum suporte a Java. Inclusive at h robs que suportam Java, sendo o que o destaque vai para o da
misso Mars Rovers que percorreu o solo lunar. Sendo assim java est disponvel para um amplo espectro de
aplicaes, cada qual com sua utilidade e caractersticas prprias.

150

Operadores

151

Operadores
Operadores
Os operadores so sinais que representam atribuies, clculos e ordem dos dados. As operaes seguem
uma ordem de prioridades, ou seja, alguns clculos (ou outros) so processados antes de outros. Por exemplo,
na lgebra podemos mostrar a seguinte ordem:
Ordem Operadores

Operao

/*

Diviso e multiplicao

+-

Soma e subtrao

Assim, as operaes de diviso e multiplicao, por serem de ordem 1, sero executadas antes das operaes
de soma e subtrao (ordem 2). Tambm, as operaes de diviso e multiplicao so de mesma ordem (1) e
no importa, entre si, a ordem da operao (2 dividido por 4 vezes 9 igual a 2 vezes 9 dividido por 4).

Separadores
Os separadores so sinais que separam, ou sejam, indicam/modificam a ordem das operaes (ou atribuies,
ou interpretaes etc.) que podem ou no ser diferentes da comum. Em lgebra, temos alguns separadores
como os seguintes:
Ordem Separadores Descrio
1

Vrgula

()

Parnteses

[]

Colchetes

{}

Chaves

Separadores em Java
Ordem Separadores

Descrio

Ponto-e-vrgula

Ponto

Vrgula

()

Parnteses

[]

Colchetes

{}

Chaves

Operadores

152

Ponto-e-vrgula, ponto e vrgula


O ponto-e-vrgula serve para separar sentenas ou instrues. A quebra de linha no separa instrues. Por
exemplo:
int
A;
o mesmo que:
int A;
E
int A;
float B;
o mesmo que:
int A; float B;
O ponto serve para separar a parte inteira da fracionria em um nmero, tal como na notao inglesa. Ou seja,
enquanto escrevemos 2,5 para representar dois e meio, em Java escrevemos:
2.5
A vrgula serve para separar itens, elementos, membros, como o que ocorre na atribuio de valores aos
vetores, por exemplo:
int[] vetor;
vetor={34, 27, 3, 2};
int JANELAS=10, PORTAS=4;
class Casa implements Lavar, Pintar {
}
Parnteses, colchetes e chaves
Na maioria das linguagens de programao de computadores, os separadores colchetes e chaves so utilizados
para outros propsitos diferentes dos em lgebra. Para uso semelhante, em programao se utiliza o
aninhamento (incluso dentro de outros) de parnteses. Por exemplo:
Em lgebra:
{13x(4+12)/[12+(13+76/2)x(1+2)]+5}
Equivale a, em Java:
(13*(4+12)/(12+(13+76/2)*(1+2))+5)
Em Java, as chaves so utilizadas para separar blocos de programao e os colchetes so utilizados para
indicar/separar os ndices de vetores (e, tambm, na declarao dos mesmos vetores).

Operadores

153

Outros separadores/delimitadores
Atravs de uma viso mais ampla, podemos encontrar muitos outros smbolos que podem atuar como
separadores em Java.
Quando atuam em dupla, podem ser chamados de delimitadores, tais como:
aspas " " - so usadas para delimitar uma cadeia de caracteres;
apstrofos ' ' - so usados para delimitar um literal do tipo caracter (char).
Alguns outros tipos de separadores:
e ou E - usados na notao cientfica de nmeros fracionrios;
Tenha calma.
Esta pgina ainda est em desenvolvimento.
O autor avisa que este contedo ainda pode conter vrios erros.

Operadores em Java
Em programao Java temos a seguintes ordem de operadores:
Tipo de Operador

Lista de Operadores

Sufixais

expr++ expr--

Prefixais

++expr --expr +expr -expr ~ !

Multiplicativos

*/%

Aditivos

+-

Shift Binrio

<< >> >>>

Comparativos

< > <= >= instanceof

igualdade

== !=

Bit-aBit E

&

Bit-aBit XOU OR

Bit-aBit OU OR

Lgico E

&&

Lgico OU

||

Ternrio

?:

Atribuio

= += -= *= /= %= &= ^= |= <<= >>= >>>=

Precedncia 13: operadores sufixais


So operadores unrios (que atuam somente a partir de uma varivel) e que so posicionados na parte da frente da
varivel. Existem dois operadores deste tipo: o Incremento ++ e o Decremento - -. O que eles fazem
respectivamente aumentar e diminuir em 1 o valor de qualquer nmero inteiro. No podem ser usados em estruturas
do tipo float, double, boolean ou char. Eles tambm s funcionam em variveis, no podendo ser usados em literais.
Exemplo de uso:
int numero=5;
5
numero++;
numero--;

//A varivel nmero inicializada e passa a valer


//A varivel nmero passa a valer 6
//A varivel nmero passa a valer 5 novamente

Operadores

154

Precedncia 12: operadores prefixais


So operadores unrios que alteram o valor de uma varivel e seus sinais so posicionados antes do identificador da
varivel. Como exemplo, pode-se citar o Incremento ++, Decremento --, Sinal Positivo +, Sinal Negativo -, Inverso
e Incremento ~ e Negao !. O incremento e decremento, j vimos o que faz. Eles esto sendo citados aqui
novamente porque seus sinais podem vir antes de variveis tambm e numa operao complexa (com outros
operadores binrios) alteram a precedncia da operao. O Sinal Positivo + retorna a varivel que vem depois dele
com o mesmo sinal, o Sinal Negativo - inverte o sinal de variveis transformando nmeros positivos em negativo e
vice-versa. Ele no pode ser usado em variveis dos tipos boolean e char. O Incremento e Inverso ~ aumenta o
nmero em uma unidade e inverte o seu sinal. S pode ser usado em inteiros. J a operao de negao ! transforma
"verdadeiro" em "falso" e vice-versa, s podendo ser usado em variveis do tipo boolean. Tambm s funcionam em
variveis, no em literais. Exemplos de uso:
int numero=5;
boolean ligado=false;
++numero;
--numero;
numero=+numero;
numero=-numero;
numero=~numero;
ligado=!ligado;

//numero contm 5
//ligado contm "falso"
//numero agora vale 6
//numero passa a valer 5
//numero continua valendo 5
//numero passa a valer -5
//numero passa a valer 6
//ligado passa a representar o valor "true"

Observao: uma diferena importante entre os operadores '++' e '--' prefixais e sufixais o tempo de avaliao da
expresso comparado com a alterao da varivel. A saber:
int x = 5;
int y, z;
y = x++;
depois modifica x
z = ++x;
valor de x

// x contm 5
// y e z no foram definidos
// primeiro faz y igual ao valor (anterior) de x, e
// primeiro modifica x,

e depois atribui a z o novo

Neste exemplo, temos que, ao final x vale 7 (duas vezes incrementado), y vale 5 (o valor inicial de x) e z vale 7 (o
valor final de x). Deve-se evitar usar mais de um operador prefixal e sufixal na mesma linha, porque isto torna o
cdigo incompreensvel, por exemplo: x = (y++ + ++z - --x) + ++y.

Precedncia 11: operadores multiplicativos


So operadores que realizam uma operao igual ou semelhante multiplicao. Exemplos de operaes do tipo so
a Multiplicao (*), a Diviso (/) e o Resto (%). O primeiro pode realizar a multiplicao entre dois valores que no
sejam do tipo boolean e nem do tipo char. O segundo pode dividir o primeiro nmero pelo segundo. Tambm no
pode ser usado em valores booleans ou char. O terceiro retorna o resto da diviso do primeiro pelo segundo.
Exemplos de uso:
int numero=5;
numero=numero*4;
numero=200/numero;
numero=5%12;

//numero
//numero
//numero
//numero

passa a valer 5
assume o valor 20
assume o valor 10
assume o valor 5

Operadores

155

Precedncia 10: operadores aditivos


So operadores que realizam alguma operao igual ou equivalente adio. Assim como os Operadores
Multiplicativos, os Aditivos podem ser usados tanto em variveis como em literais (quando fazem a concatenao de
strings). Mas tambm no podem ser usados em variveis char e boolean. Eles tambm no alteram as variveis
passadas para eles. No lugar disso, eles retornam um nmero que deve ser direcionado par uma varivel por meio da
operao de atribuio (veja abaixo). Exemplos de uso:
int numero=5;
numero=numero+8;
numero=numero-numero;
String x="Alo";
String y="Mundo!";
x = x + ", " + y;

//numero passa a valer 5


//numero passa a valer 13
//numero passa a valer zero
// x inicializado com a string "Alo"
// y inicializado com a string "Mundo!"
// x passa a valer "Alo, Mundo!"

Precedncia 9: operadores de shift


So operadores que deslocam os bits de um nmero de modo a alternar o seu valor. Exemplos de operadores deste
tipo so o Shift para a Direita (>>), o Shift para a Direita Sem-Sinal(>>>) e o Shift para a Esquerda (<<). O primeiro
valor a ser recebido pelo operador o nmero sobre o qual ser realizado um Shift e o segundo nmero a
quantidade de posies de bits a serem deslocados. Exemplos de uso:
int numero=-3;
numero=numero>>1;
numero=numero<<1;
numero=numero>>>1;
numero=numero<<1;

//numero
//numero
//numero
//numero
//numero

vale
vale
vale
vale
vale

-3
-2
-4
2147483646
-4

Precedncia 8: operadores comparativos


So operadores que comparam dois nmeros e retornam em seguido o valor booleano "verdadeiro" ou "falso". Como
exemplo, pode-se citar o Menor que(<), Maior que (>), Menor ou Igual que(<=), Maior ou Igual que (>=) e Exemplo
de (instanceof). O significado dos quatro primeiros operadores evidente. J a operao Exemplo de, retorna
"verdadeiro" se o primeiro operando for um Objeto pertencente classe passada como segundo operando e "falso"
caso contrrio. Exemplos de uso:
boolean variavel;
variavel=(4<4);
variavel=(4<=4);
variavel=(-1>-3);
variavel=(-4>=0);

//variavel
//variavel
//variavel
//variavel

recebe
recebe
recebe
recebe

"falso"
"verdadeiro"
"verdadeiro"
"falso"

Operadores

156

Precedncia 7: operadores de igualdade


So semelhantes aos Operadores Comparativos. Eles tambm recebem nmeros como operandos e retornam um
valor boolean. A diferena que estes operadores apenas verificam se as variveis so iguais ou no. Como
exemplos de operadores assim, pode-se citar o Igual a (==) e Diferente de (!=). Estes operadores podem ser usados
em qualquer tipo de varivel, desde que elas sejam do mesmo tipo. Exemplos de uso:
boolean variavel;
variavel=(-5==5);
//variavel recebe "falso"
variavel=(2!=45674); //variavel recebe "verdadeiro"

Precedncia 6, 5 e 4: operadores Bit-aBit


Os Operadores Bit-a-Bit so todos aqueles que realizam suas operaes sobre os bits de um nmero, e no sobre o
seu valor. Existem ao todo trs destes operadores e cada um deles tem um valor de precedncia diferente. O que tem
precedncia mais alta o AND bit-a-bit (&). Ele analisa dois bits e retorna 1 se ambos forem iguais 1 e 0 caso
contrrio. Depois vem o OR exclusivo bit-a-bit (^) que retorna 1 se os bits forem diferentes e 0 caso contrrio. Por
ltimo, vem o operador OR inclusivo (|), que retorna 0 caso ambos os bits valerem 0 e retorna 1 caso contrrio. Estes
operadores podem ser usados em qualquer tipo de dados, desde que possuam o mesmo tamanho em bits. Exemplos
de uso:
int numero;
numero=34&435; //numero passa a valer 34
numero=34^46;
//numero passa a valer 12
numero=436|547; //numero passa a valer 951

Precedncia 3 e 2: operadores AND e OR


Os operadores AND e OR s podem ser usados em variveis e literais do tipo boolean. O operador AND (&&)
retorna "verdadeiro" quando seus dois operandos tambm valem "verdadeiro" e retorna "falso" caso contrrio. O
operador OR (||) retorna "falso" quando seus dois operandos so falsos e retorna "verdadeiro" caso contrrio.
Exemplos de uso:
boolean variavel;
variavel=(2<45)&&(45<2)
variavel=(2<45)||(45<2)

//variavel passa a valer "falso"


//variavel passa a valer "verdadeiro"

Precedncia 1: operadores ternrios


O operador ternrio ? : recebe ao todo trs operandos. O primeiro operando deve possuir necessariamente um valor
do tipo boolean. Os outros dois operandos podem ser de qualquer tipo, mas precisam ser ambos do mesmo tipo. Caso
o valor do primeiro operando seja "verdadeiro", o operador retorna um valor igual ao do segundo operando. Caso o
seu valor seja "falso", ele retorna um valor idntico ao terceiro operando. Exemplos de uso:
int numero1=245;
int numero2=123;
numero1=(numero1>numero2)?numero1:numero2; /* Faz com que a variavel
numero 1 receba sempreo maior valor entre ela mesma e a numero2. Neste
caso, ela
receber o seu prrio valor por ele ser maior*/

Operadores

157

Precedncia 0: atribuies
Os operadores de atribuio so os mais numerosos e os que tem uma prioridade menor de serem interpretados. Um
exemplo deste operador (=)foi bastante usado neste captulo. Ele armazena o valor que aparecer direita na varivel
presente esquerda. Caso deseje-se que a varivel da esquerda receba o valor dela mesma aps passar por alguma
operao com um segundo valor, basta colocar o smbolo da operao antes do sinal "=" e colocar o segundo valor
direita. Exemplos de uso:
int numero = 3;
numero += 7;
numero -= 32;
numero %= -3;
-3. Ou seja, -1.
numero *= 6;
numero /= 2;
-3.

//numero
//numero
//numero
//numero

recebe
recebe
recebe
recebe

o valor 3
3+7. Ou seja, 10.
o seu valor menos 32. Ou seja, -22.
o resto da diviso entre seu valor e

//numero recebe o seu valor vezes 6. Ou seja, -6.


//numero recebe o seu valor dividido por 2. Ou seja,

Quando em uma mesma linha forem encontrados vrios operadores diferentes, sero executados primeiro aqueles
que tiverem maior precedncia. Se existirem operadores com o mesmo valor de precedncia, ser realizado primeiro
aquele cujo smbolo aparecer primeiro. possvel alterar a ordem natural com que so feitas as operaes atravs do
uso de parnteses. As operaes entre parnteses sempre so realizadas antes.

Outros tipos de for


ForEach
ForEach funciona com Array ou toda class que implementa a interface Iterable:
public interface Iterable<T>{
public abstract Iterator<T> iterator();
}

Exemplo de ForEach:
public class ForEach {
public static void main(String [] args){
String nomes[] = new String[5];
nomes[0]
nomes[1]
nomes[2]
nomes[3]
nomes[4]

=
=
=
=
=

"joo";
"maria";
"jos";
"paulo";
"paula";

for(String n : nomes){
System.out.println(n);
}

Outros tipos de for

158

}
}

Palavra-chave
Palavras-chave
Em programao, palavras-chave, ou palavras reservadas, so as palavras que no podem ser usadas como
identificadores, ou seja, no podem ser usadas como nome de variveis, nome de classes, etc. Estas palavras
so assim definidas ou porque j tm uso na sintaxe da linguagem ou porque sero usadas em algums
momento, seja para manter compatibilidade com verses anteriores ou mesmo com outras linguagens. No caso
do Java temos as seguintes palavras-chave:
abstract

continue for

new

switch

assert (3) default

goto (1)

package

synchronized

boolean

do

if

private

this

break

double

implements protected

throw

byte

else

import

public

throws

case

enum (4) instanceof

return

transient

catch

extends

int

short

try

char

final

interface

static

void

class

finally

long

strictfp (2) volatile

native

super

const (1) float


null
(1) sem uso na linguagem
(2) somente a partir da verso 1.2
(3) somente a partir da verso 1.4
(4) somente a partir da verso 5.0

while

Palavra-chave/abstract

159

Palavra-chave/abstract
Modificador abstract
A instruo abstract serve para:
declarar mtodos abstratos, ou seja, mtodos que devero ser desenvolvidos/implementados nas subclasses.
Quando a classe que contiver mtodos abstratos for herdada, os referidos mtodos devero ser implementados,
caso contrrio, a classe que extendeu dever ser declarada como abstrata.
declarar classes abstratas que se desenvolvem numa(s) subclasse(s). Classes abstratas so aquelas que no
esto totalmente implementadas/descritas. Uma classe abstrata no pode ser instanciada e amplamente usada
nas interfaces.
Uma classe considerada abstrata se contiver pelo menos um mtodo abstrato. Um mtodo abstrato tem a
seguinte caracterstica: void getName( );
Caso o mtodo tenha as chaves caractersticas {}, o mesmo no mais ser considerado abstrato, embora no
tenha cdigo dentro das chaves.

Palavra-chave/boolean
import java.util.Random;
public class OitoRainhas {
final int CASAS = 8;
int campo

[][] = new int [CASAS][CASAS];

Random nAleat = new Random();


public static void main (String[]args){
OitoRainhas proExe = new OitoRainhas ();
proExe.executar();
}

private void executar() {


aleatorio();
while (!confRainha()) {
aleatorio();
}
}

Palavra-chave/boolean

160

void imprimir(){
System.out.println();
for (int l = 0; l < campo[0].length; l++) {
for (int c = 0; c < campo[0].length; c++) {
System.out.print(" " + campo[l][c] + " ");
}
System.out.println();
}
}
void aleatorio() {
for (int l = 0; l < CASAS; l++) {
for (int c = 0; c < CASAS; c++) {
campo[l][c] = 0;
}
}
int i = 0;
while (i++ < 8) {
int linha = nAleat.nextInt(8);
int coluna = nAleat.nextInt(8);
if (campo[linha][coluna] == 0){
campo[linha][coluna] = 1;
} else {
i--;
}
}
imprimir();
}
boolean confRainha () {
for (int l = 0; l < campo[0].length; l++) {
for (int c = 0; c < campo[0].length; c++) {

Palavra-chave/boolean

161
if (campo[l][c] == 1) {
System.out.println("Linha: " + l + "

Coluna: " + c);


if (temAtaque(l, c)) {
return false;
}
}
}
}
return true;
}

boolean temAtaque(int l, int c) {


if (temAtaqueHorizontal(l, c)) return true;
if (temAtaqueVertical(l, c)) return true;
if (temAtaqueDiagonal(l, c)) return true;
return false;
}
boolean temAtaqueHorizontal(int l, int c) {
int contRainhas = 0;
for (int i = 0; i < CASAS; i++) {
if (campo[l][i] == 1) {
contRainhas++;
}

Palavra-chave/boolean

162
}
if (contRainhas > 1) return true;
return false;

boolean temAtaqueVertical (int l, int c){


int contRainhas = 0;
for (int i = 0; i < CASAS; i++){
if (campo[i][c] == 1) {
contRainhas++;
}
}
if (contRainhas > 1)return true;
return false;
}
boolean temAtaqueDiagonal (int l, int c){
if (temAtaqueDireitaSup(l, c))return true;
if (temAtaqueEsquerdaSup(l,c))return true;
if (temAtaqueDireitaInf(l, c))return true;
if (temAtaqueEsquerdaInf(l, c))return true;
return false;
}

boolean temAtaqueDireitaSup (int l, int c){


int contRainha = 0;

Palavra-chave/boolean

163

while (l >= 0 && c < CASAS){


if (campo[l][c] == 1) contRainha ++;
l--;
c++;
}
if (contRainha > 1)return true;
return false;
}

boolean temAtaqueEsquerdaSup (int l, int c){


int contRainha = 0;
while (l >= 0 && c >= 0){
if (campo[l][c] == 1) contRainha ++;
l--;
c--;
}
if (contRainha > 1)return true;
return false;
}
boolean temAtaqueDireitaInf (int l, int c){
int contRainha = 0;
while (l < CASAS && c < CASAS){
if (campo[l][c] == 1) contRainha ++;

Palavra-chave/boolean

164
l++;
c++;
}
if (contRainha > 1)return true;
return false;

}
boolean temAtaqueEsquerdaInf (int l, int c){
int contRainha = 0;
while (l < CASAS && c >= 0){
if (campo[l][c] == 1) contRainha ++;
l++;
c--;
}
if (contRainha > 1)return true;
return false;
}
}

Palavra-chave/else

Palavra-chave/else
significa (se no) na linguagem de java e joga para o outro codigo

Palavra-chave/final
Modificador final
A instruo final indica que a classe, mtodo ou varivel assim declarada tm uma nica atribuio que se
mantm constante, ou seja, no pode ser alterada no decorrer do processamento.
Este modificador declara o que chamamos, em programao, de constante.

Palavra-chave/goto
Palavra-chave goto
A palavra-chave goto no tem uso em Java. Ela foi reservada para que no seja usada como identificador
dentro dos programas, evitando assim confuses com o comanda goto que existe em outras linguagens.

Palavra-chave/int
Varivel que guarda nmero inteiro. Deve ser colocado entre main. Ex:
class idade {
public static void main(String[] args) {
int idade = 42;
System.out.println(idade);
}
}
Classe compilada e executado retorna a idade, isto , 42.

165

Palavra-chave/private

Palavra-chave/private
Modificador de acesso private
O modificador de acesso "private" quando aplicado a um atributo ou a um mtodo indica que os mesmos s podem
ser acessados de dentro da classe que os criou (encapsulamento). Uma classe que herde de uma superclasse com
atributos declarados como "private" s poder ter acesso a eles atravs dos mtodos pblicos da prpria superclasse,
caso contrrio, no haver acesso a estes atributos.
Exemplo
class Circulo
{
private float raio;
Circulo()
{
super();
setRaio( 3.0 );
}
void setRaio( float r )
{
raio = r
}
}
class Pneu extends Circulo
{
Pneu p = new Pneu();
p.raio = 10.0; //Erro de compilao. O Atributo raio privado da
classe Circulo
p.setRaio(10.0); //Correto, pois a classe Pneu est utilizando os
mtodos definidos na classe Circulo para fazer
//acesso ao atributo privado raio
}

166

Palavra-chave/protected

Palavra-chave/protected
Modificador de acesso protected
A instruo protected indica que o mtodo ou a varivel assim declarada possa ser acessada somente dentro do
pacote em que est contida atravs de uma subclasse.

Palavra-chave/public
Modificador de acesso public
A instruo public indica que a classe, mtodo ou varivel assim declarada possa ser acessada em qualquer
lugar e a qualquer momento da execuo do programa.

Palavra-chave/static
Modificador de acesso static
A instruo static serve:
na declarao de uma varivel dentro de uma classe, para se criar uma varivel que poder ser acessada por
todas as instncias de objetos desta classe como um varivel comum. Ou seja, a varivel criada ser a mesma
em todas instncias e quando seu contedo modificado em uma das instncias ento ele ser modificado em
todas instncias;
na declarao de um mtodo que deve ser acessado diretamente na classe e no nas suas instncias.
Mothafocka do caralho

167

Palavra-chave/super

Palavra-chave/super
super uma palavra-chave (keyword).
Quando uma classe criada como sub-classe de outra classe, super usado para que a sub-classe possa acessar
mtodos public ou protected (mas no private) da superclasse.
Super tambm usado para invocar o constructor da superclasse, durante o constructor da subclasse.

Sintaxe
super.<method_name>();
ou
super(<argumentos>);

Exemplo do uso de mtodos


public class SuperClass
{
public void printHello()
{
System.out.println( "Hello from SuperClass" );
return;
}
}
...
public class SubClass extends SuperClass
{
public void printHello()
{
super.printHello();
System.out.println( "Hello from SubClass" );
return;
}
public static main( String[] args )
{
SubClass obj = new SubClass();
obj.printHello();
}
}

168

Palavra-chave/super

169

Exemplo do uso no constructor


public class MyFrame extends Frame {
...
public MyFrame(String title) { // constructor
super(title); // chama o constructor de Frame
...
}
}

Palavra-chave/switch
Comando switch
A instruo switch uma instruo condicional de mltiplos desvios. Ou seja, de acordo com o resultado de
uma condio pode-se executar um desvio entre os vrios possveis - diferente da instruo if que permite
somente dois desvios: um para a condio verdadeira e outra para a falsa.
A instruo switch analisa o valor (literal) resultante de uma expresso ou varivel - que chamamos de
condio no pargrafo anterior - e, de acordo com esse valor (que pode ser dos tipos: char, byte, short, int, long
ou um tipo enumerado) desvia a execuo dos programas para um dos casos (atravs da palavra-chave case).

Sintaxe do comando switch


switch ( <condio> )
{
case <valor1>: <bloco de programa1
break;
case <valor2>: <bloco de programa2
break;
...
case <valorn>: <bloco de programan
break;
default: <bloco de programa a ser
break;
}

a ser executado>

a ser executado>

a ser executado>

executado caso nenhuma das condies acima seja adequada>

Onde:
<condio> literal, expresso ou varivel que seja do tipo char, byte, short, int, long ou um tipo
enumerado.
case <valorn>: estabelece que o bloco n seguinte seja executado caso <condio> seja igual a <valorn>.
break; estabelece o fim do bloco de um dos casos.
default: estabelece que o bloco seguinte seja executado caso nenhum <valorx> seja igual <condio>.

Palavra-chave/switch
Exemplos de uso do switch
int dia_da_semana=1;
switch (dia_da_semana)
{
case 1: System.out.println("Domingo");
break;
case 2: System.out.println("Segunda-feira");
break;
case 3: System.out.println("Tera-feira");
break;
case 4: System.out.println("Quarta-feira");
break;
case 5: System.out.println("Quinta-feira");
break;
case 6: System.out.println("Sexta-feira");
break;
case 7: System.out.println("Sbado");
break;
default: System.out.println("O dia da semana est errado.");
break;
}

Palavra-chave/void
Instruo void
A instruo void indica a ausncia de um tipo de dado. Serve para indicar uma classe que no retorna nenhum
dado.
Por exemplo:
public static void main(String[] args) {
//
}

170

Por onde comear

Por onde comear


Por Onde Comear
Provavelmente voc est ansioso para comear a aprender essa linguagem depois de tudo o que foi escrito at aqui,
mas vamos com calma porque h ainda mais coisas a explicar e alguns conselhos a dar antes de realmente
comearmos.
O primeiro que a linguagem Java est disponvel em vrias verses, cada uma com seu propsito. Cada uma destas
verses deve ser ressaltada uma vez que atuam em tecnologias diferentes e necessitam de diferentes pr-requisitos.
Java SE: a tecnologia Java para desktops. obrigatrio o seu entendimento, ou pelo menos seus conceitos, pois
serve de fundao para as outras verses. Atua em notebooks e PCs domsticos e est amplamente disponvel,
estando presente em quase 90% dos PCs do mundo.
Java ME: a verso para dispositivos mveis, os quais geralmente tm menos memria sendo ela limitada bem
como seu processamento tambm o sendo. Sendo assim nada mais do que uma verso reduzida das APIs para
desktop que incluem APIs especficas para construir aplicaes que lidem com estas limitaes.
JAVA EE: na verdade um conjunto de especificaes, as quais so implementadas em servidores de aplicao, tais
como JBoss, Jetty, BEA Logic, etc. A base dela o Java SE, porm o jeito de programar diferente devido ao amplo
conjunto de tecnologias e objetivos diferentes. Sendo assim o recomendado aprender primeiro JavaSE, pois a
base para as outras edies. Para isso, como em qualquer linguagem, o ideal primeiro treinar a lgica, pois o
processo de desenvolvimento de programas requer o uso de lgica o tempo todo, e depois aprender Java em paralelo
com o paradigma da orientao a objetos, o qual o mais usado atualmente.
Para aprender Java, portanto, siga para os prximos passos para poder comear aprender os bsicos dessa linguagem.
Infelizmente no vamos poder ensinar a fundo a Orientao a objetos, j que este no o foco principal do Wiki, e
sim, ensinar Java.

171

Pr-requisitos para acompanhar o livro

Pr-requisitos para acompanhar o livro


O que necessrio
Para executar os programas
Para rodar programas em Java, necessria uma Mquina Virtual Java (que interpreta os bytecodes Java) e
alguns outros pacotes de acordo com o programa a ser executado.
O pacote JRE - Java Runtime Environment oferece esta mquina virtual, as bibliotecas bsicas e outros
componentes para executar os programas Java independentes e os que se executam dentro do navegador de
internet.
Existem verses destas mquinas virtuais para os sistemas operacionais: Solaris (Sparc e Intel), Linux e
Windows no site da Sun [1].

Para desenvolver os programas


Para desenvolvermos aplicativos em Java, ser necessrio possuir o Kit de desenvolvimento Java (JDK Java SE Development Kit). Ele um conjunto de programas que permitem voc criar os seus aplicativos em
Java. O principal programa incluso nesse conjunto o javac, o compilador da linguagem Java.
Obs.: O JDK j possui inclui todos os recursos do JRE - ento s necessitamos instalar o JDK.
Este livro baseado na verso 6u1 do Java SE Development Kit (JDK).
Alm disso, necessrio um editor de textos compatvel com o formato Unicode para podermos digitar os
cdigos fonte. Por exemplo: no Windows XP, podemos usar o Bloco de Notas (Notepad).

Instalando o Java Development Kit (JDK)


Verificando se j temos o JDK instalado
Abra a janela de um terminal e digite o seguinte comando:
javac -version

Se o JDK estiver instalado ser mostrado a verso do mesmo como, por exemplo, a seguir:
javac 1.6.0_01

Se a verso mostrada for maior que 1.6.0x pode-se pular o restante desta pgina e passar para o prximo
captulo
Caso o JDK no esteja instalado, ir aparecer a seguinte mensagem, por exemplo:
'javac' is not recognized as an internal or external command, operable
program or batch file.

172

Pr-requisitos para acompanhar o livro

Baixando o JDK
O JDK 6u1 pode ser baixado aqui [1].

Instalando o JDK
Roda-se o programa de instalao.
Aps a instalao, deve-se configurar o acesso global pasta do Java. Descrevemos a seguir como isto feito:

No Windows 9x
Adicione as seguintes linhas no final do arquivo AUTOEXEC.BAT:
set PATH=%PATH%; C:\Program Files\Java\jdk1.6.0_01\bin;
set CLASSPATH=.

Obs.: A localizao da pasta dos arquivos Java ("C:\Program Files\Java\jdk1.6.0_01\bin;") deve ser mudada de
acordo do lugar onde voc instalou o JDK. Reinicie o computador.

No Windows XP
V ao Painel de controle - Sistema. Abra a aba da janela "Avanado" e clique no boto "Variveis do sistema".
Edite a varivel PATH adicionando o caminho C:\Program Files\Java\jdk1.6.0_01\bin (ou a pasta de
instalao dos executveis Java - caso j exista outros caminhos configurados, deve-se separar esta incluso
com ponto-e-vrgula ; ). Reinicie o computador.

No Linux
A instalao do Java no Linux pode ser feita de diversas maneiras e tambm varia muito dependendo da distribuio:
Para instalar no Ubuntu:
Mquina para executar programas Java:
apt-get install openjdk-7-jre
Plugin para executar applets Java no navegador
apt-get install icedtea-7-plugin
Instalao do SDK, o qual inclui compilador:
apt-get install openjdk-7-jdk
Para mais detalhes sobre como instalar o Java no Linux, veja o tutorial encontrado no livro Linux para iniciantes,
captulo Linux para iniciantes/Instalando programas/Java.

Referncias
[1] http:/ / java. sun. com

173

RMI

174

RMI
Introduo
A tecnologia Java RMI (Remote Method Invocation) consiste em uma biblioteca capaz de permitir que um
programa rodando em uma dada mquina efetue chamadas objetos instanciados em outra mquina. Apesar de ser
desenvolvida focando principalmente a chamada de procedimentos objetos localizados em mquinas distintas ela
tambm pode ser utilizada para efetuar a comunicao entre dois processos rodando na mesma mquina (desde que
ambos utilizem a JVM), muito embora tecnologias como XPCOM e outras possam disponibilizar performance e
integrao melhores.

Tenologias semelhantes
Existem duas outras tecnologias que se assemelham muito com a RMI: CORBA e .NET Remoting (que no .NET 3.0
foi incorporada pela WCF). A tecnologia .NET Remoting pode ser vista como a resposta Microsoft tecnologia
RMI, e possui quase as mesmas caractersticas. J a tecnologia CORBA divulgada mais tempo e possui a
vantagem de possuir bibliotecas em diversas linguagens, assim um objeto CORBA pode ser utilizado em vrios
programas escritos em linguagens diferentes (a tecnologia RMI foi feita exclusivamente para a plataforma Java).

Um exemplo rpido
Para demonstrar a facilidade da linguagem, vou criar um exemplo bem simples que ir utilizar a tecnologia RMI.
Um pequeno aplicativo para postar mensagens em um frum e listar as mesmas.
Primeiro devemos criar uma interface que ser utilizada para exibir aos usurios dos servio as operaes.
package rmiknolexample;
import java.rmi.RemoteException;
import java.rmi.Remote;
/**
*
* @author Andre
*/
public interface IForum
extends Remote {
public void postMessage(String author, String aMessage) throws
RemoteException;
public String[] readPosts() throws RemoteException;
public String[] readPosts(int beginAt) throws RemoteException;
}
Depois devemos criar uma classe que ir implementar a interface e disponibilizar a funcionalidade.
package rmiknolexample;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;

RMI

175

/**
*
* @author Andre
*/
public class ForumImpl
extends UnicastRemoteObject
implements IForum {
private Vector posts;
// O construtor padro deve gera a exeo RemoteException
public ForumImpl() throws RemoteException {
posts = new Vector();
}
public void postMessage(String author, String aMessage) throws
RemoteException {
posts.add(author + " disse uma vez: " + aMessage);
}
public String[] readPosts() throws RemoteException {
String[] result = new String[posts.size()];
posts.toArray(result);
return result;
}
public String[] readPosts(int beginAt) throws RemoteException {
String[] results = readPosts();
String[] copy = new String[results.length - beginAt];
System.arraycopy(results, beginAt, copy, 0, copy.length);
return copy;
}
Feito isso vamos implementar a classe que ir disponibilizar o servio ao usurio.
package rmiknolexample;
import java.rmi.Naming;
import java.rmi.RemoteException;
/**
*
* @author Andre
*/
public class ForumService {
public static void main(String[] args) {
try {

RMI

176
ForumImpl forumObj = new ForumImpl();
Naming.rebind("forumService", forumObj);
System.err.println("Rodando");
} catch(RemoteException e) {
System.err.println("Ocorreu um erro relativo ao RMI: " +
e.getMessage());
e.printStackTrace();
System.exit(0);
} catch(Exception e) {
System.err.println("Ocorreu um erro desconhecido: " +
e.getMessage());
e.printStackTrace();
System.exit(0);
}
}
}
Na classe acima observe a linha:
Naming.rebind("forumService", forumObj);
Ela responsvel por associar um nome ao seu objeto. atravs deste nome que os computadores e processos
remotos iro encontrar e utilizar o seu objeto. Este nome nico para um dado host, ou seja, mesmo se duas
aplicaes criarem objetos distintos (at mesmo de classes distintas) o mesmo nome no poder ser utilizado.
Por ltimo vamos implementar a classe que ir utilizar o servio disponibilizado.
package rmiknolexample;
import java.rmi.Naming;
import java.rmi.RemoteException;
/**
*
* @author Andre
*/
public class ForumClient {
public static void main(String[] args) {
try {
IForum forumObj =
(IForum)Naming.lookup("rmi://localhost/forumService");
forumObj.postMessage("autor", "Java RMI muito legal");
forumObj.postMessage("autor", "Nunca poste no frum sem
buscar");
String[] posts = forumObj.readPosts();
int x = 1;
for(String s: posts)
System.err.println(x++ + ": "+ s);

RMI

177
int offset = 1;
posts = forumObj.readPosts(offset);
for(String s: posts)
System.err.println((x++ + offset) + ": "+ s);

} catch(RemoteException e) {
System.err.println("Ocorreu um erro relativo ao RMI: " +
e.getMessage());
e.printStackTrace();
System.exit(0);
} catch(Exception e) {
System.err.println("Ocorreu um erro desconhecido: " +
e.getMessage());
e.printStackTrace();
System.exit(0);
}
}
}
A linha:
IForum forumObj = (IForum)Naming.lookup("rmi://localhost/forumService");
Efetua uma consulta no host informado (neste caso o localhost) e solicita o objeto associado ao nome: forumService.
O resto do cdigo fala por si s, e graas ao RMI as chamadas so idnticas chamadas locais. Melhorando um
pouco o design da aplicao possvel criar um objeto local ou ento um remoto dependendo da ocasio.
Para facilitar o teste, a classe abaixo foi criada apenas para permitir rodar o servio atravs da linha de comando:
"java -jar arquivoJar.jar"
package rmiknolexample;
/**
*
* @author Andre
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
if (args[0].equals("server"))
ForumService.main(args);
else if (args[0].equals("client"))
ForumClient.main(args);
else
System.err.println("Usage: ");
}

RMI

178
}
pronto! Para executar basta compilar as classes, iniciar o aplicativo rmiregistry que o responsvel por encontrar e
disparar as chamadas aos objetos corretos e iniciar o servidor em um terminal ou prompt.
Aps isso feito abra outro terminal ou prompt e inicie a aplicao cliente.
Observao importante: neste caso o teste apenas local mas quando utiliza-se um ambiente com diversas mquinas
muito importante iniciar a aplicao servidor com a opo: -Djava.rmi.server.hostname=<nome_ou_ip_do_host>.
Caso no seja feito o objeto pode ser exportado com o host errado e a aplicao cliente pode tentar disparar o
procedimento em um endereo diferente do solicitado.
Existem diversas outras caractersticas da tecnologia RMI que no foram abordadas, como por exemplo a capacidade
de baixar o cdigo de uma determinada classe de modo transparente. Assim mesmo que o contexto local no
reconhea uma classe esta ser transferida do servidor e poder ser utilizada pela aplicao.

Fontes e referncias
Informaes sobre RMI - Sun [1]
Java RMI - Andr Luiz Alves Moraes [2]

Referncias
[1] http:/ / java. sun. com/ javase/ technologies/ core/ basic/ rmi/ index. jsp
[2] http:/ / knol. google. com/ k/ andr%C3%A9-luiz-alves-moraes/ java-rmi/ n6m12v5sl0jh/ 1

Referncia/JVM
JVM (Java Virtual Machine)

Referncia/java

Referncia/java
class Olamundo {
public static void main(String[] args) {
System.out.println("Ol mundo!!"); //Imprime na tela
}
}

Referncia/javac
class OlaMundo
{
public static void main(String[] args)
{
System.out.println(Ol mundo!);
}
}

Referncia/main
Main a funo por onde o programa comea. Ela deve ser criada dentro do escopo de alguma classe.

179

Swing

180

Swing
Swing uma API Java para interfaces grficas. Ela compatvel com a API AWT, mas trabalha de uma maneira
totalmente diferente. A API Swing procura renderizar\desenhar por contra prpria todos os componentes, ao invs de
delegar essa tarefa ao sistema operacional, como a maioria das outras APIs de interface grfica trabalham.
Por ser uma API de mais alto nvel, ou seja, mais abstrao, menor aproximao das APIs do sistema operacional,
ela tem bem menos performace que outras APIs grficas e consome mais memria RAM em geral. Porm, ela bem
mais completa, e os programas que usam Swing tm uma aparncia muito parecida, independente do Sistema
Operacional utilizado.
Este captulo segue a estrutura do livro Programao em GUI

ndice
Primeiro programa
Widgets
Eventos e Action listeners

Swing/Eventos e Action listeners


A comunicao entre os diversos widgets feita atravs de eventos (events, em ingls) e de action listeners. Os
conceitos esto explicados no livro Programao em GUI, captulo Eventos, sinais, slots e callbacks.

Primeira tentativa
O objetivo criar um programa que mostre um boto (com a string OK) e uma caixa de texto. Ao clicar-se no boto,
a caixa de texto responde, apresentando a string OK.
Para comear, vamos escrever o esqueleto do programa:
// arquivo swing_button_1.java
// inicio do programa swing_button - versao 1.0
import javax.swing.*; //All swing components live
//in the javax.swing package
import java.awt.*;
import java.awt.event.*;
// many widgets under a box
public class swing_button_1 {
public static void main(String[] args) {
// creates the Frame
JFrame frame = new JFrame("swing_button_1");
// defines frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Swing/Eventos e Action listeners

181

// creates the (vertical) box


Box vbox = new Box(BoxLayout.Y_AXIS);
// places the box inside the frame
frame.add(vbox);
// creates the elements of the vbox
// creates the button
JButton button1 = new JButton("OK");
JTextField entry1 = new JTextField("");
// add button and textfield inside the vbox
vbox.add(button1);
vbox.add(entry1);
// set frame to a decent size (default is a small frame)
frame.setSize(212, 258);
// makes frame (and everything in it) visible
frame.setVisible(true);
}
}
// fim do programa swing_button - versao 1
O programa acima no faz nada: pode-se clicar no boto, mas isto no tem efeitos. Precisamos incluir dois
elementos:
o boto button1 deve incluir um actionListener, para que o clicar nele tenha algum efeito
a caixa de texto entry1 deve incluir um actionPerformed, para que ela reaja ao clicar do boto
Incluir um actionListener no boto muito simples: basta chamar o membro addActionListener, passando como
argumento um objeto do tipo ActionListener:
button1.addActionListener(al);
J a criao do actionListener mais complicada. Um actionListener deve ter um membro actionPerformed; assim,
poderamos ter:
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("OK");
}
};
A verso preliminar do cdigo, que ainda no faz aparecer "OK" na caixa de texto, mas faz aparecer "OK" na
console, :
// programa swing_button_1.java
// inicio do programa swing_button - versao 1.1
import javax.swing.*;

//All swing components live

Swing/Eventos e Action listeners

182
//in the javax.swing package

import java.awt.*;
import java.awt.event.*;
// many widgets under a box
public class swing_button_1 {
public static void main(String[] args) {
// creates the Frame
JFrame frame = new JFrame("swing_button_1");
// defines frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// creates the (vertical) box


Box vbox = new Box(BoxLayout.Y_AXIS);
// places the box inside the frame
frame.add(vbox);
// creates the elements of the vbox
// creates the button
JButton button1 = new JButton("OK");
JTextField entry1 = new JTextField("");
// ActionListener: makes button1 iteract with the System
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("OK");
}
};
// add ActionListener to the button
button1.addActionListener(al);
// add button and textfield inside the vbox
vbox.add(button1);
vbox.add(entry1);
// set frame to a decent size (default is a small frame)
frame.setSize(212, 258);
// makes frame (and everything in it) visible
frame.setVisible(true);
}

Swing/Eventos e Action listeners


}
// fim do programa swing_button - versao 1.1
E aqui a coisa se complica: no d para simplesmente trocar a varivel al para:
// ActionListener: makes button1 iteract with entry1
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
entry1.setText("OK");
}
};
porque o compilador d erro, com uma mensagem incompreensvel (Cannot refer to a non-final variable entry1
inside an inner class defined in a different method).

Soluo orientada a objetos


A soluo para este programa est em reescrever a classe swing_button_1 de forma a aproveitar as vantagens da
programao orientada a objetos.
Assim, teremos uma classe swing_button_2 que, em vez de conter apenas um main e fazer tudo usando variveis
locais do main, , ela prpria, uma classe do Swing.
Por exemplo, quase todos widgets que foram criados no main podem se tornar membros da classe swing_button_2,
sendo esta uma subclasse do widget principal.
Um esboo da reorganizao, com o cdigo que mostra os widgets mas no faz nada, seria:
// programa swing_button_2.java
// inicio do programa swing_button - versao 2.0
import javax.swing.*; //All swing components live
//in the javax.swing package
import java.awt.*;
import java.awt.event.*;
// a classe swing_button_2 antes era subclasse de Object
// agora, torna-se subclasse de JFrame
public class swing_button_2 extends JFrame {
// os widgets que eram criados no main
// agora so membros da classe
static Box vbox;
static JButton button1;
static JTextField entry1;
public static void main(String[] args) {
// o frame criado no main (como antes)
// a diferena que chamamos o constructor da classe
// este constructor se encarrega de montar vbox, button1 e

183

Swing/Eventos e Action listeners


entry1
swing_button_2 frame = new
swing_button_2("swing_button_2");
// o resto igual
frame.add(vbox);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(212, 258);
frame.setVisible(true);
}
// o trabalho de criar os widgets vbox, button1 e entry1 feito
no constructor da classe
public swing_button_2(String title) {
// super chama o constructor da classe JFrame
super(title);
// o resto igual
vbox = new Box(BoxLayout.Y_AXIS);
button1 = new JButton("OK");
entry1 = new JTextField("");
vbox.add(button1);
vbox.add(entry1);
}
}
// fim do programa swing_button - versao 2.0

Incluindo o ActionListener
Como visto acima, precisamos agora adicionar um ActionListener ao widget button1, e precisamos que este
ActionListener tenha o mtodo actionPerformed.
A forma mais natural de fazer isto tornar o prprio frame um ActionListener, o que pode ser feito trocando-se a
definio da classe de:
public class swing_button_2 extends JFrame {
para
public class swing_button_2 extends JFrame implements ActionListener {
Ento, todos objetos da classe swing_button_2, alm dos mtodos da classe JFrame, tambm herdaro os mtodos da
classe ActionListener, que, no caso, apenas um: actionPerformed. Este mtodo deve ser escrito:
public void actionPerformed(ActionEvent e) {
entry1.setText("OK");
};

184

Swing/Eventos e Action listeners


Finalmente, o membro button1 do objeto frame deve se conectar ao objeto frame, de forma que o mtodo
actionPerformed do frame seja executado quando o boto for clicado. Assim, temos que fazer:
button1.addActionListener(this);

Cdigo, verso final


A verso final do cdigo fica:
// programa swing_button_2.java
// inicio do programa swing_button - versao 2.1
import javax.swing.*; //All swing components live
//in the javax.swing package
import java.awt.*;
import java.awt.event.*;
// a classe swing_button_2 antes era subclasse de Object
// agora, torna-se subclasse de JFrame e implementa as
// interfaces da classe ActionListener
public class swing_button_2 extends JFrame implements ActionListener {
// os widgets que eram criados no main
// agora so membros da classe
static Box vbox;
static JButton button1;
static JTextField entry1;
// ActionListener faz button1 iteragir com entry1
public void actionPerformed(ActionEvent e) {
entry1.setText("OK");
};
public static void main(String[] args) {
// o frame criado no main (como antes)
// a diferena que chamamos o constructor da classe
// este constructor se encarrega de montar vbox, button1 e
entry1
swing_button_2 frame = new
swing_button_2("swing_button_2");
// o resto igual
frame.add(vbox);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(212, 258);
frame.setVisible(true);
}

185

Swing/Eventos e Action listeners

// o trabalho de criar os widgets vbox, button1 e entry1 feito


no constructor da classe
public swing_button_2(String title) {
// super chama o constructor da classe JFrame
super(title);
// o resto igual
vbox = new Box(BoxLayout.Y_AXIS);
button1 = new JButton("OK");
entry1 = new JTextField("");
// button1 ganha um ActionListener
button1.addActionListener(this);
vbox.add(button1);
vbox.add(entry1);
}
}
// fim do programa swing_button - versao 2.1

Ligaes externas
Writing Event Listeners [1] (tutorial em ingls)

Referncias
[1] http:/ / java. sun. com/ docs/ books/ tutorial/ uiswing/ events/ index. html

186

Swing/Primeiro programa

187

Swing/Primeiro programa
Este o primeiro programa em Java usando a API Swing.
import javax.swing.JFrame;
JFrame

// inclui, da biblioteca swing, apenas

public class jframetest {


public static void main(String[] args) {
JFrame frame = new JFrame("Este e' um teste");
frame.setSize(300, 300);
//frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

Entendendo o programa
Como quase todo programa escrito em GUI, vrios passos so necessrios para fazer uma janela aparecer na tela.
No basta cri-la, deve ser explicitamente ordenado que ela apareca.
Assim, temos os comandos
JFrame frame = new JFrame("Este e' um teste");
frame.setSize(300, 300);
que criam a janela, o comando
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
que indica que a aplicao toda deve terminar quando a janela for fechada, e o comando
frame.setVisible(true);
que faz a janela aparecer para o usurio.
Note-se que, aparentemente, o programa termina, mas a janela continua visvel. Esta uma caracterstica da
programao em GUI: o programa realmente s deve terminar quando a janela for fechada (e, mesmo assim, deve
haver alguma salvaguarda para o usurio no perder dados, tal como aparecer uma janela perguntando se mesmo
para sair ou se ele deseja salvar os dados) ou quando o programa terminar seu objetivo (digamos, uma janela que
abre por 30 segundos para dizer que est na hora de ligar a TV para assistir o jornal; depois deste tempo, a janela
deve se fechar).
A linha (comentada)
//frame.setResizable(false);
se for descomentada far com que o programa no permita que a janela seja redimensionada.

Swing/Primeiro programa

Veja tambm
Programao em GUI/Primeiro programa - conceitos

Swing/Widgets
O conceito de widget est explicado em Programao em GUI/Widgets.

Exemplo
Este programa tem o objetivo de mostrar como simples exibir vrios
widgets em um aplicativo. O widget raiz um Box, que foi criado de
forma a empilhar seus widgets filhos verticalmente. Um destes filhos
outro Box, que empilha seus filhos horizontalmente.
Estes widgets no fazem nada: os botes podem ser pressionados,
pode-se entrar com texto nos campos de texto, pode-se mover o slider,
mas no acontece nada de prtico com estas modificaes (a imagem
que aparece direita um screenshot do programa, que foi chamado
de swing_demo_1 - esta imagem, obviamente, totalmente esttica).
O programa tambm carece de esttica: o objetivo mostrar que se
pode empilhar widgets.

import javax.swing.*; //All swing components live


//in the javax.swing package
// many widgets under a box
public class swing_demo_1 {
public static void main(String[] args) {
// creates the Frame
JFrame frame = new JFrame("swing_demo_1");
// defines frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// creates the (vertical) box


Box vbox = new Box(BoxLayout.Y_AXIS);
// places the box inside the frame
frame.add(vbox);

188

Swing/Widgets

189
// creates the elements of the vbox
// creates the label
JLabel label = new JLabel("label");
// creates the pushbutton
JButton button = new JButton("Click here");
// creates the horizontal slider
JSlider slider = new JSlider(JSlider.HORIZONTAL);
// creates the text editor
JTextArea textarea = new JTextArea();
// creates the horizontal box
Box hbox = new Box(BoxLayout.X_AXIS);
// creates the elements of the hbox
JLabel label1 = new JLabel("x =");
JTextField textfield = new JTextField("100");
// add label, button, slider, TODO and hbox inside the vbox
vbox.add(label);
vbox.add(button);
vbox.add(slider);
vbox.add(textarea);
vbox.add(hbox);
// add label1 and textfield inside the hbox
hbox.add(label1);
hbox.add(textfield);
// set frame to a decent size (default is a small frame)
frame.setSize(212, 258);
// makes frame (and everything in it) visible
frame.setVisible(true);

}
}

Ligaes externas
Tutorial sobre Widgets [1]

Referncias
[1] http:/ / home. cogeco. ca/ ~ve3ll/ jatutora. htm

Tipos de dados primrios

Tipos de dados primrios


Tipos de dados primrios
Toda varivel deve ter um tipo de dado, pois, o tipo determina que valores a varivel poder conter e que
operaes podero ser realizadas com ela.
Os tipos primrios ou primitivos so os tipos de informaes mais usuais e bsicas. As variveis deste tipo
contm valores simples, apropriados ao tipo da varivel, e seus dados podem ser classificados basicamente em
trs categorias: lgicos, numricos (inteiros e reais) e de caracteres.

Tipos de dados lgicos


boolean
o tipo de dado que contm literal lgico. Serve para armazenar um nico bit de informao. Este bit pode ser
representado pelas palavras false (falso) ou true (verdadeiro). Representa estados binrios, tais como:
verdadeiro/falso, certo/errado, ligado/desligado, aberto/fechado, sim/no etc.
Exemplos de declaraes:
boolean c;
boolean ligado = false;
Observao: um erro muito comum para quem programa em C/C++ fazer testes lgicos usando variveis inteiras
ou reais. Em Java, a instruo if() s deve receber argumentos lgicos.

Tipos de dados numricos


Tipos de dados numricos inteiros
byte
o tipo de dado capaz de armazenar 8 bits de informao, ou seja, um nmero inteiro entre -128 e 127. Sua
utilizao recomendada em caso de economia de memria, j que alguns tipos de dados maiores possuem
processamento mais rpido.
Exemplos de declaraes:
byte
byte
byte
byte
byte

a;
b = '1';
z = 111;
pato = 0xA;
seven = 07;

190

Tipos de dados primrios


short
o tipo de dado que capaz de armazenar nmeros inteiros de 16 bits, ou seja, um nmero inteiro entre
-32.768 e 32.767.
Exemplos de declaraes:
short a;
short by1 = -32;
short by2 = 0xBB;
int
o tipo de dado capaz de armazenar 32 bits, ou seja, de representar um nmero inteiro qualquer entre
-2.147.483.648 e 2.147.483.647. o tipo mais indicado na maioria dos casos por possuir uma grande faixa de
valores. Variveis deste tipo tambm costumam ser manipuladas mais rapidamente j que correspondem
largura de dados (de palavra) mais usual na maioria dos processadores atuais.
Exemplos de declaraes:
int a;
int by1 = -32;
int by2 = 0xBB;
long
o tipo de dado capaz de armazenar 64 bits de informao, ou seja, que pode representar um nmero inteiro
qualquer entre -9.223.372.036.854.775.808L e 9.223.372.036.854.775.807L. Recomenda-se seu uso apenas
quando for preciso assumir valores maiores ou menores do que aqueles possveis de serem assumidos pelo int.
Exemplos de declaraes:
long a;
long bwy1 = -32L;
long byz2 = 32l;
Tipos de dados numricos reais
float
o tipo de dado capaz de armazenar nmeros reais de preciso simples, ou seja, 32 bits de informao
representando um nmero real.
Exemplos de declaraes:
float
float
float
float
float

a;
by1 = -32.0;
bz2 = 32.2F;
bz = 32.455f;
bze = 1.32455e4f;

191

Tipos de dados primrios


double
o tipo de dado capaz de armazenar nmeros reais de preciso dupla, ou seja, 64 bits de informao em forma
de nmero real. usado para representar valores nos quais preciso uma preciso maior que a de float.
Exemplos de declaraes:
double
double
double
double
double

a;
by1 = -32.0;
bz2 = 32.2d;
bz = 32.455D;
bze = 1.32455e4D;

Tipos de dados de caracteres


char
o tipo de dado capaz de armazenar 16 bits representando caracteres no formato UTF-16 (formato UTF
composto de dois caracteres de 8 bits). Representado numericamente, o tipo char pode ter valores de 0 a 65535
(inclusive) - de '\u0000' a '\uffff'. Nas verses mais recentes da linguagem Java, prope-se substituir o tipo char
pelo tipo byte.
Exemplos de declaraes:
char letra = 'A' ;
char letra = '\u0041' ;

Variveis
Variveis
Variveis so nomes atribudos endereos na memria de um computador onde se guardam dados. A
declarao de uma varivel consiste em dar um nome para a posio de memria a ser usada e especificar qual
tipo de dado a guardar na memria.
Para declarar uma varivel, utiliza-se a seguinte sintaxe:
modificador tipo identificador;
Observao: o modificador opcional no caso da varivel ser a completar
Por exemplo:
static int flor;
Pode-se declarar mais de uma varivel do mesmo tipo separando-as por vrgulas, como na seguinte sintaxe:
modificador tipo identificador1, identificador2, identificador3;
Por exemplo:
static float medida, raiz1, raiz2;
Iniciar uma varivel atribuir um valor, um dado, varivel. As variveis tambm podem ser declaradas e
iniciadas ao mesmo tempo. Por exemplo:

192

Variveis

193

static int tempodecorrido=0;

Modificadores
Java/Modificadores

Identificadores
Java/Identificadores

Vetores
Definio de vetor
Um vetor uma estrutura de dados formada por um conjunto de dados ou outros elementos de um mesmo tipo
ou uma mesma estrutura. O vetor pode ter uma dimenso ou mais. Tambm chamado de matriz quando de
duas dimenses, funciona de modo anlogo s matrizes matemticas. O acesso aos dados feito atravs de
"coordenadas" (ndices).
A programao faz um grande uso de vetores. Cada item de um vetor chamado de elemento. Cada um dos
elementos possui uma posio dentro do vetor, qual referenciamos atravs do ndice do elemento. Cada um
dos "domnios" (conjunto de posies, endereos de armazenamentos) do vetor, nos chamamos de dimenso.
J o tipo de dado (ou de elemento) corresponde ao "contradomnio" do vetor, ou seja, o conjunto de literais ou
de outro tipo de elemento que o vetor pode armazenar.
Veja um vetor de uma dimenso e dez elementos:

Ele possui 10 elementos que so acessados (referenciados) pelos ndices:


[0], [1], [2], [3], [4], [5], [6], [7], [8], [9].
Os ndices de cada elemento so escritos entre colchetes [ ].
Veja um vetor de duas dimenses e vinte e cinco elementos (5 x 5):

Ele possui 25 elementos que so acessados (referenciados) pelos ndices:


[0][0],
[0][1],
[0][2],
[0][3],

[1][0],
[1][1],
[1][2],
[1][3],

[2][0],
[2][1],
[2][2],
[2][3],

[3][0],
[3][1],
[3][2],
[3][3],

[4][0],
[4][1],
[4][2],
[4][3],

Vetores

194

[0][4], [1][4], [2][4], [3][4], [4][4].


Cada elemento representado por dois ndices (um para cada dimenso), entre colchetes e adjacentes [ ][ ].
Veja um vetor de trs dimenses e cento e vinte e cinco elementos (5 x 5 x 5):

Ele possui 125 elementos que so acessados (referenciados) pelos ndices:


[0][0][0],
[0][1][0],
[0][2][0],
[0][3][0],
[0][4][0],
[0][0][1],
[0][1][1],
[0][2][1],
[0][3][1],
[0][4][1],
[0][0][2],
[0][1][2],
[0][2][2],
[0][3][2],
[0][4][2],
[0][0][3],
[0][1][3],
[0][2][3],
[0][3][3],
[0][4][3],
[0][0][4],

[1][0][0],
[1][1][0],
[1][2][0],
[1][3][0],
[1][4][0],
[1][0][1],
[1][1][1],
[1][2][1],
[1][3][1],
[1][4][1],
[1][0][2],
[1][1][2],
[1][2][2],
[1][3][2],
[1][4][2],
[1][0][3],
[1][1][3],
[1][2][3],
[1][3][3],
[1][4][3],
[1][0][4],

[2][0][0],
[2][1][0],
[2][2][0],
[2][3][0],
[2][4][0],
[2][0][1],
[2][1][1],
[2][2][1],
[2][3][1],
[2][4][1],
[2][0][2],
[2][1][2],
[2][2][2],
[2][3][2],
[2][4][2],
[2][0][3],
[2][1][3],
[2][2][3],
[2][3][3],
[2][4][3],
[2][0][4],

[3][0][0],
[3][1][0],
[3][2][0],
[3][3][0],
[3][4][0],
[3][0][1],
[3][1][1],
[3][2][1],
[3][3][1],
[3][4][1],
[3][0][2],
[3][1][2],
[3][2][2],
[3][3][2],
[3][4][2],
[3][0][3],
[3][1][3],
[3][2][3],
[3][3][3],
[3][4][3],
[3][0][4],

[4][0][0],
[4][1][0],
[4][2][0],
[4][3][0],
[4][4][0],
[4][0][1],
[4][1][1],
[4][2][1],
[4][3][1],
[4][4][1],
[4][0][2],
[4][1][2],
[4][2][2],
[4][3][2],
[4][4][2],
[4][0][3],
[4][1][3],
[4][2][3],
[4][3][3],
[4][4][3],
[4][0][4],

Vetores

195

[0][1][4],
[0][2][4],
[0][3][4],
[0][4][4],

[1][1][4],
[1][2][4],
[1][3][4],
[1][4][4],

[2][1][4],
[2][2][4],
[2][3][4],
[2][4][4],

[3][1][4],
[3][2][4],
[3][3][4],
[3][4][4],

[4][1][4],
[4][2][4],
[4][3][4],
[4][4][4].

Declarao de um vetor
Para declarar um vetor, utiliza-se a seguinte sintaxe:
tipo[] identificador;
ou
tipo identificador[];
Onde:
tipo = tipo de dado ou de elemento;
identificador = nome do vetor.
Um vetor de duas dimenses criado do seguinte modo:
tipo[][] identificador;
ou
tipo identificador[][];
Um vetor de trs dimenses criado do seguinte modo:
tipo[][][] identificador;
ou
tipo identificador[][][];
E assim, por diante - um vetor de quatro dimenses criado do seguinte modo:
tipo[][][][] identificador;
ou
tipo identificador[][][][];

Dados em um vetor
Os elementos dos vetores podem ser atribudos da seguinte forma (separados por vrgulas e entre chaves. Por
exemplo, em um vetor unidimensional poderamos indicar os dados de seus elementos assim:
{x0,x1,x2, ... ,xn}
onde cada um dos valores X um valor do elemento de ndice correspondente no vetor. A numerao dos ndices
comea a partir do 0 e pode ser somente nmero natural, ou seja, inteiro maior ou igual a zero.
Vetores podem ser declarados e iniciados conforme o seguinte exemplo - cada dimenso delimitada por
chaves e cada elemento separado do outro atravs de vrgulas:
int[] vetor={34, 27, 3, 2};

Vetores

196
Outro modo de uso declarando, iniciando com o tamanho (quantidade de elementos) do vetor e depois
atribuindo os valores, como o equivalente a seguir:

int[] vetor= new int[4];


vetor={34, 27, 3, 2};
Ou ento, atribuindo os elementos individualmente:
int[] vetor= new int[4];
vetor[0]=34;
vetor[1]=27;
vetor[2]=3;
vetor[3]=2;
Observao: lembre-se que o ponto utilizado para separar a parte inteira da parte fracionrio de um nmero
(notao inglesa) enquanto que a vrgula separa elementos.
Vetores de caracteres tambm so chamados de strings (cadeias de caracteres) e podem ser representados
como um conjunto de caracteres cercado por aspas. Podemos declarar e atribuir tipos no bsicos. No exemplo
a seguir, frase um vetor de objetos da classe String. Cada elemento de frase tambm um vetor de
caracteres. Por exemplo, "Bom dia" o primeiro elemento do vetor frase e tambm, por si s, um vetor de
caracteres {'B','o','m',' ','d','i','a'}.
String[] frase={"Bom dia","Boa tarde","Boa noite"};

Acessando os elementos do vetor


Para representar ou acessar um nico elemento de um vetor, usa-se a sintaxe:
identificador[i1][i2][i3]...[in]
onde:
identificador = nome do vetor;
in = a literal que representa o elemento de ndice n.
Assim, no exemplo acima, frase[0] igual a "Bom dia".
Observao: como a numerao dos ndices comea em 0, frase poder ter somente, no exemplo acima, os ndices
0, 1 ou 2.
Cada dimenso do vetor representada por um conjunto de colchetes. Assim, um vetor x de:
uma dimenso acessado:
x[i1]
duas dimenses acessado:
x[i1][i2]
trs dimenses acessado:
x[i1][i2][i3]
quatro dimenses acessado:
x[i1][i2][i3][i4]
e assim por diante.

Vetores

197

Comparando um vetor de duas dimenses com uma matriz algbrica


Por exemplo, podemos representar a seguinte matriz:

assim, em Java:
int[][] B=new int[2][4];
B={{8,0,9,2},
{2,4,3,1}};
ou assim:
int[][] B={{8,0,9,2},
{2,4,3,1}};
ou assim:
int[][]
B[0][0]
B[0][1]
B[0][2]
B[0][3]
B[1][0]
B[1][1]
B[1][2]
B[1][3]

B=new int[2][4];
= 8;
= 0;
= 9;
= 2;
= 2;
= 4;
= 3;
= 1;

Declarando, iniciando e atribuindo valores a um vetor de duas ou mais


dimenses
Para se atribuir valores s vrias dimenses de vetor, separamos cada dimenso num bloco (por chaves) e seus
elementos separados por vrgulas.
Exemplo de vetor de duas dimenses (2 elementos x 3 elementos):
float[][] V={{1.5,2.7,3.5}, {1.2,3.0,4.5}};
O exemplo acima corresponde seguinte matriz:

Ento, no caso de duas dimenses, geralmente se formata o cdigo em Java assim (para lembrar a
representao "biordenada" da matriz):
float[][] V={{1.5, 2.7, 3.5},
{1.2, 3.0, 4.5}};
Cada dimenso est agrupada por chaves. Cada um dos elementos da dimenso so separados por vrgulas. Os
nmeros fracionrios so representados com ponto ao invs de vrgula (entre a parte inteira e a fracionria).
Exemplo de um vetor de 3 dimenses (4 elementos x 3 elementos x 2 elementos), lembre-se que cada
dimenso est agrupada entre chaves

Vetores

198

int[][] V2={
{{1,65}, {2,47}, {33,5}},
{{1,32}, {22,7}, {53,65}},
{{1,5}, {12,7}, {23,5}},
{{1,2}, {2,7}, {3,66}}};
Equivale sobreposio (num espao tridimensional) dessas duas matrizes (formando a terceira dimenso):

break
Break um comando bastante importante no desenvolvimento da maior parte dos programas de computador, graas
a ele possvel fazer uma interrupo em lao (loop, em ingls).
A instruo break pode ser executada dentro de um while, for, do ... while ou switch (estes comandos sero
discutidos mais adiante neste livro), fazendo um sada imediata dessa instruo. Passando para o execuo do
prximo comando. O uso mais comum de um comando break parar a execuo de um for ou pular outros casos de
uma funo switch.
No exemplo abaixo temos um cdigo escrito em Java, onde em um loop for interrompido quando a varivel inteira
contador se torna igual a 5.
public class BreakTeste
{
public static void main( String args[] )
{
int contador; //Varivel de controle usada como referncia
for ( contador = 1; contador <= 10; contador++ )//Lao, ser repetido 10 vezes
{
if ( contador == 5 ) //Se o contador chegar at 5
break;

//Termina o loop quando a condio do if se

tornar verdadeira
System.out.printf( "%d ", contador);
}//Termino da instruo for
System.out.printf( "\nInterrompe o contador quando o contador =
%d\n",contador );
}//Fim do main
}//Fim da classe BreakTest

do while

do while
O Do while similar ao While, porm ele exige que o bloco de comandos seja executado pelo menos uma vez:
do
{
//Bloco de comandos
}while (condio);
Ex:
//Um menu qualquer
char i = ' ';
do{
//outros comandos
System.out.println("Se deseja sair aperte e");
}while(i != 'e');

else
Muitas vezes um bloco if acompanhado de um bloco else. Enquanto um deles, o if, serve para testar um
condio, o else serve para o mesmo propsito, porm a funo dele executar caso a condio que o if avalia
seja falsa. Desta maneira um cdigo executa o que est dentro do bloco if se a condio do if for avaliada como
verdadeira e pula o else e executa o que est dentro do else, pulando o if, caso a condio avaliada pelo if
seja falsa. Junto com o else tambm pode vir um outro if o que faz com que se a execuo do primeiro if seja
falsa ele caia no else testando a condio desse segundo if.
Exemplo:
if( x == 2 ){
System.out.println( "x vale 2" );
}
else if( x == 4 ){
System.out.println( "x vale 4" );
}
else{
System.out.println( "x no vale nem 4 nem 2" );
}

199

for

200

for
for (int i=0; i<=10; i++) // i++ incrementando i
{
<bloco de comando>
}

if
Dando seqncia ao estudo de Java vamos comear a ver dois tipos de estrutura: a de seleo e a de iterao
(repetio).
As estruturas de seleo servem para dar ao programador uma maior liberdade de escolha sobre o rumo da execuo
de um cdigo. Geralmente elas esto associadas a condicionais e do a oportunidade de se escolher uma de duas ou
mais opes.
A primeira estrutura a ser vista o if, que se traduz para portugus para como se. Essa estrutura testa uma condio e
verifica se ela verdade se for executa o que est dentro do bloco if.
Para ilustr-la vamos fazer rapidinho um programa que testa se um dado nmero par ou no
// ---------- Par.java ------- //
// testa se um nmero par -- //
public class Par{
public static void main( String args[] ){
int x = 8;
if( x % 2 == 0 ){ // testa se o resto da diviso de x por 2 0
System.out.println( x + " par." );
}
System.exit( 0 );
}
}
Dessa forma, a utilizao de estruturas if bem simples. A nica coisa a ser lembrada que a condio dos ifs
devem ser colocadas dentro de parnteses e que devem ser colocadas chaves para delimitar o corpo de um if. Obs:
Quando h somente uma instruo no bloco if a chave opcional, como por exemplo o trecho de cdigo dado acima.
Entretanto bom colocar-se a chave uma vez que d maior clareza e legibilidade ao cdigo na maioria das vezes.

switch

201

switch
Este mdulo precisa ser revisado por algum que conhea o assunto (discuta).

Este livro ou mdulo precisa ser formatado segundo o modelo wiki e/ou organizado conforme as convenes do Wikilivros. (discuta)
Por favor ajude a formatar este mdulo de acordo com as diretrizes estabelecidas no livro de estilo.
Editor: considere colocar o ms e o ano da marcao.

A Sintaxe bem simples. Segue o exemplo:


switch(x) {
case 1:
System.out.println("Faa a execuo 1");
break;
case 2:
System.out.println("Faa tal execuo");
break;
default:
System.out.println("Desculpa, nada vlido foi feito. Call
Chuck");
}
Explicao:
No exemplo no definimos, porm, deve ser definido uma varivel inteira, de nome x. A parte switch(x) nos diz
que as trocas devem ser em volta desta varivel, dos dados referentes a ela (Mostrarei um exemplo completo, com
entrada de dados).
case 1 nos diz o que fazer, se o usurio entrar com o nmero 1. No caso de se usar Strings, coloca-se assim:
case "algumastring": . break; esta parte diz ao sistema que ele deve interromper, neste momento, se o
caso (case) for verdadeiro, ento ele sai. Exemplo completo:
import java.util.Scanner;
class Troca {
public static void main(String args[]) {
System.out.println("Acesse o que voc quer: \n\t
1-Quem?\n\t 2-Quando?\n\n");
Scanner ler = new Scanner(System.in);
int x = ler.nextInt();
ler.nextLine();
switch(x) {
case 1:
System.out.println("Eu\n");
break;
case 2:
System.out.println("Agora\n");
break;
default:
System.out.println("Tente novamente...\n");

switch

202
}
}

}
A parte que voc talvez no conhea: import java.util.Scanner; esse cdigo ser responsvel pela
importao da classe Scanner, que far a entrada de dados.
Scanner ler = new Scanner(System.in);
int x = ler.nextInt();
ler.nextLine();
Ali define-se uma classe Scanner, com o objeto ler. Logo faz se a referncia a entrada de dados. Na segunda linha,
declara-se a varivel x, que conter o objeto ler, e o nextInt(); significa que ele Cortar, qualquer entrada do
teclado (neste caso o Predefinio:Keypress, Predefinio:Keypress, etc).

while
O comando while utilizado para realizar laos at que uma condio seja satisfeita.
Sua sintaxe :
while (<condio>){
bloco de comandos
}
Ex:
int i;
while (i<=10){
System.out.println(i);
i++;
}
Para sair do lao sem que a condio tenha sido satisteita, pode-se usar o comando break.

Fontes e Editores da Pgina

Fontes e Editores da Pgina


A classe Thread Fonte: http://pt.wikibooks.org/w/index.php?oldid=254258 Contribuidores: Jorge Morais, Marcos Antnio Nunes de Moura, 4 edies annimas
A histria de Java Fonte: http://pt.wikibooks.org/w/index.php?oldid=247824 Contribuidores: Abacaxi, Raylton P. Sousa, SallesNeto BR, 5 edies annimas
Apndices Fonte: http://pt.wikibooks.org/w/index.php?oldid=247836 Contribuidores: Abacaxi, Voz da Verdade
Blocos e comentrios de programao Fonte: http://pt.wikibooks.org/w/index.php?oldid=248192 Contribuidores: Abacaxi, Albmont, JackPotte, Raylton P. Sousa, Voz da Verdade, 1 edies
annimas
Caractersticas de linguagens orientadas a objetos Fonte: http://pt.wikibooks.org/w/index.php?oldid=247819 Contribuidores: Abacaxi, Albmont, Alexandreqo, Dante Cardoso Pinto de
Almeida, Felipe Gustavo Firmo, Helder.wiki, Marcos Antnio Nunes de Moura, Nunesnd, Profvalente, Raylton P. Sousa, Thiagoharry, Voz da Verdade, Wbrito, 7 edies annimas
Comandos de iterao Fonte: http://pt.wikibooks.org/w/index.php?oldid=236993 Contribuidores: Voz da Verdade, 14 edies annimas
Comandos de seleo Fonte: http://pt.wikibooks.org/w/index.php?oldid=185526 Contribuidores: Thiagoharry, Voz da Verdade, 1 edies annimas
Como funciona o primeiro programa Fonte: http://pt.wikibooks.org/w/index.php?oldid=248163 Contribuidores: Abacaxi, Albmont, Voz da Verdade
Constante Fonte: http://pt.wikibooks.org/w/index.php?oldid=248185 Contribuidores: Abacaxi, Voz da Verdade
Converso de tipos Fonte: http://pt.wikibooks.org/w/index.php?oldid=250966 Contribuidores: Abacaxi, David Stress, Hojerio, 1 edies annimas
Criando e executando o primeiro programa Fonte: http://pt.wikibooks.org/w/index.php?oldid=253556 Contribuidores: Abacaxi, Albmont, Ezarate, Jorge Morais, MGFE Jnior, Voz da
Verdade, Wutsje, 51 edies annimas
Declarao de classes Fonte: http://pt.wikibooks.org/w/index.php?oldid=182545 Contribuidores: 1 edies annimas
Exemplo de repetio usando for Fonte: http://pt.wikibooks.org/w/index.php?oldid=231989 Contribuidores: Helder.wiki, Marco Antonio Bidia, Raylton P. Sousa
Exemplo simples de mtodo Fonte: http://pt.wikibooks.org/w/index.php?oldid=231987 Contribuidores: David Stress, Raylton P. Sousa, 1 edies annimas
Exemplos de programas Fonte: http://pt.wikibooks.org/w/index.php?oldid=231988 Contribuidores: Helder.wiki, Jorge Morais, Mike.lifeguard, Raylton P. Sousa, 2 edies annimas
Exemplos de programas com vetores Fonte: http://pt.wikibooks.org/w/index.php?oldid=247826 Contribuidores: Abacaxi, Albmont, Jorge Morais, Seduardo, Thiagoharry, Voz da Verdade,
Wbrito, 2 edies annimas
Exerccios sobre estruturas de seleo Fonte: http://pt.wikibooks.org/w/index.php?oldid=231998 Contribuidores: Raylton P. Sousa, 1 edies annimas
Ferramentas Fonte: http://pt.wikibooks.org/w/index.php?oldid=247153 Contribuidores: Abacaxi, Voz da Verdade
Fluxos de entrada e sada Fonte: http://pt.wikibooks.org/w/index.php?oldid=205111 Contribuidores: Albmont, Helder.wiki
GUI Fonte: http://pt.wikibooks.org/w/index.php?oldid=205113 Contribuidores: Albmont
Herana Fonte: http://pt.wikibooks.org/w/index.php?oldid=262164 Contribuidores: Abacaxi, 2 edies annimas
Identificadores Fonte: http://pt.wikibooks.org/w/index.php?oldid=248186 Contribuidores: Abacaxi, Jorge Morais, Voz da Verdade, 2 edies annimas
Introduo Fonte: http://pt.wikibooks.org/w/index.php?oldid=262585 Contribuidores: Abacaxi, Albmont, Dante Cardoso Pinto de Almeida, Edufsousa, Guiwp, Helder.wiki, Jorge Morais,
Marcos Antnio Nunes de Moura, Ruy Pugliesi, Scorpion, Thiagoharry, Voz da Verdade, Wbrito, 1 edies annimas
Introduo s classes Fonte: http://pt.wikibooks.org/w/index.php?oldid=262163 Contribuidores: JackPotte, 2 edies annimas
J2EE Fonte: http://pt.wikibooks.org/w/index.php?oldid=262126 Contribuidores: Felipe Gustavo Firmo, Guiwp, Helder.wiki, PatrciaR, 3 edies annimas
J2ME Fonte: http://pt.wikibooks.org/w/index.php?oldid=262212 Contribuidores: Algum, Guiwp, Helder.wiki, Maxtremus, Raylton P. Sousa
Java 3D Fonte: http://pt.wikibooks.org/w/index.php?oldid=262118 Contribuidores: Algum, Guiwp, MGFE Jnior, Master, Maxtremus
Java TV Fonte: http://pt.wikibooks.org/w/index.php?oldid=262124 Contribuidores: Algum, David Stress, Guiwp, Maxtremus
Lista de predefinies Fonte: http://pt.wikibooks.org/w/index.php?oldid=248181 Contribuidores: Abacaxi, Helder.wiki, Voz da Verdade
Literais Fonte: http://pt.wikibooks.org/w/index.php?oldid=248225 Contribuidores: Abacaxi, Thiagoharry, Voz da Verdade, Wbrito, 1 edies annimas
Modificadores Fonte: http://pt.wikibooks.org/w/index.php?oldid=248032 Contribuidores: Abacaxi, Voz da Verdade, 3 edies annimas
O porqu de se estudar Java Fonte: http://pt.wikibooks.org/w/index.php?oldid=247825 Contribuidores: Abacaxi, Profvalente, Raylton P. Sousa, SallesNeto BR, 2 edies annimas
O que so mtodos e para que servem Fonte: http://pt.wikibooks.org/w/index.php?oldid=261739 Contribuidores: Devarde, Raylton P. Sousa, SallesNeto BR, 1 edies annimas
O que Java Fonte: http://pt.wikibooks.org/w/index.php?oldid=249151 Contribuidores: Abacaxi, Albmont, Dante Cardoso Pinto de Almeida, Felipe Gustavo Firmo, Helder.wiki,
Julianocanuto, Lukas, 24 edies annimas
Objetos Fonte: http://pt.wikibooks.org/w/index.php?oldid=251765 Contribuidores: Abacaxi, Hojerio
Onde Java est presente Fonte: http://pt.wikibooks.org/w/index.php?oldid=247813 Contribuidores: Abacaxi, LipeFontoura, SallesNeto BR, Voz da Verdade, 5 edies annimas
Operadores Fonte: http://pt.wikibooks.org/w/index.php?oldid=263358 Contribuidores: Abacaxi, Albmont, Helder.wiki, Jorge Morais, Thiagoharry, Voz da Verdade, Wbrito, 28 edies
annimas
Outros tipos de for Fonte: http://pt.wikibooks.org/w/index.php?oldid=244714 Contribuidores: Abacaxi, Alexandref93, 2 edies annimas
Palavra-chave Fonte: http://pt.wikibooks.org/w/index.php?oldid=247838 Contribuidores: Abacaxi, Albmont, Edufsousa, Voz da Verdade
Palavra-chave/abstract Fonte: http://pt.wikibooks.org/w/index.php?oldid=220753 Contribuidores: Albmont, Voz da Verdade, 6 edies annimas
Palavra-chave/boolean Fonte: http://pt.wikibooks.org/w/index.php?oldid=248059 Contribuidores: Abacaxi, 1 edies annimas
Palavra-chave/else Fonte: http://pt.wikibooks.org/w/index.php?oldid=245772 Contribuidores: Abacaxi, 1 edies annimas
Palavra-chave/final Fonte: http://pt.wikibooks.org/w/index.php?oldid=247862 Contribuidores: Abacaxi, Marcos Antnio Nunes de Moura, Voz da Verdade, 1 edies annimas
Palavra-chave/goto Fonte: http://pt.wikibooks.org/w/index.php?oldid=247832 Contribuidores: Abacaxi, Voz da Verdade
Palavra-chave/int Fonte: http://pt.wikibooks.org/w/index.php?oldid=245773 Contribuidores: Abacaxi, 1 edies annimas

203

Fontes e Editores da Pgina


Palavra-chave/private Fonte: http://pt.wikibooks.org/w/index.php?oldid=185545 Contribuidores: Helder.wiki, Voz da Verdade, 4 edies annimas
Palavra-chave/protected Fonte: http://pt.wikibooks.org/w/index.php?oldid=185546 Contribuidores: Voz da Verdade, 1 edies annimas
Palavra-chave/public Fonte: http://pt.wikibooks.org/w/index.php?oldid=185547 Contribuidores: Voz da Verdade
Palavra-chave/static Fonte: http://pt.wikibooks.org/w/index.php?oldid=264574 Contribuidores: Hojerio, Voz da Verdade, 1 edies annimas
Palavra-chave/super Fonte: http://pt.wikibooks.org/w/index.php?oldid=265205 Contribuidores: Albmont, 2 edies annimas
Palavra-chave/switch Fonte: http://pt.wikibooks.org/w/index.php?oldid=248183 Contribuidores: Abacaxi, Voz da Verdade
Palavra-chave/void Fonte: http://pt.wikibooks.org/w/index.php?oldid=248051 Contribuidores: Abacaxi, Voz da Verdade
Por onde comear Fonte: http://pt.wikibooks.org/w/index.php?oldid=247812 Contribuidores: Abacaxi, Albmont, Raylton P. Sousa, SallesNeto BR, 2 edies annimas
Pr-requisitos para acompanhar o livro Fonte: http://pt.wikibooks.org/w/index.php?oldid=250823 Contribuidores: Abacaxi, Albmont, Jorge Morais, SallesNeto BR, Voz da Verdade
RMI Fonte: http://pt.wikibooks.org/w/index.php?oldid=262111 Contribuidores: Daniel Souza, Guiwp, Raylton P. Sousa
Referncia/JVM Fonte: http://pt.wikibooks.org/w/index.php?oldid=247851 Contribuidores: Abacaxi, 2 edies annimas
Referncia/java Fonte: http://pt.wikibooks.org/w/index.php?oldid=205122 Contribuidores: 2 edies annimas
Referncia/javac Fonte: http://pt.wikibooks.org/w/index.php?oldid=205123 Contribuidores: Jonas AGX, 2 edies annimas
Referncia/main Fonte: http://pt.wikibooks.org/w/index.php?oldid=247852 Contribuidores: Abacaxi, 1 edies annimas
Swing Fonte: http://pt.wikibooks.org/w/index.php?oldid=205126 Contribuidores: Albmont, 3 edies annimas
Swing/Eventos e Action listeners Fonte: http://pt.wikibooks.org/w/index.php?oldid=205127 Contribuidores: Albmont
Swing/Primeiro programa Fonte: http://pt.wikibooks.org/w/index.php?oldid=205117 Contribuidores: Albmont
Swing/Widgets Fonte: http://pt.wikibooks.org/w/index.php?oldid=205128 Contribuidores: Albmont
Tipos de dados primrios Fonte: http://pt.wikibooks.org/w/index.php?oldid=260736 Contribuidores: Abacaxi, Albmont, Helder.wiki, JackPotte, Jorge Morais, Thiagoharry, Voz da Verdade,
Wbrito, Webcentro, 13 edies annimas
Variveis Fonte: http://pt.wikibooks.org/w/index.php?oldid=248190 Contribuidores: Abacaxi, Voz da Verdade
Vetores Fonte: http://pt.wikibooks.org/w/index.php?oldid=248227 Contribuidores: Abacaxi, Albmont, JackPotte, Lus Felipe Braga, Marcos Antnio Nunes de Moura, Thiagoharry, Voz da
Verdade, Wbrito, 2 edies annimas
break Fonte: http://pt.wikibooks.org/w/index.php?oldid=255709 Contribuidores: Jonas AGX, 1 edies annimas
do while Fonte: http://pt.wikibooks.org/w/index.php?oldid=262443 Contribuidores: Master, 4 edies annimas
else Fonte: http://pt.wikibooks.org/w/index.php?oldid=261719 Contribuidores: Dante Cardoso Pinto de Almeida, Guiwp, 1 edies annimas
for Fonte: http://pt.wikibooks.org/w/index.php?oldid=262442 Contribuidores: 2 edies annimas
if Fonte: http://pt.wikibooks.org/w/index.php?oldid=205115 Contribuidores: Fesaopilger, Helder.wiki, SallesNeto BR, Sfragata, 5 edies annimas
switch Fonte: http://pt.wikibooks.org/w/index.php?oldid=261721 Contribuidores: Guiwp, 4 edies annimas
while Fonte: http://pt.wikibooks.org/w/index.php?oldid=262441 Contribuidores: David Stress, 2 edies annimas

204

Fontes, Licenas e Editores da Imagem

Fontes, Licenas e Editores da Imagem


Image:Nuvola apps konsole.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Nuvola_apps_konsole.png Licena: GNU Lesser General Public License Contribuidores: Alno,
Alphax
Image:Easy Java AWT example.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Easy_Java_AWT_example.jpg Licena: Public Domain Contribuidores: Fiete Groth
Image:Gui-widgets.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Gui-widgets.png Licena: GNU General Public License Contribuidores: Alex.ryazantsev, Faxe,
LoStrangolatore, Nameless23, Sven, Theoteryi, Wutsje, , 3 edies annimas
Image:Recycle001.svg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Recycle001.svg Licena: desconhecido Contribuidores: Users Cbuckley, Jpowell on en.wikipedia
Image:Wikibooks-logo-pt.svg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Wikibooks-logo-pt.svg Licena: logo Contribuidores: User:Bastique, User:Ramac et al.
Imagem:Rekopis chopin.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Rekopis_chopin.jpg Licena: Public Domain Contribuidores: Andreagrossmann, Kevyn, Maire, Man
vyi, Niki K, Subitosera, Tsca
Imagem:Swing demo 1.png Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Swing_demo_1.png Licena: GNU General Public License Contribuidores: Albmont, LoStrangolatore
Image:Array1.svg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Array1.svg Licena: Public Domain Contribuidores: User:Jarkko Piiroinen
Image:Array2.svg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Array2.svg Licena: Public Domain Contribuidores: User:Jarkko Piiroinen
Image:Vetor3d01.svg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Vetor3d01.svg Licena: GNU Free Documentation License Contribuidores: Voz da Verdade
Imagem:Searchtool.svg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Searchtool.svg Licena: GNU Lesser General Public License Contribuidores: David Vignoni, Ysangkok

205

Licena

Licena
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/

206

Você também pode gostar