Você está na página 1de 120

FUNDAO UNIVERSIDADE REGIONAL DE

BLUMENAU
CENTRO DE CINCIAS EXATAS E NATURAIS


DEPARTAMENTO DE SISTEMAS E COMPUTAO
Apostila de OO e FURBOT verso 1.12 11/9/2008

Material de Apoio as Disciplinas:
Programao de Computadores (SIS)
Programao Orientada a Objetos (SIS)
Programao Orientada a Objetos I (BCC)

PROFESSORES:
Mauro Marcelo Mattos
Adilson Vahldick
Marcel Hugo
Maurcio Capobianco Lopes


2

Figura 1- Ambiente do FURBOT. ................................................................................................................................... 5
Figura 2 - Exemplo de mundo especificado atravs de um arquivo xml. ........................................................................ 5
Figura 3 - Mundo criado a partir da especificao em xml. ............................................................................................ 6
Figura 4 - Ambiente netbeans com o exercicio carregado. ............................................................................................ 6
Figura 5 - componentes de um algoritmo. .................................................................................................................. 43
Figura 6 - Relao entre a classe principal e a classe do modelo .................................................................................. 46
Figura 7 - Ativao de outras classes a partir do main. ................................................................................................ 49
Figura 8 - Componentes do pacote javax.swing .......................................................................................................... 62
Figura 9 - primeira janela. .......................................................................................................................................... 65
Figura 10- Janela com rtulos ..................................................................................................................................... 67
Figura 11- Janela redecorada. .................................................................................................................................... 67
Figura 12- Rtulo com imagem................................................................................................................................... 69
Figura 13- Janela com 2 botes .................................................................................................................................. 71
Figura 14- ativao da dica do boto .......................................................................................................................... 71
Figura 15 - Hierarquia dos principais listeners............................................................................................................. 74
Figura 16- Mtodo actionPerformed sendo ativado. ................................................................................................... 75
Figura 17- Calculadora ............................................................................................................................................... 77
Figura 18 - Criando um projeto. .................................................................................................................................. 78
Figura 19 - Janela "novo projeto". .............................................................................................................................. 78
Figura 20 - detalhes do projeto. ................................................................................................................................. 79
Figura 21 Selecionando criar um novo pacote. ........................................................................................................ 79
Figura 22 - criando um novo pacote. .......................................................................................................................... 79
Figura 23 - Criando um formulrio jframe. .................................................................................................................. 80
Figura 24 - finalizando a criao de um formulrio jframe........................................................................................... 80
Figura 25 - Jframe criado. ........................................................................................................................................... 81
Figura 26 - definindo gerenciador de layout: borderlayout. ........................................................................................ 81
Figura 27 - Paleta de componentes. ........................................................................................................................... 82
Figura 28 - Paleta de configurao de um jpanel. ........................................................................................................ 82
Figura 29 - Inserindo trs componentes jpanel ao jframe. .......................................................................................... 83
Figura 30 - Programando um tratador de evento. ....................................................................................................... 83
Figura 31 - Mtodo construtor da classe..................................................................................................................... 84
Figura 32 - Projeto completo. ..................................................................................................................................... 84
Figura 33 - Modelo de mundo do jogo PacMan. ....................................................................................................... 100
Figura 34- Tela para a escolha da verso do JDK. ...................................................................................................... 111
Figura 35- Download Center. .................................................................................................................................... 111
Figura 36- Acordo de Licenciamento do Software. .................................................................................................... 112
Figura 37- Selecionar a plataforma e o instalador do JDK. ......................................................................................... 112
Figura 38- Abrir o arquivo para iniciar o download. .................................................................................................. 113
Figura 39- Execuo do Gerenciador de Download. .................................................................................................. 113


3
Figura 40- Termos de Licena do Software. .............................................................................................................. 114
Figura 41- Opes para o download. ........................................................................................................................ 114
Figura 42- Andamento do download. ....................................................................................................................... 115
Figura 43- Site do NetBeans > download. ................................................................................................................. 115
Figura 44-Licena de Uso do Software. ..................................................................................................................... 116
Figura 45- Configurao da Instalao. ..................................................................................................................... 116
Figura 46- Configurao da Instalao. ..................................................................................................................... 117
Figura 47- Instalao Completa. ............................................................................................................................... 117



4

1. INTRODUO
sse um documento de apoio das disciplinas de programao dos cursos de
Bacharelado em Cincias da Computao, de Sistemas de Informao e de
Licenciatura em Computao da FURB.
O documento foi produzido a partir de uma compilao de vrias fontes, particularmente a
partir de:
documentao produzida nas sucessivas verses do FURBOT produzidas pelo Prof.
Adilson Vahldick;
apostila desenvolvida pelo Prof. Maurcio Capobianco Lopes (fundamentao de OO e
algoritmos);
da apostila desenvolvida pelo Prof. Marcel Hugo (interfaces grficas com o usurio) e
pelas contribuies dos monitores Fernanda Gums (tutorial de instalao do Netbeans,
Eclipse e JDK) e Eduardo Coelho (gerao de gabaritos de exerccios propostos).

O FURBOT um ambiente de apoio ao ensino de lgica de programao. Foi concebido
em 2008-1 pela equipe de professores: Adilson Vahldick, Mauro Marcelo Mattos e Carlos
Henrique Correia com o propsito de disponibilizar a voc um ambiente com forte apelo
na rea de jogos e que possibilitasse o desenvolvimento de algoritmos de controle de
personagens de tal forma a criar uma atmosfera facilitadora ao aprendizado.
Durante o primeiro semestre de 2008 foram disponibilizadas vrias verses as quais
incorporaram os recursos necessrios para a soluo de problemas propostos ao longo
do semestre.
Incrementos na ltima verso do Furbot produziram a verso 1.0 liberada no incio do
segundo semestre de 2008 e que dever ser a verso de partida para as atividades deste
semestre.
A Figura 1 apresenta um exemplo de ambiente do Furbot onde coabitam: um objeto do
tipo Rob, alguns objetos do tipo Alien, alguns objetos do tipo Numero e alguns objetos do
tipo Logico (boolean). Existem 3 botes para disparar a execuo de um programa,
reinicializar um programa e parar a execuo de um programa. Alm disso, h um espao
de comunicao do Furbot com o usurio na base da janela.
E

FIGURA 1- AMBIENTE DO FURBOT.
Conforme ser apresentado mais adiante, a configurao de ambiente do FURBOT
baseada em um arquivo do tipo XML (Extended Markup Language). A Figura 2 apresenta
uma especificao de mundo que contm 8 linhas por 8 colunas e estabelece que o rob
inicia na posio (0,0). Para fins de referncia, as coordenadas de mundo iniciam no
canto superior esquerdo. Assim, andar para a direita significa incrementar o valor de x e
andar para baixo significa incrementar o valor de y. Alm disso, o rob explode ao atingir
uma das paredes do mundo.
<furbot>
<enunciado>
Exercicio 1. &lt;br&gt;
Faca o robo andar ate a ultima posicao da linha. &lt;br&gt;
Lembre-se de que as coordenadas sempre serao fornecidas como (x,y).&lt;br&gt;
A primeira coluna e linhas sao a de numero ZERO.
</enunciado>
<mundo>
<qtdadeLin>8</qtdadeLin>
<qtdadeCol>8</qtdadeCol>
<explodir>true</explodir>
</mundo>
<robo>
<x>0</x>
<y>0</y>
</robo>
</furbot>
FIGURA 2 - EXEMPLO DE MUNDO ESPECIFICADO ATRAVS DE UM ARQUIVO XML.
A Figura 3 apresenta a imagem de mundo criada a partir da especificao em XML
apresentada na Figura 2.

FIGURA 3 - MUNDO CRIADO A PARTIR DA ESPECIFICAO EM XML.
Uma aplicao Furbot possui 1 requisito importante: o nome do arquivo .xml deve ser o
mesmo nome do arquivo .java. No exemplo, o arquivo de especificao do modelo de
mundo denomina-se Exercicio1.xml e o arquivo que especifica a lgica de funcionamento
do rob denomina-se Exercicio1.java. A Figura 4 apresenta o exerccio j carregado no
ambiente Netbeans.

FIGURA 4 - AMBIENTE NETBEANS COM O EXERCICIO CARREGADO.


7
2. ALTERANDO O COMPORTAMENTO DO ROB UMA
PEQUENA INTRODUO.
A classe que contm a inteligncia do rob deve atender aos seguintes requisitos:
1. Deve ser herdar as caractersticas de Furbot acrescentando-se a declarao da
classe as palavras extends Furbot (conforme o quadro abaixo):
public class Exercicio1 extends Furbot {
.
}
Observao: na medida em que voc for avanando na disciplina, o conceito de herana
ser elucidado. Por enquanto vale destacar que j foi especificado um comportamento
padro para o rob que ficar parado. De fato o que vamos realizar uma alterao
neste comportamento para fazer o rob passear pelo mundo.

2. Deve implementar dois mtodos: inteligencia() e main() conforme o quadro
abaixo:

public class Exercicio1 extends Furbot {
public void inteligencia() throws Exception {
.
}
public static void main (String[] args) {
MundoVisual.iniciar(Exercicio1.xml);
}
}

3. Dentro do mtodo main, deve haver somente a declarao que inicializa o mundo
segundo a especificao contida no arquivo xml que informado entre aspas
conforme exemplo no quadro abaixo:

MundoVisual.iniciar(Exercicio1.xml);
Atendidos estes requisitos, o ambiente est pronto para ser utilizado. Neste primeiro
momento, voc poder modificar o comportamento do furbot alterando o mtodo
inteligencia() conforme exemplificado na Figura 3. Para tanto lanamos mo de uma das
primitivas de movimentao do Furbot: andarDireita().
Considerando que o mundo modelado como uma grade de 8 x 8 clulas e que o rob
nasce na posio 0,0 (canto superior esquerdo) , para que ele atenda a especificao,
que andar at a parede direita, basta que construamos a seguinte seqncia de
comandos:



8
public class Exercicio1 extends Furbot {
public void inteligencia() throws Exception {
andarDireita();
andarDireita();
andarDireita();
andarDireita();
andarDireita();
andarDireita();
andarDireita();
andarDireita();
diga(Cheguei!);
}
public static void main (String[] args) {
MundoVisual.iniciar(Exercicio1.xml);
}
}
Ao executarmos esta seqncia de comandos, o furbot deslocar-se- desde a posio
inicial at a ltima coluna da primeira linha.
Como voc pode ver, programar o furbot consiste em desenvolver uma seqncia finita
de comandos vlidos que fazem com que o furbot execute uma determinada tarefa. Em
linhas gerais, esta a definio de um algoritmo e o que iremos desenvolver ao longo
deste semestre.





9
3. FURBOT: COMANDOS
Nesta seo so descritos os comandos que afetam o comportamento do furbot.

3.1. COMANDOS DE CONTROLE DE MOVIMENTAO
Conforme apresentado na introduo, o furbot possui alguns comandos bsicos que
permitem a voc controlar a movimentao do mesmo no mundo.
So eles:
andarDireita():void : Faz com que o rob ande uma clula direita. Se houver um
obstculo ou for o fim do mundo, o rob explode
andarEsquerda():void : Faz com que o rob ande uma clula esquerda. Se houver
um obstculo ou for o fim do mundo, o rob explode.
andarAcima():void : Faz com que o rob ande uma clula para cima. Se houver um
obstculo ou for o fim do mundo, o rob explode.
andarAbaixo():void : Faz com que o rob ande uma clula para baixo. Se houver um
obstculo ou for o fim do mundo, o rob explode.
Um exemplo de uso destes comandos apresentado no quadro abaixo:
public class Exercicio1 extends Furbot {
public void inteligencia() throws Exception {
andarDireita();
andarDireita();
andarAbaixo();
andarEsquerda();
andarAcima();
}
public static void main (String[] args) {
MundoVisual.iniciar(Exercicio1.xml);
}
}

3.2. COMANDOS DE COMUNICAO
Para que seja possvel fazer com que o furbot comunique-se com voc, foi disponibilizado
o comando diga. Este comando faz com que o fubot possa enviar mensagens para a rea
de comunicao da tela. Este recurso muito til para que voc possa avaliar e
acompanhar o comportamento do furbot durante a execuo de alguma tarefa.
Existem duas formas do comando. So elas:


10
diga (String):void : Faz com que a mensagem enviada como parmetro seja
apresentada na tela. Toda mensagem deve ser escrita entre os parntesis e grafada
entre aspas duplas
diga (Object):void : Permite que seja passado como parmetro um objeto que contm
a mensagem a ser apresentada na tela. Este recurso avanado e voc s vai utiliz-
lo mais adiante.
limparConsole():void : Limpa a rea de mensagens do mundo. Geralmente utilizamos
para facilitar a visualizao de mensagens importantes.
Um exemplo de uso destes comandos apresentado no quadro abaixo:
public class Exercicio1 extends Furbot {
public void inteligencia() throws Exception {
diga (este um exemplo de mensagem);
String msg = Este um objeto que contm a msg a ser apresentada na tela;
diga (msg);
limparConsole();
}
public static void main (String[] args) {
MundoVisual.iniciar(Exercicio1.xml);
}
}
Como resultado da execuo do cdigo acima ser apresentado na rea de comunicao
o seguinte:
Este um exemplo de mensagem
Este um objeto que contm a msg a ser apresentada na tela

3.3. COMANDOS DE AVALIAO DA SITUAO DO
MUNDO
O furbot pode movimentar-se no mundo. Contudo, ao executar um movimento, ele pode
chocar-se com obstculos que podem ser os limites do mundo ou outros objetos que
ocupam alguma clula no mudo.
Para evitar que o choque ocorra, foram disponibilizados os seguitnes comandos:
ehVazio(Direcao):boolean : permite que o furbot verifique se a clula indicada por
Direo vazia (neste caso o furbot retorna um valor verdadeiro true) ou se est
ocupada (neste caso o furbot retorna um valor falso false), mas no indica quem
est ocupando aquela posio. Observe que se a clula na direo apontada fica alm
dos limites do mundo, esse mtodo retorna verdadeiro!.
ehFim(Direcao):boolean : o rob verifica se a clula na direo passada como
parmetro fica alm do mundo. Se ela for alm do mundo retorna verdadeiro (true)
seno retorna falso (false).
Um exemplo de uso destes comandos apresentado no quadro abaixo:


11

public class Exercicio1 extends Furbot {
public void inteligencia() throws Exception {
if (eVazio(DIREITA) )
diga (A clula a direita est vazia!)
else
diga (A clula a direita est ocupada!);
if (eFim(DIREITA) )
diga (Encontramos o fim do mundo a direita!)
else
diga (Podemos andar para a direita!);
}
public static void main (String[] args) {
MundoVisual.iniciar(Exercicio1.xml);
}
}
As seguintes constantes foram disponibilizadas para estabelecimento da orientao de
direo:
ESQUERDA
DIREITA
ACIMA
ABAIXO
AQUIMESMO
Observe que as mesmas so grafadas com todas as letras em maisculo.

3.4. COMANDOS PARA OBTENO DE COORDENADAS
Como j foi dito, o mundo do furbot baseado em um agregado de clulas. Cada clula
possui um par de coordenadas (x,y).
Para que seja possvel obter as coordenadas da posio atual do furbot utilizam-se os
seguintes comandos:
getX():int : Retorna um valor inteiro contendo o nmero da coluna em que est o rob.
Lembre-se de que a primeira coluna ZERO.
getY():int: Retorna um valor inteiro contendo o nmero da linha em que est o rob.
Lembre-se de que a primeira linha ZERO.

3.5. COMANDOS DE MANIPULAO DE OBJETOS
Todos os personagens que habitam um determinado mundo no furbot so considerados
objetos.


12
Para tornar possvel a interao entre estes objetos e viabilizar aes de deteco de
colises entre objetos, remoo de objetos, movimentao de objetos entre outros, os
seguintes comandos so disponibilizados:
getObjeto(Direcao):ObjetoMundo : O rob "agarra" no objeto da clula que foi
indicada como parmetro. Se no tiver nada nessa clula, ou for alm dos limites do
mundo, ento esse mtodo retorna null. Veja mais abaixo na seo constantes os
valores disponveis para Direcao.
ehObjetoDoMundoTipo (String, Direcao):boolean : Verifica se existe um objeto do tipo
passado como parmetro na direo informada.

public class Exercicio1 extends Furbot {
public void inteligencia() throws Exception {
boolean ehUmAlien = ehObjetoDoMundoTipo("Alien", ACIMA);
if (ehUmAlien == true )
diga (A clula acima contm um objeto do tipo ALIEN)
else
diga (A clula acima est livre);
}
public static void main (String[] args) {
MundoVisual.iniciar(Exercicio1.xml);
}
}

No exemplo do quadro acima declarada uma varivel do tipo boolean que ser
inicializada com o valor de retorno da chamada do mtodo ehObjetoDoMundoTipo. Essa
linha verifica se existe um objeto do tipo "Alien" na clula acima de onde est o rob. Se
existir retorna true.No existe uma restrio fixa do que pode ser passado no primeiro
parmetro. Entretanto, atualmente (verso 0.6) podem ser usados as Strings "Alien",
"Parede" e "Numero".
Outros mtodos que podem ser utilizados so:
adicionarObjetoNoMundo(ObjetoDoMundo, Direcao):void : Adiciona um objeto no
mundo na posio relativa direo informada.
adicionarObjetoNoMundoXY(): Adiciona um objeto no mundo na coordenada x,y.
removerObjetoDoMundo() : Remove um objeto do mundo passado como parmetro
getObjetoXY(): Retorna um objeto na coordenada x,y

3.6. DEMAIS COMANDOS A SEREM DETALHADOS:
Os comandos constantes na tabela abaixo sero descritos na prxima verso desta
apostila... aguarde!!!


13
ehDependenteEnergia():boolean : Retorna true se o rob precisa de energia para
executar os mtodos;
getMaxEnergia():int :Retorna a quantidade mxima de energia que pode ser armazena
no rob.
getEnergia():int : Retorna a quantidade atual de energia.
esperar(segundos:int):void : O rob espera a quantidade de segundos passado como
parmetro antes de executar o prximo mtodo.
esperarAlguem():ObjetoMundo : O rob espera at algum objeto cruzar a mesma
clula em que ele est, e retorna esse objeto. Caso se passem 5 segundos e nenhum
objeto ter cruzada a clula, ento retorna null.
getVelocidade() : Retorna a velocidade do rob
setVelocidade() : Altera a velocidade do rob
sortear() : Sorteia um valor entre 0 e o valor mximo passado como parmetro
jahExplodiu() : Retorna true se o rob j explodiu.
adicionarObjetoNoMundoEmbaixo()
ehBloqueado() : Verifica se o objeto bloqueado ou no.
bloquear() : Bloqueia um objeto
desbloquear() : Desbloqueia um objeto
getSouDoTipo() : Retorna o tipo do objeto.





14
4. EXERCCIOS RESOLVIDOS

Nesta seo so apresentados os gabaritos para a primeira lista de exerccios.
4.1. LISTA DE EXERCCIOS 1
A primeira lista de exerccios tem por objetivo ambientar voc com o furbot.
Os exerccios de 1 a 4 so resolvidos utilizando estruturas simples de programao. J os
exemplos 5 e 6 j demandam a utilizao de estruturas de controle de repetio while.

Exerccios:
1) Faa o rob andar at a ultima posio da linha. Lembre-se de que as
coordenadas sempre sero fornecidas como (x, y). A primeira coluna e linhas so a
de numero ZERO.
2) Faa o rob andar ate a ultima posio na mesma coluna. Lembre-se de que as
coordenadas sempre sero fornecidas como (x, y). A primeira coluna e linhas so a
de numero ZERO.
3) Faa o rob andar ate uma posio de linha e coluna diferente da linha e coluna
iniciais. Lembre-se de que as coordenadas sempre sero fornecidas como (x, y). A
primeira coluna e linhas so a de numero ZERO.
4) Faa o rob andar ate os extremos do mundo retornando a posio inicial. Cada
vez que o rob atingir um dos extremos, faa informar que ele chegou ate aquela
posio. Lembre-se de que as coordenadas sempre sero fornecidas como (x, y).
A primeira coluna e linhas so a de numero ZERO.
5) Faa o rob chegar ate a coluna 4 na mesma linha em que ele nasceu. Se ele
encontrar um obstculo deve desviar por baixo. garantido que no exista um
obstculo na ultima linha. A primeira coluna e linhas so a de numero ZERO.
6) Faa o rob andar ate uma posio de linha e coluna diferente da linha e coluna
iniciais. Lembre-se de que as coordenadas sempre sero fornecidas como (x, y). A
primeira coluna e linhas so a de numero ZERO.











4.2. RESOLUO DOS EXERCCIOS PROPOSTOS


