Escolar Documentos
Profissional Documentos
Cultura Documentos
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
Comandos de iterao
Comandos de seleo
12
14
Constante
16
Converso de tipos
16
17
Declarao de classes
20
20
21
Exemplos de programas
22
23
24
Ferramentas
24
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
148
149
O que Java
150
Objetos
150
150
Operadores
151
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
171
172
RMI
174
Referncia/JVM
178
Referncia/java
179
Referncia/javac
179
Referncia/main
179
Swing
180
180
Swing/Primeiro programa
187
Swing/Widgets
188
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
205
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
A classe Thread
{
200 );
300 );
200 );
400 );
}
Executando o classe TesteMinhaThread, veremos que as Threads incrementam o contador separadamente, baseado
no objeto MinhaThead.
A classe Thread
}
}
);
);
);
);
}
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.
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;
//
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
}
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.
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.
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.
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
}
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!");
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
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.
14
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
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:
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.
17
Fase 4 - Compilao
javac 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
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
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 {
}
0
1
2
3
4
5
6
20
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.
23
Ferramentas
Tenha calma.
Esta pgina ainda est em desenvolvimento.
O autor avisa que este contedo ainda pode conter vrios erros.
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
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.
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
goto (1)
package
synchronized
boolean
do
if
private
this
break
double
implements protected
throw
byte
else
import
public
throws
case
return
transient
catch
extends
int
short
try
char
final
interface
static
void
class
finally
long
native
super
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.
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¶metro2=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¶metro2=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
J2ME
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).
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.
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
}
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
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.
J2ME
45
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
J2ME
48
J2ME
49
Form
Vamos agora aprender a fazer Forms (formulrios), so dentro das forms que podemos inserir vrios tens de uma
aplicao.
J2ME
50
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
}
J2ME
52
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(){
}
}
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();
}
}
}
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();
}
}
}
}
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
}
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
}
}
}
}
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();
}
}
}
}
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
}
}
}
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.*;
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.*;
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.*;
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.*;
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.
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.*;
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.*;
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();
}
}
}
javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;
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.*;
J2ME
87
meuThread.sleep(50);
} catch (Exception minhaExcecao) {
minhaExcecao.printStackTrance)();
} finally {
meuGrafico3D.releaseTarget();
flushGraphics();
}
}
}
}
javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;
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.*;
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.*;
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.*;
J2ME
91
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
-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,
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
-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
-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.*;
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.*;
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.*;
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.*;
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();
}
}
}
}
javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;
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.*;
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.*;
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.*;
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.*;
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.*;
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.*;
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();
}
}
J2ME
124
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();
}
}
}
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
javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;
javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;
J2ME
132
import
import
import
import
javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;
javax.io.*;
javax.microedition.lcdui.*;
javax.microedition.m3g.*;
javax.microedition.game.*;
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.*;
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.*;
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.*;
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.
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();
}
}
}
O programa
Voc pode baixar e instalar gratuitamente a verso completa do Blender em seu site oficial www.blender.org [5].
J2ME
141
Export
Ligaes externas
Blender [5]
Esta pgina somente um esboo.
Ampliando-a voc ajudar a melhorar o Wikilivros.
Referncias
[1]
[2]
[3]
[4]
[5]
[6]
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.
, ou seja, 1000
, ou seja, -1000
, ou seja, 0,01
, ou seja, -0,001
Literais
145
a fazer
Significado
Escape Unicode
\b
\u0008
\t
\u0009
\n
\u000a
\f
\u000c
\r
\u000d
\"
\u0022
\'
\u0027
\\
\u005c
\u7Ffc
\u0062
\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
146
Modificadores
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
148
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.
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
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
Multiplicativos
*/%
Aditivos
+-
Shift Binrio
Comparativos
igualdade
== !=
Bit-aBit E
&
Bit-aBit XOU OR
Bit-aBit OU OR
Lgico E
&&
Lgico OU
||
Ternrio
?:
Atribuio
Operadores
154
//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,
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.
//numero
//numero
//numero
//numero
passa a valer 5
assume o valor 20
assume o valor 10
assume o valor 5
Operadores
155
//numero
//numero
//numero
//numero
//numero
vale
vale
vale
vale
vale
-3
-2
-4
2147483646
-4
//variavel
//variavel
//variavel
//variavel
recebe
recebe
recebe
recebe
"falso"
"verdadeiro"
"verdadeiro"
"falso"
Operadores
156
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
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.
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);
}
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
goto (1)
package
synchronized
boolean
do
if
private
this
break
double
implements protected
throw
byte
else
import
public
throws
case
return
transient
catch
extends
int
short
try
char
final
interface
static
void
class
finally
long
native
super
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
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 + "
Palavra-chave/boolean
162
}
if (contRainhas > 1) return true;
return false;
Palavra-chave/boolean
163
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>);
168
Palavra-chave/super
169
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).
a ser executado>
a ser executado>
a ser executado>
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
171
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
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
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);
181
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);
183
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
185
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
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.
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
a;
b = '1';
z = 111;
pato = 0xA;
seven = 07;
190
a;
by1 = -32.0;
bz2 = 32.2F;
bz = 32.455f;
bze = 1.32455e4f;
191
a;
by1 = -32.0;
bz2 = 32.2d;
bz = 32.455D;
bze = 1.32455e4D;
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
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:
[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
[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:
Vetores
197
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;
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;
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.
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.
203
204
205
Licena
Licena
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/
206