Manual de java

32
Programação e Sistemas de Informação Módulo 16 – Projecto de Software I JAVA Aplicações em Java A criação de uma aplicação é feita recorrendo a: New Project – Applications – Console Application Compilar o programa Build – Build Executar o programa Debug - Start 1. Estrutura de programação em java O java é uma linguagem que faz a distinção entre letras minúsculas e maiúsculas. Em Java, um projecto é composto por várias classes, sendo apenas uma a classe principal, ou seja, a classe que é chamada quando a aplicação é executada. Cada classe origina um ficheiro com extensão “.jsl”. Cada classe tem o correspondente subprograma principal e pode ter vários subrogramas secundários. O nome do subprograma principal não tem que ser igual ao nome da classe. 1

Transcript of Manual de java

Page 1: Manual de java

Programação e Sistemas de Informação

Módulo 16 – Projecto de Software I

JAVA

Aplicações em Java

A criação de uma aplicação é feita recorrendo a:

New Project – Applications – Console Application

Compilar o programa Build – BuildExecutar o programa Debug - Start

1. Estrutura de programação em java

O java é uma linguagem que faz a distinção entre letras minúsculas e maiúsculas.

Em Java, um projecto é composto por várias classes, sendo apenas uma a classe principal, ou seja, a classe que é chamada quando a aplicação é executada. Cada classe origina um ficheiro com extensão “.jsl”.

Cada classe tem o correspondente subprograma principal e pode ter vários subrogramas secundários. O nome do subprograma principal não tem que ser igual ao nome da classe.

void Esta palavra reservada indica que o subprograma não devolve qualquer valor.

1

Page 2: Manual de java

Estrutura de um programa em java:

Import java.io.*;public class Nome_Class{

tipo nome_var1, nome_var2, ...

public static void main (String[] args)throws java.io.IOException{tipo nome_va11, nome_var2, ...;

instruções;nome_subp1();nome_subp2(nome_var1, nome_var2, ...);

}

public static void nome_subp1(){tipo nome_va11, nome_var2, ...;

instruções;}

public static tipo nome_subp2(tipo_var nome_var1, tipo_var nome_var2, ...){tipo nome_va11, nome_var2, ...;

instruções;}

}

2

Início da classeInício da classe

Declaração de variáveis globais. Declaradas fora dos subprogramas

Declaração de variáveis locais. Declaradas nos subprogramas

Chamada do subprograma 1

Chamada do subprograma 2.Os parâmetros são passados ao subprograma respeitando a ordem pela qual eles estão definidos e o seu tipo, mas o nome pode ser diferente.

Identifica o subprograma principal, e consequentemente o início do programa

Necessário para a realização de operações de IO

Declaração de variáveis locais. Declaradas no subprograma prncipal

Subprograma sem parâmetros.

Subprograma com parâmetros-

Page 3: Manual de java

2. Estrutura de dados em Java

Comentários// uma linha/*

várias linhas*/

Operadores Aritméticos+ (adição)- (subtracção)* (multiplicação)/ (divisão) O resultado de uma divisão é um valor inteiro, excepto se

os dois operadores forem reais. % (resto da divisão)

Operadores lógicos&& (e/and)|| (ou/or)! (não/not)

Operadores de comparação== (igual)> (maior que)>= (maior ou igual que)< (menor que)<= (menor ou igual que)!= (diferente)

Operadores de incremento e decrementoa=a+1 a++a=a-1 a--

As casas decimais são indicadas pelo ponto(.)

Variáveis e Constantes

A declaração de uma constante faz-se com a introdução da palavra reservada “final”, antes do tipo:

final tipo nome_const = valor; A declaração de variáveis faz-se com a indicação do tipo seguido do nome da variável:

tipo_var nome_var1, nome_var2, ...;

A inicialização de uma variável pode ser feita no momento da declaração:tipo_var nome_var=valor;

3

Page 4: Manual de java

Tipos de dadosbyte (número inteiro [-128;127])short (número inteiro [-32768;32767])int (número inteiro [-2 147 483 648;-2 147 483 647])long (número inteiro [-9 223 372 036 854775 808; ...07])float (numero real [-3.4*1038; 3.4*1038])double (número real [-1.7*10308; 1.7*10308])