15
4.2.1. LISTA 1 EX1 - MODELO DE MUNDO EM XML
<furbot>
<enunciado>
Exercicio 1. &lt;br&gt;
Faca o robo andar ate a ultima posicao da linha. &lt;br&gt; Lembre-se de que as coordenadas sempre
serao fornecidas como (x, y). &lt;br&gt; A primeira coluna e linhas sao a de numero ZERO.
</enunciado>
<mundo>
<qtdadeLin>8</qtdadeLin>
<qtdadeCol>8</qtdadeCol>
<explodir>true</explodir>
</mundo>
<robo>
<x>0</x>
<y>0</y>
</robo>
</furbot>

4.2.1.1. LISTA 1 EX1 SOLUO
Lembre-se que a especificao em XML <qtdadeLin>8</qtdadeLin> implica que havero
9 linhas (numeradas de 0 a 9) e que <qtdadeCol>8</qtdadeCol> denota que teremos 9
colunas (numeradas de 0 a 9). Portanto, deslocar-se at a ltima posio na linha 0 (que
a linha onde o furbot criado) implica em executarmos 9 passos para a direita de modo
a deslocar o robo da coluna 0 at a coluna 8.
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Exercicio1 extends Furbot{
public void inteligencia() throws Exception {
diga("exercicio1");
andarDireita(); //o furbot anda uma clula para a direita posicionando-se na segunda coluna
andarDireita(); //o furbot anda uma clula para a direita posicionando-se na terceira coluna
andarDireita(); //o furbot anda uma clula para a direita posicionando-se na quarta coluna
andarDireita(); //o furbot anda uma clula para a direita posicionando-se na quinta coluna
andarDireita(); // o furbot anda uma clula para a direita posicionando-se na sexta coluna
andarDireita(); // o furbot anda uma clula para a direita posicionando-se na stima coluna
andarDireita(); // o furbot anda uma clula para a direita posicionando-se na oitava coluna
andarDireita(); // o furbot anda uma clula para a direita posicionando-se na nona coluna
}
public static void main(String[] args) {
MundoVisual.iniciar("Exercicio1.xml"); // inicia o mundo do furbot
}
}


4.2.2. LISTA 1 EX2 - MODELO DE MUNDO EM XML


16
<furbot>
<enunciado>Exercicio 2. &lt;br&gt;
Faca o robo andar ate a ultima posicao na mesma coluna. &lt;br&gt; Lembre-se de que as coordenadas
sempre serao fornecidas como (x, y). &lt;br&gt; A primeira coluna e linhas sao a de numero
ZERO.</enunciado>
<mundo>
<qtdadeLin>8</qtdadeLin>
<qtdadeCol>8</qtdadeCol>
<explodir>true</explodir>
</mundo>
<robo>
<x>0</x>
<y>0</y>
</robo>
</furbot>

4.2.2.1. LISTA 1 GABARITO DO EXERCCIO 2
Lembre-se que a especificao em XML <qtdadeLin>8</qtdadeLin> implica que havero
9 linhas (numeradas de 0 a 9) e que <qtdadeCol>8</qtdadeCol> denota que teremos 9
colunas (numeradas de 0 a 9). Portanto, deslocar-se at a ltima posio na coluna 0
(que a coluna onde o furbot criado) implica em executarmos 9 passos para baixo de
modo a deslocar o robo da linha 0 at a linha 8.
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Exercicio2 extends Furbot{
public void inteligencia() throws Exception {
diga("exercicio2");
andarAbaixo(); //o furbot anda uma clula para baixo posicionando-se na segunda linha
andarAbaixo();//o furbot anda uma clula para baixo posicionando-se na terceira linha
andarAbaixo();//o furbot anda uma clula para baixo posicionando-se na quarta linha
andarAbaixo();//o furbot anda uma clula para baixo posicionando-se na quinta linha
andarAbaixo();//o furbot anda uma clula para baixo posicionando-se na sexta linha
andarAbaixo();//o furbot anda uma clula para baixo posicionando-se na stima linha
andarAbaixo();//o furbot anda uma clula para baixo posicionando-se na oitava linha
}
public static void main(String[] args) {
MundoVisual.iniciar("Exercicio2.xml");
}
}




4.2.3. LISTA 1 EX3 - MODELO DE MUNDO EM XML
<furbot>


17
<enunciado>Exercicio 3. &lt;br&gt;
Faa o rob andar ate uma posicao de linha e coluna diferente da linha e coluna iniciais. &lt;br&gt;
Lembre-se de que as coordenadas sempre serao fornecidas como (x, y). &lt;br&gt;
A primeira coluna e linhas sao a de numero ZERO.</enunciado>
<mundo>
<qtdadeLin>8</qtdadeLin>
<qtdadeCol>8</qtdadeCol>
<explodir>true</explodir>
</mundo>
<robo>
<x>0</x>
<y>0</y>
</robo>
</furbot>

4.2.3.1. LISTA 1 GABARITO DO EXERCCIO 3
Lembre-se que a especificao em XML <qtdadeLin>8</qtdadeLin> implica que havero
9 linhas (numeradas de 0 a 9) e que <qtdadeCol>8</qtdadeCol> denota que teremos 9
colunas (numeradas de 0 a 9).
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Exercicio3 extends Furbot{
public void inteligencia() throws Exception {
diga("exercicio3");
andarAbaixo();//o furbot anda uma clula para baixo posicionando-se na segunda linha (primeira coluna)
andarDireita(); //o furbot anda uma clula para a direita posicionando-se na segunda coluna (segunda
linha)
andarAbaixo(); //o furbot anda uma clula para baixo posicionando-se na terceira linha (segunda
coluna)
andarDireita(); //o furbot anda uma clula para a direita posicionando-se na terceira coluna (terceira
linha)
andarAbaixo(); //o furbot anda uma clula para baixo posicionando-se na quarta linha (terceira coluna)
andarAbaixo();
andarAbaixo();
andarAbaixo();
andarAbaixo();
}
public static void main(String[] args) {
MundoVisual.iniciar("Exercicio3.xml");
}
}



4.2.4. LISTA 1 EX4 - MODELO DE MUNDO EM XML.
<furbot>
<enunciado>Exercicio 4. &lt;br&gt;


18
Faca o robo andar ate os extremos do mundo retornando a posicao inicial. &lt;br&gt;
Cada vez que o robo atingir um dos extremos, faca-o informar que ele chegou ate aquela posicao. &lt;br&gt;
Lembre-se de que as coordenadas sempre serao fornecidas como (x, y). &lt;br&gt;
A primeira coluna e linhas sao a de numero ZERO.</enunciado>
<mundo>
<qtdadeLin>8</qtdadeLin>
<qtdadeCol>8</qtdadeCol>
<explodir>false</explodir>
</mundo>
<robo>
<x>0</x>
<y>0</y>
</robo>
</furbot>

4.2.4.1. LISTA 1 GABARITO DO EXERCCIO 4
Lembre-se que a especificao em XML <qtdadeLin>8</qtdadeLin> implica que havero
9 linhas (numeradas de 0 a 9) e que <qtdadeCol>8</qtdadeCol> denota que teremos 9
colunas (numeradas de 0 a 9). Portanto, deslocar-se no permetro implica em fazer o
furbot ir at a ltima posio na linha 0 (que a linha onde o furbot criado), depois
descer at a linha 8 mantendo-se na coluna 8 (chegando ao canto inferior direito); depois
deslocando-se para a esquerda at a coluna 0 e mantendo-se na linha 8 (chegando ao
canto inferior esquerdo) e, finalmente, deslocando-se para cima at a linha 0 e mantendo-
se na coluna 0 (chegando ao canto superior esquerdo coordenadas 0,0 onde o furbot
foi criado.
A soluo para este problema utilizou o recurso ehFim (direo). Este recurso retorna
verdadeiro se a posio indicada por direo encontra-se fora do mundo. Portanto
executando a operao de repetio while ( ! ehFim(DIREITA)) denota que: enquanto no
for encontrado o fim do mundo na prxima posio a direita podemos deslocar o rob
para a prxima posio a direita de onde ele esta.
Observe que o smbolo ! denota negao da expresso que est sendo testada.

import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Exercicio4 extends Furbot{
public void inteligencia() throws Exception {
diga("exercicio4");
while (!ehFim(DIREITA)) { //anda at o canto superior direito
andarDireita();
};
diga ("cheguei no canto superior direito");
while (!ehFim(ABAIXO)) { //anda at o canto inferior direito


19
andarAbaixo();
};
diga ("cheguei no canto inferior direito");
while (!ehFim(ESQUERDA)) { //anda at o canto inferior esquerdo
andarEsquerda();
};
diga ("cheguei no canto inferior esquerdo");
while (!ehFim(ACIMA)) { //anda at o canto superior esquerdo
andarAcima();
};
diga ("retornei ao inicio");
}
public static void main(String[] args) {
MundoVisual.iniciar("Exercicio4.xml");
}
}

4.2.5. LISTA 1 EX5 - MODELO DE MUNDO EM XML
<furbot>
<enunciado>Exercicio 5. &lt;br&gt;
Faca o robo chegar ate a coluna 4 na mesma linha em que ele nasceu. &lt;br&gt; Se ele encontrar um
obstaculo deve desviar por baixo. &lt;br&gt; E garantido que nao exista um obstaculo na ultima linha.
&lt;br&gt;
A primeira coluna e linhas sao a de numero ZERO.</enunciado>
<mundo>
<qtdadeLin>5</qtdadeLin>
<qtdadeCol>5</qtdadeCol>
<explodir>true</explodir>
</mundo>
<robo>
<x>randomX</x>
<y>0</y>
</robo>
<objeto class="br.furb.furbot.Alien">
<x>3</x>
<y>0</y>
</objeto>
<objeto class="br.furb.furbot.Alien">
<x>3</x>
<y>2</y>
</objeto>
<objeto class="br.furb.furbot.Alien">
<x>3</x>
<y>3</y>
</objeto>
</furbot>





20
4.2.5.1. LISTA 1 GABARITO DO EXERCCIO 5
Lembre-se que a especificao em XML <qtdadeLin>5</qtdadeLin> implica que havero
5 linhas (numeradas de 0 a 4) e que <qtdadeCol>5</qtdadeCol> denota que teremos 5
colunas (numeradas de 0 a 4). Portanto, deslocar-se at a linha 4 (significa o mesmo que
ir at a ltima coluna.
A soluo para este problema utilizou o recurso ehVazio(direo). Este recurso retorna
verdadeiro se a posio indicada por direo encontra-se ocupada por algum objeto
(Parede, Alien, Nmero, etc).
Foi utilizado tambm o recurso getX() o qual retorna um valor numrico indicando a
coordenada x em que o furbot se encontra.
Tambm foi utilizado o recurso ehFim (direo) o qual, como explicado anteriormente,
retorna verdadeiro se a posio indicada por direo encontra-se fora do mundo.
Portanto executando a operao de repetio while ( ! ehFim(DIREITA)) denota que:
enquanto no for encontrado o fim do mundo na prxima posio a direita podemos
deslocar o rob para a prxima posio a direita de onde ele esta.
A operao if ( ! ehVazio (DIREITA) ) denota que: estamos verificando se a posio a
direita de onde encontra-se o furbot est vazia. Se estiver, o furbot pode deslocar-se para
a direita. Caso contrrio, ele dever executar uma operao de desvio por baixo, ou seja,
deslocar-se para baixo, deslocar-se duas vezes para a direita e retornar uma posio
acima (caracterizando-se um desvio por baixo conforme o enunciado!).
Observe que o smbolo ! denota negao da expresso que est sendo testada.
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Exercicio5 extends Furbot{
public void inteligencia() throws Exception {
diga("exercicio5");
while (getX()<5) { //enquanto a coordenada em que o furbot encontra-se for menor que 5 (0..4)
if (ehVazio(DIREITA)){ //se a posio a direita for vazia
if (!ehFim(DIREITA)) //e se a posio a direita no for fim do mundo
andarDireita(); //desloca-se para a direita
}
else { // significa que a posio a direita estava ocupada, portanto
andarAbaixo(); // desloca-se uma posio abaixo
andarDireita(); //desloca-se uma posio a direita
andarDireita(); //desloca-se outra posicao a direita
andarAcima(); //retorna para a posio seguinte ao obstculo caracterizando o desvio
}
};



21
diga ("cheguei na coluna 4");
}
public static void main(String[] args) {
MundoVisual.iniciar("Exercicio5.xml");
}
}

4.2.6. LISTA 1 EX6 - MODELO DE MUNDO EM XML
<furbot>
<enunciado>Exercicio 6. &lt;br&gt; Faca o robo chegar ate a coluna 4 na mesma linha em que ele nasceu.
&lt;br&gt;
Se ele encontrar um obstaculo deve desviar por baixo. &lt;br&gt; E garantido que nao exista um obstaculo
na ultima linha mas os aliens sao aleatorios. &lt;br&gt; A primeira coluna e linhas sao a de numero
ZERO.</enunciado>
<mundo>
<qtdadeLin>5</qtdadeLin>
<qtdadeCol>5</qtdadeCol>
<explodir>true</explodir>
</mundo>
<robo>
<x>0</x>
<randomY />
</robo>
<objeto class="br.furb.furbot.Alien">
<randomX />
<y>0</y>
</objeto>
<objeto class="br.furb.furbot.Alien">
<x>3</x>
<randomY />
</objeto>
<objeto class="br.furb.furbot.Alien">
<randomX />
<y>3</y>
</objeto>
</furbot>

4.2.6.1. LISTA 1 GABARITO DO EXERCCIO 6
Esta uma variaao do exerccio anterior incluindo o complicador que podem haver mais
obstculos o que envolve o aprimoramento da rotina de desvio por baixo.
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Exercicio6 extends Furbot{
public void inteligencia() throws Exception {
diga("exercicio6");
while (getX()<5) {
if (ehVazio(DIREITA)){
if (!ehFim(DIREITA)) {


22
andarDireita();
}
}
else {
if (ehVazio(ABAIXO)){
while (!ehVazio(DIREITA)) {
if (!ehFim(ABAIXO)) {
andarAbaixo();
}
else { //eh fim abaixo
//tem que mudar a direcao para cima
while (!ehVazio(DIREITA)){
if (!ehFim(ACIMA)) {
andarAcima();
}
}//while
}
};//while
}
else
diga ("estou encurralado!!!");
};
}
diga ("cheguei na coluna 4");

}
public static void main(String[] args) {
MundoVisual.iniciar("Exercicio6.xml");
}
}




23
4.3. LISTA DE EXERCCIOS 2
A segunda lista de exerccios tem por objetivo ampliar o seu domnio sobre os recursos do
furbot.
Exerccios:
1) Faa o rob andar at a ltima coluna contando os aliens. No final o rob deve
falar a quantidade de aliens encontrados. Ateno: no se esquea do tratamento
do singular e plural. Se for mais que um Alien, o rob deve dizer aliens;
2) Faa o robo andar ao redor do mundo e contar os alines que ele encontrou no
caminho. No final ele deve falar a quantidade de aliens encontrados;
3) Faa o rob andar ao redor do mundo e contar os alines que ele encontrou no
caminho. O rob deve voltar a clula de nascena para ento falar a quantidade de
aliens;
4) Faa o rob andar ao redor do mundo e contar os aliens que ele encontrou no
caminho. O rob deve voltar a clula de origem para ento falar a quantidade de
aliens encontrados, respectivamente, no total, na coluna zero, na ltima coluna e
na ltima linha;
5) Faa o rob andar at a clula (0,0). Em seguida o faa andar pelo mundo todo
contando os aliens que encontra pelo caminho. Quando ele alcanar a ltima clula
deve falar a quantidade de aliens encontrados;
6) Faa o rob andar ao redor do mundo e contar os aliens que ele encontrou pelo
caminho. O rob deve voltar a clula de origem para ento falar a quantidade de
aliens encontrados, respectivamente, no total, nas linhas pares, nas linhas
mpares, nas colunas pares e nas colunas mpares.


4.3.1. LISTA 2 EX1 MODELO DE MUNDO
< furbot>
<enunciado>Lista de Exerccios - Exerccio 1.<br> Faa o rob andar at a ultima coluna contando os
aliens.<br> No final deve falar a quantidade de aliens encontrados.<br> Ateno: no esquea do
tratamento do singular e plural.<br> Se for mais que 1 alien, ele deve dizer "aliens".</enunciado>
<mundo>
<qtdadeLin>4</qtdadeLin>
<qtdadeCol>8</qtdadeCol>
<explodir>true</explodir>
</mundo>
<robo>
<x>0</x>
<randomY />
</robo>
<!-- aliens -->
<objeto class="br.furb.furbot.Alien">
<random limiteInfX="1" />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random limiteInfX="1" />
<bloqueado>false</bloqueado>


24
</objeto>
<objeto class="br.furb.furbot.Alien">
<random limiteInfX="1" />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random limiteInfX="1" />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random limiteInfX="1" />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random limiteInfX="1" />
<bloqueado>false</bloqueado>
</objeto>
</furbot>

4.3.1.1. LISTA 2 - GABARITO DO EXERCCIO 1
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Lista1Exercicio1 extends Furbot {
public void inteligencia() throws Exception {
diga("Exercicio 1");
int qtdAliens = 0;
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
qtdAliens++;
}
andarDireita();
}
if (qtdAliens == 1) {
diga ("1 alien encontrado");
} else {
diga (qtdAliens + " aliens encontrados");
}
}
public static void main(String[] args) {
MundoVisual.iniciar("Lista1Exercicio1.xml");
}
}


4.3.2. LISTA 2- EX2 - MODELO DE MUNDO EM XML.
<furbot>
<enunciado>Lista de Exerccios - Exerccio 2.<br> Faa o rob andar ao redor do mundo e contar
os aliens<br> que ele encontrou no caminho. No final ele deve falar a<br> quantidade de aliens
encontrados.</enunciado>
<mundo>
<random limiteInfY="3" limiteSupY="8" limiteInfX="3" limiteSupX="8" />


25
<explodir>true</explodir>
</mundo>
<robo>
<x>0</x>
<y>0</y>
</robo>
- <!-- aliens -->
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
- <objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto> </furbot>

4.3.2.1. LISTA 2 - GABARITO DO EXERCCIO 2
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Lista1Exercicio2 extends Furbot {
public void inteligencia() throws Exception {
diga("Exercicio 2");
int qtdAliens = 0;
while (!ehFim(ABAIXO)) {
if (!ehVazio(ABAIXO)) {
qtdAliens++;
}
andarAbaixo();
}
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
qtdAliens++;
}
andarDireita();
}
while (!ehFim(ACIMA)) {
if (!ehVazio(ACIMA)) {
qtdAliens++;
}
andarAcima();
}


26
while (!ehFim(ESQUERDA)) {
if (!ehVazio(ESQUERDA)) {
qtdAliens++;
}
andarEsquerda();
}
if (qtdAliens == 1) {
diga ("1 alien encontrado");
} else {
diga (qtdAliens + " aliens encontrados");
}
}
public static void main(String[] args) {
MundoVisual.iniciar("Lista1Exercicio2.xml");
}
}


4.3.3. LISTA 2 EX3- MODELO DE MUNDO EM XML.
<furbot>
<enunciado>Lista de Exerccios - Exerccio 3.<br> Faa o rob andar ao redor do mundo e contar os
aliens<br> que ele encontrou no caminho. O rob deve voltar a clula <br> de nascena para ento falar a
quantidade de aliens.</enunciado>
<mundo>
<random limiteInfY="3" limiteSupY="8" limiteInfX="3" limiteSupX="8" />
<explodir>true</explodir>
</mundo>
<robo>
<random />
</robo>
- <!-- aliens -->
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
</furbot>



27
4.3.4. LISTA 2 EX3 - GABARITO DO EXERCCIO 3
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Lista1Exercicio3 extends Furbot {
public void inteligencia() throws Exception {
diga("Exercicio 3");
int qtdAliens = 0;
int inicialX = getX();
int inicialY = getY();
while (!ehFim(ESQUERDA)) {
andarEsquerda();
}
while (!ehFim(ABAIXO)) {
if (!ehVazio(ABAIXO)) {
qtdAliens++;
}
andarAbaixo();
}
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
qtdAliens++;
}
andarDireita();
}
while (!ehFim(ACIMA)) {
if (!ehVazio(ACIMA)) {
qtdAliens++;
}
andarAcima();
}
while (!ehFim(ESQUERDA)) {
if (!ehVazio(ESQUERDA)) {
qtdAliens++;
}
andarEsquerda();
}
// volta a celula inicial
int linhaAtual = 0;
while (linhaAtual < inicialY) {
if (!ehVazio(ABAIXO)) {
qtdAliens++;
}
andarAbaixo();
linhaAtual++;
}
int colunaAtual = 0;
while (colunaAtual < inicialX) {
andarDireita();
colunaAtual++;
}
if (qtdAliens == 1) {
diga ("1 alien encontrado");
} else {
diga (qtdAliens + " aliens encontrados");
}
}
public static void main(String[] args) {
MundoVisual.iniciar("Lista1Exercicio3.xml");


28
}
}

