Programacao Basica em Java - Homepage
Programacao Basica em Java - Homepage
Nenhuma parte desta apostila pode ser utilizada ou reproduzida, em qualquer meio ou forma, seja mecnico ou eletrnico, fotocpia, gravao, ou outros, sem autorizao, prvia, expressa e especfica do Autor. Essa apostila est protegida pela licena Creative Communs. Voc pode us-la para seus estudos, mas no pode us-la para fins comerciais ou modific-la. Bons estudos em Java!
Programao Bsica em Java by Patrcia Augustin Jaques is licensed under a Creative Commons AtribuioUso No-Comercial-Vedada a Criao de Obras Derivadas 2.5 Brasil License.
Meus agradecimentos a aluna Natali Silverio que me permitiu conhecer a licena Creative Commons. Um especial agradecimento ao aluno Leandro Medeiros que ajudou na reviso do texto.
Sumrio
Parecida com C, C++: .................................................................................................................................... 7 Orientada a Objetos:....................................................................................................................................... 7 Compilada e Interpretada: .............................................................................................................................. 7 Segura: .......................................................................................................................................................... 8 Suporta concorrncia: ..................................................................................................................................... 8 Instalando e configurando o ambiente de programao Java ............................................................................. 9 Onde encontro o ambiente de programao Java? ............................................................................................ 9 Verso Java 1.1.x ........................................................................................................................................... 9 Verso Java 1.2.x ........................................................................................................................................... 9 Outras opes .............................................................................................................................................. 10 Que ferramenta uso para criar os meus programas? ....................................................................................... 10 Passo a Passo............................................................................................................................................... 10 Que nome dar ao arquivo? ............................................................................................................................ 11 Compilando o cdigo .................................................................................................................................... 11 Executando o programa HelloWorld ............................................................................................................... 11
2.6 Declarao Import ........................................................................................................................... 15 2.7 Tipos Primitivos de Dados (Tipos Nativos de Dados) .......................................................................... 15 2.8 Converses entre Tipos Numricos .................................................................................................... 16 2.9 Declarao e Inicializao de Valores ................................................................................................. 17 2.10 Constantes .................................................................................................................................... 17 2.11 Operadores ................................................................................................................................... 17
2.11.1 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.12.1 2.12.2 2.12.3 2.12.4 2.12.5 2.12.6 2.12.7
Operadores Aritmticos ............................................................................................................................... 18 Operadores Relacionais ............................................................................................................................... 18 Operadores Lgicos .................................................................................................................................... 18 Operadores Bit-a-Bit ................................................................................................................................... 19 Operador if-then-else ternrio ..................................................................................................................... 20 Precedncia de Operadores ......................................................................................................................... 21 if-else......................................................................................................................................................... 21 switch ........................................................................................................................................................ 22 while .......................................................................................................................................................... 23 do-while ..................................................................................................................................................... 23 for ............................................................................................................................................................. 24 continue ..................................................................................................................................................... 24 break ......................................................................................................................................................... 25
3.2 Sobrecarga de Mtodos (Overloading) ............................................................................................... 31 3.3 Passagem de Parmetros em Java ..................................................................................................... 31 3.4 Visibilidade ...................................................................................................................................... 32 3.5 Herana .......................................................................................................................................... 33 3.6 Sobreposio (Overriding) ................................................................................................................ 34 3.7 O Modificador final ........................................................................................................................ 36 3.8 Classes Abstratas ............................................................................................................................. 36 3.9 Interfaces ....................................................................................................................................... 38 3.10 Inner Classes ................................................................................................................................. 39 3.11 Classes Annimas (Anonymous Class) .............................................................................................. 40 3.12 Garbage Collection ......................................................................................................................... 41 3.13 Exerccios ...................................................................................................................................... 41
3.9.1 Utilizando as Interfaces ................................................................................................................................. 39 3.5.1 super ........................................................................................................................................................... 34 3.6.1 Dinamic Binding............................................................................................................................................ 35
4 Strings .............................................................................................................................. 44
4.1 Criando uma string .......................................................................................................................... 44
4.1.1 Criando uma string vazia:.............................................................................................................................. 44 4.1.2 Criando uma string a partir de um array de caracteres:................................................................................... 44 4.1.3 Criando uma String a partir de um array de bytes:.......................................................................................... 44
4.2 Substituio de Caracteres ................................................................................................................ 45 4.3 Concatenao de Strings .................................................................................................................. 45 4.4 Substring ........................................................................................................................................ 45 4.5 Alterando os caracteres de uma String para maisculo ........................................................................ 46 4.6 Alterando os caracteres de uma String para minsculo ........................................................................ 46 4.7 Retirando espaos em branco ........................................................................................................... 46 4.8 Extrao de Caractere ...................................................................................................................... 46 4.9 Comparao de Strings..................................................................................................................... 46 4.10 Tamanho de uma string .................................................................................................................. 47 4.11 Identificando a posio de caracteres ou substrings em uma String .................................................... 47 4.12 Ordem .......................................................................................................................................... 47 4.13 Converses de tipos primitivos de dados para Strings ........................................................................ 48 4.14 Converso de String para tipos primitivos: ........................................................................................ 48 4.15 As classes Wrappers ....................................................................................................................... 49 4.16 StringTokenizer .............................................................................................................................. 49 4.17 Exerccios ...................................................................................................................................... 49
5 Arrays ............................................................................................................................... 51
5.1 Criando um array ............................................................................................................................. 51 5.2 Inicializando arrays .......................................................................................................................... 51 5.3 Acessando um elemento de uma Array .............................................................................................. 52 5.4 Obtendo tamanho de um array ......................................................................................................... 53 4
5.2.1 Inicializao Default ...................................................................................................................................... 52
5.5 Copiando o contedo de um array para outro array ............................................................................ 53 5.6 Arrays Multidimensionais .................................................................................................................. 53 5.7 Array de Objetos.............................................................................................................................. 54 5.8 Exerccios ........................................................................................................................................ 54
5.6.1 Criando arrays multidimensionais ................................................................................................................... 53 5.6.2 Inicializando um array multidimensional ......................................................................................................... 53
6 Vector ............................................................................................................................... 55
6.1 Criando um Vector ........................................................................................................................... 55 6.2 Inserindo objetos em um Vector ....................................................................................................... 55
6.2.1 Inserindo um elemento em uma determinada posio..................................................................................... 55 6.2.2 Inserindo um elemento no final do Vector ...................................................................................................... 55
6.3 Verifica a existncia de um elemento no Vector .................................................................................. 55 6.4 Retornando um elemento ................................................................................................................. 56 6.5 Retornado a posio de um elemento ................................................................................................ 56 6.6 Substituindo um objeto em uma determinada posio ......................................................................... 56 6.7 Removendo um elemento do Vector .................................................................................................. 56 6.8 Tamanho de um Vector .................................................................................................................... 56 6.9 Convertendo um Vector para array .................................................................................................... 56 6.10 Exerccios ...................................................................................................................................... 57
7 Gerando documentao HTML do cdigo com javadoc .................................................... 58 8 Interfaces em Java A biblioteca AWT ............................................................................ 60
8.1 Frame ............................................................................................................................................. 60 8.2 Gerenciadores de Layout .................................................................................................................. 61
8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6
FlowLayout................................................................................................................................................... 61 BorderLayout................................................................................................................................................ 62 GridLayout ................................................................................................................................................... 63 CardLayout................................................................................................................................................... 63 GridBagLayout .............................................................................................................................................. 64 Compreendendo os campos do GridBagConstraints ......................................................................................... 65
8.3 Dispondo Componentes sem Usar um Gerenciador de Layout .............................................................. 67 8.4 Panel .............................................................................................................................................. 68 8.5 O Modelo de Delegao de Eventos ................................................................................................... 69 8.6 Adaptadores .................................................................................................................................... 70 8.7 Label .............................................................................................................................................. 71 8.8 Definindo Fontes e Cores de Texto .................................................................................................... 71 8.9 Button ............................................................................................................................................ 73 8.10 Checkbox ...................................................................................................................................... 73 8.11 CheckboxGroup ............................................................................................................................. 74 8.12 Choice........................................................................................................................................... 74 8.13 Canvas .......................................................................................................................................... 75 8.14 TextField ....................................................................................................................................... 76 8.15 TextArea ....................................................................................................................................... 77 8.16 List 78 8.17 Dialog ........................................................................................................................................... 79 8.18 FileDialog ...................................................................................................................................... 80 8.19 ScroollPane ................................................................................................................................... 81 8.20 Menu ............................................................................................................................................ 82 8.21 CheckBoxMenuItem ....................................................................................................................... 83
8.20.1 Adicionando Atalhos para os Menus ............................................................................................................. 83
9 Applets ............................................................................................................................. 87
9.1 Restries de Segurana de um Applet .............................................................................................. 87 9.2 Hierarquia de Java ........................................................................................................................... 87 9.3 Carregando um Applet ..................................................................................................................... 88 9.4 O Ciclo de Vida de um Applet ............................................................................................................ 88 9.5 O primeiro exemplo de um applet...................................................................................................... 89 9.6 Criando programas Java aplicativos e applets ..................................................................................... 90 9.7 Exibindo Som e Imagem em um Applet.............................................................................................. 91
Todo o interpretador Java ou browser que execute applets Java uma implementao de uma Mquina Virtual Java. A JVM tambm pode ser implementada em hardware. Alm da JVM, a plataforma Java composta tambm pela Java Application Programming Interface (Java API). A API Java uma grande coleo de componentes de software disponibilizados que fornecem muitas capacidades interessantes e teis, tais como, componentes de interface grfica, conexo via sockets, etc. A API Java agrupada em bibliotecas (packages ou pacotes) de componentes relacionados. O cdigo Java compilado uma nica vez, porm o programa interpretado toda vez que for executado. Esse processo pode ser mais bem visualizado na figura a seguir.
1.1.4 Segura:
A presena de coleta automtica de lixo (Garbage Collection) evita erros comuns que os programadores cometem quando so obrigados a gerenciar diretamente a memria (C, C++, Pascal). A eliminao do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas, traz benefcios em termos de segurana. O programador proibido de obter acesso memria que no pertence ao seu programa, alm de no ter chances de cometer erros comuns tais como uso indevido de aritmtica de ponteiros. A presena de mecanismos de tratamento de excees torna as aplicaes mais robustas, no permitindo que elas abortem, mesmo quando rodando sob condies anormais.
Existem verses do ambiente Java para as plataformas mais conhecidas: Windows, Linux, UNIX e etc. Embora o cdigo do Java seja portvel, a Mquina Virtual Java dependente de plataforma. Por isso, tenha sempre o cuidado de copiar o ambiente de programao compatvel com o Sistema Operacional que voc est usando.
A partir desta verso necessrio apenas configurar a varivel de ambiente PATH. A localizao das bibliotecas Java encontrada automaticamente pela Mquina Virtual Java atravs do diretrio fornecido no PATH. A varivel PATH definida no arquivo autoexec.bat da seguinte maneira: PATH=%PATH%;c:\jdk1.3\bin
Se for necessrio utilizar uma outra biblioteca alm das bibliotecas padres fornecidas com o Java2 SDK (por exemplo, servlets), necessrio que voc a defina no CLASSPATH.
10
Esta linha utiliza a palavra reservada class para declarar que uma nova classe ser definida aqui. HelloWorld o nome usado para identificar a classe. Toda a definio da classe, inclusive todo o cdigo e os dados, estar entre a chave de abertura { e a chave final } que se encontram nas linhas 5 e 8 deste exemplo. Linha 4: public static void main (String args[ ]) A linha 3 contm a declarao do mtodo main. O mtodo main simplesmente um ponto de partida para o interpretador Java. por onde ser iniciada a execuo. O mtodo main dever sempre ser declarado na forma acima. Linha 6: System.out.println (Hello, World!); Esta linha executa o mtodo println do objeto out. Este objeto uma instncia da classe OutputStream e foi declarado como varivel de classe (static) na classe System. Este mtodo imprime na tela uma mensagem texto, no caso, Hello, World!. Por causa do modelo de objeto, uma sada simples de console complicada para entender. Por isso, at aprofundarmos o contedo suficientemente, pense apenas em System.out.println como um mtodo para impresso na tela (sada do console).
11
caractersticas uma MVJ deve possuir. Implementaes concretas existem para vrias plataformas e podem vir de vrios fornecedores. Elas tambm podem ser totalmente implementadas em software, ou ainda uma combinao de hardware e software. Por exemplo, o programa java.exe que vem no ambiente de programao fornecido pela SUN, o JSDK, um exemplo de uma implementao da MVJ. Uma instncia em tempo de execuo quando essa implementao da MVJ est rodando e executando uma aplicao. Por exemplo, quando o interpretador java.exe do JSDK est executando um programa Java. Toda a aplicao Java vai ser executada por uma instncia da MVJ.
12
programador, tambm como classes da Java API. Apenas so carregadas as classes da Java API que so utilizadas pelo programa. A MVJ tambm possui uma mquina de execuo (execution engine) que um mecanismo responsvel por executar as instrues Java (bytecodes) contidos nos mtodos das classes carregadas. Em uma MVJ implementada em software, o tipo mais simples de execution engine apenas interpreta os bytecodes um por um. Um outro tipo de execution engine, que mais rpida, o compilador just-in-time (JIT). Um compilador JIT compila os bytecodes para cdigo em mquina nativa na primeira vez que o mtodo executado. O cdigo nativo guardado em memria e, ento, pode ser reusado na prxima vez que o mtodo invocado. Ele mantm em memria tanto os bytecodes como o cdigo nativo, por isso, embora seja mais rpido, requer mais memria. Algumas vezes a JVM chamada de interpretador j que, quando a MVJ implementada em software, ela interpreta os bytecodes para execut-los. Porm, algumas MVJs usam tcnicas diferentes, como o caso dos compiladores JIT. Desta maneira, no muito adequado chamar a MVJ de interpretador (Venners, 2000).
1.5 Exerccios
Exerccio 1 Pede Argumento
Faa um programa Java leia um argumento passado para a Mquina Virtual Java. O programa deve ser formado por uma nica classe e contm apenas o mtodo main ( ). A classe deve se chamar PedeArgumento e voc passar o seu nome como argumento. Por exemplo, se o seu nome Nicolas, voc deve executar o programa atravs do seguinte comando: C:/> java PedeArgumento Nicolas E o programa deve exibir na tela como resultado:
> Ol Nicolas!
Dica: Todo o parmetro passado para a MVJ recebido pela array de String do mtodo main(). Para acessar um argumento de uma array, fornea a posio da array que voc deseja acessar. Por exemplo, como ns fornecemos apenas uma String ela estar na primeira posio da array que zero: String nome = args [0]; Se voc digitasse duas strings (por exemplo, o seu nome e sobrenome, seria necessrio acessar as duas primeiras posies da array: 0 e 1).
13
14
2.4 Identificadores
Os identificadores so as palavras usadas para nomes de classes, mtodos e variveis. Um identificador pode ser qualquer seqncia de caracteres de letras maisculas e minsculas, nmeros e caracteres de sublinhado e smbolo de cifro. Mas, tome os seguintes cuidados: Eles no podem comear com nmeros para no serem identificados como literais numricos; Java sensvel a maisculas e minsculas, por isso o identificador Valor diferente de valor.
2.5.2 Constantes
Para as variveis finais, que representam constantes em Java, usa-se todo o nome em letras maisculas. Quando as constantes forem formadas por mais de um termo, usa-se sublinhado para separ-los. Os nomes de constantes Java so formados por substantivos e adjetivos. Exemplos: VALOR_P1, DIA_SEXTA, VERDE.
2.5.3 Classes
Nomes de classes em Java so escritos em minsculo com a primeira letra em maiscula. Para os nomes compostos por mais de um termo, usa-se comear os termos seguintes com letra maiscula. Os nomes de classes Java so formados por substantivos e adjetivos. Exemplos: InterfaceSimples, Interface.
15
Intervalo de Valores -2.147.483.648 at 2.147.483.647 -32.768 at 32.767 -9.223.372.036.854.775.808L 9.223.372.036.854.775.807L -128 at 127 +- 3,40282347E+38F (6-7 dgitos significativos) +- 1,79769313486231570E+308 (15 dgitos significativos) representa um Unicode true ou false 0 0 at 0L 0 0.0f 0.0d
Valor Default
Ponto Flutuante
\u0000; false
Voc pode atribuir o valor de uma varivel que est esquerda para aquela do tipo que est direita. Muito embora os chars no sejam usados como inteiros, voc pode oper-los como se fossem inteiros. Desta maneira, necessrio o uso de cast para converter inteiros em caracteres. Caracteres podem ser considerados inteiros sem o uso de casting. Por exemplo: int trs = 3; char um = 1; char quatro = (char) (trs+um); A varivel quatro finaliza com 4 armazenado nela. Observe que um foi promovido para int na expresso, exigindo a definio de tipo de char antes da atribuio para a varivel quatro. Se voc desejar que uma varivel inteira receba o valor inteiro que um determinado caractere representa, voc pode usar o mtodo digit (char, int) da classe Character, onde passamos como parmetro o caractere e a base de converso (decimal, binria, etc). Para o contrrio, converter um inteiro para um caractere que represente aquele inteiro, utilize o mtodo forDigit (int, int) onde o primeiro parmetro representa o valor inteiro a ser convertido e o segundo parmetro a base de converso. O exemplo abaixo ilustra essas converses: public class ConverteCaracteres { public static void main (String args []) { int i = 3; char c = '1'; // converte char em inteiro. Ex: '1' -> 1 int res1 = Character.digit (c, 10); 16
// converte inteiro em char. Ex: 1 char res2 = Character.forDigit (i, System.out.println ("char -> int = System.out.println ("int -> char = } }
As variveis membros (dentro de uma classe) no inicializadas recebem por default o valor 0 (zero). As variveis locais (dentro de um mtodo) no so inicializadas por default e, por isso, gerado um erro de compilao quando no atribudo nenhum valor inicial a elas e essas so acessadas. O seguinte programa cria variveis de cada tipo primitivo e exibe seus valores: class SimpleTypes { public static void main (String args [ ]) { byte b = 5; short s = 5; int i = 334; long l = 34567L; float f = 35.76f; double d = 35.76; System.out.println (byte b = +b); System.out.println (short s = +s); System.out.println (int i = +i); System.out.println (long l = +l); System.out.println (float f = +f); System.out.println (double d = +d); } }
2.10 Constantes
Em Java no podem ser definidas constantes locais para um determinado mtodo como, por exemplo, o main. Ao invs disso, pode haver somente constantes para todos os mtodos na classe. Elas so chamadas usualmente de constantes de classe. As constantes so sempre definidas atravs dos modificadores static final. Por exemplo: public class UsesConstants { public static final double GRAVIDADE = 32; public static void main (String args [ ]) { System.out.println ("A gravidade " +GRAVIDADE); } }
2.11 Operadores
Existem quatro tipos de operadores em Java: aritmticos, bit-a-bit, relacional e lgico.
17
Os operadores relacionais sempre retornam um valor boolean (true ou false) como resultado. Por exemplo: int a=4; int b=1; boolean c = a<b; O trecho de cdigo acima mostra duas variveis (a e b) sendo comparadas e a varivel c recebendo como resultado o valor false.
Resultado
Por exemplo, no cdigo abaixo a varivel c ser incrementada. boolean a=true, b=false; int c=0; if (a && !b) c++;
A tabela a seguir mostra como cada operador bit-a-bit age em cada combinao de bits de operando.
A 0 1 0 1 0 0 1 1 B 0 1 1 1 OR (|) 0 0 0 1 AND (&) 0 1 1 0 XOR (^) 1 0 1 0 NOT A (~A)
Abaixo, encontram-se alguns exemplos: NOT: O operador unrio NOT (~) inverte todos os bits de um operando. Por exemplo, a operao de NOT sobre o nmero 42:
a ~a 00101010 11010101 42 -43
AND: Gera 1 se os bits dos operandos forem 1, caso contrrio gera 0 (zero).
a b a&b 00101010 00001111 00001010 42 15 10
19
OR: Se um dos bits dos operandos for 1 ele gera 1, caso contrrio ele gera 0 (zero).
00101010 00001111 a|b 00101111 42 15 47
XOR: Combina os bits de tal maneira que se os bits dos operandos forem diferentes gera 1, caso contrario gera 0 (zero).
a b a^b 00101010 00001111 00100101 42 15 37
<< (Deslocamento para a esquerda): Move todos os bits do operando esquerda no nmero de vezes especificado no segundo operando. Para cada bit deslocado, os bits esquerda so perdidos e as posies direita preenchidas com zeros. A operao de deslocar esquerda tem o efeito de multiplicar um nmero por 2 tantas vezes quanto for efetuado o deslocamento. Alm disso, ao se deslocar um bit 1 para a posio mais alta, o nmero torna-se negativo.
a a<<1 00000011 00000110 3 6
>> (Deslocamento para a direita): Move todos os bits do operando da esquerda para a direita no nmero de posies de bits especificados pelo operando da direita. Os bits deslocados para direita se perdem. Esta operao tem o efeito de que cada bit deslocado divide o valor do operando em 2 sem considerar o resto. Ao deslocar para a direita, os bits superiores (da extrema esquerda) so preenchidos com o contedo do bit anterior. Isto chamado de extenso de sinal e serve para preservar o sinal de nmeros negativos.
a a>>2 00100011 00001000 35 8
>>> Deslocamento para a direita sem sinal: Desloca n bits direita preenchendo os campos superiores (extrema esquerda) com zero.
A a>>>24 11111111 11111111 11111111 11111111 00000000 00000000 00000000 11111111 -1 255
Todos os tipos de inteiros so inteiros com sinal. Isto significa que eles podem representar tantos valores negativos como positivos. Java usa uma codificao conhecida como complemento de dois, o que significa que os nmeros negativos esto representados pela inverso (mudana de 1s para 0s e vice-versa) de todos os bits de um valor, somando-se depois 1 ao resultado. Por exemplo, 42 00101010 que invertendo os 0 s e 1s fica 11010101, depois somando 1 resulta em 11010110 ou 42. Para decodificar um nmero negativo em binrio para decimal, primeiro inverta todos os bits e depois some 1.
Onde expresso qualquer expresso que o resultado seja um valor boolean. Se o resultado for true, a declarao 1 executada e se for false a declarao 2 executada. Por exemplo: ratio = denom==0 ? 0 : num/denom; Na expresso acima avaliado se denom igual a zero. Caso positivo ratio recebe zero, seno ratio recebe num/denom.
20
2.12.1 if-else
boolean dadosDisponiveis = true; if (dadosDisponiveis) processarDados ( ); else esperarMaisDados ( ); No exemplo acima o cdigo verifica o valor da varivel boolean. Se dadosDisponveis igual a true ento executa o mtodo processarDados, seno executa o mtodo esperarMaisDados ( ). A clusula else opcional. Se no exemplo acima no houvesse a clusula else, nenhum mtodo seria executado. Ao invs de uma varivel boolean, tambm poderia haver uma expresso que usasse operadores para produzir um resultado boolean. Por exemplo: int bytesDisp = 5; if (bytesDisp > 0) { processarDados ( ); byteDisp --; } else esperarMaisDados ( );
21
No exemplo anterior verificado se bytesDisp > 0. Caso positivo retorna o valor boolean true e ento executa os comandos entre chaves, processarDados ( ) e byteDisp--. Caso contrrio, retorna false e executa esperarMaisDados( ).
2.12.2 switch
A declarao switch usada quando existem procedimentos diferenciados para determinados valores de uma nica varivel. Ela s pode ser usada para vriveis que sejam de tipo primitivos de dados, mais especificamente para variveis do tipo int (inteiros) e char (caracteres). Por exemplo: int mes = 4; switch (mes) { case 1: System.out.println (Janeiro); break; case 2 : System.out.println (Fevereiro); break; case 3 : System.out.println (Marco); break; case 4: System.out.println (Abril); break; case 5 : System.out.println (Maio); break; case 6 : System.out.println (Junho); break; case 7: System.out.println (Julho); break; case 8 : System.out.println (Agosto); break; case 9 : System.out.println (Setembro); break; case 10 : System.out.println (Outubro); break; case 11 : System.out.println (Novembro); break; case 12 : System.out.println (Dezembro); break; default : System.out.println (No existe ms correspondente!); } No exemplo acima, ser impresso Abril como resultado na tela. Isto porque o valor da expresso comparado com cada um dos valores das declaraes case. Se uma correspondncia for encontrada, a seqncia de cdigo que vem depois da declarao case executada. Se nenhum dos cases corresponder ao valor da expresso, ento a declarao default executada. Entretanto, a declarao default opcional. O break faz com que a execuo pule para o final do switch. Se no fosse colocado o break, a execuo seria passada para o prximo case at encontrar um break. Esse uso alternativo de cases pode ser til. Veja o exemplo abaixo: class SwitchEstacoes { public static void main (String args [ ]) int mes = 4; String estacao; switch (mes) { case 12: case 1: case 2: estacao = "Vero"; break; case 3: case 4: case 5: estacao = "Outono"; 22 {
break; case 6: case 7: case 8: estacao = "Inverno"; break; case 9: case 10: case 11: estacao = "Primavera"; break; default: estacao = "Desconhecida"; } System.out.println ("Abril est na estao " + estao + "."); } }
2.12.3 while
A construo while executa repetidamente o mesmo bloco de cdigo at que o resultado de uma expresso boolean seja verdadeiro. Por exemplo: class WhileDemo { public static void main (String args [ ]) { int n = 5; while (n>0) System.out.println ("tick "+ n--); } } O programa anterior verifica se o valor da varivel n maior que zero. Caso positivo, imprime o valor de
n, e decrementa seu valor. Realiza essa operao repetida vezes at que o valor de n seja menor ou igual a zero.
O cdigo acima reproduzir a seguinte sada:
java WhileDemo 5 4 3 2 1
2.12.4 do-while
s vezes, desejvel executar o corpo de um lao while pelo menos uma vez, quando se quer testar a expresso de encerramento no final do lao ao invs do incio (como acontece no while). Para isso, usamos o lao do-while. class DoWhile { public static void main (String args []) { int n=5; do { System.out.println ("tick " + n); } while (--n>0); } } O programa acima produz a mesma sada que o anterior.
23
2.12.5 for
A declarao for uma maneira compacta de construir um lao. Sua forma bsica segue: for (inicializao; encerramento; iterao) corpo; Por exemplo: class ForDemo { public static void main (String args []) { for (int i=1; i<=5; i++) { System.out.println ("i = "+i); } } } O programa acima produz o seguinte resultado:
c:\>java ForDemo i = 1 i = 2 i = 3 i = 4 I = 5
Se a condio inicial (i=1) no fizer com que o encerramento (i<=10) retorne true pela primeira vez, ento as declaraes corpo (System.out.println...) e iterao (i++) nunca sero executadas. A ordem de execuo do for : atribui valor inicial (i=1) verifica a condio de encerramento (i<=10) se true executa corpo do lao (System.out.println...) executa iterao (i++) volta ao passo 2 se false fim
2.12.6 continue
O continue usado em laos quando se deseja, em uma determinada condio, pular para a prxima iterao. Por exemplo: class ContinueDemo { public static void main (String args []) { for (int i=0; i<10; i++) { System.out.print (i + ""); if (i%2 == 0) continue; System.out.println (""); } } } O lao do programa acima imprime dois nmeros por linha. Ele usa o System.out.print para imprimir sem gerar uma quebra de linha. Depois, ele usa o % (operador de mdulo) para verificar se o nmero par ou mpar (se a diviso por 2 no gerar resto par). Se o nmero par, ele pula para a prxima iterao do lao sem passar pelo comando de impresso de uma nova linha. O resultado pode ser visualizado a seguir:
24
c:\>java ContinueDemo 0 1 2 3 4 5 6 7 8 9
2.12.7 break
O termo break usado para interromper um bloco de cdigo, ou seja, para sair desse bloco. usado no switch, como vimos na seo 2.12.2, e para interromper laos (for, while, do-while). class TestaBreak { public static void main (String args []) { int a = 0; while (true) { if (a == 5) break; System.out.println ("O valor de a = " + a++); } } }
TestaBreak
O break tambm usado como uma substituio da declarao goto, contida em muitas linguagens. Para esse uso, devemos declarar um rtulo para onde a execuo ser desviada aps passar pelo comando break. Para nomear um bloco, preciso escolher um identificador permitido pela linguagem e o colocar antes do bloco que se deseja rotular, o qual seguido de dois pontos (:). Depois voc pode referenciar esse rtulo como um argumento para uma declarao break, fazendo com que a execuo continue depois do final do bloco rotulado. Class TestaBreakRotulado { public static void main (String args []) { loop1: while (true) { for (int i=0; i<10; i++) { if (i==7) break loop1; // vai para o final do bloco do loop1 System.out.println ("i= "+i); } } // do while do loop1 loop2: while (true) { System.out.println ("Voltou para o while do loop2!"); for (int j=0; j<10; ++j) { if (j==3) break loop2; for (int k=0; k<10; k++) { // Volta a execuo para o lao 2 if (k==3) continue loop2; System.out.println ("k= "+k); } } } // do while do loop 2 } // da void main } // da classe
25
c:\jdk1.3\bin\>java TestaBreakRotulado i= 0 i= 1 i= 2 i= 3 i= 4 i= 5 i= 6 Voltou para o while do loop2! k= 0 k= 1 k= 2 Voltou para o while do loop2! k= 0 k= 1 k= 2 Voltou para o while do loop2! k= 0 k= 1 k= 2 Voltou para o while do loop2! <Entra em loop por causa do comando continue loop2>
2.13 Exerccios
Exerccio 1: Fatorial
O fatorial de um nmero calculado multiplicando-se os valores de um at o valor especificado. Um nmero fatorial representado pelo nmero do fatorial seguido de um ponto de exclamao. Por exemplo o fatorial de 4 representado por 4! e igual a : 1 x 2 x 3 x 4 = 24. Faa um programa java que calcule a fatorial de 2, 4, 6 e 10. Dica : Use o lao for.
26
27
3.1.1 Variveis
Cada varivel tem um nome e um tipo que define o comportamento esttico do objeto. Em Java para cada varivel so especificados: um modificador (opcional), o nome, o tipo e o valor inicial (opcional) do atributo. Por exemplo, a classe ContaCorrente possui as variveis saldo (saldo da conta corrente) e nome (nome do dono da conta). As variveis de uma classe podem ser de instncia ou de classe. Cada classe possui as suas prprias cpias das variveis de instncia, enquanto que as variveis de classe so compartilhadas.
Cada instncia da classe ContaCorrente (objeto) ter as mesmas variveis (saldo e nome), porm, elas podem ter valores diferentes em cada instncia. A varivel de classe (dinheiroTotal), porm, compartilhada por todos os objetos. Por isso, possui o mesmo valor para todos os objetos e se um objeto modificar o seu valor, o novo valor visto por todos os outros objetos.
3.1.2 Mtodos
Os mtodos definem os servios que podem ser solicitados a uma instncia (objeto), ou seja, o comportamento dinmico de um objeto. A definio de um mtodo em Java inclui um modificador (opcional), o tipo do dado retornado aps a execuo do mtodo, o nome do mtodo, o nome e tipo dos parmetros e o cdigo delimitado por chaves ( { } ). Por exemplo, na classe ContaCorrente podem ser definidos os mtodos: verificaSaldo: retorna o saldo da conta corrente; depositaValor: deposita um valor especificado x na conta; retiraValor: retira um valor especificado x da conta; A definio da classe ContaCorrente com as variveis e mtodos a seguinte:
28
class ContaCorrente { static float dinheiroTotal; float saldo; String nome; float verificaSaldo ( ) { return saldo; } void depositaValor (float valor) { saldo = saldo + valor; dinheiroTotal += valor; } void retiraValor (float valor) { if (saldo>=valor) { saldo = saldo valor; dinheiroTotal -= valor; } } }
29
Na primeira linha tem-se o nome da varivel (minhaConta) na qual o identificador do objeto ser armazenado. Na segunda linha criado o objeto do tipo ContaCorrente com o comando new que retorna o identificador do objeto que armazenado na varivel minhaConta. O enunciado acima poderia ser escrito tambm da seguinte maneira: ContaCorrente minhaConta = new ContaCorrente (Maria);
30
Por exemplo, digamos que criamos um objeto do tipo ContaCorrente e queremos modificar os seus valores, definindo o nome do dono da conta e modificando e visualizando o saldo. class AcessaContaCorrente { public static void main (String args [ ]) { ContaCorrente minhaConta = new ContaCorrente (Maria); float saldo; saldo = minhaConta.verificaSaldo ( ); System.out.println (saldo); minhaConta.depositaValor (200); saldo = minhaConta.verificaSaldo ( ); System.out.println (saldo); } } O cdigo acima cria um objeto do tipo ContaCorrente com valores iniciais de Maria para nome e 1000 para valor. Aps, verifica o saldo da conta, deposita 200 e verifica novamente o saldo.
31
} public static void main (String args []){ int val = 11; TestaPassagemParametros.trocaValorPrimitivo (val); System.out.println ("val = "+val); ContaCorrente minhaConta = new ContaCorrente ("SuperHomem"); System.out.println (minhaConta.saldo); TestaPassagemParametros.trocaValorObjeto (minhaConta); System.out.println (minhaConta.saldo); TestaPassagemParametros.trocaReferenciaObjeto (minhaConta); System.out.println (minhaConta.nome); } } // da class
TestaPassagemParametros
E para o mtodo trocaReferenciaObjeto ns passassemos um objeto String em vez de um objeto ContaCorrente, o que voc acha que aconteceria? O mesmo que aconteceu para o objeto ContaCorrente. No atribudo o novo valor para a string. Isto acontece porque em Java uma nova instncia criada para toda a literal String. Desta maneira, quando fizemos str = azul; igual a fazer: str = new String (azul); Por isso, possvel manipular um literal String como se fossem objetos String. Por exemplo: int tam = abc.length ( );
3.4 Visibilidade
Em Java existem modificadores para determinar a visibilidade das variveis e mtodos . Por exemplo, uma varivel ou mtodo public pode ser acessada por outros objetos, porm se for private somente pode ser chamada dentro do prprio objeto. Um bom hbito de programao consiste em deixar privado (private) tudo aquilo que no precisa ser acessado por um mtodo de outro objeto. Veja na tabela abaixo, os modificadores existentes em Java:
Encapsulamento private protected sem modificador public Visibilidade Podem ser acessados somente por mtodos da mesma classe. Podem ser acessados pelas classes do mesmo pacote, como tambm pelas subclasses do mesmo pacote e de outros pacotes. Podem ser acessados por subclasses do mesmo pacote ou por outras classes do mesmo pacote. Podem ser acessados de qualquer classe.
Por exemplo, a classe ContaCorrente poderia ter os seus dados privados e os mtodos pblicos para que outras classes possam cham-los. Desta maneira, os dados s podem ser acessados apenas pelo cdigo dos mtodos. Essa propriedade de proteger os dados privados com mtodos pblicos chamada de encapsulamento. A classe ContaCorrente ficaria: class ContaCorrente { private static float dinheiroTotal; 32
private float saldo; private String nome; public ContaCorrente (String nomeDono) { nome = nomeDono; saldo = 0; } public float verificaSaldo ( ) { return saldo; } public void depositaValor (float valor) { saldo = saldo + valor; dinheiroTotal += valor; } public void retiraValor (float valor) { if (saldo >= valor) saldo = saldo valor; dinheiroTotal -= valor; } }
3.5 Herana
Chamamos de herana quando novas classes herdam propriedades (dados e mtodos) de outras classes existentes. Esse um importante recurso da orientao a objetos que permite a reutilizao de cdigo. As classes que herdam as propriedades so chamadas subclasses e a classe pai chamada superclasse. Em Java usada a palavra extends para implementar a herana. Por exemplo, digamos que temos uma classe Ponto que implemente um ponto com duas coordenadas x e y e queremos construir uma classe Ponto3D que represente um ponto tri-dimensional (com 3 coordenadas).
class Ponto { int x, y; public Ponto (int x, int y) { this.x = x; this.y = y; } public Ponto ( ) { this (-1, -1); // this tambm pode ser usado para chamar construtores } public void print ( ) { System.out.print (x +", "+ y); } } class Ponto3D extends Ponto { int z; public Ponto3D (int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public Ponto3D ( ) { this (-1, -1, -1); } } Na declarao acima, Ponto a superclasse e Ponto3D a subclasse. As variveis x e y no precisam ser declaradas em Ponto3D, pois foram herdadas de Ponto.
33
3.5.1 super
No exemplo anterior, a classe Ponto3D possui uma certa quantidade de cdigo repetido. Por exemplo, o cdigo que inicializa x e y est em ambas as classes: this.x = x; this.y = y; Nesse caso, podemos usar a declarao super que faz a chamada do mtodo construtor da superclasse. Uma verso melhorada da classe Ponto3D seria: class Ponto3D extends Ponto { int z; public Ponto3D (int x, int y, int z) { super (x, y); // chama o construtor Ponto (x, y) this.z = z; } public Ponto3D ( ) { this (-1, -1, -1); } } A referncia super tambm pode ser usada para chamar mtodos da superclasse. O super pode ser usado como uma verso do this, ao que se refere superclasse. Por exemplo, a declarao super.print ( ) significa chamar o mtodo print da superclasse da instncia this. Veja o mtodo printPonto3D abaixo: class Ponto3D extends Ponto { int z; public Ponto3D (int x, int y, int z) { super (x, y); // chama o construtor Ponto (x, y) this.z = z; } public Ponto3D ( ) { this (-1, -1, -1); } public void printPonto3D ( ) { super.print (); System.out.print (", "+z); } public static void main (String args []) { Ponto3D p3 = new Ponto3D ( ); p3.printPonto3D ( ); } }
34
A classe Ponto3D ficaria: class Ponto3D extends Ponto { int z; public Ponto3D (int x, int y, int z) { super (x, y); // chama o construtor Ponto (x, y) this.z = z; } public Ponto3D ( ) { this (-1, -1, -1); } public void print ( ) { System.out.println (\nMtodo print da classe Ponto3D); super.print ( ); System.out.print (", "+z); } public static void main (String args []) { Ponto3D p3 = new Ponto3D ( ); p3.print ( ); } } O programa acima produz o seguinte resultado:
Ponto3D
Voc pode observar que foi chamado o mtodo print da classe Ponto3D. Porm, se chamssemos um mtodo da classe Ponto que no fosse sobrescrito na classe Ponto3D (por exemplo, se no existisse o mtodo print na classe Ponto3D), automaticamente, seria chamado o mtodo da superclasse (Ponto).
35
Resultado p2.print ()
de
No mtodo main declaramos a varivel p2 como sendo do tipo Ponto e depois armazenamos nela uma referncia a uma instncia da classe Ponto3D. Quando chamamos o mtodo print( ) (p2.print ( ) ), o interpretador Java verifica que, na verdade, p2 uma instncia de Ponto3D e, portanto, chama o mtodo print da classe Ponto3D e no da classe Ponto. Observe que como Ponto a superclasse, ele pode referenciar objetos de subclasses, mas o contrrio (uma varivel do tipo Ponto3D referenciar um objeto do tipo Ponto) gera erro em tempo de compilao. Por exemplo, podemos fazer: Ponto p1 = new Ponto ( ); Ponto p2 = new Ponto3D ( ); Mas no podemos fazer: Ponto3D p3 = new Ponto ( ); Temos que usar casting se queremos que uma varivel do tipo Ponto3D receba a referncia de um objeto Ponto3D contida em uma varivel do tipo Ponto. Caso contrrio, ser gerado erro em tempo de compilao. Ponto p2 = new Ponto3D ( ); Ponto3D p4 = (Ponto3D) p2;
Regras para mtodos sobrescritos:
Um mtodo no pode ser menos acessvel que o mtodo que ele sobrescreve. No exemplo explicado anteriormente, no possvel o mtodo print da classe Ponto ser public e o da classe Ponto3D ser private. Mas, o contrrio vlido.
mtodos rea ( ) e circunferncia ( )). Porm, esses mtodos no podem ser implementados na classe Shape, pois eles tm comportamentos diferentes. Por exemplo, a rea de um tringulo diferente da rea de um quadrado. Java lida com essas situaes atravs de mtodos abstratos. Java permite definir um mtodo sem implement-lo declarando o mtodo com o modificador abstract. Um mtodo abstract no possui corpo; ele possui somente a definio da assinatura (nome, argumentos e tipo de retorno) seguida de um ponto-e-vrgula (;). Toda classe que contm pelo menos um mtodo abstract uma classe abstrata e deve ser declarada como abstract. Veja algumas regras para classes abstratas: Uma classe abstrata no pode ser instanciada. Uma subclasse de uma classe abstrata pode ser instanciada somente se implementar todos os mtodos abstratos. Se uma subclasse de uma classe abstrata no implementa todos os mtodos abstratos que herda, ento ela tambm uma classe abstrata. Mtodos static, private e final no podem ser abstratos (abstract), pois no podem ser sobrescritos na subclasse. Classes abstratas podem ter variveis e mtodos no abstratos. Assim, se a classe Shape possui os mtodos abstratos circunferncia ( ) e rea ( ), necessrio que todas as subclasses de Shape implementem estes mtodos para que possam ser instanciadas. Veja as definies destas classes no exemplo abaixo: public abstract class Shape { String cor; public abstract double area ( ); public abstract double circunference ( ); public String getType ( ) { return this.getClass().getName(); } } // da class Shape class Circle extends Shape { public static final double PI = 3.141592656358979323846; protected double r; public Circle (double r) { this.r = r; } public double getRadius () { return r; } public double area () { return PI*r*r; } public double circunference () { return 2*PI*r; } } // da class Circle class Rectangle extends Shape { protected double w, h; public Rectangle (double w, double h) { this.w = w; this.h = h; } public double getWidth () { return w; } public double getHeight () { return h; } public double area () { 37
return w*h; } public double circunference () { return 2*(w+h); } } // da class Rectangle class ClassesAbstratas { public static void main (String args []) { Shape [] shapes = new Shape [3]; shapes [0] = new Circle (2); shapes [1] = new Rectangle (1, 3); shapes [2] = new Rectangle (4.0, 2); double totalArea = 0; for (int i=0; i<shapes.length; i++) { System.out.print ("O objeto "+i+ " um "); System.out.println ("O objeto "+i+ " um "+shapes [i].getType()); // ou utilizo instanceof //if (shapes [i] instanceof Circle) System.out.println (" um Circle"); totalArea += shapes[i].area(); } System.out.println ("rea total de todos os objetos "+totalArea); } } O programa acima produz o seguinte resultado:
c:\jdk1.3\bin\java.exe ClassesAbstratas O objeto 0 um Circle O objeto 1 um Rectangle O objeto 2 um Rectangle rea total de todos os objetos 23.566370625435916
Note que uma classe abstrata implementada atravs da palavra-chave extends: class Rectangle extends Shape { A classe Rectangle no abstrata e por este motivo implementa todos os mtodos abstratos da classe Shape. Alm disso, como a classe Rectangle herda todas os mtodos e variveis da superclasse ela pode utilizar o mtodo getType( ) implementado na classe abstrata Shape.
3.9 Interfaces
abstract class so substitudas pela palavra interface.
A declarao de uma interface muito semelhante a uma classe, com a diferena de que as palavras
Uma interface, ao contrrio de uma classe abstrata, no possui nenhuma implementao, todos os mtodos so abstratos. Mesmo que o programador omita o modificador abstract, os mtodos sero considerados abstratos por default. Todos os mtodos de uma interface so pblicos, mesmo que o modificador public seja omitido. Declarar um mtodo de uma interface como private ou protected gera erro em tempo de compilao. Alm disso, como uma interface apenas uma especificao de uma classe e no uma implementao, os mtodos no podem ser final ou static. Todas as variveis declaradas em uma interface so constantes, mesmo que no possuam os modificadores static final. Alm disso, como elas so constantes, elas devem ser inicializadas. Desta maneira,
38
voc pode usar uma interface para compartilhar constantes entre vrias classes. Essa utilizao da interface poderia ser comparada como usar um arquivo de cabealho com um grande nmero de constantes em C. Uma interface declarada da seguinte maneira: interface MinhaInterface { int getSize ( ); void setSize (int param); } No possvel criar uma instncia a partir de uma interface. Primeiramente, a interface precisa ser implementada. Definimos que uma classe implementa uma interface atravs da palavra implements: class MinhaClasse implements MinhaInterface { int size; public int getSize ( ) { return size; } public void setSize (int tam) { size = tam; } } Uma classe pode ser subclasse (extends) apenas de uma classe, mas pode implementar (implements) vrias interfaces. Na declarao de uma classe que implementa vrias interfaces, os nomes das interfaces devem estar separados por vrgula (,). Alm disso, uma classe pode derivar uma nica superclasse e implementar vrias interfaces. Por exemplo: class MinhaClasse extends MinhaSuperclasse implements MinhaInterface1, MinhaInterface 2 {
A inner classe pode usar variveis e mtodos da enclosing classe. A inner classe pode ser definida como abstract. A inner classe pode ser uma interface implementada por outra inner classe. Inner classes podem ser declaradas private ou protected. Os modificadores de proteo no previnem a inner classe de acessar variveis membros de outras classes e da enclosing class. Outras classes, que no a enclosing classe, no enxergam a inner classe. Inner classes podem acessar variveis private da enclosing class. Se uma inner classe for declarada como static, ela se torna uma top-level classe e perde a capacidade de acessar variveis da enclosing class. Inner classes no podem possuir variveis membros static. Se a inner classe precisa usar uma varivel static, essa varivel deve ser declarada na enclosing class. As inner classes so mais usadas, por convenincia, para criar adaptadores de eventos. /* Cdigo adaptado da apostila da SUN SL-276 */ import java.awt.*; import java.awt.event.*; public class TestaInnerClass { private Frame f; private TextField tf; public static void main (String args []) { TestaInnerClass inner = new TestaInnerClass (); inner.inicio(); } public void inicio () { f = new Frame ("Exemplo de Inner Class"); f.add (new Label ("Clique e arraste o mouse aqui."), BorderLayout.NORTH); tf = new TextField (30); f.add (tf, BorderLayout.SOUTH); f.addMouseMotionListener (new Tratador1()); f.addMouseListener (new Tratador2()); f.setSize(300, 200); f.setVisible(true); } // A classe Tratador1 uma inner classe public class Tratador1 extends MouseMotionAdapter { public void mouseDragged (MouseEvent e) { String s = "Mouse Dragging: X = "+e.getX()+" Y = "+e.getY(); tf.setText (s); } } // da inner class Tratador1 public class Tratador2 extends MouseAdapter { public void mouseEntered (MouseEvent e) { String s = "Mouse entrou"; tf.setText (s); } public void mouseExited (MouseEvent e) { String s = "Mouse saiu"; tf.setText (s); } } // da inner class Tratador2 } // da enclosing class TestaInnerClass
String s = "Mouse Dragging: X = "+e.getX( )+" Y = "+ e.getY( ); tf.setText (s); } } ); Classes Annimas no possuem mtodos construtores. Os parmetros so repassados ao construtor da classe pai.
Java executa a coleta de lixo varrendo periodicamente a rea de memria em busca de posies que no sejam mais referenciadas. O processo de coleta de lixo uma thread de baixa prioridade. Voc no notar quando ele estiver executando.
3.13 Exerccios
Exerccio 1 Criando a conta do Joo da Silva
Implemente a classe ContaCorrente da seo 3.1.2. Implemente um mtodo print( ) que exiba na tela os dados do dono da conta corrente na classe ContaCorrente.
41
Crie uma outra classe que se chama AcessaContaJoao. No mtodo main( ), crie uma conta para o Joo da Silva com saldo = 1000. Exiba os dados da conta chamando o mtodo print(). Faa um saque de 135. Exiba novamente os dados.
Exerccio 3 Encapsulamento
Agora que voc aprendeu o conceito de encapsulamento, encapsule os atributos da classe Pessoa. Os dados devem possuir modificador private e seus valores podem ser acessados e modificados por mtodos mutator (set...) e acessor (get...).
Exerccio 4 Herana
Implemente a classe Aluno. A classe Aluno subclasse da classe Pessoa. A classe Aluno, alm de conter os dados de uma Pessoa, vai ter tambm uma nota e uma turma. Crie mtodos acessor e mutator para os atributos nota e turma. Escreva um mtodo print2() que chame o mtodo print() da classe pai (Pessoa) que ir exibir nome, data de nasc. e endereo do aluno e exiba na tela a nota e a turma do aluno. No mtodo public static void main, crie 1 objeto aluno que represente voc como aluno do curso Java. Que nota voc se d? :o) Exiba os seus dados.
Exerccio 5 Sobreposio
Na classe Aluno (criada no exerccio anterior) faa a sobreposio do mtodo print( ) da classe pai (classe Pessoa), substituindo o mtodo print2( ).
Exerccio 6 Agregao
Implemente a classe Ponto. Um ponto tem dois atributos do tipo inteiro: As coordenadas x e y. Alm disso, um ponto tambm possui os mtodos: mtodo construtor: Inicializa as coordenadas x e y com os valores passados como parmetro para o mtodo. setaCoordenadas (int x, int y): que recebe como parmetro os novos valores das coordenadas. exibe ( ): Que exibe os valores dos atributos x e y. Implemente a classe Reta. Uma Reta possui 2 atributos do tipo Ponto: o ponto inicial e o ponto final da Reta. Uma Reta possui os mtodos: mtodo construtor: recebe 4 valores inteiros e inicializa as coordenadas x e y de cada ponto. exibe( ): exibe as coordenadas x e y de cada ponto. Implemente a classe TestaReta que possui apenas o mtodo main( ). Dentro do mtodo main(): crie um objeto do tipo Reta e inicialize o Ponto Inicial com x=2, y = 3 e o Ponto Final com x=5, y=6. chame o mtodo exibe( ) da classe Reta. Neste exemplo, podemos observar uma importante propriedade da orientao a objetos que a agregao. A classe Reta tem um relacionamento do tipo agregao com a classe Ponto. Incluir objetos de classe como membros de outra classe conhecido como agregao ou composio. A agregao permite a reutilizao de cdigo. 42
43
4 Strings
String uma seqncia ou cadeia de caracteres. Java tem uma classe embutida no pacote java.lang a qual encapsula a estrutura de dados de uma string. Este pacote no precisa ser importado, j que isso realizado automaticamente. Como as strings so objetos, existem mtodos para manipul-las que permitem, entre outras coisas, comparar o contedo de duas strings, pesquisar caracteres especficos de uma string, obter seu tamanho, etc. Alm disso, o contedo das strings imutvel. Isso quer dizer que o contedo da instncia String no pode ser alterado depois que ela criada. Entretanto, uma varivel declarada como uma referncia a String pode ser alterada para apontar para um outro objeto String. Isto porque as variveis de referncia a um objeto no representam o objeto, mas sim um manipulador (handle) deste objeto.
String str2 = ;
Hewwo
4.4 Substring
Para extrair um texto de uma String, pode ser usado o mtodo substring, que retorna uma nova string com o trecho selecionado nas posies indicadas. Em Java a primeira posio de uma string zero (0). Por exemplo: String str = Hello World; H 0 String resultado = str.substring (6); e 1 l 2 l 3 o 4 5 W 6 o 7 r 8 l 9 D 10
World
No exemplo acima, a varivel resultado conter uma nova string formada por todos os caracteres a partir da posio 6 at o final da string contida na varivel str. String resultado = str.substring (3, 8) lo Wo
Nesse ultimo exemplo, a varivel resultado receber uma nova string que contm os caracteres que esto da posio 3 at a posio 8 exclusive (sem o caractere da posio 8).
45
HELLO
hello
Hello
46
O mtodo equals e o operador == fazem dois testes de igualdade totalmente diferentes. Enquanto o mtodo equals compara os caracteres dentro de uma String, o operador == compara duas referncias de objeto para ver se elas se referem exatamente mesma instncia.
retorna o ndice da ocorrncia do primeiro caractere da string World. int pos = str.lastIndexOf (World); 12
4.12 Ordem
O mtodo String compareTo (String) pode ser usado para determinar a ordem de strings: maior que, igual ou menor que. Este mtodo retorna um nmero inteiro: <0 (negativo): se a string menor do que parmetro; >0 (positivo): se a string maior que o parmetro; =0 (zero): se as strings so iguais.
O programa a seguir classifica um array de strings usando o mtodo compareTo (String) a fim de determinar a ordem de classificao usando o mtodo Bolha (bubblesort).
47
class SortString { public static void main (String args [ ]) { String arr [ ] = { Now, is, the, time, for, mem, to, come, to, aid, of, their, country }; for (int j=0; j<arr.length; j++) { for (int i=j+1; i<arr.length-1; i++) if (arr[i].compareTo(arr[j])<0) { String t = arr [j]; arr[j] = arr[i]; arr[i] = t; } System.out.println (arr[j]); } // do for } // da main } // da class O resultado deste programa a lista de strings classificadas por ordem alfabtica.
c:\>java SortString Now aid all come country for good is mem of the their time to to
Como voc deve ter percebido no resultado deste exemplo, o mtodo compareTo considera letras maisculas e minsculas. A palavra Now veio antes de todas as outras porque comea com letra maiscula que tem um valor menor no conjunto de caracteres ASCII. Isso ocorre porque esse mtodo compara os valores UNICODE dos caracteres das strings. Para a comparao de mtodos ignorando letras em maiscula e minscula usar o mtodo compareToIgnoreCase (String). Para criar rotinas de busca e ordenamento de texto em linguagem natural ver classe Collator (package java.text). Essa classe realiza comparao de String locale-sensitive. Por exemplo, permite comparar palavras no diferenciando palavras acentuadas de no acentuadas.
De String para inteiro: int i = Integer.parseInt (String); De String para long: long l = Long.parseLong (String); De String para double: double d = Double.parseDouble (String);
4.16 StringTokenizer
Para quebrar uma string em tokens (conjunto de caracteres separado por algum caractere delimitador pr-definido) devemos utilizar a classe StringTokenizer. Essa classe pode ser empregada, por exemplo, na migrao de dados em um arquivo texto para banco de dados. O exemplo abaixo ilustra o uso da classe StringTokenizer para separar tokens de uma string. Este exemplo usa o mtodo construtor que separa os tokens com delimitadores default que so: tab, nova linha, carriage-return, form-feed. import java.util.*; class BuscaPalavrasEmUmaString { public static void main (String args[ ]) { String texto = "Isto um texto de teste"; // usando delimitadores default StringTokenizer st = new StringTokenizer (texto); // usando # como delimitador // StringTokenizer st = new StringTokenizer (texto, #); while (st.hasMoreTokens( )) { String palavra = st.nextToken(); System.out.println (palavra); } } }
4.17 Exerccios
Exercicio 1 StringTokenizer
Faa um programa que busca palavras por palavra dentro de um texto e as imprima em maiscula. Considere um texto uma string inicial.
49
Faa um programa que gere frases aleatoriamente. Uma frase formada por uma combinao de um artigo + um substantivo + um verbo + uma preposio + um artigo + um substantivo, sendo que seus valores so lidos de arrays de String. As arrays devem ser povoadas com os seguintes valores: String String String String artigo [] = {"o", "a", "um", "uma", "algum", "qualquer"}; substantivo [] = {"menino", "menina", "cachorro", "cidade", "carro"}; verbo [] ={"dirigiu", "pulou", "correu", "caminhou", "saltou"}; preposicao [] = {"para", "de", "acima de", "debaixo de", "sobre"};
Para formar uma frase, o programa deve escolher randomicamente um elemento da respectiva array. O texto deve gerar 10 frases diferentes. Dica: Para gerar randomicamente um numero inteiro use o mtodo nextInt(int) da classe Random. Como a classe Random pertence ao pacote java.util, voc deve import-lo. Voc deve fornecer um parmetro inteiro para o mtodo que o valor mximo que pode ser gerado. Por exemplo, se voc fornecer 5, ele vai gerar um nmero entre 0 (inclusive) e 5 (exclusive).
50
5 Arrays
Arrays so grupos de variveis do mesmo tipo. As arrays podem armazenar variveis de qualquer tipo (tipo de dado primitivo ou objetos), mas importante lembrar que todos os valores devem ser de um nico tipo de dado. Em Java arrays so implementadas como objetos, por isso usamos o operador new para instanciar uma nova array. Os colchetes ([ ]) so usados para declarar um tipo array.
Um array pode ser inicializado automaticamente da mesma forma que os tipos simples. A inicializao de um array feita por um conjunto de expresses separadas por vrgula (,) e entre chaves ({ }). O array ser
51
criado com tamanho suficiente para conter o nmero de elementos inicializados. O array do cdigo acima poderia tambm ser inicializado da seguinte maneira: class Array { public static void main (String args [ ]) { int diaMes [ ] = {31, 28, 31, 30 }; System.out.println (Janeiro tem + diaMes[0] + dias.); } // do main } // da class O programa acima ter sada idntica ao anterior.
52
No possvel redimensionar um array, mas apenas elimin-la da memria e criar uma nova instncia. Por exemplo, int v[4] = {0, 1, 2, 3}; //criando um array de 4 posies e inicializado v = new int [2]; // fazendo com que v aponte para um novo array de 2 posies Assim, quando fizemos v anteriormente. = new int [2], perdemos todos os valores armazenados
53
int m [ ] [ ] = { {0, 1, 2, 3} , {4, 5, 6, 7}, {8, 9, 10, 11}; {12, 13, 14, 15} }; Uma outra forma de inicializar uma matriz atribuir um valor para cada posio da matriz. Por exemplo: m [0] [0] = 0; m[0] [1] = 1; m [0] [2] = 2; Quando queremos atribuir um mesmo valor para todos os elementos de uma matriz, podemos usar um lao for: for (int i =0; i<m.length; i++) for (int j=0; j<m[i].length; j++) m [i] [j] = 0; Como um array multidimensional um array de array, podemos determinar tamanhos diferentes. Por exemplo: int mat [ ] [ ] = new int [2] [ ]; mat [0] = new int [4]; mat [1] = new int [3];
0 1 0 1 2 3
Ou podemos usar um lao for para otimizarmos essa tarefa: for (int i=0; i<d.length; i++) d [i] = new Data ( );
5.8 Exerccios
Exerccio 1 - Array de Alunos (Dificuldade Fcil)
Faa uma classe que contenha apenas um mtodo main( ). Nesse mtodo crie uma array de 5 posies do tipo Pessoa. Crie um objeto do tipo Aluno para cada posio da array. Especifique um nome, um endereo, uma data de nascimento, uma nota e uma turma para cada aluno. Imprima os dados de todos os alunos utilizando um lao for.
54
6 Vector
Em Java possvel criar um array que armazene elementos de tipos de objetos diferentes usando a classe Vector do pacote java.util. Por exemplo, eu posso armazenar um objeto do tipo Data na posio 0 (zero) e do tipo Pessoa em outra posio.
55
56
importante ressaltar que um objeto Vector s armazena objetos e no armazena tipos primitivos de dados. Para armazenar um tipo primitivo de dado (int, char, boolean, long, short, byte, double) necessrio armazenar seus valores em wrappers (Long, Double, Float, Short, Integer, Character, Byte).
Para entender melhor essa seo, implemente a classe a seguir. Esta classe manipula os elementos de um Vector. class ObjetoVetor { public static void main (String args [ ]) { Vector v = new Vector ( ); Float f = new Float (32.0f); v.addElement (f); Integer i = new Integer (12); v.adElement (i); Float f = (Float) v.elementAt (0); Integer i = (Integer) v.elementAt (1); System.out.println (v [0] = +f.toString()); System.out.println (v [1] = +i.toString()); } // do main } // da class A sada ser a impresso dos valores armazenados:
6.10 Exerccios
Exerccio 1 Vector de Alunos
Refaa o exerccio 1 do captulo sobre array (Array de alunos) utilizando a classe Vector. No esquea de importar o pacote java.util.*;
57
Tag @see
@author @param @throws @return
Significado
utilizado para especificar uma nota SeeAlso utilizado para especificar uma nota Autor Descreve um parmetro de um mtodo Especifica as excees disparadas por este mtodo, um @throws deve ser fornecido para cada exceo disparada pelo mtodo Especifica uma nota Returns na documentao em HTML
Por exemplo: import java.lang.*; /** Esta classe exemplifica um programa com comentrios de documentao @see <a href="C:\jdk1.3\docs\api\java\io\File.html">java.io.File</a> @author Patricia Jaques @version %1.2% */ public class JavaDoc { /** <pre> Retorna o caractere no ndice especificado. * O valor do ndice pode variar de <code>0</code> a <code>length() - 1</code>. </pre> * @param index o ndice do caractere desejado. * @return o caractere desejado. * @exception StringIndexOutOfRangeException * se o ndice no possui valor entre <code>0</code> e </code>length()-1</code>. */ public char charAt(int index) { } Para documentar um cdigo fonte Java, use o comando: javadoc author -version JavaDoc.java Nas figuras abaixo, podemos ver uma das pginas HTML de documentao (viso Class) gerada pela ferramenta JavaDoc.
...
58
59
Component
Button Canvas
Container
Window
Font
FlowLayout FontMetrics
Frame Dialog
Scrollbar
TextComponent
Graphics
GridBagConstraints GridBagLayout Image Insets Point Polygon Rectangle Toolkit MenuComponent
MenuBar MenuItem
Menu CheckboxMenuItem
8.1 Frame
Um frame normalmente visto como uma janela, com opes de minimizar, maximizar e fechar. Em uma aplicao stand-alone, os objetos de interface grfica devem estar em um Frame para que possam ser visualizados. Um applet pode criar um Frame, porm este aparecer com uma faixa Untrusted Java Applet Window. Para aplicaes stand-alone, essa mensagem no aparece. Veja o exemplo abaixo: 60
import java.awt.*; public class FrameDemo { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); f.setSize (200, 200); f.setVisible (true); } }
8.2.1 FlowLayout
O gerenciador FlowLayout posiciona os objetos linha por linha, centralizados na janela. Quando uma linha preenchida, ele inicia uma nova linha. O FlowLayout possui trs mtodos construtores: FlowLayout ( ); FlowLayout (int align); FlowLayout (int align, int hgap, int vgap); O parmetro align permite especificar um novo alinhamento para os objetos. Os valores possveis para este parmetro so: FlowLayout.LEFT: Alinhamento esquerda; FlowLayout.CENTER: Alinhamento centralizado; FlowLayout.RIGHT: Alinhamento direita; Alm disso, os parmetros hgap e vgap permitem especificar o espaamento horizontal e vertical entre os objetos em pixel. O cdigo abaixo insere quatro botes em um Frame com layout FlowLayout. import java.awt.*; class GerenciadorFlowLayout { public static void main (String args[]) { Frame f = new Frame (); FlowLayout layout = new FlowLayout (FlowLayout.LEFT); f.setLayout (layout); Button b1 = new Button ("um"); Button b2 = new Button ("dois"); Button b3 = new Button ("trs"); Button b4 = new Button ("quarto"); f.add (b1); f.add (b2); f.add (b3); f.add (b4); f.pack(); f.setVisible (true); } } 61
8.2.2 BorderLayout
O gerenciador BorderLayout divide o Container em cinco reas e adiciona os objetos de forma a ocupar inteiramente cada uma dessas reas. North
West South
Center
East
Java organiza as reas North, South, West e East em funo do tamanho dos seus componentes. O objeto adicionado na rea Center ter o tamanho da rea restante. No BorderLayout quando o Frame redimensionado, os objetos tambm so redimensionados. Isto no acontece no FlowLayout. Para adicionar componentes ao objeto, use o mtodo: add (Component, String rea); O programa a seguir cria um Frame com cinco botes e com gerenciador BorderLayout. import java.awt.*; class GerenciadorBorderLayout { public static void main (String args[]) { Frame f = new Frame (); BorderLayout layout = new BorderLayout (); f.setLayout (layout); Button b1 = new Button ("North"); Button b2 = new Button ("Center"); Button b3 = new Button ("South"); Button b4 = new Button ("West"); Button b5 = new Button ("East"); f.add (b1, BorderLayout.NORTH); f.add (b2, BorderLayout.CENTER); f.add (b3, BorderLayout.SOUTH); f.add (b4, BorderLayout.WEST); f.add (b5, BorderLayout.EAST); f.setSize (200, 100); f.setVisible (true); } } Alm disso, possvel adicionar espaos entre os componentes. Para tanto necessrio chamar o seguinte mtodo construtor do BorderLayout: BorderLayout (int hgap, int vgap); Onde hgap e vgap determinam o espaamento horizontal e vertical, em pixels, entre os componentes. Por exemplo, para colocar espao entre os componentes no cdigo acima necessrio modificar a linha oito (8) do cdigo por: BorderLayout layout = new BorderLayout (20, 20);
62
8.2.3 GridLayout
O GridLayout organiza os componentes em uma grade imaginria. Pode ser usado um dos dois mtodos construtores: GridLayout (int rows, int cols); GridLayout (int rows, int cols, int hgap, int vgap); Os parmetros rows e cols especificam o nmero de linhas e colunas da grade. Os parmetros hgap e
O programa abaixo cria um Frame com cinco botes e layout BorderLayout. import java.awt.*; class GerenciadorGridLayout { public static void main (String args[]) { Frame f = new Frame (); GridLayout layout = new GridLayout (2, 2); // GridLayout layout = new GridLayout (2, 2, 10, 10); espaamento f.setLayout (layout); Button b1 = new Button ("um"); Button b2 = new Button ("dois"); Button b3 = new Button ("trs"); Button b4 = new Button ("quatro"); Button b5 = new Button ("cinco"); f.add (b1); f.add (b2); f.add (b3); f.add (b4); f.add (b5); f.pack(); f.setVisible (true); } }
-> com
8.2.4 CardLayout
O CardLayout permite alternar entre vrias janelas, onde exibida uma nica janela de cada vez. Para criar um objeto CardLayout pode ser usado um dos seguintes mtodos construtores: CardLayout (); CardLayout (int hgap, int vgap); No CardLayout hgap e vgap especificam a distncia horizontal e vertical entre o componente exibido e as bordas do Frame ou Panel. Para adicionar componentes, isto , pginas ao CardLayout, usado o mtodo add da classe Container: add (String nomeDaPagina, Component comp); Para visualizar uma nova pgina, voc deve usar o mtodo show da classe CardLayout: show (Container container, String nome); Onde frame o container (Frame, Panel ou Applet) e nome o nome da pgina a ser exibida. Para entender melhor o funcionamento do CardLayout, veja o exemplo a seguir: import java.awt.*;
63
import java.io.*; class GerenciadorCardLayoutSimples { public static void main (String args[]) { Frame f = new Frame (); CardLayout layout = new CardLayout (); Panel p1 = new Panel (); p1.setBackground (Color.yellow); Panel p2 = new Panel (); p2.setBackground (Color.blue); Panel p3 = new Panel (); p3.setBackground (Color.green); f.setLayout (layout); f.add (p1, "Um"); f.add (p2, "Dois"); f.add (p3, "Trs"); f.setSize (300, 100); f.setVisible(true); while (true) { String str = Console.read ("Digite o nome do Panel que voc quer ver: "); int i = Integer.parseInt (str); if (i==1) layout.show (f, "Um"); else if (i==2) layout.show (f, "Dois"); else if (i==3) layout.show (f, "Trs"); else if (i==4) layout.previous (f); // mostra pgina anterior else if (i==5) layout.next (f); // mostra prxima pgina else System.exit (0); // finaliza execuo } } } class Console { public static String read (String str) { InputStream in = System.in; InputStreamReader is = new InputStreamReader (in); BufferedReader console = new BufferedReader (is); System.out.print (str); String ret = null; try { ret = console.readLine (); } catch (IOException e) { ret = "<" + e + ">"; } return ret; } } // da class
8.2.5 GridBagLayout
O GridBagLayout permite que interfaces com layouts mais complexos sejam construdas. O GridBagLayout, assim como o GridLayout, divide a interface em uma grade, porm permite que um componente ocupe o tamanho desejado na clula, ao invs de ocupar a clula inteira. O GridBagLayout tambm permite que um nico componente ocupe mais de uma clula. Para utilizar o GridBagLayout voc deve primeiramente criar um objeto GridBagLayout atravs do construtor e defini-lo como gerenciador de layout: GridBagLayout gbLayout = new GridBagLayout (); setLayout (gbLayout); Aps, voc deve criar um objeto GridBagConstraints que contm vrios campos que so utilizados para especificar a geometria de cada componente e a relao com os outros componentes no GridBaglayout. 64
Tendo feito isso, voc deve definir os campos GridBagConstraints para cada componente no GridBagLayout e aplica-los ao layout utilizando o mtodo setConstraints do GridBagLayout: Aps isso, o objeto ser adicionado ao container com o mtodo add. Frame f = new Frame (); GridBagLayout gbLayout = new GridBagLayout (); f.setLayout (gbLayout); GridBagConstraints constraints= new GridBagConstraints (); Button b1 = new Button (Boto 1); constraints.anchor = GridBagConstraints.CENTER; gbLayout.setConstraints (b1, constraints); f.add (b1);
a) gridx e gridy
Os campos gridx e gridy especificam a posio da linha e da coluna a partir do canto superior esquerdo. Por exemplo, gridx=2 e gridy=1 determinam que este componente ir ocupar uma posio na terceira coluna e na segunda linha. Isto porque a indexao comea a partir do zero.
gridx=2 gridy=1
gridwidth=3 gridheight = 2
Alm de especificar um valor inteiro para gridx e gridy, possvel especific-los como GridBagConstraints.RELATIVE (valor default), o que faz com que o gerenciador de layout os coloque a direita (para gridx) ou abaixo do objeto adicionado anteriormente (gridy).
b) gridwidth e gridheight
Os campos gridwidth e gridheight especificam o nmero de clulas que o componente ir ocupar na linha e na coluna. O valor default 1. Use GridConstraints.REMAINDER para determinar que este o ltimo componente na linha (gridwidth) ou na coluna (gridheight). Use GridConstraints.RELATIVE para informar que este componente o prximo aps a linha (gridwidth) ou coluna (gridheight) do ltimo componente colocado.
c) weightx e weighty
Os campos weightx e weighty determinam como o gerenciador de layout distribui os espaos adicionais ente os componentes. Um valor maior significa que o componente obtm uma participao no espao. O valor zero (valor default) determina que o componente no obtm espao adicional. O espao restante colocado entre a grade e as bordas do container. Os valores podem variar entre 0 e 100.
d) fill
O campo fill redimensiona os componentes para preencher a rea de exibio do componente. Pode ter um dos seguintes valores:
65
Efeito No redimensiona para preencher. Este o valor default. Estica para preencher horizontalmente. Estica para preencher verticalmente. Estica para preencher horizontal e verticalmente.
e) anchor
O campo anchor especifica a posio do objeto na rea de exibio. Os valores podem ser:
Valor GridBagConstraints.CENTER GridBagConstraints.SOUTHEAST GridBagConstraints.NORTHWEST GridBagConstraints.EAST GridBagConstraints.WEST GridBagConstraints.NORTHEAST GridBagConstraints.SOUTHWEST GridBagConstraints.NORTH GridBagConstraints.SOUTH Centro Em cima e esquerda Em baixo e direita esquerda direita Em cima e esquerda Em baixo e a direita Em cima Ao sul Efeito
f) Insets
O campo insets adiciona um espaamento externo ao objeto. Ele no aumenta o tamanho do componente, mas apenas aumenta o tamanho da rea de exibio (clulas) onde ele est contido. Podem ser especificados espaamentos superior, inferior, esquerdo e direito. GridBagConstraints constraints = new GridBagConstraints (); constraints.insets.top = 10; // superior constraints.insets.bottom=20; // inferior constraints.insets.left=5; // esquerda constraints.insets.right=40; // direita
import java.awt.*; class GridBagLayout { public static void main (String args []) { Frame f = new Frame (); GridBagLayout layout= new GridBagLayout (); f.setLayout (layout); Button b1 = new Button ("Boto 1"); Button b2 = new Button ("Boto 2"); Button b3 = new Button ("Boto 3"); Button b4 = new Button ("Boto "); Button b5 = new Button ("Boto 5"); Button b6 = new Button ("Boto 6"); Button b7 = new Button ("Boto 7"); Button b8 = new Button ("Boto 8"); Button b9 = new Button ("Boto 9"); Button b10 = new Button ("Boto 10"); GridBagConstraints constraints = new GridBagConstraints (); constraints.weightx = 100; constraints.fill = GridBagConstraints.BOTH; layout.setConstraints (b1, constraints); layout.setConstraints (b2, constraints); layout.setConstraints (b3, constraints); constraints.gridwidth = GridBagConstraints.REMAINDER; // fim da linha layout.setConstraints (b4, constraints); layout.setConstraints (b5, constraints); 66
constraints.gridwidth = GridBagConstraints.RELATIVE; /* em baixo do ltimo componente adicionado */ layout.setConstraints (b6, constraints); constraints.gridwidth = GridBagConstraints.REMAINDER; // fim da linha layout.setConstraints (b7, constraints); constraints.gridwidth = 100; constraints.gridheight = 2; // ocupar duas linhas constraints.weighty = 100; layout.setConstraints (b8, constraints); constraints.gridwidth = GridBagConstraints.REMAINDER; // fim da linha constraints.gridheight = 1; constraints.weighty = 100; layout.setConstraints (b9, constraints); layout.setConstraints (b10, constraints); f.add (b1); f.add (b2); f.add (b3); f.add (b4); f.add (b5); f.add (b6); f.add (b7); f.add (b8); f.add (b9); f.add (b10); f.pack (); f.setVisible (true); } } Os campos weightx e weighty so usados para determinar quais componentes teriam seus tamanhos alterados em altura e largura quando o frame fosse redimensionado. Se deixssemos em comentrio estas linhas, quando o frame fosse redimensionado, o tamanho dos componentes no seria alterado e o espao resultante seria colocado entre a grade e as bordas do Frame. Veja como ficaria na figura abaixo:
67
O mtodo setBounds usado para determinar o tamanho e localizao do objeto: setBounds (int x, int y, int width, int height); Onde: x: A coordenada x deste componente em pixels. y: A coordenada y deste componente em pixels. width: A largura deste componente em pixels. height: A altura deste componente em pixels.
import java.awt.*; class SemGerenciadorLayout { public static void main (String args []) { Frame f = new Frame ("Sem layout"); f.setLayout (null); Button b1 = new Button ("Boto 1"); Button b2 = new Button ("Boto 2"); Button b3 = new Button ("Boto 3"); b1.setBounds (3,23, 60, 30); b2.setBounds (63, 53, 60, 30); b3.setBounds (123, 83, 60, 30); f.add (b1); f.add (b2); f.add (b3); f.setSize (250, 150); f.setVisible (true); } }
8.4 Panel
Muitas vezes, necessrio separar o frame em reas para adicionar outros objetos, onde, em cada uma dessas reas, estariam um conjunto de objetos grficos (botes, label, etc). Podemos fazer isso com um Panel. O Panel, como os Frames, permite que outros objetos sejam adicionados nele. Em uma aplicao stand-alone, um Panel, ou vrios Panels, devem estar contidos em um Frame. import java.awt.*; public class FrameComPanel { public static void main (String args []) { Frame frame = new Frame ("Frame Com Panel"); Panel panel = new Panel (); Button botao1 = new Button ("Boto1 no Panel"); Button botao2 = new Button ("Boto2 no Panel"); Button botao3 = new Button ("Boto3 no Frame"); frame.setLayout (new BorderLayout ()); panel.setLayout (new FlowLayout()); panel.add (botao1); panel.add (botao2); frame.add (panel, BorderLayout.CENTER); frame.add (botao3, BorderLayout.SOUTH); frame.pack(); frame.setVisible (true); } }
68
Observe que como a classe tratadora do evento tem que implementar um Listener que uma interface, necessrio que todos os mtodos sejam declarados, mesmo que no usados. Por exemplo, a interface WindowListener responsvel por tratar os eventos da janela do Frame. Cada um dos seus mtodos tem uma determinada funo. Para tratar o evento de fechar a janela (boto fechar do frame), usamos o mtodo windowClosing que chamado pela JVM quando a janela do frame a qual ele est associado est se fechando. Para cada um dos tipos de componentes (boto, label, etc) existe um Listener que captura os eventos deste tipo de objeto. Na tabela a seguir eles so demonstrados. Na coluna Categoria est o nome dos componentes que ele captura os eventos. Na coluna nome da interface, encontra-se o nome do Listener. Na coluna Mtodos, encontram-se os nomes dos mtodos desta interface que devem ser implementados pela classe tratadora. Na ltima coluna est especificado o nome do mtodo que permite associar um tratador a este componente.
69
Categoria Button Label, List, Menu, TextField CheckBox CheckboxMenuItem Choice, Label, List
Usado para capturar teclas KeyListener keyPressed(KeyEvent) digitadas. (Pode ser associado a keyReleased(KeyEvent) qualquer objeto seja keyTyped(KeyEvent) subclasse de um Component) Trata eventos de pressionar MouseListener o Mouse. (Pode ser associado a qualquer objeto seja subclasse de um Component) mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mouseClicked(MouseEvent)
addMouseListener (MouseListener)
Trata eventos de MouseMotionListener mouseDragged(MouseEvent) movimentao do Mouse. (Pode ser associado a mouseMoved(MouseEvent) qualquer objeto seja subclasse de um Component) TextArea TextField Frames TextListener WindowListener textValueChanged(TextEvent) windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent)
Cada um destes listeners ser demonstrado juntamente com os componentes que sero vistos.
8.6 Adaptadores
Voc deve ter observado que para tratar o evento de fechar a janela, ns tivemos que definir um Listener para o Frame: WindowHandler. Para captar os eventos de janela, esta classe tem que implementar a interface WindowListener. Quando uma classe implementa uma interface, temos que implementar todos os mtodos definidos nesta interface. Embora tenhamos apenas usado o mtodo windowClosing, tivemos que implementar todos os outros mtodos definidos na Interface WindowListener. Caso contrrio, seria gerado um erro de compilao. Para nos poupar esse trabalho, Java implementa estas classes, so os adaptadores. Desta maneira, ao invs da nossa classe tratadora de eventos implementar uma interface Listener, ela vai derivar uma classe adaptadora. Porm, como Java no permite herana mltipla, a classe tratadora pode derivar um nico adaptador e implementar as demais interfaces. O exemplo anterior ficaria: import java.awt.*; import java.awt.event.*; public class FrameComEvento { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); WindowHandler handler = new WindowHandler ();
70
f.addWindowListener (handler); f.setSize (200, 100); f.show (); } } class WindowHandler extends WindowAdapter { public void windowClosing (WindowEvent e) { System.exit (0); } }
Interface ActionListener ItemListener KeyListener MouseListener MouseMotionListener TextListener WindowListener Adaptador No h adaptador para esta interface, pois s possui um mtodo. No h adaptador para esta interface, pois s possui um mtodo. KeyAdapter MouseAdapter MouseMotionAdapter No h adaptador para esta interface, pois s possui um mtodo. WindowAdapter
8.7 Label
A classe Label permite desenhar uma string em um campo no editvel. Os mtodos mais usados deste componente so: setForeground (Color c) define cores da string. Algumas opes para cor so: Color.blue, Color.green, Color.magenta, Color.black. setBackground (Color c) permite definir a cor de fundo do label.
import java.awt.*; class LabelDemo { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); Label label = new Label ("MinhaLabel", Label.CENTER); label.setForeground (Color.blue); label.setBackground (Color.white); f.add (label); f.pack (); f.show (); } }
71
Estilo
Itlico Voc pode ainda usar uma combinao de dois estilos, por exemplo, negrito e itlico.
Java define cinco nomes de fontes independentes de plataforma, que voc pode usar: Courier, Dialog, Helvetica, Times New Romam e Symbol. Quando um programa usa uma fonte, Java transforma a fonte em uma fonte dependente de plataforma. Por exemplo, a fonte Helvetica transformada em Arial no Windows. Voc pode definir uma fonte diferente destas cinco que so padro. Se a fonte no existir no sistema operacional que sua aplicao est rodando, Java a substitui por uma outra automaticamente. Vejamos agora, como fica o nosso Label com uma fonte TimesRomam, em negrito e itlico e com tamanho 18. import java.awt.*; class FontDemo { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); Label label = new Label ("MinhaLabel", Label.CENTER); label.setForeground (Color.blue); label.setBackground (Color.white); Font font = new Font ("TimesRoman", Font.BOLD + Font.ITALIC, 18); label.setFont (font); f.add (label); f.pack (); f.show (); } } possvel obter uma lista com o nome de todos os objetos do tipo Font disponveis. O trecho do cdigo retorna um array composto pelos objetos Font disponveis em Java. Veja o cdigo abaixo: import java.awt.*; class TodasAsFontes { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); String fontes[] = f.getToolkit().getFontList (); int nroFont = fontes.length; f.setLayout (new GridLayout (nroFont, 1)); for (int i=0; i<nroFont; i++) { Label label = new Label (fontes[i], Label.CENTER); label.setForeground (Color.blue); label.setBackground (Color.cyan); Font fonte = new Font (fontes[i], Font.PLAIN, 12); label.setFont (fonte); f.add (label); } f.pack (); f.show (); } } Voc observou que definimos as cores do Label com os mtodos: setForeground: define cor do texto; setBackground: define cor de fundo. Como padro, existem as seguintes opes de cores:
Color.black Color.green Color.red Color.blue Color.lightGray Color.white Color.cyan Color.magenta Color.yellow Color.darkGray Color.orange Color.gray Color.pink
72
possvel ainda definir uma nova cor, conhecendo os seus valores RGB. Nesse caso, necessrio criar um objeto do tipo Color: Color minhaCor = new Color (int r, int g, int b); ou Color minhaCor = new Color (int rgb);
Entendendo a classe Toolkit A classe Toolkit uma classe abstrata que voc pode usar para obter informaes sobre seu sistema, tais como as fontes disponveis, a resoluo e o tamanho da tela. Para acessar o objeto Toolkit , o container (Frame ou applet) deve chamar a funo getDefaultToolkit() que retorna um objeto Toolkit. Alm da funo getFontList() do Toolkit, possvel usar as funes getScreenResolution(), que retorna a resoluo da tela e getScreenSize, que retorna um objeto do tipo Dimension, cujas variveis membros contm largura e a altura da tela.
8.9 Button
Um Button um componente que pode ser usado para invocar alguma ao quando o usurio o pressiona e solta. Um Button rotulado com uma String que sempre centralizada no button. import java.awt.*; import java.awt.event.*; class ButtonDemo { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); Button button = new Button ("Meu Boto"); button.addActionListener (new TratadorDeBotao()); f.add (button); f.pack(); f.show (); } } class TratadorDeBotao implements ActionListener { public void actionPerformed (ActionEvent e) { String str = e.getActionCommand(); if (str.equals ("Meu Boto")) System.out.println ("Boto pressionado."); } }
8.10 Checkbox
Checkbox so objetos associados a um texto disponibilizados para o usurio fazer uma seleo do tipo on/off com o mouse. import java.awt.*; import java.awt.event.*; class CheckBox { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); Checkbox cb1 = new Checkbox ("Windows"); Checkbox cb2 = new Checkbox ("Solaris"); Checkbox cb3 = new Checkbox ("Mac"); CheckboxHandler handler = new CheckboxHandler(); cb1.addItemListener (handler); cb2.addItemListener (handler); 73
cb3.addItemListener (handler); f.setLayout (new FlowLayout ()); f.add (cb1); f.add (cb2); f.add (cb3); f.pack (); f.show (); } } class CheckboxHandler implements ItemListener { public void itemStateChanged (ItemEvent e) { String nomeItem = e.getItem ().toString(); String estado = "desabilitado"; if (e.getStateChange ()==ItemEvent.SELECTED) estado = "habilitado"; System.out.println (nomeItem + " foi "+estado); } }
8.11 CheckboxGroup
Quando desejamos que o usurio possa escolher apenas uma das opes de CheckBox, associamos a estes um CheckboxGroup. A aparncia dos objetos ir mudar para um radio button. Para associar um checkbox a um CheckboxGroup, voc pode usar o seguinte construtor: Checkbox (String label, CheckboxGroup nomeGrupo, boolean state); O parmetro label especifica o nome do Checkbox, o nomeGrupo especifica o objeto do tipo CheckboxGroup e state determina o estado inicial, que true para ficar habilitado e false caso contrrio. import java.awt.*; import java.awt.event.*; class CheckBoxGroup { public static void main (String args []) { Frame f = new Frame ("CheckboxGroup"); CheckboxGroup group = new CheckboxGroup (); Checkbox cb1 = new Checkbox ("Windows", group, true); Checkbox cb2 = new Checkbox ("Solaris", group, true); Checkbox cb3 = new Checkbox ("Mac", group, false); CheckboxHandler handler = new CheckboxHandler(); cb1.addItemListener (handler); cb2.addItemListener (handler); cb3.addItemListener (handler); f.setLayout (new FlowLayout ()); f.add (cb1); f.add (cb2); f.add (cb3); f.pack (); f.show (); } }
8.12 Choice
O choice permite escolher um valor de uma lista de valores. import java.awt.*; import java.awt.event.*; class ChoiceDemo { public static void main (String args []) { Frame f = new Frame ("Choice"); 74
Choice c = new Choice (); c.addItem ("Primeiro"); c.addItem ("Segundo"); c.addItem ("Terceiro"); CheckboxHandler handler = new CheckboxHandler(); c.addItemListener (handler); f.setLayout (new FlowLayout ()); f.add (c); f.pack (); f.show (); } }
Mtodo add(String tx) insert(String tx, int pos) int getItemCount() int getSelectedIndex() remove(int pos) removeAll() select(int pos) String getItem(int pos) String getSelectedItem(); adiciona a String tx no final da lista. adiciona a String tx na posio pos. obtm a quantidade de itens na lista. retorna ndice do elemento selecionado. remove elemento da posio pos. remove todos os elementos da lista. seleciona item na posio pos. retorna o item na posio pos. retorna nome do elemento selecionado na lista. Descrio
8.13 Canvas
Um Canvas prov um espao colorido para desenhar, escrever texto, ou receber entrada do teclado ou do mouse.
import java.awt.*; import java.awt.event.*; class MeuCanvas { public static void main (String args []) { Frame f = new Frame ("Meu Canvas"); Canvas canvas = new Canvas (); Label label = new Label ("Label"); f.add (canvas, BorderLayout.CENTER); f.add (label, BorderLayout.SOUTH); CanvasHandler handler = new CanvasHandler (canvas, label); canvas.addMouseMotionListener (handler); canvas.addKeyListener (handler); f.setSize (300, 100); f.setVisible (true); } } class CanvasHandler implements KeyListener, MouseMotionListener { Canvas canvas; Label label; String s = ""; public CanvasHandler (Canvas canvas, Label label) { this.canvas = canvas; this.label = label; } public void keyTyped (KeyEvent e) { s += String.valueOf (e.getKeyChar ());
75
canvas.getGraphics().drawString (s, 20, 20); } public void keyPressed (KeyEvent e) { } public void keyReleased (KeyEvent e) { } public void mouseMoved (MouseEvent e) { int x = e.getX (); int y = e.getY (); String coord = "x="+x+ " y="+y; label.setText (coord); } public void mouseDragged (MouseEvent e) { } }
8.14 TextField
O TextField uma nica linha editvel de texto. possvel associar um ActionListener a este objeto para informar quando o boto Enter ou Return foi pressionado. O mtodo e.getActionCommand() da classe ActionEvent retorna a string contida no TextField. import java.awt.*; import java.awt.event.*; class TextFieldDemo { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); TextField tf = new TextField ("Texto Inicial"); tf.addActionListener (new TratadorDeTextField ()); f.add (tf); f.pack (); f.show (); } } class TratadorDeTextField implements ActionListener { public void actionPerformed (ActionEvent e) { String str = e.getActionCommand(); System.out.println (str); } } Para manipulao do texto contido em um TextField existem os mtodos:
Mtodo boolean echoCharIsSet ( ) boolean isEditable( ) char getEchoChar( ) int getCaretPosition( ) select (int posI, int posF) selectAll( ) set caretPosition(int) setEchoChar( ) setEditable(boolean) setText(String) String getSelectedText( ) String getText() Descrio retorna true se existe um caractere de echo setado. Caractere de echo um caractere que ir aparecer no TextField no lugar do caractere digitado. Esse recurso usado para textfield que pegam senhas. retorna true se o componente editvel e false caso contrrio. retorna caractere de eco retorna posio do cursor. seleciona texto do TextField a partir da posio posI at a posio posF (exclusive). Primeira posio zero. seleciona todo texto do TextField. coloca o cursor na posio determinada. Posio inicial zero. seta caractere de eco. especifica se o componente editvel (true) ou no. atribui uma string a um TextField. retorna texto selecionado no TextField. retorna o texto contido em um TextField em uma String.
76
8.15 TextArea
Um TextArea um campo editvel de mltiplas linhas e colunas. Voc pode criar um TextArea com o construtor: TextArea (String texto, int linhas, int colunas); Onde texto o texto inicial que vai ser exibido no TextArea e linhas e colunas o nmero de linhas e colunas da rea de exibio do TextArea. O TextArea exibe, por default, barras de rolagem vertical e horizontal. A exibio ou no de barras de rolagem pode ser determinada somente no mtodo construtor, ou seja, no pode ser modificada aps a construo do componente. Para tanto pode ser usado o construtor: TextArea (String texto, int linhas, int colunas, int scrollbars); Onde scrollbars pode ser uma das seguintes constantes: TextArea.SCROLLBARS_BOTH: com barra de rolagem horizontal e vertical. TextArea.SCROLLBARS_NONE: sem barra de rolagem. TextArea.SCROLLBARS_VERTICAL_ONLY: apenas com barra de rolagem vertical. TextArea.SCROLLBARS_HORIZONTAL_ONLY: apenas com barra de rolagem horizontal. No TextArea, pressionar o boto Enter gera o caractere de nova linha. Portanto, nestes casos, se voc necessitar obter um texto digitado, use um boto ao invs de associar um ActionListener, como foi feito para o TextField. import java.awt.*; import java.awt.event.*; class TextAreaDemo { public static void main (String args []) { Frame f = new Frame ("TextArea"); TextArea ta = new TextArea ("Texto Inicial", 4, 30); Button b1 = new Button ("Apply"); b1.addActionListener (new TratadorDeTextField (ta)); f.add (ta, BorderLayout.CENTER); f.add (b1, BorderLayout.SOUTH); f.pack (); f.show (); } } class TratadorDeTextField implements ActionListener { TextArea ta; public TratadorDeTextField (TextArea ta) { this.ta = ta; } public void actionPerformed (ActionEvent e) { String str = e.getActionCommand(); System.out.println (ta.getText ()); } }
Mtodo setText(String) String getText() int getCaretPosition( ) set caretPosition(int) int getCaretPosition( ) select (int posI, int posF) String getSelectedText( ) selectAll( ) setEditable(boolean) atribui uma string a um TextArea. retorna o texto contido em um TextArea em uma String. retorna posio do cursor. coloca o cursor na posio determinada. Posio inicial zero. retorna posio do cursor. seleciona texto do TextArea a partir da posio posI at a posio posF (exclusive). Primeira posio zero. retorna texto selecionado no TextArea. seleciona todo texto do TextArea. especifica se o componente editvel (true) ou no. Descrio
77
retorna true se o componente editvel e false caso contrrio. anexa texto tx ao final do texto contido no TextArea.
insert(String tx, int pos) insere texto tx na posio pos. replaceRange(String tx, int posI, int Substitui o texto contido entre as posies posI e posF pelo texto tx. posF)
8.16 List
Uma lista permite apresentar opes textuais que so exibidas em uma regio onde vrios itens sejam exibidos em uma nica vez. As listas apresentam barra de rolagem e permitem que mais de uma opo sejam selecionadas. List l = new List (int tam, boolean mltiplas_escolhas); Onde tam o nmero de linhas visveis da lista e mltiplas_escolhas um valor boolean que true quando se deseja que mais de uma opo possam ser selecionadas na lista. import java.awt.*; import java.awt.event.*; class ListDemo { public static void main (String args []) { Frame f = new Frame ("List"); List list = new List (4,true); list.add ("Primeiro"); list.add ("Segundo"); list.add ("Terceiro"); list.add ("Quarto"); list.add ("Quinto"); list.add ("Sexto"); Tratador handler = new Tratador (list); list.addItemListener (handler); list.addActionListener (handler); f.setLayout (new FlowLayout ()); f.add (list); f.pack (); f.show (); } } class Tratador implements ItemListener, ActionListener { List list; public Tratador (List list) { this.list = list; } // ActionListener pega duplo clique public void actionPerformed (ActionEvent e) { String str = e.getActionCommand(); System.out.println ("Pegou duplo clique de " + str + "."); } // ItemListener pega clique nico public void itemStateChanged (ItemEvent e) { String nomeItem = e.getItem ().toString(); String estado = "desabilitado"; if (e.getStateChange ()==ItemEvent.SELECTED) estado = "habilitado"; System.out.println ("Na itemStateChanged: "+nomeItem + " foi "+estado); int []ind = list.getSelectedIndexes (); String []items = list.getSelectedItems(); for (int i=0; i<ind.length; i++) System.out.println (ind[i] + " " + items[i]); } }
78
O ItemListener capta o clique nico sobre um determinado valor da lista e o ActionListener captura duplo clique.
Mtodo add(String tx, int pos) add(String tx) int[] getSelectedIndexes() String[] getSelectedItems ( ); int getItemCount() select(int pos) deselect(int pos) String getItem(int pos) remove(int pos) removeAll() setMultipleMode(boolean) boolean isMultipleMode() adiciona a String tx na posio pos. adiciona a String tx no final da lista. retorna um array com os ndices dos elementos selecionados. retorna um array com o nome dos elementos selecionados na lista. obtm a quantidade de itens na lista. seleciona item na posio pos. retira a seleo do item na posio pos. retorna o item na posio pos. remove elemento da posio pos. remove todos os elementos da lista. ativa (se true) ou no a lista para permitir seleo de vrios elementos. retorna true se a lista est operando em modo de seleo mltipla. Descrio
8.17 Dialog
Um Dialog uma janela similar a um Frame com a diferena de que possvel determina-lo como modal. Quando definimos uma caixa de dilogo como modal, o usurio no pode passar para outras janelas no mesmo aplicativo at que feche a caixa de dilogo. Se ela no for modal possvel passar para outra janela simplesmente dando um clique nela. possvel criar uma caixa de dilogo com um dos seguintes construtores: Dialog (Frame frame, boolean modal); Dialog (Frame frame, String titulo, Boolean modal); Onde frame o Frame ao qual esta caixa de dilogo est associada, modal true caso a caixa seja modal e false caso contrrio, e ttulo o ttulo da caixa de dilogo. import java.awt.*; import java.awt.event.*; public class DialogDemo { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); Button b = new Button ("Boto"); f.add (b); Handler handler = new Handler (f); b.addActionListener (handler); f.addWindowListener (handler); f.setLayout (new FlowLayout ()); f.setSize (200, 100); f.show (); } } class Handler implements WindowListener, ActionListener { Frame f; public Handler (Frame f) { this.f = f; } public void actionPerformed (ActionEvent e) { Dialog d = new Dialog (f, "Dialog", true); Label l = new Label ("Label na Caixa de Dilogo"); d.add (l); d.addWindowListener (new WindowAdapter() { d.setVisible (false); } }); d.pack(); d.setVisible (true);
79
} public void windowClosing (WindowEvent e) { System.exit (0); } public void windowOpened (WindowEvent e) { } public void windowIconified (WindowEvent e) { public void windowDeiconified (WindowEvent e) public void windowClosed (WindowEvent e) { } public void windowActivated (WindowEvent e) { public void windowDeactivated (WindowEvent e) }
} { } } { }
Assim, como um Frame um Dialog uma subclasse de um Window. O seu Layout default BorderLayout. Para fechar um Dialog voc pode usar o mtodo dispose.
8.18 FileDialog
O FileDialog permite selecionar arquivos do sistema atravs de uma janela especfica. O FileDialog retorna apenas uma String contendo o nome e diretrio onde o arquivo est localizado. Ele no retorna o arquivo em si. Ao criar a caixa de dilogo, podemos determinar o tipo atravs do seu construtor: FileDialog d = new FileDialog (Frame f, String nome, int mode); Onde f o frame ao qual esta caixa de dilogo est associada. Uma caixa de dilogo sempre modal. Nome o ttulo da caixa de dilogo e mode um dos tipos: FileDialog.SAVE: caixa de dilogo salvar; FileDialog.LOAD: caixa de dilogo de abertura de arquivo; import java.awt.*; import java.awt.event.*; public class FileDialogDemo { public static void main (String args []) { Frame f = new Frame ("Meu Frame"); Button b = new Button ("Boto"); f.add (b); Handler handler = new Handler (f); b.addActionListener (handler); f.addWindowListener (handler); f.setLayout (new FlowLayout ()); f.setSize (200, 100); f.show (); } } class Handler implements WindowListener, ActionListener { Frame f; public Handler (Frame f) { this.f = f; } public void actionPerformed (ActionEvent e) { FileDialog d = new FileDialog (f, "FileDialog", FileDialog.SAVE); d.setVisible (true); String nome = d.getFile (); String dir = d.getDirectory (); System.out.println ("Foi selecionado arquivo "+nome+" no diretrio "+dir); } public void windowClosing (WindowEvent e) { System.exit (0); } public void windowOpened (WindowEvent e) { } 80
windowIconified (WindowEvent e) { windowDeiconified (WindowEvent e) windowClosed (WindowEvent e) { } windowActivated (WindowEvent e) { windowDeactivated (WindowEvent e)
} { } } { }
8.19 ScroollPane
Esta classe fornece um container com barras de rolagem. O ScrollPane no permita que seja definido um layout a ele ou que sejam adicionados objetos. Se voc quiser adicionar algum objeto (por exemplo, boto), deve criar um Panel, adicionar os objetos ao Panel e colocar o Panel no ScrollPane. import java.awt.*; class ScrollPaneDemo { public static void main (String args[]) { Frame f = new Frame ("ScrollPane"); Panel p = new Panel (); GridLayout layout = new GridLayout (2, 2); p.setLayout (layout); Button b1 = new Button ("Boto um"); Button b2 = new Button ("Boto dois"); Button b3 = new Button ("Boto trs"); Button b4 = new Button ("Boto quatro"); Button b5 = new Button ("Boto cinco"); p.add (b1); p.add (b2); p.add (b3); p.add (b4); p.add (b5); ScrollPane sp = new ScrollPane (); sp.add (p); f.add (sp); f.setSize (100, 100); f.show(); } }
81
8.20 Menu
Os Menus so componentes que podem ser adicionados unicamente em Frames. Na verdade um Menu composto por 3 componentes: MenuBar, Menu e MenuItem.
MenuBar
MenuItem m
Menu
Para criar um Menu, voc deve primeiramente criar uma barra de Menu, onde sero inseridos os elementos de Menu: MenuBar bar = new MenuBar (); Aps isso, voc deve definir os seus menus como objetos do tipo Menu e adiciona-los a barra de Menu:
Menu menuFile = new Menu ("File"); bar.add (menuFile); A seguir, voc pode adicionar os itens (MenuItem) de cada menu: menuFile.add (item1); menuFile.add (item2); menuFile.addSeparator (); menuFile.add (item3); Voc pode usar um separador (linha separadora) para dividir itens de menu. Para isso, basta usar o mtodo addSeparator do objeto Menu. Alm disso, voc pode usar o mtodo setHelpMenu do objeto MenuBar para adicionar um menu Help a sua barra. O menu Help adicionado ter a aparncia de acordo com a sua plataforma. Por exemplo, em sistemas do tipo X/Motif ele coloca o Menu Help a extrema direita da barra de Menu. import java.awt.*; import java.awt.event.*; class MenuDemo { public static void main (String args []) { Frame frame = new Frame (); MenuBar bar = new MenuBar (); Tratador handler = new Tratador (); Menu menuFile = new Menu ("File"); MenuItem item1 = new MenuItem ("Abrir"); MenuItem item2 = new MenuItem ("Salvar"); MenuItem item3 = new MenuItem ("Sair"); item1.addActionListener (handler); item2.addActionListener (handler); item3.addActionListener (handler); menuFile.add (item1); menuFile.add (item2); menuFile.addSeparator (); menuFile.add (item3); Menu menuEdit = new Menu ("Edit"); Menu menuHelp = new Menu ("Help"); bar.add (menuFile);
82
bar.add (menuEdit); bar.setHelpMenu (menuHelp); frame.setMenuBar (bar); frame.setSize (200, 100); frame.setVisible (true); } } class Tratador implements ActionListener { public void actionPerformed (ActionEvent e) { String str = e.getActionCommand(); System.out.println ("Foi acionado o Item de Menu: "+str); } }
8.21 CheckBoxMenuItem
possvel criar itens de menu para seleo on/off, assim como no checkbox. import java.awt.*; import java.awt.event.*; class CheckBoxMenuItemDemo { public static void main (String args []) { Frame frame = new Frame (); MenuBar bar = new MenuBar (); Handler handler = new Handler (); Menu menuFile = new Menu ("Font"); CheckboxMenuItem item1 = new CheckboxMenuItem ("Bold"); CheckboxMenuItem item2 = new CheckboxMenuItem ("Italic"); CheckboxMenuItem item3 = new CheckboxMenuItem ("Underline"); item1.addItemListener (handler); item2.addItemListener (handler); item3.addItemListener (handler); menuFile.add (item1); menuFile.add (item2); menuFile.addSeparator (); menuFile.add (item3); bar.add (menuFile); frame.setMenuBar (bar); frame.setSize (200, 100); frame.setVisible (true);
83
} } class Handler implements ItemListener { public void itemStateChanged (ItemEvent e) { String nomeItem = e.getItem ().toString(); String estado = "desabilitado"; if (e.getStateChange ()==ItemEvent.SELECTED) estado = "habilitado"; System.out.println (nomeItem + " foi "+estado); } }
this.f = f; addMouseListener(this); addMouseMotionListener(this); setBackground (Color.yellow); } public void paint (Graphics g) { switch(posicao) { case 0: g.setColor(Color.blue); break; case 1: g.setColor(Color.magenta); break; case 2: g.setColor(Color.cyan); break; case 3: g.setColor(Color.green); break; default: g.setColor(Color.red); break; } posicao = (posicao<5) ? posicao+1 : 0; g.fillRect(xi, yi, Math.abs(xf-xi), Math.abs(yf-yi)); } public void update (Graphics g) { paint (g); } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } public void mousePressed(MouseEvent e) { xi = e.getX(); yi = e.getY(); } public void mouseReleased(MouseEvent e) { xf = e.getX(); yf = e.getY(); repaint(); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void actionPerformed (ActionEvent e) { PrintJob pjob = f.getToolkit().getPrintJob(f, "Impresso Squares - Java", null); if (pjob != null) { Graphics pg = pjob.getGraphics(); if (pg != null) { f.printAll(pg); pg.dispose(); } pjob.end(); } } }
8.23 Exerccios
Exerccio 1 - Calculadora
Crie uma calculadora com a aparncia abaixo. Quando voc clica no boto de igual(=), ela apaga o que estava no campo TextField e mostra o resultado. Dica: Use o gerenciador de layout GridLayout. 85
86
9 Applets
Um applet um cdigo Java que roda em um browser. Ele se difere de uma aplicao stand-alone na maneira que executado. Uma aplicao inicializada quando sua funo main () chamada. O ciclo de vida de um applet um pouco mais complexo e ser explicado neste captulo. Quando um usurio acessa uma pgina HTML que contm um applet, o cdigo do applet todo copiado para a mquina do usurio para, aps isso, ser executado localmente.
java.awt.Component
java.awt.Button ...
java.awt.Container
java.awt.Frame java.awt.TextArea
java.awt.Panel
java.applet.Applet
Como um Applet um Panel, o seu gerenciador de layout default o FlowLayout. Alm disso, assim como no Panel, possvel inserir componentes nele.
87
88
paint (Graphics g): Este mtodo executado toda vez que o browser enviar uma mensagem de pintura para o applet. Este mtodo chamado na inicializao do applet e toda vez que o browser for ativado. repaint():Este mtodo chamado pelo programador quando ele deseja repintar a tela. Este mtodo chama o mtodo update (). update(Graphics g): Limpa a rea de fundo e aps chama o mtodo paint (Graphics g);
public void mouseEntered (MouseEvent e) { } public void mouseExited (MouseEvent e) { } public void mouseReleased (MouseEvent e) { } } Mas, para que possamos executar um applet no browser preciso escrever uma pgina HTML que chame esse applet. <HTML> <HEAD> <TITLE> Testando um Applet </TITLE> </HEAD> <BODY> <APPLET CODE=MeuApplet.class WIDTH = 300 </APPLET> </BODY> </HTML>
Tendo criado a pgina HTML, podemos abri-la em um browser para ver o applet rodando.
90
case 5: g.setColor (Color.gray); g.drawRoundRect (mouseX, mouseY, 40, 30, 8, 8); break; case 6: g.setColor (Color.magenta); g.fillRect (mouseX, mouseY, 40, 30); break; case 7: g.setColor (Color.black); g.drawArc (mouseX, mouseY, 40, 30, 120, 300); break; case 8: g.setColor (Color.orange); g.fillArc (mouseX, mouseY, 40, 30, 120, 300); break; case 9: g.setColor (Color.blue); g.drawString ("HelloWorld!", mouseX, mouseY); cont=0; } } public void mousePressed (MouseEvent e) { mouseX = e.getX(); mouseY = e.getY(); repaint (); cont++; } public void update (Graphics g) { paint (g); } public void mouseClicked (MouseEvent e) { } public void mouseEntered (MouseEvent e) { } public void mouseExited (MouseEvent e) { } public void mouseReleased (MouseEvent e) { } public void windowClosing(WindowEvent e) { System.exit(0); } public void windowOpened(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { } }
91
import java.awt.*; import java.applet.*; public class AppletSomImagem extends Applet { Image img1; AudioClip audioClip; public void init() { String strSound, strImg1, strImg2; strImg1 = getParameter("imagem1"); img1 = getImage(getDocumentBase(), strImg1); strSound = getParameter("som"); audioClip = getAudioClip(getDocumentBase(), strSound); } public void paint(Graphics g) { g.drawImage(img1, 0, 0, this); } public void start( ) { audioClip.play(); } public void stop() { audioClip.stop(); } } A pgina HTML que chama o applet: <HTML> <HEAD> <TITLE> Testando Recursos em um Applet </TITLE> </HEAD> <BODY> <APPLET CODE = "AppletSomImagem.class" WIDTH = 300 <PARAM NAME = imagem1 VALUE="Orb.gif"> <PARAM NAME = som VALUE="Som.au"> </APPLET> </BODY> </HTML>
HEIGHT = 200>
92
93
Para determinar um Look and Feel Motif: UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); Para determinar um Look and Feel MAC ( vlido apenas se a aplicao Java estiver executando em uma plataforma MacOS): UIManager.setLookAndFeel("javax.swing.plaf.mac.MacLookAndFeel");
LookAndFeel
Metal
Windows
Motif
O exemplo a seguir mostra uma aplicao Java utilizando o Look and Feel da plataforma: import javax.swing.*; public class LookAndFeel { public static void main (String args[]) { try { /* Seta para Look and Feel da plataforma (por ex. Windows ) */ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { } JFrame f = new JFrame ( ); JButton button = new JButton("Hello, world"); f.getContentPane().add (button); f.pack(); f.show (); } } Para modificar o Look And Feel de um frame de um programa j inicializado necessrio tambm chamar o mtodo SwingUtilities.updateComponentTreeUI para atualizao dos componentes. O cdigo fica assim: UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); SwingUtilities.updateComponentTreeUI (f.getContentPane()); Geralmente, os componentes da biblioteca Swing possuem um componente equivalente na biblioteca AWT com um nome similar acrescido da letra J no incio da palavra. Assim, temos o componente Swing JFrame para o Frame do AWT, JButton para Button, etc.
10.2 JFrame
Assim, como na biblioteca AWT existe a janela Frame, no Swing h o JFrame. Frames so containers e, por isso, podem conter outros componentes de interface como botes, labels, etc. A estrutura de um Frame bastante complexa como pode ser observado na Figura 3. Existem 4 camadas em um JFrame: root pane, layered pane, glass pane, que no interessam ao programador e que so necessrios para organizar a barra de menu, e o content pane para implementar o Look and Feel. o content pane que usado pelo programador para adicionar os componentes ao Frame. Por exemplo: Container contentPane = frame.getContentPane ( ); JPanel p = new JPanel ( ); contentPane.add (p);
94
Figura 3: Estrutura Interna de um Frame. Os que estavam familiarizados com a biblioteca AWT devem ter notado que ao contrrio do que fazamos, adicionar o componente diretamente no frame, agora adicionamos o componente na camada content pane do JFrame.
AWT Frame frame = new Frame ( ); Panel p = new Panel ( ); frame.add (p); SWING JFrame frame = new JFrame ( ); Container contentPane = frame.getContentPane ( ); JPanel p = new JPanel ( ); contentPane.add (p);
Pode-se desenhar uma mensagem diretamente em um JFrame, mas essa no uma boa prtica de programao. O ideal colocar a mensagem dentro de um Panel e adicionar este componente ao Frame. No Swing no existe um componente especial para desenho como o Canvas na biblioteca AWT. Para desenho no Swing deve-se usar o JPanel. Alm disso, o mtodo que deve ser sobrescrito o public void paintComponent (Graphics g){ super.paintComponent (g); ... // cdigo restante } ao invs do mtodo paint sobrescrito no AWT.
95
96
10.5 JPanel
No JPanel adicionamos os componentes diretamente nele utilizando o mtodo add(), assim como para o Panel (AWT). Da mesma maneira, determinamos o layout de um panel, chamando o mtodo setLayout do objeto do tipo JPanel. Veja o cdigo abaixo: import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.*; import javax.swing.*; class JPanelDemo { public static void main (String args[]) { JFrame f = new JFrame (); JPanel panel = new JPanel (); FlowLayout layout = new FlowLayout (FlowLayout.LEFT); panel.setLayout (layout); JButton b1 = new JButton ("um"); JButton b2 = new JButton ("dois"); JButton b3 = new JButton ("trs"); JButton b4 = new JButton ("quatro"); panel.add (b1); panel.add (b2); panel.add (b3); panel.add (b4); f.getContentPane().add (panel); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); f.pack(); f.show(); } }
10.6 JButton
Os botes so implementados em Swing atravs da classe JButton. O JButton subclasse da classe AbstractButton, por isso, muitas das suas funcionalidades podem ser encontradas na documentao da classe pai, tais como, definio de um texto e de uma imagem a ser exibida pelo boto.
} } class TratadorDeBotao implements ActionListener { public void actionPerformed (ActionEvent e) { String str = e.getActionCommand(); if (str.equals ("Meu Boto")) System.out.println ("Boto pressionado."); } }
import java.awt.*; import java.awt.event.*; import javax.swing.*; class SeparateGUIFrame extends JFrame implements ActionListener { JPanel panel; public SeparateGUIFrame() { setTitle("SeparateGUITest"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); panel = new JPanel(); JButton blueAction = new JButton("Blue", new ImageIcon("blue-ball.gif")); JButton yellowAction = new JButton("Yellow", new ImageIcon("yellowball.gif")); JButton redAction = new JButton("Red", new ImageIcon("red-ball.gif")); blueAction.addActionListener (this); yellowAction.addActionListener (this); redAction.addActionListener (this); panel.add(yellowAction); panel.add(blueAction); panel.add(redAction); Container contentPane = getContentPane(); contentPane.add(panel); } public void actionPerformed(ActionEvent evt) { Color c; String s = evt.getActionCommand (); if (s.equals ("Red")) c = Color.red; else if (s.equals ("Blue")) c = Color.blue; else c = Color.yellow; panel.setBackground(c); panel.repaint();
98
} } public class ButtonComImagem { public static void main(String[] args) { JFrame frame = new SeparateGUIFrame(); frame.show(); } }
10.7 JLabel
Para a criao de labels no Swing temos o JLabel. O JLabel permite a apresentao de contedo puramente textual, assim como o Label do AWT, e tambm de figuras. Veja o exemplo a seguir retirado de (Campione, 2000): import import import public java.awt.*; java.awt.event.*; javax.swing.*; class JLabelDemo extends JPanel { JLabel label1, label2, label3; public JLabelDemo() { ImageIcon icon = new ImageIcon("middle.gif", "a pretty but meaningless splat"); setLayout(new GridLayout(3,1)); label1 = new JLabel("Image and Text", icon, JLabel.CENTER); //Set the position of the text, relative to the icon: label1.setVerticalTextPosition(JLabel.BOTTOM); label1.setHorizontalTextPosition(JLabel.CENTER); label1.setOpaque (true); // para o fundo no ficar transparente label1.setBackground (Color.white); label2 = new JLabel("Text-Only Label"); label2.setOpaque (true); label2.setBackground (Color.yellow); label3 = new JLabel(icon); label3.setOpaque (true); label3.setBackground (Color.blue); add(label1); add(label2); add(label3); } public static void main(String[] args) { JFrame frame = new JFrame("LabelDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);}}); frame.getContentPane().add(new JLabelDemo(), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }
99
O exemplo abaixo mostra uma aplicao retirada de (Horstman & Cornell, 2000) que mostra como fazer a substituio de um texto especificado dentro de um JTextArea. import java.awt.*; import java.awt.event.*; import javax.swing.*; class TextEditFrame extends JFrame { public TextEditFrame() { setTitle("TextEditTest"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Container contentPane = getContentPane(); JPanel panel = new JPanel(); JButton replaceButton = new JButton("Replace"); panel.add(replaceButton); replaceButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { String f = from.getText(); int n = textArea.getText().indexOf(f); // substitui o texto especificado, da posio inicial at a posio final if (n >= 0 && f.length() > 0) textArea.replaceRange(to.getText(), n, n + f.length()); } } ); from = new JTextField(8); panel.add(from); panel.add(new JLabel("with")); to = new JTextField(8); panel.add(to); textArea = new JTextArea(8, 40); scrollPane = new JScrollPane(textArea); contentPane.add(panel, "South"); contentPane.add(scrollPane, "Center"); pack(); } private JScrollPane scrollPane; private JTextArea textArea; private JTextField from, to; } public class TextDemo { public static void main(String[] args) { JFrame f = new TextEditFrame(); f.show(); } }
Para implementar uma rea de obteno de password (senha) existe a classe JPasswordField que substitui os caracteres digitados pelo usurio por * na caixa de texto.
10.9 JCheckBox
O JCheckBox funciona de maneira anloga ao CheckBox do AWT, ou seja, permite a escolha de um ou mais itens a partir de um conjunto de elementos exibidos. Veja o exemplo abaixo que foi retirado de (Campione, 2000). import java.awt.*; import java.awt.event.*; import javax.swing.*; 100
public class CheckBoxDemo extends JPanel { JCheckBox chinButton; JCheckBox glassesButton; JCheckBox hairButton; JCheckBox teethButton; /* * Four accessory choices provide for 16 different * combinations. The image for each combination is * contained in a separate image file whose name indicates * the accessories. The filenames are "geek-XXXX.gif" * where XXXX can be one of the following 16 choices. * The "choices" StringBuffer contains the string that * indicates the current selection and is used to generate * the file name of the image to display. ---// zero accessories c--// one accessory -g---h---t cg-// two accessories c-hc--t -gh-g-t --ht -ght // three accessories c-ht cg-t cghcght // all accessories */ StringBuffer choices; JLabel pictureLabel; public CheckBoxDemo() { // Create the check boxes chinButton = new JCheckBox("Chin"); chinButton.setMnemonic('c'); chinButton.setSelected(true); glassesButton = new JCheckBox("Glasses"); glassesButton.setMnemonic('g'); glassesButton.setSelected(true); hairButton = new JCheckBox("Hair"); hairButton.setMnemonic('h'); hairButton.setSelected(true); teethButton = new JCheckBox("Teeth"); teethButton.setMnemonic('t'); teethButton.setSelected(true); // Register a listener for the check boxes. CheckBoxListener myListener = new CheckBoxListener(); chinButton.addItemListener(myListener); glassesButton.addItemListener(myListener); hairButton.addItemListener(myListener); teethButton.addItemListener(myListener); // Indicates what's on the geek. choices = new StringBuffer("cght"); // Set up the picture label pictureLabel = new JLabel(new ImageIcon( "geek/geek-" + choices.toString() + ".gif")); pictureLabel.setToolTipText(choices.toString()); // Put the check boxes in a column in a panel JPanel checkPanel = new JPanel(); checkPanel.setLayout(new GridLayout(0, 1)); checkPanel.add(chinButton);
101
checkPanel.add(glassesButton); checkPanel.add(hairButton); checkPanel.add(teethButton); setLayout(new BorderLayout()); add(checkPanel, BorderLayout.WEST); add(pictureLabel, BorderLayout.CENTER); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } /** Listens to the check boxes. */ class CheckBoxListener implements ItemListener { public void itemStateChanged(ItemEvent e) { int index = 0; char c = '-'; Object source = e.getItemSelectable(); if (source == chinButton) { index = 0; c = 'c'; } else if (source == glassesButton) { index = 1; c = 'g'; } else if (source == hairButton) { index = 2; c = 'h'; } else if (source == teethButton) { index = 3; c = 't'; } if (e.getStateChange() == ItemEvent.DESELECTED) c = '-'; choices.setCharAt(index, c); pictureLabel.setIcon(new ImageIcon("geek/geek-"+ choices.toString()+ ".gif")); pictureLabel.setToolTipText(choices.toString()); } } public static void main(String s[]) { JFrame frame = new JFrame("CheckBoxDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.setContentPane(new CheckBoxDemo()); frame.pack(); frame.setVisible(true); } }
10.10 JRadioButton
No Swing, existe a classe JRadioButton para implementao de botes radio. O usurio pode escolher apenas uma das opes de JRadioButton num dado instante, enquanto que o JCheckBox permite mltipla escolha, se assim definido pelo programador. Como o JRadioButton subclasse de AbstractButton, ele pode possuir todas as funcionalidades que um boto possui. Por exemplo, um JRadioButton pode ser formado por uma imagem e um texto. O exemplo abaixo foi adaptado de (Campione, 2000). import java.awt.*; import java.awt.event.*; import javax.swing.*; public class RadioButtonDemo extends JPanel static JFrame frame; static String birdString = "Bird"; 102
static String catString = "Cat"; static String dogString = "Dog"; static String rabbitString = "Rabbit"; static String pigString = "Pig"; JLabel picture; public RadioButtonDemo() { JRadioButton birdButton = new JRadioButton(birdString); birdButton.setMnemonic('b'); birdButton.setSelected(true); JRadioButton catButton = new JRadioButton(catString); catButton.setMnemonic('c'); JRadioButton dogButton = new JRadioButton(dogString); dogButton.setMnemonic('d'); JRadioButton rabbitButton = new JRadioButton(rabbitString); rabbitButton.setMnemonic('r'); JRadioButton pigButton = new JRadioButton(pigString); pigButton.setMnemonic('p'); // Group the radio buttons. ButtonGroup group = new ButtonGroup(); group.add(birdButton); group.add(catButton); group.add(dogButton); group.add(rabbitButton); group.add(pigButton); // Register a listener for the radio buttons. RadioListener myListener = new RadioListener(); birdButton.addActionListener(myListener); catButton.addActionListener(myListener); dogButton.addActionListener(myListener); rabbitButton.addActionListener(myListener); pigButton.addActionListener(myListener); // Set up the picture label picture = new JLabel(new ImageIcon(birdString + ".gif")); // Put the radio buttons in a column in a panel JPanel radioPanel = new JPanel(); radioPanel.setLayout(new GridLayout(5, 1)); radioPanel.add(birdButton); radioPanel.add(catButton); radioPanel.add(dogButton); radioPanel.add(rabbitButton); radioPanel.add(pigButton); setLayout(new BorderLayout()); add(radioPanel, BorderLayout.WEST); add(picture, BorderLayout.CENTER); // deixa espaco em branco de 20 pixels em torno do panel setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } /** Listens to the radio buttons. */ class RadioListener implements ActionListener { public void actionPerformed(ActionEvent e) { picture.setIcon(new ImageIcon(e.getActionCommand() + ".gif")); } } public static void main(String s[]) { frame = new JFrame("RadioButtonDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);}}); frame.getContentPane().add(new RadioButtonDemo(), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }
103
10.11 JComboBox
O exerccio anterior poderia ser feito utilizando um JComboBox ao invs de RadioButton. Um JComboBox exibe uma lista de elementos a qual s pode ser selecionado um nico item. O JComboBox a implementao no Swing da classe Choice do AWT. O exemplo abaixo foi retirado de (Campione, 2000). import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComboBoxDemo extends JPanel JLabel picture;
public ComboBoxDemo() { String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); petList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String petName = (String)cb.getSelectedItem(); picture.setIcon(new ImageIcon(petName + ".gif")); } }); picture = new JLabel(new ImageIcon(petStrings[petList.getSelectedIndex()] + ".gif")); picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); setLayout(new BorderLayout()); add(petList, BorderLayout.NORTH); add(picture, BorderLayout.SOUTH); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } public static void main(String s[]) { JFrame frame = new JFrame("ComboBoxDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.getContentPane().add(new ComboBoxDemo(), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }
10.12 JList
Um JList permite a seleo de mltiplos elementos a partir de uma lista exibida. mais til utilizar lista do que Checkox quando houver muitos elementos a serem exibidos que ocupem muito espao na tela, pois ela permite a utilizao de scroll. Uma lista no possui um scroll, necessrio inserir a lista em um scroll pane. Na biblioteca AWT a lista implementada pela classe List e no Swing pela classe JList. Uma lista pode ser construda a partir de um array de strings. Por exemplo: String itens [] = { lpis, caderno, caneta, livro, aluno}; JList list = new JList (itens); Para inserir a lista em um scroll pane, use:
104
JScrollPane scroll = new JScrollPane (list); Por default, uma lista pode exibir 8 elementos. Para modificar esse valor (por ex. para 10) use o mtodo setVisibleRowCont(10). Por default, o usurio pode selecionar mais de um elemento de uma lista. Para selecionar mais de um item, use a tecla CTRL enquanto clicar em cada item. Para selecionar uma lista contnua de elementos, clique no primeiro item, tecle SHIFT e clique no ltimo item. Para restringir a seleo que o usurio pode fazer, use o mtodo setSelectionMode( ). Por exemplo:
Seleo de um nico item por list.setSelectionMode (ListSelectionModel.SINGLE_SELECTION); vez
Para pegar eventos em uma lista (seleo de elementos pelo usurio) necessrio implementar o listener de eventos de listas ListSelectionListener que deve ter o mtodo public void valueChanged (ListSelectionEvent evt). class ListaListener implements ListSelectionListener O exemplo abaixo exibe um JList criado a partir de uma lista de strings. Os itens selecionados na lista so exibidos na rea de texto abaixo do frame. import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class ListaSimples extends JFrame implements ListSelectionListener { private JList list; private JtextField employeeName; public ListaSimples() { super("Lista Simples"); String [] str = {"Alison Huml", "Kathy Walrath", "Lisa Friendly", "Mary Campione"}; list = new JList (str); list.setSelectionMode (ListSelectionModel.SINGLE_SELECTION); list. setSelectedIndex(0); list.addListSelectionListener(this); JscrollPane listScrollPane = new JScrollPane(list); employeeName = new JTextField(10); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(listScrollPane, BorderLayout.CENTER); contentPane.add(employeeName, BorderLayout.SOUTH); } 105
public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (list.getSelectedIndex() == -1) employeeName.setText(""); else { String name = list.getSelectedValue().toString(); employeeName.setText(name); } } } public static void main(String s[]) { JFrame frame = new ListaSimples(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.pack(); frame.setVisible(true); } } Observe que usamos o mtodo e.getValueIsAdjusting() do evento que retorna um valor booleano. Toda vez que o usurio pressiona o boto do mouse apontando para um item da lista notificado um evento e chamado o mtodo valueChanged( ), mesmo que o usurio no tenha soltado o boto pressionado do mouse. O mtodo e.getValueIsAdjusting() retorna false se foi realizada uma seleo pelo usurio com o mouse, ou seja, o usurio pressionou e soltou o boto do mouse; ou true se a seleo ainda est se modificando, ou seja, o usurio est apontando com o mouse um item com o boto pressionado, mas ainda no soltou o boto. Uma vez que o evento tenha sido notificado necessrio obter quais itens foram selecionados. O mtodo list.getSelectedValue( ) retorna o elemento selecionado. Se a lista permite mltipla seleo deve-se usar o mtodo list.getSelectedValues( ).
10.12.1 ListModel
Voc deve ter observado que os mtodos para adicionar ou retirar elementos em uma lista no esto contidos na classe JList. Isso porque as listas usam o padro model-view-controller para separar a aparncia visual dos dados na lista. O JList responsvel pela aparncia visual, enquanto que para adicionarmos dados (objetos) em uma lista precisamos de um ListModel. Um ListModel uma interface que deve ser implementada. Para simplesmente selecionar e extrair elementos de uma lista existe a classe DefaultListModel. Para adicionarmos elementos em uma lista usamos uma instncia de DefaultListModel. Essa instncia criada e passada ao mtodo construtor da JList. listModel = new DefaultListModel(); listModel.addElement("Alison Huml"); listModel.addElement("Kathy Walrath"); listModel.addElement("Lisa Friendly"); listModel.addElement("Mary Campione"); list = new JList(listModel); Para removermos um elemento da lista usamos o mtodo: listModel.remove(int index); Para inserirmos um item por outro, podemos usar o mtodo: listModel.insertElementAt(Object novoItem, int posicao);
106
O prximo exemplo, retirado de (Campione, 2000), permite a seleo e duplicao dos elementos apresentados em uma lista. import import import import java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*;
public class ListDemo extends JFrame implements ListSelectionListener { private JList list; private DefaultListModel listModel; private private private private static final String hireString = "Hire"; static final String fireString = "Fire"; Jbutton fireButton; JtextField employeeName;
public ListDemo() { super("ListDemo"); listModel = new DefaultListModel(); listModel.addElement("Alison Huml"); listModel.addElement("Kathy Walrath"); listModel.addElement("Lisa Friendly"); listModel.addElement("Mary Campione"); //Create the list and put it in a scroll pane list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); list.addListSelectionListener(this); JscrollPane listScrollPane = new JScrollPane(list); JButton hireButton = new JButton(hireString); hireButton.setActionCommand(hireString); hireButton.addActionListener(new HireListener()); fireButton = new JButton(fireString); fireButton.setActionCommand(fireString); fireButton.addActionListener(new FireListener()); employeeName = new JTextField(10); employeeName.addActionListener(new HireListener()); String name = listModel.getElementAt(list.getSelectedIndex()).toString(); employeeName.setText(name); //Create a panel that uses FlowLayout (the default). JPanel buttonPane = new JPanel(); buttonPane.add(employeeName); buttonPane.add(hireButton); buttonPane.add(fireButton); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(listScrollPane, BorderLayout.CENTER); contentPane.add(buttonPane, BorderLayout.SOUTH); } class FireListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if //there's a valid selection //so go ahead and remove whatever's selected. int index = list.getSelectedIndex();
107
listModel.remove(index); int size = listModel.getSize(); //Nobody's left, disable firing if (size == 0) { fireButton.setEnabled(false); //Adjust the selection } else { if (index == listModel.getSize())//removed item in last position index--; list.setSelectedIndex(index); //otherwise select same index } } } //This listener is shared by the text field and the hire button class HireListener implements ActionListener { public void actionPerformed(ActionEvent e) { //User didn't type in a name... if (employeeName.getText().equals("")) { Toolkit.getDefaultToolkit().beep(); return; } int index = list.getSelectedIndex(); int size = listModel.getSize(); //If no selection or if item in last position is selected, //add the new hire to end of list, and select new hire if (index == -1 || (index+1 == size)) { listModel.addElement(employeeName.getText()); list.setSelectedIndex(size); //Otherwise insert the new hire after the current selection, //and select new hire } else { listModel.insertElementAt(employeeName.getText(), index+1); list.setSelectedIndex(index+1); } } } public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { //No selection, disable fire button if (list.getSelectedIndex() == -1) { fireButton.setEnabled(false); employeeName.setText(""); //Selection, update text field } else { fireButton.setEnabled(true); String name = list.getSelectedValue().toString(); employeeName.setText(name); } } } public static void main(String s[]) { JFrame frame = new ListDemo();
108
10.12.2 ListCellRendering
Uma JList usa um objeto chamado cell renderer para exibir cada um de seus componentes. O cell renderer default sabe exibir strings e cones. Porm, se desejarmos colocar outro tipo de objeto em uma lista ou se desejarmos modificar o modo como o cell renderer exibe strings e cones, temos que implementar um cell renderer especfico. Para implementar um cell renderer deve-se: Escrever uma classe que implemente a interface ListCellRenderer. Criar uma instncia de sua classe e chamar o mtodo setCellRenderer passando a instncia como argumento. A classe que implementa o cell renderer deve implementar o mtodo getListCellRendererComponent. Esse mtodo retorna um componente o qual o mtodo paintComponent do objeto usado para exibi-lo na lista. Por isso, alm do cell renderer implementar o ListCellRenderer, mais simples se ele for subclasse de algum outro componente que se deseja exibir na lista. No exemplo abaixo, queremos mostrar uma lista com strings e cones. Faremos isso, adicionando esses componentes a um JLabel que ser exibido na lista. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CustomListDemo extends JPanel ImageIcon images[]; {
public CustomListDemo() { String[] names = { "Blue", "Red", "Yellow"}; ImageIcon [] images = new ImageIcon [names.length]; images [0] = new ImageIcon("blue-ball.gif"); images[0].setDescription("Blue"); images [1] = new ImageIcon("red-ball.gif"); images[1].setDescription("Red"); images [2] = new ImageIcon("yellow-ball.gif"); images[2].setDescription("Yellow"); JList lista = new JList(images); ListRenderer renderer= new ListRenderer(); lista.setCellRenderer(renderer); lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); lista.setSelectedIndex(0); lista.setVisibleRowCount (3); JScrollPane listScrollPane = new JScrollPane(lista); setLayout(new BorderLayout()); add (listScrollPane, BorderLayout.NORTH); } class ListRenderer extends JLabel implements ListCellRenderer public ListRenderer() { setOpaque(true); } public Component getListCellRendererComponent( JList list, Object value, {
109
int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } ImageIcon icon = (ImageIcon)value; setText(icon.getDescription()); setIcon(icon); return this; } } public static void main(String s[]) { JFrame frame = new JFrame("CustomComboBoxDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.getContentPane().add(new CustomListDemo(), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }
10.13.1 JOptionPane
Usando JOptionPane possvel criar diferentes tipos de dilogos. JOptionPane fornece suporte para dilogos fornecendo cones, permitindo determinar ttulos e textos e personalizando o boto. Ainda possvel determinar quais componentes ir conter e em que rea da tela ir aparecer. O JOptionPane oferece as seguintes opes de cone:
interrogao informao advertncia erro
Para a criao de forma mais simples de dilogos pode-se usar os mtodos showXXXDialog da classe JOptionPane. Os mtodos mais usados so showMessageDialog (dialog com um nico boto) e showOptionDialog (pode conter uma variedade de botes personalizados, texto e outros componentes). Como opo de mtodos para criar dialog box temos: showMessageDialog: Exibe uma dialog box modal com um nico boto OK. possvel especificar a mensagem, o cone e o ttulo da dialog box.
110
showOptionDialog: Cria uma dialog box com o texto, cone, botes e ttulo especificados. Com esse mtodo possvel especificar os textos dos botes e outros tipos de personalizao. O programa a seguir cria uma dialog box com os botes de opo YES e NO. import import import public javax.swing.*; java.awt.event.*; java.awt.*; class JoptionPaneTest { public static void main (String args []) { JFrame f = new JFrame ("Meu Frame"); JButton b = new JButton ("Boto"); f.getContentPane().setLayout (new FlowLayout ()); f.getContentPane().add (b); Handler handler = new Handler (f); b.addActionListener (handler); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); f.setSize (200, 100); f.show (); }
} class Handler implements ActionListener { JFrame f; public Handler (JFrame f) { this.f = f; } public void actionPerformed (ActionEvent e) { int ret = JOptionPane.showConfirmDialog(f, "choose one", "Nome do Frame", JOptionPane.YES_NO_OPTION); System.out.println ("Opcao escolhida = " + ret); } }
10.14 JDialog
Para criar um JDialog deve-se criar uma classe que seja subclasse de JDialog. o mesmo processo que derivar uma classe de um JFrame. Voc deve: No construtor da classe chamar o construtor da classe pai JDialog. preciso fornecer a instncia do frame, o ttulo da caixa de dilogo e um flag boooleano para indicar se modal ou no. Adicione os componentes desejados ao dialog box. Adicione os handler de eventos. Determine o tamanho da dialog box. O programa abaixo, retirado de (Horstman & Cornell, 2000), exibe uma caixa de dilogo JDialog quando o usurio escolhe a opo About do menu. import java.awt.*; import java.awt.event.*; import javax.swing.*; class DialogFrame extends JFrame implements ActionListener { public DialogFrame() { setTitle("DialogTest"); setSize(300, 300); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); 111
} } ); JMenuBar mbar = new JMenuBar(); setJMenuBar(mbar); JMenu fileMenu = new JMenu("File"); mbar.add(fileMenu); aboutItem = new JMenuItem("About"); aboutItem.addActionListener(this); fileMenu.add(aboutItem); exitItem = new JMenuItem("Exit"); exitItem.addActionListener(this); fileMenu.add(exitItem); } public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if(source == aboutItem) { if (dialog == null) // first time dialog = new AboutDialog(this); dialog.show(); } else if(source == exitItem) { System.exit(0); } } private AboutDialog dialog; private JMenuItem aboutItem; private JMenuItem exitItem; } class AboutDialog extends JDialog { public AboutDialog(JFrame parent) { super(parent, "About DialogTest", true); Box b = Box.createVerticalBox(); b.add(Box.createGlue()); b.add(new JLabel("Core Java")); b.add(new JLabel("By Cay Horstmann and Gary Cornell")); b.add(Box.createGlue()); getContentPane().add(b, "Center"); JPanel p2 = new JPanel(); JButton ok = new JButton("Ok"); p2.add(ok); getContentPane().add(p2, "South"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { setVisible(false); } } ); setSize(250, 150); } } public class DialogTest { public static void main(String[] args) { JFrame f = new DialogFrame(); f.show(); } }
112
10.15 JFileChooser
O JFileChooser fornece uma janela para navegao pelo sistema de arquivos. Ele permite escolher um arquivo para abrir ou especificar o diretrio onde um arquivo ser salvo. JFileChooser so sempre dialog box modais. Esta classe equivale ao FileDialog da biblioteca AWT. O programa abaixo, retirado de (Campione, 2000), exibe uma caixa de dilogo JFileChooser. import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.filechooser.*; public class FileChooserDemo extends JFrame { static private final String newline = System.getProperty("line.separator"); public FileChooserDemo() { super("FileChooserDemo"); final JTextArea log = new JTextArea(5,20); log.setMargin(new Insets(5,5,5,5)); JScrollPane logScrollPane = new JScrollPane(log); //Create a file chooser final JFileChooser fc = new JFileChooser(); //Create the open button ImageIcon openIcon = new ImageIcon("open.gif"); JButton openButton = new JButton("Open a File...", openIcon); openButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int returnVal = fc.showOpenDialog(FileChooserDemo.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); //this is where a real application would open the file. log.append("Opening: " + file.getName() + "." + newline); } else { log.append("Open command cancelled by user." + newline); } } }); //Create the save button ImageIcon saveIcon = new ImageIcon("save.gif"); JButton saveButton = new JButton("Save a File...", saveIcon); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int returnVal = fc.showSaveDialog(FileChooserDemo.this); // opcao retornada pelo usuario -> escolheu == APPROVE_OPTION if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); //this is where a real application would save the file. log.append("Saving: " + file.getName() + "." + newline); } else { log.append("Save command cancelled by user." + newline); } } }); //For layout purposes, put the buttons in a separate panel JPanel buttonPanel = new JPanel(); buttonPanel.add(openButton); buttonPanel.add(saveButton); //Add the buttons and the log to the frame Container contentPane = getContentPane(); contentPane.add(buttonPanel, BorderLayout.NORTH); contentPane.add(logScrollPane, BorderLayout.CENTER); } public static void main(String s[]) { JFrame frame = new FileChooserDemo(); 113
10.16 Menu
O menu em Swing funciona de maneira anloga ao menu da biblioteca AWT (ver seo menu do captulo de Interface Grfica AWT desta apostila). Primeiramente, necessrio criar uma barra de menu. JMenuBar menuBar = new JMenuBar ( ); Para adicionar a barra de menu no topo do frame, use o mtodo setJMenuBar: frame.setJMenuBar (menuBar); Para cada menu, voc deve criar um objeto de menu: JMenu editMenu = new JMenu (Edit); Aps, deve-se adicionar itens de menu, separadores e submenus ao objeto menu: JMenuItem pasteItem = new JMenuItem (Paste); editMenu.add (pasteItem);
114
editMenu.addSeparator ( ); JMenu optionsMenu = new JMenu (Options); // a submenu editMenu.add (optionMenu); Por ltimo, temos que adicionar os menus a barra de menu: menuBar.addMenu (editMenu); O exemplo abaixo, retirado de (Horstman & Cornell, 2000), exibe uma barra de menu com menus e submenus. import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class MenuTest extends JFrame implements ActionListener, MenuListener { public MenuTest() { setTitle("MenuTest"); setSize(400, 300); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); JmenuBar mbar = new JMenuBar(); setJMenuBar(mbar); // demonstrate enabled/disabled items Jmenu fileMenu = new JMenu("File"); fileMenu.addMenuListener(this); // demonstrate accelerators JmenuItem openItem = new JMenuItem("Open"); openItem.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); saveItem = new JMenuItem("Save"); saveItem.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)); saveAsItem = new JMenuItem("Save As"); mbar.add(makeMenu(fileMenu, new Object[] {"New", openItem, null, saveItem, saveAsItem, null, "Exit" }, this)); // demonstrate check box and radio button menus readonlyItem = new JCheckBoxMenuItem("Read-only"); ButtonGroup group = new ButtonGroup(); JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert"); insertItem.setSelected(true); JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype"); group.add(insertItem); group.add(overtypeItem); // demonstrate icons and nested menus mbar.add(makeMenu("Edit", new Object[] { new JMenuItem("Cut", new ImageIcon("cut.gif")), new JMenuItem("Copy", new ImageIcon("copy.gif")), new JMenuItem("Paste", new ImageIcon("paste.gif")), null, makeMenu("Options", new Object[] { readonlyItem, null, insertItem, overtypeItem
115
}, this) }, this)); // demonstrate mnemonics JMenu helpMenu = new JMenu("Help"); helpMenu.setMnemonic('H'); mbar.add(makeMenu(helpMenu, new Object[] { new JMenuItem("Index", 'I'), new JMenuItem("About", 'A') }, this)); // demonstrate pop-ups popup = makePopupMenu(new Object[] { "Cut", "Copy", "Paste" }, this); getContentPane().addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent evt) { if (evt.isPopupTrigger()) popup.show(evt.getComponent(), evt.getX(), evt.getY()); } }); } public void actionPerformed(ActionEvent evt) { String arg = evt.getActionCommand(); System.out.println(arg); if(arg.equals("Exit")) System.exit(0); } public void menuSelected(MenuEvent evt) { saveItem.setEnabled(!readonlyItem.isSelected()); saveAsItem.setEnabled(!readonlyItem.isSelected()); } public void menuDeselected(MenuEvent evt) { } public void menuCanceled(MenuEvent evt) { } public static JMenu makeMenu(Object parent, Object[] items, Object target) { JMenu m = null; if (parent instanceof JMenu) m = (JMenu)parent; else if (parent instanceof String) m = new JMenu((String)parent); else return null; for (int i = 0; i < items.length; i++) { if (items[i] == null) m.addSeparator(); else m.add(makeMenuItem(items[i], target)); } return m; } public static JMenuItem makeMenuItem(Object item, Object target) { JMenuItem r = null; if (item instanceof String) r = new JMenuItem((String)item); else if (item instanceof JMenuItem) r = (JMenuItem)item; else return null; if (target instanceof ActionListener) r.addActionListener((ActionListener)target); return r; } public static JPopupMenu makePopupMenu (Object[] items, Object target) { JPopupMenu m = new JPopupMenu();
116
for (int i = 0; i < items.length; i++) { if (items[i] == null) m.addSeparator(); else m.add(makeMenuItem(items[i], target)); } return m; } public static void main(String[] args) { Frame f = new MenuTest(); f.show(); } private JMenuItem saveItem; private JMenuItem saveAsItem; private JCheckBoxMenuItem readonlyItem; private JPopupMenu popup; }
10.17 JApplet
Se o seu applet ir conter elementos de interface grfica do pacote swing, ele dever ser um JApplet, caso contrrio no funcionar corretamente. Um JApplet subclasse da classe Applet. O ciclo de vida de um JApplet anlogo a de um Applet, por isso, no ser revisado neste captulo. Para informaes bsicas sobre o funcionamento de um applet, veja a seo de Applet desta apostila. Em applets swing, temos que adicionar os componentes de interface grfica dentro do content pane do applet, assim como fazemos em um JFrame. Veja abaixo um exemplo simples de um applet swing, retirado de (Campione, 2000), que exibe uma mensagem em um label no browser. import javax.swing.*; import java.awt.*; public class HelloSwingApplet extends JApplet { public void init() { JLabel label = new JLabel( "You are successfully running a Swing applet!"); label.setHorizontalAlignment(JLabel.CENTER); label.setBorder(BorderFactory.createMatteBorder(1,1,2,2,Color.black)); getContentPane().add(label, BorderLayout.CENTER); } }
117
Se o seu browser no suporta o JDK1.2 ou superior voc pode instalar o Java Plug-in. O Java Plug-in permite selecionar a verso de JDK desejada. Porm, para rodar um applet atravs do Java Plug-in necessria que a pgina HTML contenha mais do que uma simples tag <applet>, como vista no captulo de Applet. Para gerar esta pgina crie uma pgina HTML com a tag <applet> e execute Java Plug-in HTML converter1 para gerar a nova pgina HTML a partir da anterior. Uma maneira mais simples usar o appletviewer para visualizar os applets. A pgina HTML para exibir este applet em um browser com Java Plug-in fica: <html> <head> <title>Run HelloSwingApplet</title> </head> <body BGCOLOR="#ffffff"> <h2> Run HelloSwingApplet </h2> <p> <blockquote> <!--"CONVERTED_APPLET"--> <!-- CONVERTER VERSION 1.1 --> <SCRIPT LANGUAGE="JavaScript"><!-var _info = navigator.userAgent; var _ns = false; var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0); //--></SCRIPT> <COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!-var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0))); //--></SCRIPT></COMMENT> <SCRIPT LANGUAGE="JavaScript"><!-if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1B3E9-00805F499D93" WIDTH = 400 HEIGHT = 50 codebase="http://java.sun.com/products/plugin/1.1.2/jinstall-112win32.cab#Version=1,1,2,0"><NOEMBED><XMP>'); else if (_ns == true) document.writeln('<EMBED type="application/x-javaapplet;version=1.1.2" java_CODE = "HelloSwingApplet.class" java_CODEBASE = "exampleswing" java_ARCHIVE = "applets.jar" WIDTH = 400 HEIGHT = 50 pluginspage="http://java.sun.com/products/plugin/1.1.2/plugininstall.html"><NOEMBED><XMP>'); //--></SCRIPT> <APPLET CODE = "HelloSwingApplet.class" CODEBASE = "example-swing" ARCHIVE = "applets.jar" WIDTH = 400 HEIGHT = 50 ></XMP> <PARAM NAME = CODE VALUE = "HelloSwingApplet.class" > <PARAM NAME = CODEBASE VALUE = "example-swing" > <PARAM NAME = ARCHIVE VALUE = "applets.jar" > <PARAM NAME="type" VALUE="application/x-java-applet;version=1.1.2"> </APPLET> </NOEMBED></EMBED></OBJECT> <!-<APPLET CODE = "HelloSwingApplet.class" CODEBASE = "example-swing" ARCHIVE = "applets.jar" WIDTH = 400 HEIGHT = 50 >
Veja
como
obter
Java
Plug-in
HTML
Converter
na
URL
http;//java.sun.com/products/plugin.
118
</APPLET> --> <!--"END_CONVERTED_APPLET"--> <blockquote><hr><strong>Note:</strong> Because the preceding applet uses the Swing 1.1 API, it requires Java Plug-in 1.1.2 or Java Plug-in 1.2. It won't work with Java Plug-in 1.1.1 or uncustomized 1.1 browsers. For more information about running applets in the tutorial, refer to <a href="../../information/examples.html">About Our Examples</a>. That page includes a section about <a href="../../information/examples.html#plugin">Downloading Java Plugin</a>.<hr></blockquote> </blockquote> <p> <hr size=4> <p> </body> </html>
public class Bookmark extends JApplet implements ListSelectionListener { public void init() 119
int i = 1; String s; Vector v = new Vector(); while ((s = getParameter("link_" + i)) != null) { v.add(s); i++; } JList links = new JList(v); Container contentPane = getContentPane(); contentPane.add(links); links.addListSelectionListener(this);
} public void valueChanged(ListSelectionEvent evt) { if (evt.getValueIsAdjusting()) return; JList source = (JList)evt.getSource(); String arg = (String)source.getSelectedValue(); try { AppletContext context = getAppletContext(); URL u = new URL(arg); context.showDocument(u, "right"); } catch(Exception e) { showStatus("Error " + e); } } }
Pgina Bookmark.html (Principal) <HTML> <HEAD> <TITLE>Bookmark Applet</TITLE> </HEAD> <FRAMESET COLS="320,*"> <FRAME NAME="left" SRC="Left.html" MARGINHEIGHT=2 MARGINWIDTH=2 120
SCROLLING = "no" NORESIZE> <FRAME NAME="right" SRC="Right.html" MARGINHEIGHT=2 MARGINWIDTH=2 SCROLLING = "yes" NORESIZE> </FRAMESET> </HTML> Pgina Left.html <HTML> <TITLE>A Bookmark Applet</TITLE> <BODY> Double-click on one of the names in the list box. The corresponding web page will be displayed in the frame on the right. <APPLET CODE = "Bookmark.class" WIDTH = 290 HEIGHT = 300 > <PARAM NAME = link_1 VALUE ="http://java.sun.com"> <PARAM NAME = link_2 VALUE ="http://www.gamelan.com"> <PARAM NAME = link_3 VALUE ="http://www.zhongwen.com"> <PARAM NAME = link_4 VALUE ="http://www.horstmann.com"> <PARAM NAME = link_5 VALUE ="http://www.prenhall.com"> <PARAM NAME = link_6 VALUE ="http://www.usps.gov"> <PARAM NAME = link_7 VALUE ="http://www.inf.pucrs.br/~pjaques/"> </APPLET> </BODY> </HTML> Pgina Right.html <HTML> <TITLE> Web pages will be displayed here. </TITLE> <BODY> Double-click on one of the names in the list box to the left. The web page will be displayed here. </BODY> </HTML>
121
122
12 Referncias Bibliogrficas
(Albuquerque, 1999) Albuquerque, Fernando. Programao Orientada a Objetos usando Java e UML. Braslia: MSD, 1999. (Booch, 1994) Booch, Grady. Object Oriented Design with Applications. Redwood City: Benjamin/Cummings Publishing Company, 1994. The
(Campione, 2000) Campione Mary, Walrath Kathy. The Java Tutorial, Object-Oriented Programming for the Internet. http://www.aw.com./cp/javaseries.html. (Chan et al., 1999) Chan, Mark; Griffith, Steven & Iasi, Anthony. Java 1001 Dicas de Programao. So Paulo: Makron Books, 1999. (Coad & Yourdon, 1993) Coad, Peter & Yourdon, Edward. Projeto Baseado em Objetos. Rio de Janeiro: Campus, 1993. (Deitel, 2001) Deitel, Harvey M. Java como Programar. Porto Alegre: Bookman, 2001. (Flanagan, 1999) Flanagan, David. Java in a Nutshell A Desktop Quick Reference (Java 2SDK 1.2 e 1.3). 3rd Edition. Sebastopol: OReilly, 1999. (Hamilton etal., 1997) Hamilton, Graham; Cattel, Rick & Fischer, Maydene. JDBC Database Access with Java. Massachusetts: Addison Wesley, 1997. (Harold, 2000) Harold, Elliotte Rusty. http://sunsite.unc.edu/javafaq/javatutorial.html. Brewing Java: A Tutorial.
(Harold, 1997) Harold, Elliotte Rusty. Java Network Programming. Sebastopol: OReilly, 1997. (Horstman & Cornell, 2000) Horstmann, Cay & Cornell, Gary. Core Java 2 - Volume 1 Fundamentos. Makron Books. (Horstman & Cornell, 2000) Horstmann, Cay & Cornell, Gary. Core Java 2 - Volume 2 Avanados. Makron Books. (Hunter & Crawford, 1998) Hunter, Jason & Crawford, Willian. Java Servlet Programming. Sebastopol: OReilly, 1998. http://www.ora.com/catalog/jservlet/. (Koffman & Wolz, 1999) Koffman, Elliot & Wolz, Ursula. Problems Solving with Java. USA: Addison-Wesley, 1999. (Koosis & Koosis, 1999) Koosis, Donald & Koosis, David. Programao com Java Srie para Dummies. Rio de Janeiro: Campus, 1999. (Lalani et al., 1997) Lalani, Suleiman San; Jamsa, Kris. Java Biblioteca do Programador. So Paulo: Makron Books, 1997. (Lemay & Perkins, 1996) Lemay, Laura & Perkins Charles L. Teach Yourself JAVA in 21 days. Samsnet, 1996. (Lindholm et al., 1997) Lindholm, Tim; Yellin, Frank; Reading: Addison-Wesley, 1997. 475 p. Friendly, Lisa. The Java Virtual Machine Specification.
(Morgan , 1998) Morgan, Mike. Using Java 1.2. Indianapolis: QUE, 1998. (Naughton, 1996) Naughton, Patrick. Dominando o Java. So Paulo: Makron Books, 1996. (Oaks & Wong, 1997) Oaks, Scott & Wong, Henry. Java Threads. Cambridge: O'Reilly, 1997. (Reese, 2000) Reese, George. http://www.ora.com/catalog/javadata/ Database Programming with JDBC and Java.
(Ritchey, 1996) Ritchey, Tim. Programando com Java! Beta 2.0. Rio de Janeiro: Campus, 1996. (Santos, 2003) Santos, Rafael. Introduo Programao Orientada a Objetos Usando Java. So Paulo: SBC, Campus, 2003. (Sun, 1997) SUN Microsystems. Java Programming SL-276 Student Guide. June 1997. 123
(Venners, 2000) Venners, Bill. Inside the Java Virtual Machine. McGraw-Hill, 2000. Livro pode ser parcialmente consultado em: http://www.artima.com/insidejvm/blurb.html.
124