char (caracter. Delimitado por plicas ‘a’)String (conjunto de caracteres. Delimitado por aspas “aaa”) boolean (lógica true/false)

3. Instruções de Entrada/Escrita em java

Instrução de i/o System.out.println(“ mensagem “+nome_var1+”...”+nome_var2);System.out.print(“ ... ”);System.in.read(); //faz a espera de enter

Instrução de atribuiçãonome_var = valor a atribuir;

Aceitar um caracter do tecladochar c=(char)System.in.read();

Aceitar uma string do tecladoString st = new BufferedReader(new InputStreamReader(System.in)).readLine();

Aceitar um valor inteiro do tecladoString st = new BufferedReader(new InputStreamReader(System.in)).readLine();int num =Integer.valueOf(st).intValue();

Aceitar um valor real do tecladoString st = new BufferedReader(new InputStreamReader(System.in)).readLine();float a = Float.valueOf(st).floatValue();

String st = new BufferedReader(new InputStreamReader(System.in)).readLine();double a = Double.valueOf(st).doubleValue();

Data do sistema//Bibliotecaimport java.util.Date;

Date nome_var=new Date();

//O resultado vem na seguinte forma:

Classe MathTrata-se de uma classe com um conjunto de funções matemáticas:

- Math.sqrt() calcula a raíz quadrada- Math.pow(base, expoente) calcula a potência de um nº elevado a

outro

4

Page 5: Manual de java

- Math.random() gera um número aleatório entre 0 e 1. Para o valor ser entre 0 e 100, basta multiplicar por 100. O valor gerado é do tipo real, podendo ser convertido para inteiro.

Conversõesa=Integer.valueOf(b).intValue(); converte o valor de b para inteiro em a.a=Float.valueOf(b).floatValue(); converte o valor de b para real em a.a=(int)b; converte o valor de b para inteiro em a.a=(float)b; converte o valor de b para real em a.

4. Estruturas de programação em Java

Estrutura condicionalif (condição){ instruções se true; }else { instruções se false;}

Estrutura de selecção múltiplaswitch (nome_var){

case valor1: instruções; break;

case valor2: instruções; break;.....

default: instruções; break;

}

Estruturas de repetiçãowhile (condição){ instruções; }

do{ instruções; }while (condição)

Em ambos os casos as instruções são executadas caso a condição seja verdadeira. A diferença reside no facto da 2ª ser executada de 1 a n vezes, enquanto que a 1ª pode ser executada de 0 a n vezes.

while (true){ instruções; }Ciclo que apenas termina quando a janela é fechada

for (inicialização; condição de execução; incremento/decremento){

5

Page 6: Manual de java

instruções;}

Tratamento de excepçõesUma excepção é algo que ocorre durante a execução de um conjunto de instruções e que não se comporta de acordo com o previsto. Esta situação é controlada com a instrução:

try{

instruções a realizar;}catch (IOException e){

//informação caso as instruções não sejam executadas normalmente. instruções;

}

5. Arrays

Tabelas unidimensionais (arrays)

Declaração do array: tipo_dados [] nome_array = new tipo_dados[nº de posições do array]

Criação de elementos do array:nome_array[indice]=valor_a_atribuir

Acesso aos elementos do array:nome_array[indice]

Os elementos do array são numerados de 0 a n elementos.

6

Page 7: Manual de java

Exercícios (Aplicações em java)

Exercício 1: Apresentar no ecrã uma mensagem com a indicação do nº de alunos da turma.

Exercício 2: Aceitar um valor e apresentar o seu dobro.

Exercício 3: Aceitar dois valores e calcular a raíz quadrada do primeiro e o exponencial do primeiro elevado ao segundo.

Exercício 4: Aceitar dois valores e apresentar a sua soma, subtracção, multiplicação, divisão e resto da divisão.

Exercício 5: Aceitar um valor e verificar se este é par ou ímpar, apresentando a respectiva informação.

Exercício 6: Aceitar dois valores e verificar se o primeiro é maior, menor ou igual ao segundo, apresentando a respectiva informação.

Exercício 7: Aceitar um valor e verificar se esse valor está entre 0 e 20. Caso não esteja, deve ser dada uma informação de valor incorrecto. Se o valor for menor que 10, deve dizer a informação de negativo, caso contrario deve ser dada a informação de positivo.