4.3.5. LISTA 2 EX4 - MODELO DE MUNDO EM XML.
<furbot>
<enunciado>Lista de Exerccios - Exerccio 4.<br> Faa o rob andar ao redor do mundo e contar os
aliens<br> que ele encontrou no caminho. O rob deve voltar a clula <br> de nascena para ento falar a
quantidade de aliens encontrados:<br> no total, na coluna 0, na linha 0, na ltima coluna e na <br> ltima
linha.</enunciado>
<mundo>
<random limiteInfY="3" limiteSupY="8" limiteInfX="3" limiteSupX="8" />
<explodir>true</explodir>
</mundo>
<robo>
<random />
</robo>
<!-- aliens -->
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
</furbot>
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
</furbot>




29
4.3.5.1. LISTA 2 - GABARITO DO EXERCCIO 4
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Lista1Exercicio4 extends Furbot {
public void inteligencia() throws Exception {
diga("Exercicio 4");
int qtdAColuna0, qtdaLinha0, qtdAUltimaColuna, qtdAUltimaLinha, qtdACantos, total;
qtdAColuna0 = qtdaLinha0 = qtdAUltimaColuna = qtdAUltimaLinha = qtdACantos = total = 0;
int inicialX = getX();
int inicialY = getY();
while (!ehFim(ESQUERDA)) {
andarEsquerda();
}
while (!ehFim(ABAIXO)) {
if (!ehVazio(ABAIXO)) {
qtdAColuna0++;
}
andarAbaixo();
}
if (!ehVazio(AQUIMESMO)) {
qtdACantos++;
qtdAUltimaLinha++;
}
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
qtdAUltimaLinha++;
}

andarDireita();
}
if (!ehVazio(AQUIMESMO)) {
qtdACantos++;
qtdAUltimaColuna++;
}
while (!ehFim(ACIMA)) {
if (!ehVazio(ACIMA)) {
qtdAUltimaColuna++;
}

andarAcima();
}
if (!ehVazio(AQUIMESMO)) {
qtdACantos++;
qtdaLinha0++;
}

while (!ehFim(ESQUERDA)) {
if (!ehVazio(ESQUERDA)) {
qtdaLinha0++;
}
andarEsquerda();
}
if (!ehVazio(AQUIMESMO)) {
qtdACantos++;
qtdAColuna0++;
}
int linhaAtual = 0;



30
while (linhaAtual < inicialY) {
if (!ehVazio(ABAIXO)) {
qtdAColuna0++;
}

andarAbaixo();
linhaAtual++;
}
int colunaAtual = 0;

while (colunaAtual < inicialX) {
andarDireita();
colunaAtual++;
}
total = qtdAColuna0 + qtdaLinha0 + qtdAUltimaColuna + qtdAUltimaLinha - qtdACantos;

if (total == 1) {
diga ("Total: 1 alien");
} else {
diga ("Total: "+total+" aliens");
}

if (qtdAColuna0 == 1) {
diga ("Coluna0: 1 alien");
} else {
diga ("Coluna0: "+qtdAColuna0+" aliens");
}

if (qtdaLinha0 == 1) {
diga ("Linha0: 1 alien");
} else {
diga ("Linha0: "+qtdaLinha0+" aliens");
}

if (qtdAUltimaColuna == 1) {
diga ("UltColuna: 1 alien");
} else {
diga ("UltColuna: "+qtdAUltimaColuna+" aliens");
}

if (qtdAUltimaLinha == 1) {
diga ("UltLinha: 1 alien");
} else {
diga ("UltLinha: "+qtdAUltimaLinha+" aliens");
}
}
public static void main(String[] args) {
MundoVisual.iniciar("Lista1Exercicio4.xml");
}
}



31
4.3.6. LISTA 2 EX5 - MODELO DE MUNDO EM XML.
<furbot>
<enunciado>Lista de Exerccios - Exerccio 5.<br> Faa o rob andar at a clula (0,0). <br> Em seguida
faa ele andar pelo mundo todo<br> e contando os aliens. Quando ele alcanar<br> a ltima clula deve
falar a quantidade<br> de aliens encontrados.</enunciado>
<mundo>
<random limiteInfY="3" limiteSupY="8" limiteInfX="3" limiteSupX="8" />
<explodir>true</explodir>
</mundo>
<robo>
<random />
</robo>
<!-- aliens -->
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
</furbot>


4.3.6.1. LISTA 2 - GABARITO DO EXERCCIO 5

import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Lista1Exercicio5 extends Furbot {
public void inteligencia() throws Exception {
diga("Exercicio 5");
//////////////////////////////////
// goto (0,0)
while (getX() > 0)
andarEsquerda();
while (getY() > 0)
andarAcima();
//////////////////////////////////
// percorre o mundo
boolean sentidoDireita = true;
int qtdAliens = 0;

while (!ehFim(ABAIXO)) {


32

if (!ehVazio(AQUIMESMO))
qtdAliens++;

if (sentidoDireita) {
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
qtdAliens++;
}
andarDireita();
}
} else {
while (!ehFim(ESQUERDA)) {
if (!ehVazio(ESQUERDA)) {
qtdAliens++;
}
andarEsquerda();
}
}
if (!ehFim(ABAIXO))
andarAbaixo();

sentidoDireita = !sentidoDireita;
}
if (!ehVazio(AQUIMESMO))
qtdAliens++;
if (sentidoDireita)
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
qtdAliens++;
}
andarDireita();
}
else
while (!ehFim(ESQUERDA)) {
if (!ehVazio(ESQUERDA)) {
qtdAliens++;
}
andarEsquerda();
}
if (qtdAliens == 1) {
diga ("1 alien encontrado");
} else {
diga (qtdAliens + " aliens encontrados");
}
}
public static void main(String[] args) {
MundoVisual.iniciar("Lista1Exercicio5.xml");
}
}

4.3.7. LISTA 2 EX6 - MODELO DE MUNDO EM XML.
<furbot>
<enunciado>Lista de Exerccios - Exerccio 6.<br> Faa o rob andar ao redor do mundo e contar os
aliens<br> que ele encontrou no caminho. O rob deve voltar a clula <br> de nascena para ento falar a
quantidade de aliens<br> encontrados: no total, nas linhas pares, nas linhas mpares,<br> nas colunas
pares e nas colunas mpares.</enunciado>


33
<mundo>
<random limiteInfY="3" limiteSupY="8" limiteInfX="3" limiteSupX="8" />
<explodir>true</explodir>
</mundo>
<robo>
<random />
</robo>
<!-- aliens -->
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
<objeto class="br.furb.furbot.Alien">
<random />
<bloqueado>false</bloqueado>
</objeto>
</furbot>


4.3.7.1. LISTA 2 - GABARITO DO EXERCCIO 6
import br.furb.furbot.Furbot;
import br.furb.furbot.MundoVisual;
public class Lista1Exercicio6 extends Furbot {
public void inteligencia() throws Exception {
diga("Exercicio 6");
while (getX() > 0)
andarEsquerda();
while (getY() > 0)
andarAcima();
// percorre o mundo
boolean sentidoDireita = true;
int qtdALinhaImpar, qtdALinhaPar, qtdAColunaImpar, qtdAColunaPar, total;
qtdALinhaImpar = qtdALinhaPar = qtdAColunaImpar = qtdAColunaPar = total = 0;
while (!ehFim(ABAIXO)) {
if (!ehVazio(AQUIMESMO)) {
if (getX() %2 == 0) qtdALinhaPar++;
else qtdALinhaImpar++;
if (getY()%2 == 0) qtdAColunaPar++;
else qtdAColunaImpar++;
total++;
}


34
if (sentidoDireita) {
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
if (getX()%2 == 0) qtdALinhaPar++;
else qtdALinhaImpar++;
if (getY()%2 == 0) qtdAColunaPar++;
else qtdAColunaImpar++;
total++;
}
andarDireita();
}//while
} else
{ //sentido a esquerda
while (!ehFim(ESQUERDA)) {
if (!ehVazio(ESQUERDA)) {
if (getX()%2 == 0) qtdALinhaPar++;
else qtdALinhaImpar++;
if (getY()%2 == 0) qtdAColunaPar++;
else qtdAColunaImpar++;
total++;
}
andarEsquerda();
}//while
}
if (!ehFim(ABAIXO))
andarAbaixo();
sentidoDireita = !sentidoDireita;
}
if (!ehVazio(AQUIMESMO)) {
if (getX()%2 == 0) qtdALinhaPar++;
else qtdALinhaImpar++;
if (getY()%2 == 0) qtdAColunaPar++;
else qtdAColunaImpar++;
total++;
}
if (sentidoDireita)
while (!ehFim(DIREITA)) {
if (!ehVazio(DIREITA)) {
if (getX()%2 == 0) qtdALinhaPar++;
else qtdALinhaImpar++;
if (getY()%2 == 0) qtdAColunaPar++;
else qtdAColunaImpar++;
total++;
}
andarDireita();
}//while
else
while (!ehFim(ESQUERDA)) {
if (!ehVazio(ESQUERDA)) {
if (getX()%2 == 0) qtdALinhaPar++;
else qtdALinhaImpar++;
if (getY()%2 == 0) qtdAColunaPar++;
else qtdAColunaImpar++;
total++;
}
andarEsquerda();
}//while


if (total == 1) {


35
diga ("Total: 1 alien");
} else {
diga ("Total: "+total+" aliens");
}
if (qtdALinhaPar == 1) {
diga ("Linha Par: 1 alien");
} else {
diga ("Linha Par: "+qtdALinhaPar+" aliens");
}
if (qtdALinhaImpar == 1) {
diga ("Linha Impar: 1 alien");
} else {
diga ("Linha Impar: "+qtdALinhaImpar+" aliens");
}
if (qtdAColunaPar == 1) {
diga ("Coluna Par: 1 alien");
} else {
diga ("Coluna Par: "+qtdAColunaPar+" aliens");
}
if (qtdAColunaImpar == 1) {
diga ("Coluna Impar: 1 alien");
} else {
diga ("Coluna Impar: "+qtdAColunaImpar+" aliens");
}
}
public static void main(String[] args) {
MundoVisual.iniciar("Lista1Exercicio6.xml");
}
}





36
5. INTRODUO A PROGRAMAO ORIENTADA A OBJETOS

Orientao a objetos modela o mundo a partir dos objetos existentes no mundo real.
OBJETOS so elementos que existem concretamente, seja em forma fsica ou conceitual.
Os objetos tm caractersticas e comportamentos prprios.
CLASSES definem categorias de objetos com caractersticas e comportamentos
similares.
A Programao Orientada a Objetos (POO) consiste na construo de modelos de
classes adequados para o domnio de um determinado problema a ser trabalhado, de
forma a se criar objetos que permitam a soluo do problema.
Algumas caractersticas importantes da OO so:
encapsulamento: os objetos tm uma interface para se comunicar com o seu mundo
exterior.
herana1: objetos podem herdar informaes de outros objetos.
polimorfismo1: objetos similares podem ter comportamentos diferentes.
associao1: objetos podem se associar a outros objetos.
abstrao: classes devem ser modeladas considerando apenas aquilo que relevante
para a soluo de um determinado problema.
A implementao de uma soluo computacional utilizando OO requer, portanto, a
construo de um modelo de classes e objetos.
5.1. CLASSES
As CLASSES so categorias de objetos com dados e comportamentos similares.
Uma classe um modelo que contm ATRIBUTOS (DADOS ou PROPRIEDADES) e
MTODOS (OPERAES ou MENSAGENS) possveis sobre um determinado objeto.
Os ATRIBUTOS so SUBSTANTIVOS ou LOCUES ADJETIVAS que definem as
caractersticas de um objeto.
Os MTODOS so VERBOS que definem os comportamentos ou as aes realizadas
pelo ou sobre o objeto.
Exemplos de CLASSES:

1
Estes conceitos sero abordados nas disciplinas posteriores de programao.


37
ALUNO
Atributos: nmero de matrcula, nome, sexo, curso
Mtodos: matricular-se, informar nmero de matrcula

CONTA CORRENTE
Atributos: nmero da conta, dgito verificador, nome do correntista, cpf, saldo
Mtodos: abrir conta, depositar, retirar, ver saldo, ver dados correntista

ENDEREO
Atributos: rua, nmero, bairro, cidade, uf
Mtodos: cadastrar endereo, alterar endereo, ver endereo
A representao diagramtica mais comum de uma classe feita atravs de uma caixa
dividida em trs partes: a primeira deve conter o nome da classe, a segunda, deve conter
os atributos da classe e a terceira deve conter os mtodos da classe.
O diagrama com esta representao apresentado a seguir:

Exemplos:

Existem atributos de uma classe que podem ser outras classes. Por exemplo, na classe
Aluno, o atributo Curso poderia ser uma outra classe, contendo o cdigo do curso, nome
do curso, currculo e assim por diante.
A identificao de classes candidatas a um sistema feita atravs da anlise dos
SUBSTANTIVOS do enunciado de um problema.
nmero de matrcula
nome
sexo
matricular-se
informar nmero de matrcula
Conta Corrente
nmero da conta
dgito verificador
nome do correntista
abrir conta
depositar
retirar
Endereo
rua
nmero
bairro
cadastrar endereo
alterar endereo
Nome da Classe
atributos
mtodos
Aluno


38
no problema 1 analisado anteriormente, o aluno um candidato a ser uma classe, pois
sobre ele definem-se outras informaes tais como nome e notas.
no problema 2, a classe candidata poderia ser a sala, pois sobre ela que se sabe a
largura e o comprimento e se deseja calcular a rea.

5.2. OBJETOS
Um OBJETO o que chamamos de INSTNCIA da classe, ou seja, quando atribumos
valores aos DADOS.
Um objeto s existe a partir da definio de uma classe.
A representao diagramtica de um objeto similar a de uma classe inserindo o sinal de
: (dois pontos) seguido do nome da classe.
Por conveno o nome de uma classe grafado em letra maiscula e o de um objeto
grafado em letra minscula.
O diagrama com esta representao apresentado a seguir:

Podem existir diversas instncias de uma mesma classe.
aluno : Aluno
nmero de matrcula: 100
nome: Bento de Oliveira
sexo: M
curso: Cincia da Computao

Matricular-se
Consultar Dados
contaCorrente :
Conta Corrente
nmero da Conta: 100
dgito verificador: 2
nome do correntista: Rica de
Menezes
CPF: 123456789-0
Saldo: R$1.000.000,00
Abrir conta
Depositar
Retirar
endereo :
Endereo
rua: Rua das Accias
nmero: 123
bairro: Jovem
cidade: Blumenau
uf: SC

Cadastrar Endereo
Alterar Endereo


39

Um objeto a materializao de uma classe. Para ser usado um objeto deve ser criado.


5.2.1. EXERCCIOS PROPOSTOS
1. Defina pelo menos 3 atributos e 3 mtodos para as seguintes classes. Apresente a
representao atravs de um diagrama:
a) funcionrio;
b) livro;
c) crculo;
d) carro;
e) locadora de vdeos
f) DVD;
g) jogo de truco;
h) jogador de truco;
i) carta de baralho;
2. Crie pelo menos 2 objetos para cada uma das classes do exerccio anterior,
considerando os atributos e mtodos definidos. Apresente a representao atravs de
um diagrama.

5.3. ATRIBUTOS
Conforme visto anteriormente, ATRIBUTOS so as informaes que caracterizam uma
classe.
Os ATRIBUTOS tambm so chamados de PROPRIEDADES de uma classe.
Mas quando eu devo definir um atributo?
aluno1 : Aluno
nmero de matrcula: 100
nome: Bento de Oliveira
sexo: M
curso: Cincia da Computao

Matricular-se
Consultar Dados
aluno2 : Aluno
nmero de matrcula: 157
nome: Maria da Silva
sexo: F
curso: Psicologia

Matricular-se
Consultar Dados
aluno3 : Aluno
nmero de matrcula: 89
nome: Cleto Marques
sexo: M
curso: Sistemas de Informao

Matricular-se
Consultar Dados


40
Via de regra, um dado deve ser definido como atributo quando ele no tem
dependncia de outros dados.
Dados dependentes devem ser definidos como atributos apenas quando so muito
usados. Entretanto, deve-se ter em mente que a cada dado alterado que influencie em
seu valor, o mesmo tambm precisa ser alterado.
Exemplo: considere o exerccio 1 onde o professor tem que calcular a mdia de um aluno
a partir de suas 3 notas. Quem so os atributos do aluno?
nota1, nota2 e nota3 so atributos uma vez que so dados independentes.
mdia no deve ser atributo pois depende das notas, ou seja, um dado calculado.

Os ATRIBUTOS tm tipos que os definem.

5.3.1. TIPOS DOS ATRIBUTOS
Todo ATRIBUTO tem um tipo de dado associado. O tipo de dado determina:
que valores ele pode assumir;
as operaes s quais ele pode ser submetida;
o espao que ele ocupa na memria do computador.

Os tipos de dados bsicos ou primitivos so:
inteiro: define valores numricos do tipo inteiro, ou seja, sem casas decimais. (Ex: 10,
15, 138)
real: define valores numricos do tipo real (ponto flutuante), ou seja, com casas
decimais. (Ex. 0.15, 45.2, 1.3465)
caractere: define valores alfanumricas compostas de apenas um caractere. (Ex. A,
? @)
lgico: define variveis do tipo VERDADEIRO ou FALSO.
Outro tipo de dado muito comum denominado de string ou cadeia de caracteres, pois
permite agrupar diversos caracteres. (Ex. Joo da Silva, ABC123, Computador).
Para as classes dos exemplos anteriores, poderamos definir os seguintes tipos de dados
(o tipo do dado normalmente vem frente do nome do atributo).


41


5.3.2. EXERCCIOS PROPOSTOS

1. Descreva os tipos de dados para os atributos definidos no exerccio 1 da seo 5.2.1.


5.4. MTODOS
Conforme visto anteriormente, MTODOS so os comportamentos ou as aes
realizadas por um objeto.
Os mtodos tambm so chamados de funes, pois, assim como na Matemtica, eles
recebem valores e retornam um resultado.
Os mtodos operam sobre dados. Assim, normalmente os mtodos tm valores de
Entrada e Sada.
Os dados de ENTRADA sobre os quais os mtodos operam podem ser:
ATRIBUTOS: so dados que j existem dentro da prpria classe;
PARMETROS: so dados que no existem na classe, mas que so necessrios para
o processamento do mtodo.
A SADA gerada por um mtodo pode ser:
ATRIBUTO: neste caso o resultado da execuo do mtodo fica armazenado na
prpria classe;
RETORNO: neste caso, o mtodo devolve o resultado para quem solicitou, como um
resultado de uma funo.
inteiro nmero de matrcula
string nome
caracter sexo
matricular-se
consultar dados

Conta Corrente
inteiro nmero da conta
inteiro dgito verificador
string nome do correntista
abrir conta
depositar
retirar
Endereo
string rua
inteiro nmero
string bairro
cadastrar endereo
alterar endereo
Aluno


42

5.4.1. ASSINATURA DOS MTODOS
A Assinatura de um mtodo o seu cabealho, ou seja, o que descreve o mtodo.
Para construir um mtodo necessrio:
1. definir o seu nome (nomeMetodo);
2. identificar os dados de Entrada;
3. classificar os dados de entrada como ATRIBUTO ou PARMETRO. Se for
PARMETRO obrigatrio especific-lo na assinatura do mtodo. Atributo no.
4. identificar os dados de Sada;
5. classificar os dados de Sada como ATRIBUTO ou RETORNO. Se for RETORNO
obrigatrio especific-lo na assinatura do mtodo. Atributo no.
Assim, a assinatura de um mtodo feita do seguinte modo:

tipo nomeMetodo (parametros)

O TIPO descreve o tipo de dado do valor de retorno do mtodo. Quando ele omitido,
porque a sada um atributo.
Nos PARMETROS deve ser colocado o tipo de dado e um nome para o parmetro.
Quando os parmetros so omitidos, porque a(s) entrada(s) (so) atributo(s).

5.4.2. ALGORITMO
O ALGORITMO de um mtodo so as instrues que ele deve executar para realizar as
operaes que so de sua responsabilidade.
Um ALGORITMO similar a uma receita para resolver tarefas especficas. Estas tarefas
no podem ser redundantes nem subjetivas na sua definio, devendo ser claras e
precisas.
Tambm precisam ter uma SEQNCIA LGICA para que o problema seja resolvido
corretamente.
Via de regra todo algoritmo opera sobre DADOS (denominados de VARIVEIS), sendo
um processo que precisa de RECURSOS (dados de entrada) e produz RESULTADOS
(dados de sadas).

FIGURA 5 - COMPONENTES DE UM ALGORITMO.

Deixando de lado a questo da orientao a objetos, experimente descrever algoritmos
para os problemas a seguir. No se esquea de descrever os recursos necessrios e o
resultado esperado para cada um:
fazer uma limonada;
pegar um livro na biblioteca;
desenhar e recortar um quadrado em uma folha de papel;
calcular o permetro de um tringulo;
jogar truco.
Um algoritmo precede a tarefa de programao medida em que ele descreve como o
programa deve ser feito.
Um algoritmo composto de INSTRUES e EXPRESSES.
As INSTRUES mais comuns em algoritmos so:
ATRIBUIO: existem informaes em um programa que precisam ser armazenadas.
Um atributo, por exemplo, precisa armazenar seu contedo. Nestes casos, utiliza-se
uma expresso de atribuio.
ESTRUTURAS DE CONTROLE EM NVEL DE INSTRUO (SELEO E
REPETIO): em um programa podem existir comandos executados apenas em
determinadas situaes. Nestes casos utilizam-se as estruturas de seleo. Em outras
situaes, um comando precisa ser executado repetidas vezes. Nestes casos,
utilizam-se as estruturas de repetio.
CHAMADAS DE OUTROS MTODOS: muitas vezes em um programa, a soluo de
um mtodo, requer a execuo de outros mtodos. Nestes casos, deve-se seguir a
assinatura do mtodo a ser ativado (chamado).
TRATAMENTOS DE ERROS: muitas situaes na programao de computadores
requerem cuidado pois podem gerar diversos tipos de erros. Nas linguagens mais
modernas, existem estruturas especficas para o tratamento destes erros.
As EXPRESSES tem por finalidade verificar ou transformar os dados em um algoritmo.
As expresses contam com OPERADORES que permitem realizar as aes sobre os
dados de um determinado algoritmo.


44
Os OPERADORES dependem de linguagens e normalmente so representados por
smbolos:
operador de atribuio (=);
operadores aritmticos (+, - , * , /);
operadores relacionais (>, <, <=, <=, <>, =)
operadores lgicos (e, ou, no).
Existem diversas formas de representar um algoritmo, entre as quais destacam-se:
texto: um tipo de representao meramente textual, onde descreve-se, em linhas
gerais, os passos para a execuo do algoritmo;
portugus estruturado ou portugol: chamado de pseudo-linguagem, pois apresenta
algumas estruturas similares uma linguagem de programao;
diagramas: representa as estruturas de um programa atravs das mais diversas
formas geomtricas. Os mais comuns so: fluxograma, Diagrama de Chapin e
diagrama de estados.
Convenciona-se comear um algoritmo com a palavra incio e terminar com a palavra fim.

5.4.3. EXERCCIOS PROPOSTOS
1. Descreva a assinatura e o algoritmo dos mtodos do exerccio 1 da seo 5.2.1.


5.5. ENCAPSULAMENTO
A orientao a objetos define regras de acesso aos atributos e mtodos, para garantir a
segurana e qualidade do cdigo desenvolvido.
Existem diversos qualificadores para atributos e mtodos. Neste curso destacaremos
dois:
privado: neste caso, o atributo ou mtodo s pode ser utilizado dentro da prpria
classe.
pblico: neste caso, o atributo ou mtodo pode ser utilizado por qualquer outra classe.

O princpio do ENCAPSULAMENTO estabelece, entretanto que:
TODO ATRIBUTO DEVE SER PRIVADO. S os mtodos podem ser pblicos2.

2
Existem algumas excees no caso de herana de classes que no sero vistas por enquanto.


45
MTODOS DE ACESSO (setters&getters)
Uma vez que os atributos so encapsulados, deve existir uma forma de atribuir valores a
eles ou de verificar seus valores.
Nestes casos existem mtodos especiais denominados de MTODOS DE ACESSO.
Existem dois tipos de mtodos de acessos:
de ATRIBUIO: utilizado para definir um valor para o atributo. Denominado
comumente de mtodo set.
de VERIFICAO: utilizado para verificar o valor de um atributo. Denominado
comumente de mtodo get.
O mtodo de ATRIBUIO tem a seguinte assinatura e o seguinte algoritmo:
publico setAtributo (tipoAtributo parametro)
inicio
atributo = parmetro
fim
O mtodo de VERIFICAO tem a seguinte assinatura e o seguinte algoritmo:
tipoAtributo getAtributo ()
inicio
retornar atributo
fim

5.6. CONSTRUTORES
Os objetos so instncias de uma classe.
Para serem utilizados os objetos precisam ser CRIADOS.
A criao de objetos feita atravs de MTODOS especiais denominados de
CONSTRUTORES.
Os CONSTRUTORES normalmente so utilizados para a inicializao de atributos de um
objeto. Neste caso eles podem substituir os mtodos de acesso de ATRIBUIO
(setters).
A estrutura de um construtor dada como segue:
publico nomeDaClasse (<parametros>)
inicio
<expresses>
fim
Um CONSTRUTOR um mtodo pblico e tem o mesmo nome da classe.


46
CONSTRUTORES no tm retorno, mas podem ter parmetros com os valores de
inicializao dos atributos.
IMPORTANTE: um atributo TEM QUE ser inicializado no CONSTRUTOR quando ele
fundamental para a existncia do objeto.

5.7. ESTRUTURA DE UM PROGRAMA OO
A boa prtica de programao recomenda que o programador deva separar a parte lgica
do programa da interface com o usurio.
Assim, em nossos programas orientados a objetos SEMPRE teremos no mnimo 2
classes:
a classe principal: responsvel pela interface com o usurio (leitura e escrita dos
dados) e criao dos objetos necessrios para a soluo do problema. Doravante esta
classe ser denominada de main;
a classe do modelo: responsvel por executar as tarefas que solucionam a situao-
problema proposta.
Neste caso dizemos que h uma associao entre as classes.
Deste modo, usaremos o seguinte modelo de arquitetura em nossas aplicaes:

FIGURA 6 - RELAO ENTRE A CLASSE PRINCIPAL E A CLASSE DO MODELO
A classe principal tem a funo de prover as funcionalidades descritas nos casos de uso.
Deste modo ela ter sempre as seguintes tarefas fundamentais:
CRIAR O(S) OBJETO(S) da(s) classe(s) do modelo;
OBTER do usurio atravs do dispositivo de entrada (teclado) OS DADOS
necessrios para inicializar a classe do modelo;
PASSAR OS DADOS obtidos para a classe do modelo;
CHAMAR OS MTODOS da classe do modelo necessrios para a sluo do problema
proposto;
OBTER da classe do modelo OS RESULTADOS do problema;
CLASSE PRINCIPAL
(classe main)
CLASSE DO MODELO
(Lgica do
Problema)


47
INFORMAR ao usurio atravs do dispositivo de sada (vdeo) OS RESULTADOS
obtidos;
A classe do modelo ter sempre as seguintes tarefas fundamentais:
RECEBER os dados da classe principal;
PROCESSAR os dados recebidos da classe principal;
DISPONIBILIZAR os resultados do processamento para a classe principal.




48
6. INTRODUO LINGUAGEM JAVA
Origem da linguagem:
linguagem originalmente desenvolvida para eletrodomsticos, portanto, simples e
portvel;
foi projetada para ser uma linguagem com caractersticas modernas de programao;
nasceu considerando a Internet como ambiente operacional.
Principais caractersticas:
propsito geral;
orientada a objetos e fortemente tipada;
independente de plataforma ou sistema operacional (hardware e software);
vrios fornecedores de ambientes de desenvolvimento;
gerncia automtica de memria (garbage collector) sem ponteiros e alocao direta
de memria;
escalabilidade das aplicaes.
Como funciona:
compilao do Fonte (.java) para bytecode da Java Virtual Machine (JVM)
interpretao e execuo do bytecode (.class)
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec,
2006. 136 p, il. pg. 4.

6.1. ESTRUTURA DE UM PROGRAMA JAVA
Um programa Java pode ser executado de diversas formas: no contexto de uma aplicao
desktop, como um applet na WEB, ou como uma aplicao JSP. No nosso contexto,
trataremos de uma aplicao desktop.
Para poder ser executado um programa em Java como uma aplicao desktop, tem que
existir uma classe com uma funo denominada main(), atravs da qual o programa em
Java iniciado.
A classe com a funo main(), tambm denominada Principal, pode ativar outras classes
conforme pode ser visualizado na figura a seguir.



FIGURA 7 - ATIVAO DE OUTRAS CLASSES A PARTIR DO MAIN.
Normalmente uma classe Principal no tem atributos ou mtodos, mas apenas a criao
de outras classes e inicializao do programa. Isto no uma regra e varia do gosto de
cada programador. Entretanto, uma boa prtica de programao.
O exemplo a seguir permite verificar a declarao de uma funo main() em um classe
Principal:
public class Principal {
public static void main(String[] args) {
System.out.println (Minha primeira classe em Java);
}
A classe System, apresentada no exemplo, permite escrever um texto em modo
caractere.
A estrutura bsica de uma classe em Java apresentada a seguir:
public class Nome_da_classe {

//declarao dos atributos

//mtodo construtor
public Nome_da_classe() {
}

//declarao e implementao dos mtodos
}
Deve-se notar o uso de chaves para iniciar ({) e fechar (}) uma classe em Java.
O construtor um mtodo de inicializao da classe. Ele tambm delimitado por
chaves, assim como todos os mtodos em Java. O construtor e os mtodos sero vistos
mais adiante.
Por conveno o nome de uma classe sempre iniciado por letra maiscula.
Exemplo: codificao da classe para calcular a largura da sala.
/** Esta classe define uma sala


50
* @author Maurcio Capobianco Lopes
* @version %I%, %G% */

public class Sala {

//contm as dimenses da sala
private double largura;
private double comprimento;

/**Mtodo construtor da classe */
public Sala () {
}

/**Define a largura da sala */
public void setLargura (double largura) {
this.largura = largura;
}

/**Define o comprimento da sala */
public void setComprimento (double comprimento) {
this.comprimento = comprimento;
}

/** Calcula a rea da sala */
public double calcularArea() {
return largura * comprimento;
}

}
importante ressaltar que novas e boas prticas de programao nos permitiro melhorar
esta classe no futuro.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pgs. 5 a 7.

6.2. PALAVRAS RESERVADAS E IDENTIFICADORES EM JAVA
Palavras reservadas so todos os nome pr-existentes na linguagem que tem algum
significado e no podem ser utilizadas pelo programador para definir nomes criados por
ele.
Exemplos de palavras reservadas: public, class, int, double, etc.
Identificadores so todos os nomes criados pelo programador. Os identificadores so
utilizados para nomear classe, atributos e mtodos.


51
Um identificador em Java deve sempre iniciar com uma letra, podendo a seguir ter
qualquer combinao de letras (a..z), nmeros (0..9) e do caractere sublinhado (_).
Observe que nenhum outro smbolo ou espao em branco permitido em um
identificador.
Java chamada de case-sensitive, ou seja, as letras minsculas e maisculas so
diferentes. Exemplo: teste diferente de TESTE que por sua vez diferente de Teste que
diferente de TestE e assim por diante.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 6, 8 e 9.

6.3. TIPOS DE DADOS PRIMITIVOS
Os tipos de dados primitivos so os tipos bsicos de uma linguagem.
Em Java eles so:
Numricos (inteiros):
Tipo Tamanho
(em bits)
Domnio
byte 8 -128 .. 127
short 16 -32.768 .. 32.767
int 32 -2.147.483.648 .. 2.147.483.647
long (literal: L) 64 -2^
64
.. 2^
64
-1
Numricos (reais):
Tipo Tamanho
(em bits)
Domnio Dgitos
Significativos
float (literal: f) 32 1.4 * 10
-45
.. 3.4 * 10
38
7-8
double (literal: d) 64 5.0 * 10
-324
.. 1.8 * 10
308
15-16
Alfanumricos:
Tipo Tamanho
(em bits)
Armazenamento
char 16 1 caracter UNICODE
Lgicos:
Tipo Tamanho
(em bits)
Armazenamento
boolean 1 true ou false


52
O Java possui ainda o tipo void que no armazena nenhum contedo.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 7.

6.3.1. CONVERSO DE TIPOS DE DADOS
Os tipos de dados em Java podem ser convertidos utilizando-se o nome do tipo frente
da operao que se deseja converter.
Esta operao denominada de typecast.
Exemplos:
char a = 5;
double y = 7.6;
int i;
long j = 10;
double x;
//converter um caractere para um nmero inteiro. No atribudo 5 mas sim o cdigo UNICODE do smbolo
5
i = (int) a;
//converter um real para inteiro
i = (int) x;
//converter um inteiro para um real
x = (double) j;
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 75.

6.3.2. CLASSE STRING
Uma cadeia de caracteres em Java denominada de String.
Uma String no um tipo primitivo, mas sim uma classe e, portanto, seu nome iniciado
com uma letra maiscula.
O tamanho de uma String limitado memria disponvel.
Um char representado entre apstrofos (Ex: a), enquanto uma String representado
entre aspas (Ex: a).



53
6.3.2.1. OPERADORES E MTODOS DE STRINGS
A classe String tem o operador + para a concatenao entre strings.
String nome = Silva + sauro;
Principais mtodos da classe String
Funcionalidade Mtodo
comparar dois strings e retornar verdadeiro ou falso boolean equals(String s)
comparar dois strings ignorando maiscula e
minsculas
boolean equalsIgnoreCase(String s)
retornar o nmero de caracteres da String int length()
procurar o string s e retornar a posio onde
encontrou. Se no encontrou retorna -1
int indexOf(String s)
retornar o caractere na posio i da string char charAt(int i)

6.3.2.2. CONVERSO DE STRINGS
Uma necessidade muito comum dos programadores Java converter uma String para um
tipo primitivo ou vice-versa.
A tabela a seguir apresenta os principais mtodos de converso:
Funcionalidade Mtodo
String para inteiro Integer.parseInt (String s);
String para real Double parseDouble (String S)
Qualquer tipo primitivo para String String.valueOf (valor)
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec,
2006. 136 p, il. pg. 75.

6.4. DEFINIO DE ATRIBUTOS
A definio de atributos em uma classe Java pode ser feita do seguinte modo:
qualificador tipo nome_atributo;
ou
qualificador tipo nome_atributo = valor;
ou
qualificador final tipo nome_atributo = valor;

onde:
qualificador: informa se o atributo pblico ou privado;
tipo: o tipo do atributo;
nome_atributo: o nome dado ao atributo;
valor: inicializao do atributo;
final: um qualificador (palavra reservada) que indica que o valor do atributo no pode ser alterado.


54

Exemplos:
private char letra;
private int numero = 10;
private final double tamanho = 50;
Em funo do encapsulamento, os atributos devem ser precedidos do seu qualificador de
acesso. Neste caso usaremos sempre a palavra private.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 9 e 30.

6.5. MTODOS
Mtodos so as funes que permitem realizar operaes sobre o objeto.
A definio de mtodos em uma classe em Java pode ser feita do seguinte modo:
qualificador tipo nome_mtodo ([parmetros]) {
bloco de instrues
[return expresso]
}

onde:
qualificador: informa se o mtodo pblico ou privado;
tipo: o tipo do valor de retorno do mtodo;
nome_mtodo: o nome dado ao mtodo;
parmetros: so os dados de entrada passados para o mtodo para que o mesmo possa ser executado.
Esto entre colchetes ([]), pois so opcionais em um mtodo;
bloco de instrues: so as instrues realizadas pelo mtodo para o processamento dos dados;
return: indica que o mtodo deve ser finalizado retornando o valor que o resultado da expresso.
Tambm opcional no caso de um mtodo do tipo void.
As instrues so dadas por comandos ou expresses.
Em Java as instrues sempre terminam com ponto-e-vrgula (;).
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec,
2006. 136 p, il. pg. 31.

6.6. EXPRESSES
As expresses denotam chamadas de mtodos ou operaes sobre os dados de uma
classe. As expresses envolvem o uso de operadores.


55

6.6.1. OPERADOR DE ATRIBUIO
O operador de atribuio na linguagem Java o sinal de igual que representa a atribuio
da expresso direita a varivel esquerda.
Exemplos:
x = 100;
y = x + 3;

6.6.2. OPERADORES ARITMTICOS
Os operadores aritmticos em Java so:
Operador Exemplo Comentrio
++ ++x ou x++ Soma 1 em x antes ou depois de usar a varivel
-- --x ou x-- Subtrai 1 em x antes ou depois de usar a varivel
+ x + y Soma o contedo de x e y
- x - y Subtrai o contedo de y do contedo de x
* x * y Multiplica x por y
/ x / y Obtm o quociente de x por y
% x % y Obtm o resto da diviso de x por y
Outros operadores aritmticos so:
Operador Exemplo Comentrio
+ = X + = Y Equivale a x = x + y
- = X - = Y Equivale a x = x - y
* = X * = Y Equivale a x = x * y
/ = X / = Y Equivale a x = x / y
% = X % = Y Equivale a x = x % y

6.6.3. OPERADORES RELACIONAIS
Os operadores relacionais em Java so:
Operador Exemplo Comentrio
== x == y Contedo de x igual ao de y
!= x != y Contedo de x diferente de y
<= x <= y Contedo de x menor ou igual ao de y
>= x >= y Contedo de x maior ou igual ao de y
< x < y Contedo de x menor que o de y
> x > y Contedo de x maior que o de y





56
6.6.4. OPERADORES LGICOS
Os operadores lgicos so:
Operao Operador
E &&
OU ||
NEGAO !
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pgs. 14 a 16.

6.7. ENCAPSULAMENTO
Conforme j visto anteriormente, em uma linguagem orientada a objetos, os atributos so
encapsulados, ou seja, s podem ser acessados atravs de mtodos.
Assim, para que se possa atribuir um valor ao atributo ou pegar o seu contedo deve-se
criar mtodos especficos para esta tarefa denominados comumente de set e get.
O mtodo set permite definir um valor para o atributo.
O mtodo get permite obter um valor de um atributo.

6.7.1. MTODO SET
O mtodo set tem a seguinte estrutura:
public void setNomeAtributo (tipo nomeParametro) {
this.nomeParametro = nomeParametro;
}

Exemplo:
//classe
public class Pessoa {
//atributo da classe
private String nome;

//mtodo que permite pessoa receber um nome
public void setNome (String nome) {
this.nome = nome;
}
}
Deste modo, o valor passado como parmetro - denominado de nomeParametro -
atribudo ao valor do atributo da classe.


57
O qualificador this usado para referenciar o objeto dentro da prpria classe.
O mtodo set pode ter consistncias para verificar se um determinado valor pode ser
armazenado no objeto.

6.7.2. MTODO GET
O mtodo get tem a seguinte estrutura:
public tipo getNomeAtributo () {
return nomeAtributo;
}

Exemplo: (continuando o exemplo de pessoa apresentado anteriomente no set)
//mtodo que permite verificar o nome da pessoa
public String getNome () {
return nome;
}
Neste caso, o contedo armazenado no atributo retornado para o mtodo que solicitou a
informao ao objeto.
O mtodo get deve ter um tipo idntico ao do atributo que ele ir retornar.
O qualificador return usado para encerrar a execuo de um mtodo e retornar o valor
que se deseja.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 32 e 37.

6.8. CONSTRUTOR
Para que um objeto seja utilizado ele precisa ser criado.
Um construtor executado no momento de criao de um objeto.
Os construtores normalmente so utilizados para a inicializao de atributos com valores
diferentes do valor default.
Os construtores devem ter o mesmo nome da classe e no podem retornar um valor.




58
Estrutura de um construtor:
//mtodo construtor
public Nome_da_classe() {
}

Os construtores podem ter parmetros para a inicializao dos atributos.

6.9. CRIAO DE UM OBJETO
Um objeto em Java criado chamando-se o mtodo new().
A chamada do mtodo new() cria um endereo de memria (handle) para o objeto,
permitindo que o mesmo possa ser utilizado (receber e informar valores e proceder
clculos ou operaes).
O endereo de memria alocado para o objeto deve ser armazenado em uma varivel do
tipo da classe do objeto que se deseja criar.
Exemplo de uso da classe Sala:
import java.util.Scanner;

public class SalaTXT {

public static void main(String[] args) {
//criar o objeto
Sala sala = new Sala();
//criar o objeto de leitura dos dados
Scanner s = new Scanner (System.in);
//ler dados e envi-los ao objeto sala
System.out.println("Digite o comprimento");
sala.setComprimento(s.nextDouble());
System.out.println("Digite a largura");
sala.setLargura(s.nextDouble());
//calcular e informar a rea
System.out.println("rea="+sala.calcularArea());
}
}
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 34.





59
6.10. PACOTES E CLASSES ESTTICAS
A linguagem Java oferece muitas classes prontas, com funes para realizar as mais
diversas tarefas.
Estas classes so agrupadas em pacotes (packages).
Os pacotes agrupam classes com caractersticas comuns.
Os pacotes disponibilizados pela linguagem podem ser conhecidos em
http://java.sun.com/j2se/1.5.0/docs/api/.
Assim, ao utilizar uma funo de um pacote em java necessrio fazer sua importao
atravs da diretiva import.
No item sobre criao de objetos h um exemplo de importao da classe Scanner.
import java.util.Scanner;

O programador pode criar seus prprios pacotes.
Algumas classes no precisam ser importadas e nem instanciadas. Estas classes tm a
caracterstica de serem estticas e j estarem disponveis pela API da linguagem. o
caso da classe System.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 42 e 61.

6.11. CLASSES E FUNES DE ENTRADA E SADA
Existem diversas classes para entrada e sada de dados em Java. Neste curso usaremos
as seguintes:
Scanner para entrada;
System para sada.
A classe Scanner precisa da criao de um objeto para ser utilizada, do seguinte modo:
Scanner s = new Scanner (System.in);

O parmetro System.in no constructor da classe indica que a leitura feita do teclado.
Alguns mtodos disponveis para ler os valores so:


60
nextInt(): l um valor inteiro;
nextDouble(): l um nmero real;
next(): l um string;
nextBoolean(): l um valor lgico;
Um exemplo de uso destes mtodos pode ser visto no item sobre criao de objetos.
A classe Scanner pertence ao pacote java.util.Scaner e portanto de v ser importada.
Para a escrita de dados em vdeo utiliza-se diretamente a classe System sem a
necessidade de criao de um objeto.
Na classe System utiliza-se o objeto out e em seguida podem ser usados os mtodos:
println: para exibir texto ou valores sem formatao;
printf: para exibir texto ou valores formatados.
Exemplos de uso do mtodo System.out.println j foram passados anteriormente.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 10.

6.12. DOCUMENTAO DE PROGRAMAS
A documentao de programas tem diversos objetivos, entre os quais se destacam:
facilitar sua manuteno;
manter um histrico de utilizao;
facilitar a consulta e reuso das implementales realizadas
Em java a documentao feita do seguinte modo:
De nica linha //
// Exibe apenas a linha como comentrio

De uma ou mais linhas /* */
/* comentrio que vai se estendendo at fechar com */
De documentao /** */
/** Indicam que o comentrio deve ser inserido em qualquer documentao gerada automaticamente pelo
javadoc . */


61
O javadoc uma documentao padro em arquivos HTML para programas Java. A
documentao em Java deve inserir diversos tags que permitem identificar informaes
sobre a classe. Algumas tag importantes so:
@author: descreve o autor da classe
@version: descreve o nmero da verso atual
@param: descreve os parmetros de um mtodo
@return: descreve o valor retornado por um mtodo
Alm de uma boa documentao, os programas devem conter uma identao, ou seja,
recuos com espaos em branco para facilitar a visualizao de sua estrutura.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 6.

6.13. EXERCCIOS PROPOSTOS
1. Um banco tem o nmero e o saldo da conta corrente de um cliente. Baseado nisto,
fornea uma soluo utilizando a metodologia proposta que permita a retirada e o
saque de dinheiro da conta, atualizando e informando o seu saldo.
2. Uma pessoa tem seu nome, cpf, rg e data de nascimento (dia, ms e ano). Descreva
uma soluo utilizando a metodologia proposta onde dada uma data qualquer (dia,
ms, ano), informe a idade da pessoa (em anos) nesta data.


7. INTERFACE GRFICA
Nesta seo so abordados os aspectos relacionados a criao de aplicaes grficas,
conhecidas inicialmente como AWT Abstract Windows Toolkit. Nas sucessivas verses
do Java, o AWT foi substitudo pelo Swing, uma biblioteca pertencente a biblioteca JFC-
Java Foundation Classes. Existem diversas APIs para construo de interfaces grficas
em Java. Entre elas destacam-se: AWT, SWT, Swing e JSF.
Pela caracterstica das aplicaes desenvolvidas na disciplina ser utilizada a API Swing.
A API Swing apresenta diversos componentes grficos para construo de interfaces com
o usurio em Java.
A diferena bsica entre as classes do Swing em relao s do pacote AWT est na
forma de denominar os componentes. Em Swing acrescenta-se a letra J no incio do
nome da classe de cada compontente. Asim, a classe Button (AWT) passou a denominar-
se JButton (Swing).
As aplicaes grficas so aquelas que possibilitam a criao de uma GUI (Graphical
User Interface Interafce Grfica do Usurio). Assim, ao desenvolver uma aplicao
dotada de uma GUI, necessrio definir quais componentes sero utilizados e qual a
disposio dos mesmos na janela.
O swing possui inmeras classes que podem ser utilizadas na construo de uma GUI.
Estes componentes pertencem ao pacote javax.swing e esto destacados na figura a
seguir:

FIGURA 8 - COMPONENTES DO PACOTE JAVAX.SWING
Todas as classes elaboradas nesta seo necessitam de diversas classes externas tanto
do pacote swing como do pacote AWT. Assim, via de regra, os programas tero pelo
menos trs linhas com a diretiva import apontando para as classes externas, conforme
as declaraes a seguir:
import java.awt.*; //permite a utilizao de classes do pacote AWT e de constantes numricas
import Java.awt.event.*;// usado para proces. de eventos como clique do mouse, Enter,etc
import javax.swing.*;// permite a utilizao de diversas classes do pacote swing.


A Figura 9 ilustra a estrutura de um cdigo mesclando recursos de AWT (bOld ou Button
na verso AWT) e swing (bNew ou Button na verso swing).

FIGURA 9 - EXEMPLO DE FRAME AWT X SWING.
Fonte: http://www-static.cc.gatech.edu/classes/cs4812_99_winter/
A Figura 10 apresenta o resultado da execuo do cdigo apresentado na Figura 9.

FIGURA 10 - EXEMPLO DE BOTO AWT E SWING.
Fonte: http://www-static.cc.gatech.edu/classes/cs4812_99_winter/


7.1. FRAMES
Um Frame uma classe do pacote AWT responsvel pela criao de janelas (similares
aquelas criadas no ambiente Windows).
A classe Frame gera uma janela com barra de ttulo, bordas e pode ter outros
componentes em seu interior(Figura 11).

FIGURA 11 - ARQUITETURA DE UM JFRAME.
A classe JRootPane um container que possui um JLayeredPane (contendo o Menu e o
ContentPane) e um componente GlassPane (transparente) onde so instalados novos
componentes. A Figura 12 ilustra esta estrutura..


FIGURA 12 - JROOTPANE.
O exemplo a seguir ilustra a criao de uma janela atravs da utilizao da classe JFrame
do pacote swing (Furgeri; 2006,pg 181).
import java.awt.*; //permite a utilizao de classes do pacote AWT e de constantes numricas
import Java.awt.event.*;// usado para proces. de eventos como clique do mouse, Enter,etc
import javax.swing.*;// permite a utilizao de diversas classes do pacote swing.

public InterfaceGUI() { //construtor da classe
this.setTitle("Titulo da janela");
setSize(400,50); //dimenses da janela: largura, comprimento em pixels
setLocation(150,150); //posio do canto esquerdo e topo da tela
setResizable(false); //a janela no pode ser redimensionada
}

void fecharJanela() { //mtodo que registra a operao de fechar a janela ao clicar sobre o "x".
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main (String args[]) { //mtodo para teste da janela
JFrame janela = new InterfaceGUI(); //cria um objeto do tipo Janela
janela.setVisible(true); //a janela criada e exibida na tela
}
}

A execuo do cdigo acima apresenta a janela da Figura 13.

FIGURA 13 - PRIMEIRA JANELA.

O mtodo setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) responsvel por
implementar o comportamento padro para a sada da aplicao quando o boto
pressionado. Outras constantes que podem ser utilizadas so (Furgeri; 2006,pg 181):
JFrame.HIDE_ON_CLOSE : oculta a janela quando fechada
JFrame.DO_NOTHING_ON_CLOSE : no faz nada, apenas desativa o boto de
encerramento;
JFrame.DISPOSE_ON_CLOSE: a janela desaparece e os recursos utilizados pela
classe so liberados.