Exercício 8: Aceitar um valor referente a uma idade e efectuar as seguintes verificações:Idade Bilhete

Inferior a 6 Isento de pagamentoEntre 6 e 12 Bilhete de criançaEntre 13 e 65 Bilhete normal Mais de 65 Bilhete de 3ª idade

Exercício 9: Aceitar dois valores, apresentando um menu com 4 opções solicitando ao utilizador a opção de soma, subtracção, multiplicação ou divisão, efectuando a operação aritmética correspondente entre os dois valores, até que o utilizador escolha a opção de sair. Se a opção não for nenhuma das disponíveis, o programa deverá informar que a opção foi incorrecta.

Exercício 10: Aceitar uma sequência de valores entre 0 e 20, até a confirmação de continuação ser negativa. No final pretende-se o nº, a soma e a média dos valores introduzidos.

Exercício 11: Aceitar um valor e apresentar todos os valores desde 1 até ele.

Exercício 12: Aceitar um valor e calcular o factorial desse valor.

7

Page 8: Manual de java

Exercício 13: Uma companhia de venda de flores a floristas e ao público, oferece aos primeiros isenção de impostos e um desconto que depende da importância a pagar segundo a seguinte tabela:

Compras DescontoInferior a 50 € 2%De 50 a 250 € 5%

Superior a 250€ 10%Os outros compradores não só não têm desconto como ainda estão sujeitos a um imposto de 6% sobre o valor da compra.Desenvolva um algoritmo que, após a realização de um compra, calcule o valor que efectivamente o cliente vai pagar, seja florista ou público em geral.

Exercício 14: Desenvolva um programa que calcule a nota de um aluno, sabendo que esta é definida da seguinte forma:

60% - média dos 2 testes da disciplina 20% - média dos 3 trabalhos práticos 20% - trabalho final

Exercício 15: Ao chegar a uma casa de hamburgers, o cliente dirige-se ao computador para encomendar a sua refeição. Surge-lhe o seguinte menu;

Hamburger = 2 € Cheeseburger = 2.5 € Batatas fritas = 75 centimos Sumo = 1 €

De seguida tem de responder às seguintes questões, para indicaras quantidade desejadas de cada um:

Hamburgers ? Cheeseburger ? Batatas fritas ? Sumo ?

Finalmente surge-lhe no ecrã a seguinte mensagem:Hamburgers Cheeseburger Batatas fritas Sumo Total x x x x x

Exercício 16: Elabore um programa que aceite a idade de 20 alunos de uma turma e determine quantos têm menos de 14 anos, quantos têm entre 14 e 16 anos e quantos têm mais de 16 anos de idade.

Exercício 17: Desenvolva um programa que lhe permite jogar um jogo. O computador deve gerar um nº aleatório entre 0 e 100. A tarefa do utilizador é tentar adivinhar esse nº. No final deve ser dada a informação do nº de tentativas

Exercício 18: Desenvolva um programa que aceite as notas (entre 0 e 20) de 20 alunos, através de uma tabela unidimensional. Pretende-se no fim a média das notas desses 20 alunos.

Exercício 19: Altere o programa anterior, de forma que além de aceitar as notas dos alunos, apresente um pequeno menu, para realização de tarefas sobre o array:

1-Alteração de uma nota2-Média das notas dos alunos3-Consultar a nota de um aluno

8

Page 9: Manual de java

4-Aluno(s) com a nota mais alta5-Terminar

9

Page 10: Manual de java

Applets em Java

1. O ambiente gráfico

Um applet é uma aplicação que é executada num browser web.

A criação de um applet é feito recorrendo a New Project – Web Pages – Applet on HTML

São gerados automaticamente dois ficheiros:Applet.java (código do applet)Page.htm

Para que o applet possa ser executado no browser é necessário fornecer um pequeno código em html, código este que é inserido no ficheiro “Page.htm”:

<html><body> <applet code=Applet.class width=320 height=200></applet></body></html>

Bibliotecas necessárias:import java.awt.*;import java.applet.*;

Início do Appletpublic class nome_applet extends Applet

O ecrã gráfico é composto da seguinte forma:

Ao contrário das aplicações em java, no applet não existe a classe main. No seu lugar, aparece uma classe:

public void nome_subp (Graphics g)

10

X

Y

(0,0)

Page 11: Manual de java