Conforme Furgeri (2006,pg 178), os mtodos mais utilizados da classe JFrame so:
JFrame() : cria uma janela vazia
JFrame(String titulo): cria uma janela vazia com o ttulo definido pela String titulo
getTitle(): mtodo que retorna o ttulo da janela
isResizable(): mtodo que retorna se a janela ou no redimensionvel


66
setResizable(): mtodo que define se a janela ou no redimensionvel
setTitle(String titulo): mtodo que especifica o ttulo da janela

7.1.1. INCLUSO DE TEXTOS NA JANELA
Para a incluso de textos nos JFrames utiliza-se a classe JLabel. possvel controlar
vrias propriedades do texto a ser utilizado, tais como: alinhamento, tipo de letra,
tamanho, cor, etc.
import java.awt.*;
import javax.swing.*;

public class InterfaceGUILabel extends JFrame {
public InterfaceGUILabel() {
setTitle("Teste de insero de rtulos (labels) numa janela");
setSize(350,120);
setLocation(50,50);

//cria um objeto a ser utilizado como cor de fundo no padrao RGB.
//Os nmeros entre parentesis referem-se as tonalidades das cores vermelha,verde e azul.
//Os numeros para cada tonalidade podem variar de no mmino 0 ao mximo de 255 e
//sua mistura forma uma cor especfica.
Color corDeFundo = new Color(220,220,220);

getContentPane().setBackground(corDeFundo);//define a cor de fundo da janela no padro RGB

JLabel label1 = new JLabel(" Rtulo 1: ",JLabel.LEFT);//cria um rtulo alinhado a esquerda
label1.setForeground(Color.red); //define a cor do texto

JLabel label2 = new JLabel(" Rtulo 2:",JLabel.CENTER);
Font fonteDoTexto = new Font ("Arial",Font.ITALIC,20);
label2.setFont(fonteDoTexto);
label2.setForeground(Color.blue);//define a cor do texto

getContentPane().setLayout(new GridLayout(4,1)); //gerenciamento de layout
getContentPane().add(label1); //adiciona o label ao frame na primeira linha
//outra forma de utilizar o mtodo getContentPane()
Container panel = getContentPane();
panel.add(label2);//adiciona o label ao frame na segunda linha
}

void fecharJanela() { //mtodo que registra a operao de fechar a janela ao clicar sobre o "x".
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

A classe acima pode ser testada a partir do seguinte trecho de cdigo:
....
JFrame janela2 = new InterfaceGUILabel(); //cria um objeto do tipo Janela
janela2.setVisible(true); //a janela criada e exibida na tela
.....

A Figura 19 apresenta a janela construda a partir do cdigo acima.

FIGURA 14- JANELA COM RTULOS

ATENO: o mtodo getContentPane() retorna uma referncia ao objeto que controla a
janela que estamos construindo. Como a janela representada por um objeto, para que
seja possvel operar sobre o mesmo precisamos de uma referncia. Uma outra forma
mais explcita de realizar a mesma operao poderia ser descrita da seguinte forma:
....
Container panel = getContentPane();
panel.add(label2);//adiciona o label ao frame na segunda linha
.....

A classe Container pertence ao pacote AWT e representa um objeto que contm todos os
demais componentes de uma janela.
A ttulo de curiosidade, a janela da Figura 14 pode ser reconfigurada de forma a
apresentar uma aparncia diferente daquela padro do Windows. O trecho de cdigo
abaixo ilustra esta possibilidade:
....
JFrame janela3 = new InterfaceGUILabel(); //cria um objeto do tipo Janela
janela3.setUndecorated(true); //desenha um frame completamente sem bordas e botes
janela3.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);//altera o modo de exibio
janela3.setVisible(true); //a janela criada e exibida na tela
.....

A Figura 15 apresenta o resultado:

FIGURA 15- JANELA REDECORADA.
O mtodo setWindowDecorationStyle() define um novo estilo de janela. No exemplo,
JRootPane.FRAME define o estilo padro utilizado pela JVM com os botes de minimizar,
maximizar e encerrar.
Voc pode testar outras variaes que podem ser obtidas utilizando-se as constantes:
JRootPane.NONE;
JRootPane.COLOR_CHOOSER_DIALOG;
JRootPane.ERROR_DIALOG;
JRootPane.FILE_CHOOSER_DIALOG;
JRootPane.INFORMATION_DIALOG;
JRootPane.PLAIN_DIALOG;
JRootPane.QUESTION_DIALOG;
JRootPane.WARNING_DIALOG.

Conforme Furgeri (2006,pg 182), os mtodos mais utilizados da classe JLabel so:
JLabel() : cria um rtulo vazio, ou seja, sem texto;
JLabel(String txt) : cria um rtulo com o texto passado como parmetro;
JLabel(String txt, int alin): cria um rtulo com o alinhamento explcito;
JLabel(String txt, Image im): cria um rtulo com texto e imagem ;
JLabel(String txt, Image im, int alin): cria um rtulo com texto, imagem e alinhamento;
getText(): retorna o texto de um rtulo;
setText(): altera o contedo do texto de um rtulo.

O seguinte trecho de cdigo ilustra a utilizao da imagem ao lado do rtulo:
....
ImageIcon icone = new ImageIcon ("./imagem.gif");
JLabel label2 = new JLabel(" Rtulo 2:",icone,JLabel.CENTER);
.....

Isto resulta na seguinte janela:



69
FIGURA 16- RTULO COM IMAGEM


7.2. GERENCIADORES DE LAYOUT
Cada componente a ser visualizado nas janelas grficas, tais como: rtulos, botes,
caixas de texto, etc., devem ser inseridos em locais predefinidos na janela. Este espao
denominado: clula.
Para dividir uma janela em clulas, preciso utilizar um gerenciador de layout, ou seja,
um mtodo que controla a maneira como os componentes sero dispostos na janela. Esta
a funo do mtodo setLayout(). Este mtodo utilizado para definir como o frame ser
dividido. No caso do exemplo acima, esta sendo estabelecido que o frame ser composto
por uma grade de quatro linhas e uma coluna (4,1) conforme esboado abaixo:
Clula 1
Clula 2
Clula 3
Clula 4
Caso no tivesse sido definido o tipo de layout a ser utilizado pela janela, o sistema
consideraria que o frame contm somente uma clula.
Por padro, o Java vem com cinco Gerenciadores de Layout: BorderLayout, BoxLayout,
FlowLayout, GridBagLayout, GridLayout e um adicional, o CardLayout.
ATENO: O IDE NetBeans disponibiliza mais opes de Layout. Neste tutorial utilizam-
se o BorderLayout, o GridLayout e o FlowLayout.
O BorderLayout tenta organizar os objetos em um dentre cinco locais geogrficos,
representados por constantes na classe BorderLayout (NORTH, SOUTH, EAST,
WEST e CENTER), possivelmente com algum afastamento entre eles (NEIMEYER,
p.473).
O GridLayout organiza os componentes em linhas e colunas, como se fosse uma
tabela. Eles so adicionados da esquerda para direita e de cima para baixo em uma
grade.
J o FlowLayout organiza os componentes de forma similar aquela utilizada nos
editores de texto, ou seja, preenche a linha at que haja espao; ao terminar o espa,
muda para a linha seguinte.



70
7.3. EVENTOS
A interao do usurio do programa com as classes definidas pelo programador
normalmente implementada atravs de eventos.
Os eventos so blocos de comandos que associam a ocorrncia de alguma ao
realizada sobre o sistema a uma possvel reao.
Em uma interao baseada em eventos as aes s so realizadas a partir do instante
em que ocorre um evento.
Um evento pode estar associado a:
clique ou movimento do mouse;
acionamento do teclado;
operaes sobre janelas (abrir, fechar, criar, redimensionar, mover);
um temporizador (timer);
uma falha de hardware ou software.
etc.


7.3.1. INCLUSO DE BOTES NAS JANELAS
Para a incluso de botes nos frames, utilizada a classe JButton. Da mesma forma que
no JLabel, muitas propriedades podem ser manipuladas em JButton. O exemplo a seguir
ilustra a utilizao deste componente (Furgeri; 2006,pg 182):
import java.awt.*;
import javax.swing.*;
public class InterfaceGUIBotoes extends JFrame implements ActionListener {

JButton botao1, botao2; //declara 2 botoes
ImageIcon icone = new ImageIcon("./imagem.gif");

public InterfaceGUIBotoes() { //construtor
setTitle("Interface com botoes");
setSize(350, 100);
setLocation(50, 50);
getContentPane().setBackground(new Color(180, 180, 180));

botao1 = new JButton("Busca", icone);
botao1.setHorizontalTextPosition(AbstractButton.LEFT);
botao1.setBackground(new Color(100, 180, 180)); //cor de fundo
botao1.setForeground(Color.black); //cor do ttulo
botao1.setFont(new Font("Times", Font.BOLD, 20)); //define a fonte
botao1.setEnabled(true);
botao1.addActionListener( this);//esta classe dever tartar os eventos gerados nos botes
botao1.setToolTipText(" Pressione neste boto para realizar uma busca");//dica
botao1.setMnemonic(KeyEvent.VK_B);

botao2 = new JButton("Cancelar");
botao2.addActionListener(this); //esta classe dever tartar os eventos gerados nos botes
botao2.setMnemonic(KeyEvent.VK_C);
botao2.setToolTipText("Pressione aqui para cancelar");

getContentPane().setLayout(new FlowLayout()); //define um gerenciador de layout
getContentPane().add(botao1); //adiciona um boto a janela
getContentPane().add(botao2);//adiciona o outro boto a janela
}

//declara o mtodo tratador dos eventos associados aos botes
public void actionPerformed (ActionEvent e) {
if (e.getSource() == botao1) {
System.out.println("O boto 1 foi pressionado!");
}
else if (e.getSource() == botao2) {
System.out.println("O boto 2 foi pressionado!");
}
}

void fecharJanela() { //mtodo que registra a operao de fechar a janela ao clicar sobre o "x".
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

A execuo desta classe constri a janela apresentada na Figura 17.

FIGURA 17- JANELA COM 2 BOTES
Ao passar-se com o mouse sobre o boto Busca, surgir a dica cadastrada atravs do
mtodo botao1.setToolTipText(texto) conforme apresentado na Figura 18.


FIGURA 18- ATIVAO DA DICA DO BOTO
Para adicionar uma tecla de atalho ao boto, utiliza-se o mtodo setMnemonic() passando como parmetro uma letra
Da mesma forma que um objeto JLabel, um objeto do tipo boto pode ser inicializado de
trs maneiras:


72
Somente com um texto (o ttulo de um boto);
Com uma imagem ou,
Com ambos um texto e uma imagem.

Para definir a posio do texto do boto em relao imagem inserida no mesmo, utiliza-
se o mtodo setHorizontalTextPosition(. Esta propriedade deve ser definida quando o
boto possuir imagem e texto ao mesmo tempo. A conveno padro estabelece que a
imagem aparece ao lado esquerdo do texto, contudo, isto pode ser modificado pela
constante LEFT que far com que o texto aparea ao lado esquerdo da imagem. Da
mesma forma, pode-se alterar o alinhamento vertical do texto atravs do mtodo:
setVerticalTextPosition() utilizando as constantes TOP (topo) ou BOTTOM (abaixo)
(Furgeri; 2006,pg 184).
Alm destas, outra propriedade importante refere-se ao fato de que um boto pode ser
criado e no estar habilitado para o usurio clicar. Em algum momento futuro, em funo
da lgica da aplicao , o boto ter funo e, neste caso, ser habilitado. Para
implementar esta funcionalidade, utiliza-se o mtodo setEnabled(true/false).
Em qualquer aplicao em que as aes do usurio devem ser interpretadas pelo
programa quando o mesmo interagir com a janela (clicar em um boto, por exemplo),
necessria a implementao de uma interface padro do Java. No exemplo acima, foi
utilizada a interface ActionListener (existem outras interfaces disponveis que no sero
tratadas neste momento) atravs da declarao implements ActionListener (Furgeri;
2006,pg 183):
....
public class InterfaceGUIBotoes extends JFrame implements ActionListener {
.....
}
.....

Quando uma implementao de interface utilizada, torna-se obrigatrio inserir na
aplicao um ou vrios mtodos que realizaro o processamento dos eventos (seo
7.3.2). Ao contrrio de outras linguagens como Delphi e Visual Basic (entre outras), Java
permite definir mtodos receptores de eventos, independentemente do objeto que o
gerou. Em outras palavras, possvel utilizar um mesmo mtodo para controlar o clique
em todos os botes de uma mesma janela (Furgeri; 2006,pg 183).




73
7.3.2. TRATADORES DE EVENTOS

Conforme Gonalves (2007, p. 103), para o processamento dos eventos gerados na
interao com o usurio, o Java utiliza de um pacote chamado java.awt.event. Para os
outros tipos de eventos, que so especficos da biblioteca Swing, utilizado o pacote
java.swing.event.
As interaes dos usurios com os componentes de interface geram eventos. Segundo
Schvepe (2006, p. 17), o mecanismo de tratamento de eventos em Java formado por
trs partes:
a) o objeto origem, isto , o componente que gerou o evento;
b) o evento propriamente dito, ou seja, um objeto que encapsula as informaes
necessrias para processar o evento gerado;
c) o objeto ouvinte (listener), ou seja, o objeto que notificado pelo objeto origem
quando ocorre um evento e que usa a informao da notificao para responder ao
evento.
Em Java um evento denominado de Listener. Os listeners so classes criadas
especificamente para o tratamento de eventos. Um Listener um objeto que notificado
quando um evento acontece.
O processamento do evento delegado ao listener no aplicativo. Quando ocorre um
evento existe um mecanismo de aviso (dispatch) para os listeners daquele evento. O
dispatch nada mais do que uma delegao para que o listener cuide do tratamento de
evento (RUIZ, 2006).
No Erro! Fonte de referncia no encontrada. so descritos os principais eventos que podem
ocorrer em uma aplicao, e em que momento elas ocorrem.
ActionEvent ActionEvent Ocorre quando um boto pressionado, quando um item de lista recebe um
duplo clique ou quando um item de menu selecionado.
ComponentEvent Ocorre quando um componente ocultado, movido, redimensionado ou se torna
visvel.
FocusEvent Ocorre quando um componente recebe ou perde o foco do teclado.
ItemEvent Ocorre quando selecionado um item em uma lista de itens.
KeyEvent Ocorre quando se manipula o teclado.
MouseEvent Ocorre quando se manipula o mouse (mover, clicar, etc.).
WindowEvent Ocorre quando se manipula uma janela (mover, fechar, maximizar, etc.).
QUADRO 1- PRINCIPAIS EVENTOS
Os vrios tipos de listeners so especificados atravs de um uma interface. A Figura 19
exibida abaixo mostra uma hierarquia dos principais listeners do pacote java.awt.

Fonte: Fernandes (2002).
FIGURA 19 - HIERARQUIA DOS PRINCIPAIS LISTENERS.

Um dos mtodos, comuns a todos os objetos, chama-se actionPerformed. Como no h
um mtodo para cada evento dos objetos de uma janela, dentro do mtodo
actionPerformed necessrio identificar qual dos objetos responsvel pela gerao do
evento. A figura abaixo destaca esta situao:
....
public class InterfaceGUIBotoes extends JFrame implements ActionListener {
....
//declara o mtodo tratador dos eventos associados aos botes
public void actionPerformed (ActionEvent e) {
if (e.getSource() == botao1) {
System.out.println("O boto 1 foi pressionado!");
}
else if (e.getSource() == botao2) {
System.out.println("O boto 2 foi pressionado!");
}
}
.....

O mtodo e.getSource() retorna uma referncia ao objeto que gerou o evento. Atravs de
um comando IF, verifica-se se o evento foi produzido, por exemplo, pelo objeto boto1.
A figura abaixo caracteriza o funcionamento do mtodo actionPerformed:

FIGURA 20- MTODO ACTIONPERFORMED SENDO ATIVADO.
Conforme Furgeri (2006,pg 186), os mtodos mais utilizados da classe JButton so:
JButton() : cria um boto sem texto;
JButton(String texto): cria um boto com um rtulo;
JButton(String texto, Image img): cria um boto com rtulo e imagem;
getLabel(): retorna o rtulo do boto;
setLabel(String texto): altera o rtulo do boto;
setEnabled(boolean): define se o boto est habilitado (true) ou no (false);
setHoritontalTextPosition(): define o tipo de alinhamento horizontal (LEFT/RIGHT);
setMnemonic(..): define uma tecla que ser usada como acionadora do evento em
conjunto com a tecla ALT;
setToolTipText: possibilita atrelar uma mensagem de dica ao boto. Quando o ponteiro
do mouse estaciona sobre o boto, a mensagem exibida;
setVerticalTextPosition(): define o tipo de alinhamento vertical do texto em relao a
uma imagem (TOP/BOTTOM).

A Figura 21 ilustra a utilizao de cones associados a um boto e que alteram a imagem
em funo do mouse estar sobre o boto ou no (http://www-
static.cc.gatech.edu/classes/cs4812_99_winter/).

FIGURA 21 - BOTO COM CONE ROLLOVER.

7.3.3. INCLUSO DE CAIXAS DE TEXTO
A classe JTextField utilizada para inserir caixas de texto nos frames. Da mesma forma
que os componentes anteriores, h uma srie de propriedades cujos contedos podem
ser modificados.
O exemplo abaixo demonstra a utilizao dos vrios componentes a partir de uma
interface de uma calculadora.
import java.awt.*;
import javax.swing.*;
public class InterfaceGUICaixaTexto extends JFrame implements ActionListener {
JButton bt1, bt2, bt3, bt4, bt5;
JLabel lab1, lab2, lab3;
JTextField txt1, txt2, txt3;
public InterfaceGUICaixaTexto() {
setTitle("Calculadora");
setBounds(300, 50, 350, 90);
getContentPane().setBackground(new Color(150, 150, 150));
getContentPane().setLayout(new GridLayout(3, 4));

lab1 = new JLabel("Num.1"); lab1.setForeground(Color.black);
lab2 = new JLabel("Num.2"); lab2.setForeground(Color.black);
lab3 = new JLabel("Total"); lab3.setForeground(Color.red);
bt1 = new JButton("+"); bt1.addActionListener(this);
bt2 = new JButton("-"); bt2.addActionListener(this);
bt3 = new JButton("x"); bt3.addActionListener(this);
bt4 = new JButton("/"); bt4.addActionListener(this);
bt5 = new JButton("Limpar"); bt5.addActionListener(this);
bt5.setBackground(Color.black); bt5.setForeground(Color.white);



txt1 = new JTextField();
txt2 = new JTextField();
txt3 = new JTextField(); txt3.setEditable(false);
getContentPane().add(lab1); getContentPane().add(txt1); getContentPane().add(bt1);
getContentPane().add(bt2);
getContentPane().add(lab2); getContentPane().add(txt2); getContentPane().add(bt3);
getContentPane().add(bt4);
getContentPane().add(lab3); getContentPane().add(txt3); getContentPane().add(bt5);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == bt5) {
txt1.setText("0");
txt2.setText("0");
txt3.setText("");
return;
}
float n1 = 0, n2 = 0, result = 0;

try {
n1 = Float.parseFloat(txt1.getText()); n2 = Float.parseFloat(txt2.getText());
} catch (NumberFormatException erro) {
txt3.setText("Erro de formato");
return;
}

if (e.getSource() == bt1) {
result = n1 + n2;
} else if (e.getSource() == bt2) {
result = n1 - n2;
} else if (e.getSource() == bt3) {
result = n1 * n2;
} else if (e.getSource() == bt4) {
result = n1 / n2;
}
txt3.setText("" + result);
}

void fecharJanela() { //mtodo que registra a operao de fechar a janela ao clicar sobre o "x".
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

A Figura 22 ilustra o resultado da execuo do cdigo acima.

FIGURA 22- CALCULADORA

7.4. CRIANDO UM PROJETO COM INTERFACE GRFICA USANDO A
FERRAMENTA DO NETBEANS
Esta seo visa fornecer uma simples introduo ao uso do IDE NetBeans, sendo guiado
atravs de uma aplicao Java com interface de interao com o usurio.
Para criarmos um projeto na IDE os seguintes passo devero ser seguidos:
d) inicie o NetBeans;
e) no IDE, escolha <Arquivo > < Novo Projeto>, como mostrado na Figura 23;


FIGURA 23 - CRIANDO UM PROJETO.

f) na janela Novo Projeto, expanda a categoria Geral e selecione Aplicao Java
como mostrado na Figura 24;


FIGURA 24 - JANELA "NOVO PROJETO".

g) na pgina apresentada na Figura 25, em Nome e Localizao faa o seguinte:
a. - no Campo Nome do Projeto, escreva Computador,
b. - desmarque a opo Criar Classe Principal,
c. - clique em Finalizar;


FIGURA 25 - DETALHES DO PROJETO.

h) expanda o item Pacotes de Cdigo-Fonte(Figura 26). Clique com o boto direito
do mouse em <pacote padro> e selecione <Novo > < Pacote Java>;


FIGURA 26 SELECIONANDO CRIAR UM NOVO PACOTE.

i) na guia Nome e Localizao(Figura 27), digite no campo Nome do Pacote o
nome desejado, por exemplo, Interface e clique em Finalizar. Voc poder
observar que o pacote Interface ficou subordinado aos Pacotes de Cdigo-
Fonte;


FIGURA 27 - CRIANDO UM NOVO PACOTE.

j) agora vamos criar a nossa primeira janela, a qual ter por finalidade simular um
computador, com teclado e monitor. Clique com o boto direto do mouse em
<Interface > e selecione <Novo > e novamente Formulrio JFrame (Figura
28);

FIGURA 28 - CRIANDO UM FORMULRIO JFRAME.

k) digite um nome para o Formulrio, por exemplo, InputOutput e clique no boto
Finalizar(Figura 29);


FIGURA 29 - FINALIZANDO A CRIAO DE UM FORMULRIO JFRAME.

l) pronto, seu formulrio foi criado (Figura 30). Apenas necessrio incluir os
componentes para que o formulrio fique semelhante ao que conhecemos como
um computador. Mas antes de comear a incluir os componentes, vamos abrir um
parntese e falar sobre o Gerenciador de Layout (consulte a seo: 0).


FIGURA 30 - JFRAME CRIADO.

m) continuando com a execuo do tutorial, vamos adicionar no JFrame o
Gerenciador de Layout BorderLayout. Para isto, basta clicar com o boto direito
do mouse em <JFrame > e < Definir Layout > e finalmente <Border
Layout>(Figura 31);


FIGURA 31 - DEFININDO GERENCIADOR DE LAYOUT: BORDERLAYOUT.

n) na Paleta, esto os componentes que podem ser utilizados no JFrame. Para que
eles sejam apenas adicionados, basta clicar uma vez sobre o componente
desejado e no desenho do JFrame (Figura 32);


FIGURA 32 - PALETA DE COMPONENTES.
o) para criar o nosso simulador de um computador, colocaremos trs JPanel, dois
JScrollPane, um JTextArea, um JTextField e dois JLabel (Figura 33). Para tanto
execute os seguintes passos:

FIGURA 33 - PALETA DE CONFIGURAO DE UM JPANEL.

a. colocar no JFrame o JPanel1, o JPanel2 e o JPanel3. O JPanel1 dever
ficar alinhado a Esquerda. Para isto, v s propriedades do componente,
procure o item Direo e escolha West. Faa o mesmo procedimento com
o JPanel2 (configurando-o para East) e o JPanel3 (configurando-o para
North),
b. na propriedade preferredSize coloque para o JPanel1 e o JPanel2 o valor
[200,100] e para o JPanel3 [150,30],
c. desmarque a opo enabled do JPanel2,
d. no JPanel3, use o Gerenciador de Layout GridLayout,
e. agora adicionar no JPanel1 um JScrollPane. Dentro do JScrollPane
adicionar um JTextField,
f. no JPanel2, adicione um JScrollPane, depois um JTextArea. Desmarque a
opo editable nas propriedades do JTextArea,
g. no JPanel3, adicione dois JLabel. No JLabel da esquerda coloque a
propriedade text como Teclado e no JLabel da direita como Monitor,
conforme a imagem representada naFigura 34;


FIGURA 34 - INSERINDO TRS COMPONENTES JPANEL AO JFRAME.

p) a tela de simulao de um computador j est criada. Agora basta programar um
evento que faa com que tudo o que for digitado no Teclado seja propagado para
o Monitor aps pressionada a tecla <ENTER>. Para isso, clique com o boto
direito do mouse em <jTextField1> <Eventos> <Action> <actionPerformed>.
Uma janela que contm o cdigo fonte ser aberta e l voc poder programar o
evento. A Figura 35 apresenta o corpo do mtodo para fazer com que o texto
digitado no Teclado seja mostrado no Monitor, aps um <ENTER>;


FIGURA 35 - PROGRAMANDO UM TRATADOR DE EVENTO.

q) no mtodo construtor da classe InputOutput vamos definir um tamanho para o
frame atravs do mtodo setSize() e tambm no permitir que o tamanho do frame
seja modificado atravs do mtodo setResizable(). O cdigo fonte do mtodo
apresentado na Figura 36;


FIGURA 36 - MTODO CONSTRUTOR DA CLASSE.

r) agora para executar e ver o resultado (Figura 37), salve o projeto e clique no
Menu <Executar> <Executar Projeto Principal> ou ento utilize o atalho F6 no
teclado. Agora seu projeto Computador est pronto.


FIGURA 37 - PROJETO COMPLETO.




85

8. INTEGRANDO O FURBOT COM INTERFACE GRFICA
Esta seo descreve como o Furbot pode ser integrado a um ambiente de interface
grfica.
At agora voc precisava definir um modelo de mundo em XML para que o Furbot
pudesse operar. Existe uma outra forma de faz-lo utilizando componentes de interface
grfica.
A nova arquitetura do Furbot que suporta este recurso detalhada a seguir:
import br.furb.furbot.Furbot;

public class ExemploDeFurbot extends Furbot {

public ExemploDeFurbot () {
//no construtor do furbot, voc deve estabelecer os parmetros gerais de funcionamento do mesmo.
this.setTempoEspera(20); //estabelece a velocidade de execuo do furbot
this.desbloquear(); // estabelece que o mesmo est desbloqueado
}

public void inteligencia() throws Exception {
// faz o furbot andar pelo mundo
......
}
........

}
O exemplo acima implementa a funcionalidade do rob. Voc pode utilizar todos os
recursos estudados at agora. A principal diferena est em que voc deve acrescentar
na funcionalidade do construtor a configurao de funcionamento do furbot (que
anteriormente era recuperada a partir do arquivo XML).
O quadro a seguir apresenta uma estrutura geral da tela grfica a partir da qual so
criados o mundo sobre o qual o furbot ir se movimentar e a prpria instancia de furbot
(definida no quadro acima).
Exemplos:
import br.furb.furbot.MundoFurbot; // classe que viabiliza a interao com a interface com o usurio
import br.furb.furbot.suporte.TamanhoCelula; //classe que estabelece o tamanho da clula

public class Apresentacao extends javax.swing.JFrame {
//cria um mundo de Furbot com 8 x 5 celulas e tamanho da celula pequena
private MundoFurbot mundo = new MundoFurbot(8,5,TamanhoCelula.Pequena);
private ExemploDeFurbot robo; //classe declarada no quadro anterior






86

// cria um JFrame - ver seo 7.
public Apresentacao() {
initComponents();
setLocationRelativeTo(null);
jScrollPane1.setViewportView(mundo);
robo = new ExemploDeFurbot ();
mundo.addObjeto(robo,0,0);

//a seguir indica ao mundo quais so os botes da interface grafica que comandam
// o inicio e fim das operaes ( Esta indicao opcional)
mundo.setBotaoExecutar(jButton2);
mundo.setBotaoParar(jButton3);

// Indica ao mundo qual a area de texto (JTextArea) que exibira o que o rob
// falar (metodo diga)
mundo.setConsole(jTextArea1);
}

// o cdigo abaixo gerado pelo Netbeans
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jLabel2 = new javax.swing.JLabel();
jComboBox1 = new javax.swing.JComboBox();

.
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

.

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
mundo.parar();
}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
robo.setFazCalculo(jComboBox1.getSelectedIndex());
robo.mudarPosicao(0, 0);
jTextArea1.setText("");
mundo.executar();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
InteiroPositivo ip = new InteiroPositivo();
ip.setValor(Integer.parseInt(jTextField1.getText()));
mundo.addObjeto(ip);
jTextField1.selectAll();
jTextField1.requestFocus();
}



87
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Apresentacao().setVisible(true);
}
});
}

}
O exemplo acima implementa a funcionalidade do rob. Voce pode utilizar todos os
recursos estudados at agora. A principal diferena est em que voc deve acrescentar
na funcionalidade do construtor a configurao de funcionamento do furbot (que
anteriormente era recuperada a partir do arquivo XML).





88

9. ESTRUTURAS DE CONTROLE EM NVEL DE INSTRUO
As estruturas de controle em nvel de instruo so (entre parnteses est sua
representao em Java):
SELEO: executam instrues de acordo com uma determinada condio.
o simples: se (if)
o encadeada: se-ento (if else)
o mltipla: escolha (switch case)
REPETIO: executam instrues em um nmero repetido de vezes. Tambm so
chamadas de laos ou loop.
o para-faa (for)
o enquanto-faa (while / do while)

9.1. SELEAO SIMPLES (IF)
As estruturas de seleo simples apresentam apenas uma condio.
Exemplos:
Se est chovendo ento
abra o guarda-chuva

Se a biblioteca est aberta ento
empreste o livre

Se tem acar ento
adoce a limonada

Se no est frio ento
tire o casaco
Sintaxe em Portugus Estruturado:
se <expresso-lgica> ento
<seqncia-de-comandos>
fimse
Sintaxe em Java:
if (expresso-lgica) {
<seqncia-de-comandos em Java>
}
Em Java, se houver apenas um comando a ser executado dentro da estrutura de controle,
as chaves podem ser dispensadas. No caso de mais de um comando, elas so
obrigatrias.
Exemplo simplificado para verificar se um aluno est aprovado em uma disciplina:


89
Em Portugus Estruturado:
se mdia do aluno >= 6.0 ento
situao do aluno = Aprovado
fimse

Em Java:
if (aluno.media >= 6)
aluno.situacao = Aprovado;
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec,
2006. 136 p, il. pg. 19.

9.2. SELEO ENCADEADA (IF ELSE)
As estruturas de seleo encadeadas apresentam alternativas de ao diferentes de
acordo com a situao avaliada.
Exemplos:
Se est chovendo ento
vou de carro
seno
vou de nibus

Se gosto de limonada com acar ento
coloco acar na limonada
seno
se gosto da limonada com adoante ento
coloco adoante na limonada

Sintaxe em Portugus Estruturado
se <expresso-lgica> ento
<seqncia-de-comandos-expresso-verdadeira>
seno
<seqncia-de-comandos-expresso-falsa>
fimse
Sintaxe em Java
if (expresso-lgica) {
<seqncia-de-comandos-expresso-verdadeira>
} else {
<seqncia-de-comandos-expresso-falsa>
}

Um exemplo simplificado para informar se um aluno est aprovado ou reprovado em uma
disciplina representado no quadro a seguir:



90
Em Portugus Estruturado:
se nota do aluno >= 6.0 entao
situao do aluno = aprovado
seno
situao do aluno = reprovado
fimse

Em Java:
if (aluno.nota >= 6)
aluno.situacao = aprovado;
else
aluno.situacao = reprovado;
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 19.

9.3. SELEO COMPOSTA
As estruturas de seleo compostas apresentam mais de uma condio e podem ser
classificadas em : simples ou encadeadas.
Devem ser utilizadas com os operadores lgicos E ou OU.
Exemplos:
Se est com sede e tem dinheiro ento
compre uma garrafa de gua

Se o computador est ligado e tem browser ento
acesse a internet

Se est calor ou a gua est quente ento
mergulhe na piscina

Se est chovendo e est fazendo frio e voc est em casa ento
coma uma pipoca
tome um ch quente

Se final de semana e o tempo est bom ento
vou praia
Seno
fico em casa

Um exemplo de Sintaxe em Portugus Estruturado usando o operador lgico E
apresentado no quadro a seguir.
se expresso-lgica1 e expresso-lgica2 ento
<seqncia-de-comandos-expresso-verdadeira>
seno
<seqncia-de-comandos-expresso-falsa>
fimse


91
Em Java o operador lgico E representado por && e o operador lgico OU
representado por ||.
Exemplo de Sintaxe em Java usando o operador lgico E.
if (expresso-lgica1 && expresso-lgica2) {
<seqncia-de-comandos-expresso-verdadeira>
} else {
<seqncia-de-comandos-expresso-falsa>
}
Exemplo simplificado de um algoritmo para verificar se uma pessoa pode nadar em uma
piscina:
Exemplo em Portugus Estruturado:
se (temperatura da gua > 25) e (gua est limpa) ento
pessoa pode nadar
fimse

Exemplo em Java:
if (agua.temperatura>25) && (agua.situacao==L)
pessoa.nadar = true;
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 19.

9.4. SELEO MLTIPLA (SWITCH - CASE)
As estruturas de seleo mltipla permitem avaliar uma entre diversas alternativas.
Escolha o tempo
sol : vou praia
chuva : fico em casa

Escolha a cor
verde : tenho esperana
vermelho : estou apaixonado
azul : est tudo tranquilo
Sintaxe em Portugus Estruturado:
escolha <expresso-de-seleo>
opo 1 : <seqncia-de-comandos-1>
opo 2 : <seqncia-de-comandos-2>
.
.
seno
<seqncia-de-comandos-extra>
fimescolha
A opo seno indica que nenhuma das opes anteriores foi validada.
A sintaxe em Java :


92
switch <expresso> {
case 1 : <seqncia-de-comandos-1>
break;
case 2 : <seqncia-de-comandos-2>
break;
.
.
default : <seqncia-de-comandos-extra>
}
Em Java a expresso s pode ter como resultado um valor numrico inteiro, caractere ou
enumerao. Em Java a opo seno denominada de default e opcional. O break
utilizado para finalizar o switch e deve ser usado em cada condio.
Exemplo simplificado de um algoritmo para escrever por extenso o sexo de uma pessoa
dada a digitao de F ou M:
Exemplo em Portugus Estruturado:
escolha sexo da pessoa
"F" : escreva ("Feminino")
"M" : escreva ("Masculino")
seno escreva ("Sexo no informado")
fimescolha

Exemplo em Java:
switch (pessoa.sexo) {
case 'F' : System.out.println("Feminino");
break;
case 'M' : System.out.println("Masculino");
break;
default : System.out.println("No Informado");
}
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec,
2006. 136 p, il. pg. 20.
9.5. ATRIBUIO CONDICIONAL
Existem situaes em que se utiliza a estrutura encadeada, apenas para atribuir valor a
uma varivel. Nestes casos pode-se utilizar o operador ?.
Quando o resultado da expresso lgica for verdadeira a varivel representada pelo
identificador receber o resultado da expresso_verdadeira. caso contrrio receber o
resultado da expresso_falsa.
Um exemplo para somar ou diminuir um valor a uma varivel se ele for par ou mpar
apresentado a seguir:



93
Exemplo em Portugus Estruturado:
num = (x par)? x + 1 : x - 1

Exemplo em Java:
int num = (x % 2 == 0) ? x++ : x--;
No exemplo se o valor x for par num receber o valor de x acrescido de uma unidade.
Caso contrrio receber o valor de x diminudo de uma unidade.
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 15.

9.5.1. EXERCCIOS PROPOSTOS:
1. Para a pessoa definida no exerccio da lista anterior foram estabelecidos
novos atributos: sexo, altura e peso. Assim, descreva uma soluo baseada
na metodologia para calcular o IMC (ndice de Massa Corporal) da pessoa.
O IMC indica se um adulto est acima do peso, se est obeso ou abaixo do
peso ideal considerado saudvel. A frmula para calcular o ndice de Massa
Corporal : IMC = peso / (altura)
2
. Considerando a tabela abaixo, informe o
IMC da pessoa.

Condio IMC em Mulheres IMC em Homens
abaixo do peso < 19,1 < 20,7
no peso normal 19,1 - 25,8 20,7 - 26,4
acima do peso ideal 25,9 - 32,3 26,5 - 31,1
obeso > 32,3 > 31,1
2. Para a conta corrente criada no exerccio da lista anterior, o banco solicitou
a incluso de uma rotina para informar se o saldo do cliente credor ou
devedor. Baseado nisto, construa este mtodo e a cada atualizao do saldo
informe se o cliente credor ou devedor.
3. Um pai decidiu ensinar seu filho a fazer as operaes aritmticas
elementares (+, -, *, /). Para isto, ele pedia que o filho fizesse as
contas mo e depois conferisse em um programa que ele pediu para que
voc desenvolvesse no computador. Baseado nisto, construa uma soluo
baseada na metodologia proposta onde dados dois valores e o operador,
informe o resultado da operao. A classe a ser criada deve ter o nome de
Matemtica.
4. Na classe Matemtica definida no exerccio 3, insira mtodos para: informar
o maior entre dois nmeros e informar o menor entre dois nmeros. Usando
apenas estes mtodos criados, informe o maior e o menor valor entre trs
nmeros.


94
5. Um matemtico deseja verificar se determinados valores podem ser lados
de um tringulo. Em caso afirmativo, ele deseja saber qual o tipo do
tringulo: eqiltero (todos os lados iguais), issceles (pelo menos dois
lados iguais), ou escaleno (nenhum lado igual)). Ele lembra que para ser
um tringulo, a soma do valor de dois lados tem que ser maior que a do
terceiro lado.
6. Na classe criada no exerccio da lista anterior insira um mtodo para
informar se o tringulo ou no retngulo (h2= a2 + b2). Considere
tambm a possibilidade de no ser tringulo, considerando as mesmas
condies apresentadas naquele exerccio.
7. Considerando duas pessoas da classe Pessoa criada no exerccio da lista
anterior, informe a mais alta.

9.6. PARA FAA (FOR)
As estruturas de repetio com contador permitem a execuo de um grupo de comandos
num determinado nmero conhecido de vezes.
Exemplos:
Para 10 carros faa
lave o carro

Para 5 bombons faa
coma o bombom

Para 40 alunos faa
calcule a mdia do aluno
Sintaxe
Em Portugus Estruturado
Para contador de inicio a fim faa
Bloco de comandos
Fim para

Em Java
for (expresso 1; expresso 2; expresso 3)
bloco de comandos ;
IMPORTANTE:
expresso 1: a expresso que define o valor de inicializao de uma varivel
de controle. Esta expresso uma instruo de atribuio executada uma nica
vez antes de o lao ser iniciado;
expresso 2: a expresso que define a condio de teste da varivel de
controle. Ela avaliada como verdadeira ou falsa no incio de cada execuo do
lao. Se a expresso for verdadeira, o bloco de comandos do lao executado.
Se for falsa o lao encerrado e o controle passa para a instruo seguinte;
expresso 3: a expresso que define a forma de atualizao da varivel de
controle a cada vez que o lao for repetido. Ela executada ao final de cada
repetio do lao.


95
Exemplo simplificado para ler e escrever 10 nmeros:
Em Portugus Estruturado
para contador de 1 a 10 faca
leia (numero)
escreva (numero)
fimpara

Em Java
//declara a varivel para ler e escrever o nmero
int numero;
//inicializa um objeto para leitura
Scanner sc = new Scanner(System.in);
//faz a repetio
for (int cont = 1; cont <=10; cont++) {
System.out.println("Digite um nmero");
//l o nmero do teclado
numero = sc.nextInt();
//escreve o nmero no monitor de vdeo
System.out.println(numero);
}
Leia mais em:
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pg. 17.

9.7. ENQUANTO FAA (WHILE / DO - WHILE)
As estruturas de repetio condicionais avaliam uma determinada condio lgica para
fazer a execuo do lao de repetio. Uma condio sempre ser avaliada como
verdadeira ou falsa.
A estrutura condicional mais comum o enquanto-faa. Esta estrutura executa um
conjunto de instrues enquanto a expresso lgica for avaliada como verdadeira.A
condio pode estar no incio ou no final do bloco de execuo.
Exemplos:
Enquanto tem carros para lavar faa
lave o carro

Enquanto tem bombons para comer faa
coma o bombom

Enquanto no encontrei o livro na biblioteca faa
procure em outra estante

Faa
calcule a mdia do aluno
Enquanto tem alunos



96
A sintaxe :
Em Portugus Estruturado
enquanto <expresso-lgica> faa
<seqncia-de-comandos>
fim enquanto
ou
faa
<seqncia-de-comandos>
enquanto <expresso-lgica>

Em Java
while (expresso-lgica) {
<seqncia-de-comandos>
}
ou
do {
<seqncia-de-comandos>
} while (expresso-lgica);
IMPORTANTE:
expresso-lgica: a expresso avaliada antes de cada repetio do lao. Quando
seu resultado for VERDADEIRO, <seqncia-de-comandos> executada. Na
expresso lgica podem ser usados os operadores lgicos NAO, E ou OU.
Exemplo simplificado para ler e escrever um nmero inteiro:
Em Portugus Estruturado
leia(numero)
enquanto numero <> 0 faca
escreva (numero)
leia (numero)
fimenquanto

Em Java
//declara a varivel para ler e escrever o nmero
int numero;
//inicializa um objeto para leitura
Scanner sc = new Scanner(System.in);
//l o nmero do teclado
System.out.println("Digite um nmero");
numero = sc.nextInt();
//enquanto o nmero digitado no for zero continua a repetio
while (numero <> 0) {
//escreve o nmero no monitor de vdeo
System.out.println(numero);
//l outro nmero do teclado
System.out.println("Digite um nmero");
numero = sc.nextInt();
}
No exemplo apresentado pode ser observado o uso de um flag (0). O flag indica o fim de
um determinado conjunto de dados.
Leia mais em:


97
JANDL JNIOR, Peter. Java 5: guia de consulta rpida. So Paulo : Novatec, 2006. 136
p, il. pgs. 18 e 19.
9.7.1. EXERCCIOS PROPOSTOS:
1. Um matemtico est necessitando de vrias funes relacionadas a um nmero inteiro
positivo. Suponha a definio de uma classe InteiroPositivo que apresenta o seguinte
atributo: um nmero X. Implemente os seguintes mtodos:
a) um mtodo setValor, que realiza a consistncia necessria para garantir que X
seja um inteiro positivo;
b) um mtodo para retornar o nmero X multiplicado por outro objeto de
InteiroPositivo (este outro objeto o objeto encontrado imediatamente antes
deste);
c) um mtodo para definir o fatorial de X;
Fatorial (X) = X * (X-1) * (X-2) * (X-3) * * 2 * 1
d) um mtodo para imprimir a srie de Fibonacci formada por X elementos;
Fibonacci = 1, 1, 2, 3, 5, 8, 13,
e) um mtodo para imprimir os divisores inteiros de X e a quantidade de divisores.
Exemplo: para o nmero 12, os divisores so 1, 2, 3, 4, 6, 12 e a quantidade de
divisores 6;
f) um mtodo para retornar o valor de H, baseado na frmula:
X
1
...
4
1
3
1

2
1
1 = H + + + + + , tambm expresso por

=
X
d
d
1
1

g) um mtodo para retornar o valor de I, baseado na frmula:
1
X
2
1 - X
...
2 X
3
1 - X
2

X
1
= I + + +

+ +
h) um mtodo para retornar o valor de S, baseado na frmula:
20!
x
! 19
x
! 18
x
! 17
x
! 16
x
...
! 5
x
! 4
x
3!
x

2!
x
x = S
2 3 4 5 16 17 18 19
20
+ + + + + + + + + +
i) um mtodo para retornar o valor de P, baseado na frmula:
! 12
6
! 10
5
! 8
4
! 6
3
4!
2
-
2!
1
= P + + , considerando X termos.
Voc dever desenvolver uma interface ao usurio que permita digitar o valor desejado e
criar um objeto de InteiroPositivo, colocando-o numa das clulas do mundo
(aleatoriamente). Dica: implemente a classe InteiroPositivo como subclasse de
br.furb.furbot.Numero.
O matemtico (rob) deve percorrer o mundo e ao encontrar um objeto deve passar
todas as mensagens de InteiroPositivo, exibindo seus resultados. Ele continua seu
caminho at que todos os objetos tenham sido encontrados.
2. Variao sobre o exerccio anterior: Alm da funcionalidade j desenvolvida no
exerccio 1, agora o matemtico tambm tem a possibilidade de no mais passar


98
todas as mensagens, mas sim sortear uma delas e exibir o resultado, a cada objeto
encontrado.

3. Variao sobre o exerccio anterior: Alm da funcionalidade acrescida no exerccio 2, o
matemtico poder tambm apenas passar uma mensagem selecionada pelo
usurio. A seleo ocorre atravs da interface grfica, antes de comear a execuo.

4. Digitar uma frase na janela, separar em palavras, distribuir
aleatoriamente no mundo e fazer o rob percorrer e remontar a
frase. Crie uma caixa de texto (para digitao da frase), um boto
(para separar a frase e distribuir as palavras no mundo), alm dos
botes de executar, parar e da console. O rob deve falar a frase inteira na console no
final da execuo.

5. Pegar 5 palavras (de no mnimo 3 letras e no mximo 10), em um mundo 15x15 e
montar uma palavra cruzada. Crie uma janela com cinco caixas de texto (para digitar
cada uma das palavras) e um boto (para distribu-las no mundo). A palavra deve ser
desmontada em letras, para em seguida distribuir sequencialmente essas letras no
mundo. Se a palavra horizontal ou vertical, quem determina o seu algoritmo.
Porm, as cinco palavras devem se cruzar, ou seja, no pode existir uma palavra rf.

6. Considere uma classe chamada TemperaturasDaSemana, a qual armazena as
temperaturas mxima e mnima de cada um dos sete dias da semana. Sua aplicao
deve permitir entrar com as temperaturas e depois oferecer ao usurio a possibilidade
de consultar:
a) a temperatura mdia de um determinado dia;
b) a temperatura mxima ocorrida na semana, indicando o dia;
c) a temperatura mnima ocorrida na semana, indicando o dia.

7. Considere uma matriz quadrada de inteiros de ordem N (visualizada no mundo). Crie
um boto para popular esse mundo com NxN objetos Numero, com valores aleatrios.
Crie uma classe de rob que passeie pelo mundo, e cada Numero deve ser
armazenado numa matriz de inteiros. Na janela adicione um boto para executar e
parar, e dois botes que:
a) pergunta ao rob a soma dos elementos da diagonal principal da matriz e mostra
numa JOptionPane o resultado. O clculo no pode ser feito previamente;
b) [ergunta ao rob o menor valor par da matriz e mostra numa JOptionPane o
resultado.
Adicione duas caixas de texto para solicitar as coordenadas x e y ao usurio e um
boto que pergunta ao rob valor do elemento [x , y] digitado pelo usurio.
Adicione um ltimo boto para que o rob volte clula [0,0], ele monte uma nova
matriz de ordem N, porm transposta, e altere os valores dos objetos Numero para
refletir essa nova matriz.
8. Voc est trabalhando em um projeto de automao de uma estao ferroviria. Uma
das classes identificadas PassageirosHora, que foi definida como sendo uma matriz
Ex.: ISTO UM TESTE
ISTO 1
2


99
tridimensional de inteiros que em cada posio guarda a quantidade de passageiros
transportados por hora, de determinado dia, de determinado ms. Assim a matriz de
ordem 12 meses x 30 dias x 24 horas. Crie esta classe, que deve ter as seguintes
funcionalidades:
FUNCIONALIDADE Cdigo de teste
PassageirosHora ph = new PassageirosHora();
a) adicione mais um passageiro em
determinada hora;


ph.adiciona(1,1,13); // 13 horas de 1
o
de
Janeiro
b) retorne a quantidade de passageiros
transportados em determinado dia;

int qtde = ph.quantosPassageiros(25,12); //
Natal
c) retorne o ms em que houve o menor
fluxo de passageiros.

int ms = ph.mesMenorFluxo();
d) retorne o dia, ms e hora em que
houve a maior quantidade
transportada de passageiros;
int[ ] momento = ph.picoTransporte();

9. Na classe Matemtica, criada no exerccio anterior insira um mtodo para informar o
Mximo Divisor Comum entre dois nmeros.



10. RECURSOS NO FURBOT PARA DESENVOLVIMENTO DE JOGOS
Esta seo apresenta os recursos que o Furbot disponvel para desenvolver jogos
simples. Todos os recursos aqui apresentados esto disponveis a partir da verso 0.15.
A Figura 38 apresenta um exemplo de jogo do tipo PacMan desenvolvido utilizando os
recursos do FURBOT.

FIGURA 38 - MODELO DE MUNDO DO JOGO PACMAN.
10.1. USANDO O TECLADO
Atravs do mtodo getUltimaTeclaPress() possvel obter do sistema o cdigo da ltima
tecla pressionada. Cada tecla corresponde a um cdigo diferente. Para voc descobrir os
cdigos das teclas que pretende usar no jogo, construa as seguintes linhas de cdigo em
um rob do Furbot:
while (true) {
int tecla = getUltimaTeclaPress();
diga(tecla);
}

Ao executar o rob, voc vai reparar que o sistema vai imprimindo o cdigo 0 enquanto
nenhuma tecla for pressionada. Quando pressionar uma tecla o cdigo dela mostrado
na console, e em seguida volta a imprimir o cdigo 0. Esse exemplo mostra que ao
chamar o mtodo ele tira o cdigo que estava guardado, ou seja, se chamar duas vezes


101
seguidas, na segunda vez provavelmente no vir o mesmo cdigo, e mais provvel
ainda, deve vir o cdigo 0.
J existem algumas teclas mapeadas no Furbot: TECLACIMA, TECLABAIXO,
TECLAESQUERDA, TECLADIREITA e TECLAESPACO. Com isso, o cdigo retornado
pelo mtodo getUltimaTeclaPress() pode ser comparado com essas constantes. Por
exemplo:
while (true) {
int tecla = getUltimaTeclaPress();
if (tecla == TECLACIMA) {
andarAcima();
} else {
if (tecla == TECLABAIXO) {
andarAbaixo();
}
}
diga(tecla);
}

10.2. ADICIONANDO NOVOS OBJETOS AO MUNDO E REMOVENDO
OBJETOS DO MUNDO
At agora voc viu que a nica forma de adicionar objetos no mundo mexendo no XML.
Existe outra forma que atravs de mtodos do Furbot:
adicionarObjetoNoMundo(ObjetoDoMundo,Direcao) ou
adicionarObjetoNoMundoXY(ObjetoDoMundo, int, int). A utilizao desses mtodos
muito til quando o rob precisa disparar um tiro, por exemplo.
O cdigo abaixo apresenta o uso desses dois mtodos: cria dois novos Aliens (observe a
sintaxe usando a palavra reservada new) e adiciona-os no Mundo.
Alien alien1 = new Alien();
adicionarObjetoNoMundo(alien1, DIREITA);
Alien alien2 = new Alien();
adicionarObjetoNoMundoXY(alien2, 3, 4); // x = 3, y = 4

Ateno: a execuo do sistema pra se tentar incluir o mesmo objeto duas vezes. Por
exemplo, o cdigo abaixo faz parar o sistema.

Alien alien1 = new Alien();
adicionarObjetoNoMundo(alien1, DIREITA);
adicionarObjetoNoMundo(alien1, ESQUERDA);
adicionarObjetoNoMundoXY(alien1, 3, 4); // x = 3, y = 4


102
Tambm possvel remover um objeto do mundo (esse um recurso muito til quando
algum elemento precisa sumir). O cdigo abaixo apresenta o exemplo de como remover
um objeto que o rob encontrou.

ObjetoDoMundo obj = getObjeto(AQUIMESMO);
removerObjetoDoMundo(obj);


10.3. FAZENDO SEUS PRPRIOS TIPOS DE OBJETOS DO MUNDO
O Furbot tem uma grande flexibilidade que permite que voc faa seus prprios tipos de
objetos do mundo, permitindo atribuir uma imagem a ele e programar um comportamento
para esse objeto. Assim como at agora voc programava cada novo rob atravs de
uma classe, o mesmo que vai acontecer para criar esses novos objetos. Entretanto,
existem algumas diferenas que voc precisa prestar muita ateno. Nos quadros abaixo
esto parte do cdigo de um rob e de um objeto do mundo.
public class MeuRobo extends Furbot {
public void inteligencia() throws Exception {
}

public static void main(String[] args) {
MundoVisual.iniciar("MeuRobo.xml");
}
}

public class Inimigo extends ObjetoDoMundoAdapter {
public void executar() throws Exception {
}
}

Primeira observao: o rob estende de Furbot, e o inimigo estende
ObjetoDoMundoAdapter. Essa a regra bsica para criar novos tipos de objetos do
mundo: estender da classe ObjetoDoMundoAdapter.
Segunda observao: a lgica do rob fica no mtodo inteligencia() e a lgica do inimigo
fica no mtodo executar(). Essa a segunda regra bsica para implementar novos tipos
de objetos do mundo: a lgica dos objetos ficam no mtodo executar(). Nessa lgica voc
pode usar todos os recursos que j vinha usando para o rob: os mtodos de movimento
(andarDireita(), andarAcima(), etc), para viso (getObjeto(), ehFim(), etc), para manter um


103
registro de atividades (diga()) e para adicionar e remover objetos (como visto nas sees
anteriores).
Terceira observao: normalmente colocaremos o mtodo main() somente na classe do
rob. Se colocarmos em algum tipo de objeto, e quisermos executar um programa,
precisamos mandar a executar a classe do tipo do objeto. Como normalmente montamos
um rob para resolver o problema de um mundo, ento a melhor posio para o mtodo
main() no prprio rob.
Os objetos dessa classe podem ser adicionados durante a execuo do rob, atravs dos
mtodos adicionarObjetoNoMundo(...) ou adicionarObjetoNoMundoXY(...) ou mape-los
no XML. Para isso, basta usar o elemento <objeto> e no atributo class colocar o nome da
classe. Veja um exemplo no quadro abaixo. Aqui criado um objeto com a classe Inimigo
numa posio aleatria.

<objeto class = Inimigo>
<random/>
</objeto>
Agora veremos como atribuir uma imagem a qualquer objeto do mundo (inclusive o rob:
voc poder atribuir uma imagem personalizada para seu rob). Para isso ser
necessrio implementar o mtodo buildImage(). Veja como fazer esse mtodo no quadro
abaixo.
public ImageIcon buildImage() {
return LoadImage.getInstance().getIcon("inimigo.png");
}

Observa como bastante simples atribuir imagens aos objetos: basta informar o novo do
arquivo contendo a imagem. So aceitos arquivos no formato PNG, GIF e JPG. As
imagens precisam ter de preferncia o tamanho de 50X50, que a dimenso de cada
clula no mundo. O arquivo precisa estar na pasta do projeto (o mesmo local aonde voc
vinha colocando os arquivos XML).
Lembre-se: possvel implementar esse mtodo nos seus robs.

10.4. CONFIGURANDO VELOCIDADES DIFERENTES PARA OS OBJETOS
Num jogo normalmente temos vrios objetos animados com velocidades independentes.
Voc sabe que a velocidade no Furbot baseada numa barra de rolagem presente na


104
janela. Mas tambm possvel que se especifiquem velocidades diferentes para cada
objeto no mundo. Para isso utilizamos o mtodo setVelocidade() conforme o exemplo no
quadro abaixo.
Alien1 alien = new Alien();
alien.setVelocidade(100);
adicionarObjetoNoMundo(alien, ACIMA);
....
setVelocidade(0);