2. Estrutura de um applet com subprogramasimport java.awt.*;import java.applet.*;public class Applet1 extends Applet{

public void paint (Graphics g) {

nome_subp(g);}public void nome_subp(Graphics g){

instruções;}...

}

Exemplo de um applet com subprogramas

import java.awt.*;import java.applet.*;public class Applet1 extends Applet{

public void paint (Graphics g){

setBackground(Color.gray);//Chamada ao subprograma <desenhaquad>

desenharqua(g);}

//Criação do subprograma <desenharqua>public void desenharqua (Graphics g){

g.setColor(Color.black);g.drawRect(200,200,200,200);

}}

11

Identifica o subprograma principal, e consequentemente o início do applet

Subprograma

Chamada do subprograma

Page 12: Manual de java

3. Desenho de objectos gráficos em applets

Linha g.drawLine(x,y,x1,y1);x coordenada horizontal de início.y coordenada vertical de início.x1 coordenada horizontal de fim.y1 coordenada vertical de fim.

Rectângulo g.drawRect(x,y,a,b); g.fillRect(...); g.clearRect(...);

x coordenada horizontal do canto superior esquerdo de início.y coordenada vertical do canto superior esquerdo de início.a tamanho horizontal.b tamanho vertical.No 1º caso a forma não tem preenchimento.No 2º caso a forma é feita com preenchimento da cor que estiver seleccionada com o comando g.setColor(Color.c).No 3º caso a forma é apagada.

Elipse g.drawOval(x,y,a,b); g.fillOval(...);

x coordenada horizontal do canto superior esquerdo de início.y coordenada vertical do canto superior esquerdo de início.a tamanho horizontal.b tamanho vertical.No 1º caso a forma não tem preenchimento.No 2º caso a forma é feita com preenchimento da cor que estiver seleccionada com o comando g.setColor(Color.c).

String g.drawString(“ mensagem “+nome_var,x,y)x coordenada horizontal de início.y coordenada vertical de início.

Cor de linha g.setColor(Color.c);c designação da cor desejadaEsta instrução deve ser colocada antes da instrução ...draw...

Cor de fundo setBackground(Color.c);c cor de preenchimento de fundo desejada.

Cores disponíveis black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow.

Colocar um tempo de espera numa animação: try { Thread.sleep(25); }catch (Exception e) {}

Neste caso, o tempo de espera são 25 unidade de tempo

12

Page 13: Manual de java

A construção de uma animação em java, faz-se com recurso a um simples ciclo for. Dentro deste criam-se as formas com alteração de coordenadas.

while (true){

for (k=1; k<=400; k++){

g.setColor(Color.black);g.drawRect(k,50,30,20);try { Thread.sleep(25); }catch (Exception e) {}

}}

13

Page 14: Manual de java

Exercícios (Gráficos em applets java)

Exercício 1: Construir um applet com gráficos semelhante ao seguinte:

Exercício 2: Construir um applet contendo a figura seguinte. O raio dos círculos é de 30.

Exercício 3: Construir um applet que mostre um rectângulo em movimento horizontal. O rectângulo deve ter30 pixels de comprimento e 20 de largura. Quando atinge um dos limites do applet, deve inverter o sentido do movimento.

Exercício 4: Elabore um applet que desenhe uma casa com o seguinte aspecto.

14

Quadrado: linha preta, preenchimento azul, tamanho 200*200.

Triângulo: linha preta, preenchimento vermelho, tamanho 100(altura)*200(largura).

Page 15: Manual de java

Interfaces gráficos em Applets

A diferença entre um applet gráfico e um applet com interface gráfico, é que o segundo tem mecanismos que interagem com o utilizador.

Nos applets java com interfaces gráficos, a classe que indica o início do programa é representada da seguinte forma:

public void init ()

Estrutura do appletimport java.awt.*;import java.applet.*;public class Applet1 extends Applet{

public void init () {

instruções}

}

1. Criação de objectos

Labelsadd(new Label("descrição mensagem", Label.RIGHT));

ouLabel nome_var=new Label("descrição mensagem", Label.CENTER);add (nome_var);(Label.CENTER, Label.LEFT, Label.RIGHT)

Para colocar um determinado conteúdo numa label: nome_var.setText(“...”);

Caixas de textoadd(new TextField(“descrição”,tamanho_campo));

ouTextField nome_var = new TextField(“descrição”,tamanho_campo);add (nome_var);A descrição pode ser omitida.getText() devolve uma string com o conteúdo do campo de texto Para converter uma string numa caixa de texto para um valor inteiro/real:

nome_var=Integer.valueOf(Applet1.nome_var.getText()).intValue();nome_var=Float.valueOf(Applet1.nome_var.getText()).floatValue();

Para converter o valor inteiro/real para string:nome_var.setText(Integer.toString(a*b));nome_var.setText(Float.toString(a/b));

Para restringir a alteração a uma caixa de texto: nome_var.setEditable(false);Para colocar o cursor na caixa de texto: nome_var.requestFocus();Para seleccionar o conteúdo da caixa de texto: nome_var.selectAll();Para colocar um determinado conteúdo numa caixa de texto:

nome_var.setText(“...”);

15

Para que o applet possa ser inicializado no browser

Page 16: Manual de java

Botõesadd(new Button("nome botão"));

ou Button nome_var=new Button("nome botão");add (nome_var);

Botões RadioCheckboxGroup nome_var=new CheckboxGroup();add(new Checkbox("opção 1",nome_var,true));add(new Checkbox("opção 2",nome_var,false));

A opção true selecciona o botão nome_var.getSelectedCheckbox().getLabel() devolve a descrição (string) do

botão que está seleccionado.

Caixas de Selecçãoadd(new Checkbox("descrição caixa",true));

A opção true selecciona o botão e pode ser omitida nome_var.getState() devolve o valor booleano (true/false) do estado da caixa;

A caixa deve ser declarada como, public static Checkbox nome_var= new Checkbox(“...”); tal como veremos mais abaixo nos eventos.

Caixas de EscolhaChoice nome_var=new Choice();add(nome_var);nome_var.addItem("opção 1");nome_var.addItem("opção 2");

nome_var.getSelectedIndex() devolve a posição do item (0,1,...) que está seleccionado.

Inserção de imagens num Appletpublic void init(){ instruções }public void paint (Graphics g){ Image nome_var;

Nome_var= getImage (getCodeBase(), "nome_imagem.gif");g.drawImage (nome_var,100,50, this);

}

16

A imagem tem que estar na mesma pasta do applet, podendo ser do tipo gif ou jpeg.

Deslocamento horizontal e vertical

Page 17: Manual de java

2. Organização dos Elementos Gráficos (Gestores de Layout)

FlowLayout Os componentes vão sendo adicionados da esquerda para a direita, até que não caiba mais nenhum, começando então a serem adicionados na linha seguinte.

setLayout(new FlowLayout(FlowLayout.LEFT,h,v));FlowLayout.CENTER, LEFT, RIGHT h espacamento vertical entre elementosv espacamento horizontal entre elementos

GridLayout Os componentes são adicionados por zonas, de igual tamanho, definidas dentro da zona do applet.

SetLayou(new GridLayout(l,c,h,v)l Nº de linhasc Nº de colunash espaçamento horizontal entre elementosv espaçamento vertical entre elementos

Com a definição de Layout introduzida, todos os elementos são adicionados respeitando a ultima definição de Layout.

3. Organização dos Elementos Gráficos com o panel

A apresentação de um interface mais estético e amigável, faz-se com recurso a componentes panel.

public class Applet1 extends Applet {Panel nome_p;

public void init(){

Panel nome_p1=new Panel();Panel nome_p2=new Panel();…nome_p=new Panel();

nome_p1.setLayout(new FlowLayout(…));nome_p1.add(…));… nome_p2.setLayout(new FlowLayout(…));nome_p2.add(…));…

nome_p.setLayout(new GridLayout(…));add(nome_p);nome_p.add(nome_p1);nome_p.add(nome_p2);...

}}

17

Page 18: Manual de java

4. Gestão de Eventos

Um evento é o processo que é desencadeado sempre que o utilizador selecciona um botão. O componente em questão gera o evento que é enviado para o processador, respondendo este à acção do utilizador através de um método denominado:

actionPerformed()

Primeiro que é tudo é necessário importar a biblioteca que garante a gestão de eventos:

import java.awt.event.*;public class Applet1 extends Applet{

Os objectos, para poderem ser acedidos/alterados, devem ser definidos como:public static TextField caixa_1=new TextField();public static TextField caixa_2=new TextField();public static TextField caixa_3=new TextField();…

public void init(){

O próximo passo passa pela adição dos diversos objectos ao applet:add(caixa_1); add(caixa_2); add(caixa_3);...add(new ...);...

Os botões devem ser declarados da seguinte forma:Button botao_1=new Button("…”);Button botao_2=new Button("…”);...add(botao_1); add(botao_2); ...

Nota: Os objectos são colocados no applet pela ordem pela qual foram adicionados

O próximo passo é a criação do listener (na verdade, interface). É o componente utilizado para implementar eventos.

ActionListener evento_1=new evento_11();ActionListener evento_2=new evento_22();...

sendo definido um listener para cada objecto que gere um evento.

De seguida deve associar-se o listener à variável do objecto:botao_1.addActionListener(evento_1);botao_2.addActionListener(evento_2); ...

}}

18

Page 19: Manual de java

Após a definição de todos os objectos de constituem o applet bem como a associação de eventos aos botões, é necessário proceder à criação dos eventos, isto é, a definição do conjunto de instruções que serão executadas quando o utilizado selecciona o botão.

class evento_11 implements ActionListener { public void actionPerformed(ActionEvent e) { int a,b;

a=Integer.valueOf(Applet1.caixa_1.getText()).intValue();b=Integer.valueOf(Applet1.caixa_2.getText()).intValue();Applet1.caixa_3.setText(Integer.toString(a*b));

} }

Neste caso, a classe evento_11 é definida como variável do ActionListener evento_1, que por sua vez está associada ao objecto/botão botao_1.

O método gestor de evento “actionPerformed()” vai aceder aos elementos definidos na classe “Applet1” (o acesso a estes é garantido por estarem definidas como “public”) ;

Notas: A referência aos objectos é feita com nome_applet.nome_obj Para que nas classes que implementam os eventos se possa ter acesso a

variáveis globais, estas têm que ser declaradas na classe principal, como public static tipo nome_var;

19

Page 20: Manual de java

Exercícios (Interfaces gráficos em applets java)

Exercício 1: Elabore um applet com o seguinte aspecto:

Exercício 2: Elabore um applet com 4 botões (Somar, Subtrair, Multiplicar e Dividir), alinhados ao centro e separados entre si com 30 pontos na horizontal e 20 na vertical.

Exercício 3: Elabore um applet com 6 botões (Somar, Subtrair, Multiplicar, Dividir, Quadrado e Raíz), em 2 colunas e 3 linhas e separados entre si com 40 pontos na horizontal e 20 na vertical.

Exercício 4: Elabore um applet, utilizando componentes panel e cardlayout com o seguinte aspecto:

Exercício 5: Elabore um applet que aceite dois valores, calcule e apresente o resultado da sua soma. O applet deve apresentar o seguinte aspecto:

20

Page 21: Manual de java

Exercício 6: Elabore um applet que aceite dois valores e apresente 5 botões (soma, subtracao, multiplicacao, divisao e limpar), que permitem calcular e apresentar respectivamente o resultado da soma, subtracção, multiplicação e divisão dos 2 valores introduzidos, mostrando ainda uma label indicando os valores e a operação executada. O botão de limpar serve para limpar os editores e a label. O applet deve apresentar o seguinte aspecto:

Exercício 7: Elabore um applet para calcular um determinado valor a pagar, tendo em conta que ao valor base, deve ser adicionado:

20% caso o cliente seja do sexo masculino. 10% caso o cliente seja do sexo feminino. 20% caso o cliente seja casado; 10% caso o cliente não seja casado

Deve ainda ser inserido o botão de limpar que permite apagar o conteúdo das caixas. O applet deve apresentar o seguinte aspecto:

Exercício 8: Elabore um applet que apresente um conjunto de produtos, com caixas de escolha e apresente a soma do valor dos produtos . O applet deve apresentar o seguinte aspecto:

Exercício 9: Elabore um applet que gere um número aleatório entre 0 e 100. Trata-se de um jogo que tem como objectivo, adivinhar o número gerado, devendo ser dada a informação se o nº introduzido é maior ou menor. Deve também ser dada a informação do nº de tentativas até o jogador ter acertado no nº. O applet deve ter o seguinte aspecto:

21