A velocidade no Furbot baseada num temporizador. Na verdade quando voc atribui
uma velocidade ao objeto vai precisar pensar no tempo que o objeto vai levar entre
executar um comando e outro. No cdigo acima foi criado um alien e atribudo uma
velocidade de 100. A unidade da velocidade milisegundos. No caso desse alien, ele foi
configurado para ter um tempo de espera de 100ms entre executar um comando e outro.
A ltima linha atribui velocidade 0 ao rob, ou seja, cada comando executado
instantaneamente sem existir um tempo de espera adicional. Novamente: quanto maior o
valor que voc informa nesse mtodo, menor ser a sua velocidade.
10.5. SORTEIO
Para deixar um jogo interessante, existem momentos em que os objetos precisam sortear
algo, por exemplo, uma direo ou a velocidade do tiro. Para isso, voc utilizar o mtodo
sortear(). Esse mtodo retorna um int. Por exemplo, o cdigo abaixo sorteia um nmero e
faz o resto da diviso por quatro. De acordo com o resultado, que fica entre 0 e 3, o rob
toma uma deciso.
int sorteio = sortear() % 4;
switch(sorteio) {
case 0 : andarAcima(); break;
case 1 : andarAbaixo(); break;
case 2 : andarEsquerda(); break;
case 3 : andarDireita(); break;
}

10.6. TROCA DE MUNDO EM TEMPO DE EXECUO
Voc saberia responder quando se encerra a execuo do rob? .... Existem duas formas:
a primeira clicando no boto [Stop] da janela do mundo; a segunda quando termina a
inteligncia do rob. Se voc deseja implementar que em algum momento do jogo, o
cenrio do mundo troque, preciso que saia do mtodo inteligencia(). Mas saindo desse


105
mtodo termina a execuo do rob!!! Como poderamos implementar a troca de
mundos?
A partir da verso 0.15 tem uma nova forma de iniciar o MundoVisual. Observe o cdigo
no quadro abaixo.
public static void main(String[] args) {
MundoVisual.iniciarSequencia(RoboJogavel.class, "PrimFase.xml", "SegFase.xml");
}

O novo mtodo iniciarSequencia() recebe como parmetro a classe de um rob e uma
lista de mundos (nesse exemplo tem somente dois, mas o limite a memria). O primeiro
mundo a ser carregado PrimFase. Se nada de novo for feito na inteligncia do rob, a
execuo simplesmente termina.
Para programar a troca de mundos durante a execuo voc precisar utilizar o mtodo
proxMundo(int) da classe MundoVisual. Esse mtodo sinaliza ao mundo para carregar
uma nova configurao automaticamente quando acabar a inteligncia do rob. O
parmetro indica o cdigo do mundo a ser carregado, de acordo com os parmetros
passados no mtodo iniciarSequencia(). O primeiro mundo de cdigo 0, o segundo de
cdigo 1 e assim por diante.
O quadro abaixo faz um teste comparando se o mundo atual (getMundo()) de cdigo 0,
ou seja, se o primeiro mundo da lista. Se isso for verdadeiro ento sinaliza o mundo
visual para utilizar o mundo de cdigo 1 quando acabar a inteligncia do rob.

if (MundoVisual.getMundo() == 0) {
MundoVisual.proxMundo(1);
}
O gerenciamento de fases, ou troca de cenrios, acontece automaticamente, de acordo
com o mundo indicado no mtodo proxMundo(int).
importante chamar a ateno de que toda vez que um novo mundo criado, todos os
objetos desse mundo so recriados, inclusive o rob. Existem situaes em que
precisamos transferir dados de uma fase para outra, e infelizmente no tem como guardar
no rob. Uma alternativa criada para resolver esse problema fazer com que o
MundoVisual mantenha esses dados. Existem trs mtodos que voc utilizar para isso.
Vamos explicar esses mtodos atravs do cdigo abaixo. O mtodo setAtributo() guarda
um valor de qualquer tipo (int, boolean, String, Alien, etc) e associa ele com um nome.


106
Esse nome deve ser nico. Se voc utilizar duas vezes, o valor que tinha antes perdido.
O mtodo temAtributo() verifica se existe um valor guardado com o nome passado por
parmetro. E o mtodo getAtributo() retorna o valor guardado com o nome passado como
parmetro.
MundoVisual.setAtributo("x", getX());
MundoVisual.setAtributo("y", getY());
...
if (MundoVisual.temAtributo("x")) {
int x = MundoVisual.getAtributo("x");
int y = MundoVisual.getAtributo("y");
}

10.7. CONTROLANDO PROBLEMAS DE CONCORRNCIA
Em jogos geralmente existem vrias entidades movimentando-se no mundo do jogo (ex:
no PacMan existem os fantasmas e o pacman). Como o FURBOT originalmente no foi
concebido para tratar os problemas associados com aspectos de threads concorrentes,
possvel que vocs encontrem problemas relacionados ao disparo de excees.
Para tentar minimizar (e no corrigir!!) o impacto destes problemas, utilizem a soluo a
seguir. Em cada entidade que se movimenta declarar um atributo:

private boolean estouVivo = true;

No lao de repetio do mtodo inteligencia (ou do mtodo executar) teste o atributo
estouVivo. Exemplo:
...
Direcao direcao = sortearDirecao();
boolean continuar = true;
while (continuar == true && estouVivo ==true) {
if (!ehFim(direcao)) {
if (!ehObjetoDoMundoTipo("Parede", direcao)) {
andar(direcao);
}
}
direcao = sortearDirecao();
}//while
if (estouVivo == false) {
diga ("MORRI");
}
.....

Em cada entidade que se movimenta declarar um mtodo que permite sinalizar que a
mesma no deve continuar a execuo. Exemplo:


107
public void entidadeMorreu() {
estouVivo = false;
} .....

O mtodo que realiza o controle de colises deve apresentar o comportamento similar a
este:
public boolean ocorreuColisao(Direcao direcao) {
ObjetoDoMundo obj = getObjeto(direcao); //primeiro tenta pegar o objeto
if (obj != null) { //verifica se conseguiu pegar o objeto na posicao
String tipo = obj.getSouDoTipo(); //testa o tipo do objeto
if (tipo.equals("AlienPacManExemplo")) {
AlienPacManExemplo al = (AlienPacManExemplo)obj; //mapeia o objeto para o tipo da classe
// AlienPacManExemplo

al.entidadeMorreu(); //envia uma mensagem para o objeto que deve parar
diga("ALIENS COLIDIRAM");
return true;
} else {
if (tipo.equals("MeuPacMan")) {
diga ("vou remover o pacMan");
MeuPacMan mp = (MeuPacMan) obj;//converte o objeto para o tipo
// da classe MeuPacMan
mp.pacManMorreu();
return true;
}
}
}
return false;
}

Ao ser executado o mtodo entidadeMorreu() da classe PacMan (por exemplo), ser
atualizado o valor do atributo estouVivo para false e com isto o lao de repetio do
mtodo inteligencia encerra sua execuo.
O efeito desta soluo que a entidade viva continuar executando at retornar ao teste
do comando while. Neste momento ela pra de executar. Dependendo da complexidade
da lgica a ser executada, possvel que o comportamento da entidade fique errneo por
um tempo equivalente ao tempo necessrio para executar os comandos restantes at o
final do comando while.
Como a entidade encerra o mtodo inteligencia() ou executar(), no ocorrem as excees
decorrentes dos aspectos de concorrncia.





108
10.8. CONSIDERAES FINAIS
importante chamar a ateno de que o Furbot no uma engine de jogos, mas um
conjunto de classes para facilitar o aprendizado de programao Java. Os problemas de
desempenho e alguns de apresentao so inevitveis para garantir um ambiente fcil de
programar. Na medida do possvel estaremos resolvendo esses problemas.
Aconselho que voc destrinche esse documento: entenda todos os pargrafos e todos os
cdigos. Programe para test-los. Anote as dvidas e procure pelos professores,
monitores ou alunos mais experientes.
10.9. EXEMPLO
import javax.swing.ImageIcon;
import br.furb.furbot.Direcao;
import br.furb.furbot.ObjetoDoMundoAdapter;
import br.furb.furbot.suporte.LoadImage;
public class SeguidorDeRobo extends ObjetoDoMundoAdapter{
private boolean fim = false;
public ImageIcon buildImage() {
return LoadImage.getInstance().getIcon("imagens/alienmovel.png");
}
public SeguidorDeRobo() {
setVelocidade(0);
}
public void executar() throws Exception {
Direcao direcao = descobrirDirecao();
while (ehFim(direcao) == false) {
obterLetra();
andar(direcao);
}//while
passoNaExtremidade(direcao);
diga(palavra);
fim = true;
}
private String palavra = "";
private void obterLetra() {
Letra letra = getObjeto(AQUIMESMO);
palavra += letra.getLetra();
}
private void passoNaExtremidade(Direcao direcao){
if (direcao == ABAIXO || direcao == ACIMA) {
andarEsquerda();
} else {
andarAbaixo();
}
private void andar(Direcao direcao) {
switch (direcao) {
case ABAIXO: andarAbaixo(); break;
case ACIMA: andarAcima(); break;
case DIREITA: andarDireita(); break;
default : andarEsquerda();
}//switch
}


109
private Direcao descobrirDirecao() {
if (ehVazio(ABAIXO) == false)
return ABAIXO;
if (ehVazio(ACIMA) == false)
return ACIMA;
if (ehVazio(ESQUERDA) == false)
return ESQUERDA;
return DIREITA;
}
public boolean finalizou() {
return this.fim ;
}
}//class }//SeguidorDeRobo




110



11. INSTALAO DO AMBIENTE DE DESENVOLVIMENTO: JDK E NETBEANS

O primeiro passo antes de utilizar o FURBOT a instalao e configurao do ambiente
de desenvolvimento. Esta seo deste documento descreve os passos para baixar e
configurar o software necessrio para o desenvolvimento de aplicaes utilizando o
FURBOT. Para complementar o processo de instalao, acesse o link:
http://www.inf.furb.br/poo/furbot/index.html.
O material desta seo foi desenvolvido pelo Prof. Mauricio Capobianco Lopes e pela
monitora Fernanda Gums e tem por objetivo descrever os procedimentos para instalao
do ambiente de programao orientada a objetos: JDK e IDE Netbeans.

11.1. EXPLICAO INICIAL
Nas disciplinas de programao orientada a objetos iremos utilizar um conjunto de
ferramentas formado pelo ambiente de desenvolvimento Java da Sun Java
Development Kit (JDK) 1.5 (ou superior). Contudo, este conjunto de ferramentas no
fornece um ambiente de desenvolvimento ou de edio dos programas-fonte.
Assim sendo, para criar as aplicaes Java, poderemos utilizar a ferramenta Netbeans. A
ferramenta permite a edio dos programas em Java e proporciona um ambiente de
desenvolvimento que facilita o aprendizado da linguagem e dos conceitos associados.

11.2. DOWNLOAD DOS INSTALADORES
Voc vai precisar do aplicativo de instalao de cada uma das ferramentas que sero
utilizadas.
H duas formas de obt-las:

1. Emprestando o CD disponvel na biblioteca da universidade;
2. Fazendo o download diretamente da pgina dos fornecedores das ferramentas: IDE
NetBeans e JDK.

11.2.1. FAZENDO O DOWNLOAD DO SOFTWARE JDK
Acesse o link: http://java.sun.com/javase/downloads/index.jsp. Voc encontrar uma pgina
semelhante mostrada na Figura 39:


FIGURA 39- TELA PARA A ESCOLHA DA VERSO DO JDK.
Clique no link Get the JDK download e voc ser remetido para uma pgina similar
pgina abaixo (Figura 40):


FIGURA 40- DOWNLOAD CENTER.

Clique no link Review License Agreement e voc ser remetido para a pgina do acordo
de Licenciamento do software (Figura 41):

FIGURA 41- ACORDO DE LICENCIAMENTO DO SOFTWARE.
Leia o acordo de licenciamento do software e clique no boto Accept License Agreement
e voc ser remetido para uma pgina que voc dever escolher a plataforma e o
instalador a ser baixado (Figura 42):


FIGURA 42- SELECIONAR A PLATAFORMA E O INSTALADOR DO JDK.
Selecione uma das opes 1 ou 2 (para Windows) ou 3 ou 4 (para Linux) e clique no
boto Download selected with Sun Download Manager (opo 5). No Windows ser
apresentada a janela para abrir um arquivo (Figura 43):


FIGURA 43- ABRIR O ARQUIVO PARA INICIAR O DOWNLOAD.
Clique no boto Open e ser iniciado o processo de download do software Sun
Download Manager. Ao ser apresentada a janela abaixo (Figura 44) clique no boto
Run.

FIGURA 44- EXECUO DO GERENCIADOR DE DOWNLOAD.
Ser apresentada a janela (Figura 45) que contm os termos de licena de uso do
software Sun Download Manager. Clique no boto Accept.


FIGURA 45- TERMOS DE LICENA DO SOFTWARE.
Na janela de opes (Figura 46) configure as opes de funcionamento do software Sun
Download Manager selecionando a opo Browse (1) para indicar em que pasta voc
deseja armazenar o software JDK a ser baixado. Selecione tambm as demais opes (2)
conforme a sua preferncia e clique no boto OK.

FIGURA 46- OPES PARA O DOWNLOAD.
Neste momento ser apresentada uma janela (Figura 47) contendo as informaes sobre
o processo de download do software selecionado. Como geralmente os arquivos a serem
baixados so relativamente grandes, o tempo para download vai depender da velocidade
de conexo com a internet que voc possui. A qualquer momento voc pode selecionar a
opo Pause para suspender temporariamente o download ou Parar para parar o
processo.


FIGURA 47- ANDAMENTO DO DOWNLOAD.
Depois que o arquivo tenha sido baixado com sucesso, inicie a instalao.

11.2.2. FAZENDO O DOWNLOAD DO SOFTWARE NETBEANS
Acesse o link: http://www.netbeans.info/downloads/index.php. Voc encontrar uma pgina
semelhante a da Figura 48.

FIGURA 48- SITE DO NETBEANS > DOWNLOAD.
Se voc vai executar o NetBeans em uma mquina com sistema operacional Windows,
clique no boto Download NetBeans IDE, baixe o arquivo e execute-o. Se voc vai
executar o NetBeans em uma mquina com outro sistema operacional (Linux, MacOS,
Solaris) clique no link Other Systems & Languages, escolha o instalador, baixe o arquivo
e siga as instrues da seo 11.2.4.

11.2.3. INSTALANDO O AMBIENTE JDK
Para proceder instalao do JDK, d um duplo clique sobre o aplicativo e siga as
instrues de instalao. Inicialmente ser apresentada a tela a seguir contendo o acordo
de licena de uso do software. Clique no boto Accept.

FIGURA 49-LICENA DE USO DO SOFTWARE.
Concordando com a licena de uso, aparecer a tela de configurao da instalao
conforme a Figura 50:

FIGURA 50- CONFIGURAO DA INSTALAO.
No caso da instalao da verso 6 do ambiente de desenvolvimento (JDK), ser instalado
tambm o ambiente de RunTime necessrio para a execuo de applets e aplicaes em
geral na sua mquina. Esta solicitao ser realizada como mostra a Figura 51. Clique no
boto Next e aguarde a finalizao da instalao.


FIGURA 51- CONFIGURAO DA INSTALAO.
Ao trmino do processo de instalao do ambiente JDK, ser apresentada a tela (Figura
52) indicando o sucesso dos procedimentos. O prximo passo instalar o editor de
aplicaes IDE Netbeans.


FIGURA 52- INSTALAO COMPLETA.

11.2.4. INSTALANDO O AMBIENTE NETBEANS
As informaes a seguir foram obtidas a partir do link:
http://www.netbeans.org/community/releases/55/install_pt_BR.html#standalone.


118
11.2.4.1. WINDOWS
Em computadores com o Microsoft Windows, usar o instalador compactado auto-extravel
apresenta um mtodo preferencial de instalar o NetBeans IDE.
Para instalar o NetBeans IDE:
1. Depois de fazer o download do arquivo instalador, clique duas vezes no cone para
abrir o instalador.
2. No assistente de instalao, escolha uma resposta para o Contrato de licena e
clique em Prximo.
3. Especifique um diretrio vazio dentro do qual ser instalado o NetBeans IDE.

Observao: Esta instalao do NetBeans IDE no desorganizar as configuraes de
outras instalaes do NetBeans, porque o IDE cria automaticamente um novo diretrio de
usurio quando aberto (${HOME}/.netbeans/5.5).
1. Escolha o JDK que o IDE usar na lista de JDKs compatveis e clique em Prximo.
2. Verifique se o local de instalao est correto e se h espao disponvel no sistema
para a instalao.
3. Clique em Prximo para iniciar a instalao.
Observao: Caso haja problemas durante a instalao do software, consulte a seo
Soluo de problemas para obter as descries completas e as solues alternativas
sugeridas para problemas no resolvidos que podem afetar o processo de instalao.

11.2.4.2. LINUX
Em computadores com Linux, o mtodo de preferncia para instalar o NetBeans IDE
usar o instalador binrio.
Para instalar o NetBeans IDE:
1. V at o diretrio que contm o instalador.
2. Se necessrio, altere as permisses do arquivo instalador para tornar o binrio
executvel. Para tanto, digite em um prompt de comando:
$ chmod +x seu_binrio_executvel
Observao: Certifique-se de substituir seu_binrio_executvel pelo nome real do arquivo
do binrio que foi baixado.
3. Abra o instalador executando em um prompt de comando:
$ ./seu_binrio_executvel


119
Observao: Verifique novamente se substituiu seu_binrio_executvel pelo nome real do
arquivo do binrio que foi baixado.
4. No assistente de instalao, escolha uma resposta para o Contrato de Licena e
clique em Prximo.
5. Especifique um diretrio vazio dentro do qual ser instalado o NetBeans IDE e
clique em Prximo.
6. Escolha o JDK que o IDE usar na lista de JDKs compatveis e clique em Prximo.
O instalador procura os JDKs instalados no sistema e pergunta se deseja especificar qual
ser utilizado. possvel fazer isso na linha de comando. Por exemplo:
$ ./seu_binrio_executvel -is:javahome caminho_para_seu_jdk
7. Verifique se o local de instalao est correto e se h espao disponvel no sistema
para a instalao.
8. Clique em Prximo para iniciar a instalao.
Observao: Caso haja problemas durante a instalao do software, consulte a seo
Soluo de problemas para obter as descries completas e as solues alternativas
sugeridas para problemas no resolvidos que podem afetar o processo de instalao.

11.2.5. RESULTADOS
Voc deve ter o Java e o IDE NetBeans instalados no seu sistema.

11.2.6. MAIS INFORMAES
Site do IDE NetBeans
Documentao Java
Site do FURBOT





120
12. ANEXO 1 - LEIA MAIS EM ...
12.1. MODELAGEM DE PROBLEMAS
LARMAN, Craig. Utilizando UML e padres: uma introduo anlise e ao projeto
orientados a objetos. 2. ed. Porto Alegre : Bookman, 2004. 608 p, il
MELO, Ana Cristina. Desenvolvendo aplicaes com UML 2.0: do conceitual
implementao. 2. ed. atual. Rio de Janeiro : Brasport, 2005. 284 p, il.
MENEZES, Eduardo Diatahy Bezerra de. Princpios de anlise e projeto de sistemas
com UML. Rio de Janeiro : Campus, 2002. 286p, il.
SINTES, Anthony. Aprenda programao orientada a objetos em 21 dias. So Paulo :
Pearson Education do Brasil, 2002. 693p, il.
Lgica de Programao e Algoritmos
CARBONI, Irenice de Ftima. Lgica de programao. So Paulo : Pioneira Thomson
Learning, 2003. 240 p, il.
CORMEN, Thomas H. Algoritmos: teoria e prtica. Rio de Janeiro : Campus, 2002. xvii,
916p, il. Traduo de: Introduction to algorithms.
MANZANO, Jose Augusto N. G; OLIVEIRA, Jayr Figueiredo de. Algoritmos : logica para
desenvolvimento de programacao. Sao Paulo : Erica, 1996. 265p.

12.2. LINGUAGEM JAVA
DEITEL, P. J. Java: como programar.6. ed. Porto Alegre : Pearson, 2005. xl, 1110 p, il.
Traduo de: Java how to program.
BARNES, David J; KOLLING, Michael. Programao orientada a objetos com Java.
So Paulo : Pearson Education : Prentice Hall, 2004. xxviii, 368 p, il. , 1 CD-ROM.
Traduo de: Objects first with Java : a practical introduction using Blue J. Acompanha CD
que contm o JDK e o BlueJ para vrios sistemas operacionais, Sites Web de suporte,
alm dos projetos de exemplo.
HORSTMANN, Cay S. Conceitos de computao com o essencial de Java. 3. ed.
Porto Alegre : Bookman, 2005. x, 780 p, il. Traduo de: Computing concepts with Java
essentials.
SANTOS, Rafael. Introduo programao orientada a objetos usando JAVA. Rio
de Janeiro : Campus, 2003. 319p, il. (Campus-SBC).
FURGERI, Santos. Java2: ensino didtico desenvolvendo e implementando aplicaes
t. ed. So Paulo: rica, 2006. 372p.

Você também pode gostar