Sie sind auf Seite 1von 98

Aprendendo Java

www.athanazio.com

Hamilton Lima athanazio@pobox.com

verso de 25 jul 2003

Pgina 2

ndice geral
conceitos bsicos...................................................................................................................... 7 Configurao do ambiente.................................................................................................... 8 instalando e configurando................................................................................................. 8 testando o ambiente............................................................................................................. 8 Entendendo a linguagem.................................................................................................... 10 Como funciona o java ?.................................................................................................. 10 caractersticas da linguagem.......................................................................................... 11 Iniciando a sintaxe.............................................................................................................. 12 Entendendo o Ola mundo............................................................................................... 12 Elementos bsicos da linguagem....................................................................................... 12 regra para nome de identificadores................................................................................ 12 palavras reservadas........................................................................................................ 12 Comentrios................................................................................................................... 13 Tipos de dados e declarao de variveis...................................................................... 13 Operadores..................................................................................................................... 15 Estruturas de controle......................................................................................................... 16 Interrompendo os fluxos de controle.............................................................................. 16 se.................................................................................................................................... 17 Variando......................................................................................................................... 18 Enquanto........................................................................................................................ 19 Caso............................................................................................................................... 19 Classes bsicas.................................................................................................................. 21 String............................................................................................................................... 21 Classes para nmeros.................................................................................................... 22 Vetores................................................................................................................................ 24 Lista de exerccios.............................................................................................................. 27 Orientao a Objetos.................................................................................................................................... 29 Conceitos............................................................................................................................ 30 Novas palavras, velhas idias........................................................................................ 30 As novas palavras............................................................................................................... 30 Classes........................................................................................................................... 30 Atributos.......................................................................................................................... 30 Mtodos.......................................................................................................................... 30 Encapsulamento............................................................................................................. 30 Herana.......................................................................................................................... 30 Representando classes....................................................................................................... 31 Introduo....................................................................................................................... 31 Diagrama de classes...................................................................................................... 31 Associao...................................................................................................................... 31 Herana.......................................................................................................................... 32 OO na prtica................................................................................................................. 32 Usando Java........................................................................................................................... 33 Classes e objetos................................................................................................................ 33

Melhorando as classes....................................................................................................... 34 Construtores................................................................................................................... 34 Sobrecarga..................................................................................................................... 34 Controle de acesso......................................................................................................... 34 Constantes...................................................................................................................... 35 Elementos classe............................................................................................................ 35 Exerccios Capitulo 2............................................................................................................... 36 Orientao a Objetos 2................................................................................................................................. 38 Mais OO.............................................................................................................................. 39 Herana............................................................................................................................... 39 Anulao............................................................................................................................. 39 Verificao de tipo.............................................................................................................. 39 Molde de tipo.................................................................................................................. 39 Classes sem objetos........................................................................................................... 41 Classes e mtodos abstratos......................................................................................... 41 Interfaces........................................................................................................................ 43 Organizao da casa.............................................................................................................. 44 criao de pacotes.............................................................................................................. 44 tratando erros.......................................................................................................................... 46 Tratamento de erros........................................................................................................... 47 banco de dados....................................................................................................................... 49 JDBC Conceitos ................................................................................................................. 50 Usando JDBC..................................................................................................................... 51 JDBC na veia...................................................................................................................... 51 Ola Mundo JDBC............................................................................................................ 51 Mais funcionalidades...................................................................................................... 51 Interfaces com usurio usando AWT........................................................................................................................... 52 Descrio da AWT.............................................................................................................. 53 novos nomes....................................................................................................................... 54 Container........................................................................................................................ 54 Components................................................................................................................... 54 Gerentes de layout.......................................................................................................... 56 Como funciona um aplicao ............................................................................................. 57 Gerentes de layout.............................................................................................................. 59 FlowLayout...................................................................................................................... 59 BorderLayout.................................................................................................................. 61 GridLayout...................................................................................................................... 63 Combinando gerentes de layout......................................................................................... 64 Desenhando na tela............................................................................................................ 66 Componentes visuais.......................................................................................................... 68 Tratando Eventos................................................................................................................ 71 Como funciona ?............................................................................................................. 71 Eventos de janelas.......................................................................................................... 74 Criando menus.................................................................................................................... 77 exemplos de solues............................................................................................................. 80 Capitulo 1, exerccio 1......................................................................................................... 81
Pgina 4

Capitulo 1, exerccio 2......................................................................................................... 83 Capitulo 1, exerccio 3......................................................................................................... 84 Capitulo 1, exerccio 4......................................................................................................... 85 Capitulo 1, exerccio 5......................................................................................................... 86 Capitulo 1, exerccio 6......................................................................................................... 87 Capitulo 1, exerccio 7......................................................................................................... 88 Capitulo 1, exerccio 8......................................................................................................... 89 Capitulo 1, exerccio 9......................................................................................................... 90 Capitulo 1, exerccio 10....................................................................................................... 92 exemplo de Aplicao MDI..................................................................................................... 94

Legenda

Dica ou grande recomendao

No use software pirata use software livre, este indicar alternativas livres de software

Atividades extras, consultas, exerccios, pesquisas

Indicao de problemas comuns, que devem ser evitados

Controle de verses 25/07/2003 adicionados instrues e exemplos de JDBC 28/06/2003 reunidos todos os documentos em um s 30/10/2002 criado novo documento o incio 11/10/2002 reviso geral e migrao de sgml para openoffice 01/10/2002 adicionado controle de eventos ActionEvent 25/09/2002 verso inicial, captulo de AWT 14/10/2001 concludo Orientao a objetos 2 e Manipulao de arquivos 08/10/2001 concluso de Orientao a objetos 1 e Orientao a objetos 2, at interfaces 01/10/2001 Orientao a objetos 1 melhorando as classes e lista de exercicios 15/09/2001 concluso de Orientao a objetos 1 e remodelagem sem AWT 21/07/2001 Orientao a objetos 1 Feito com

Pgina 6

CONCEITOS BSICOS

Configurao do ambiente instalando e configurando


Para usar os programas descritos nesta documentao voc ir precisar do kit de desenvolvimento da linguagem Java. Existem alguns tipos destes kits, ns iremos usar inicialmente o J2SE (Java 2 Standard Edition) Para obter o J2SE acesse http://java.sun.com/j2se/ e realize o download da ltima verso estvel (verso estvel a ltima que no estiver em testes, ou seja, no perodo de aprendizado no recomendamos verses alfa, beta, pr-release, etc ). Aps o download basta realizar a instalao seguindo os passos sugeridos pela instalao. Apesar de na maioria das vezes no lermos os avisos de instaladores, um bom hbito, faz-lo, evitando assim que aes inesperadas ocorram durante a instalao, como por exemplo instalar um software em um disco rgido que est quase sem espao.

Depois de instalado, precisaremos configurar uma varivel de ambiente, para o funcionamento correto do compilador Java. Quando o compilador for executado o mesmo precisar saber onde encontrar as bibliotecas da linguagem Java e possveis bibliotecas criadas pelo programador. A biblioteca Java encontrada automaticamente, porm as desenvolvidas - precisamos indicar onde encontrar atravs de definio da varivel de ambiente CLASSPATH, esta varivel define o caminho para encontrar classes usadas por um programa, iremos configurar o nosso caminho de procura para o diretrio atual, no Prompt do Ms-DOS com os seguintes comandos:
c:\>set CLASSPATH=. c:\> c:\>echo %CLASSPATH% . c:\>

configurando CLASSPATH
Nota: Observar que ao executar a linha acima do set CLASSPATH=. iremos definir a varivel de ambiente somente para a sesso do Ms-DOS que estiver aberta no momento. para garantir que esta configurao esteja disponvel para todas as sesses do Ms-DOS que utilizarmos a linha de definio set CLASSPATH=. dever ser includa no final do arquivo autoexec.bat

Pgina 8

testando o ambiente
Para criar seu primeiro arquivo utilize qualquer editor de textos ASCII puro, por exemplo o bloco de notas do windows (notepad.exe), ou o edit do DOS. Crie uma arquivo conforme o exemplo abaixo :

class olamundo{ public static void main ( String args[] ){ System.out.println( "Ol mundo" ); } }

olamundo.java

Para salvar arquivos com extenso diferente de .txt no bloco de notas, ser necessrio colocar o nome do arquivo entre aspas, por exemplo: "olamundo.java"

Nosso teste de ambiente consistir em compilar e executar o olamundo.java recm criado, no diretrio onde foi criado olamundo.java siga os comandos abaixo:
c:\>javac olamundo.java c:\>java olamundo Ola mundo c:\>

Compilando e executando um programa

Nota: javac olamundo.java realiza a compilao do arquivo fonte .java e cria um arquivo .class que ser executado pelo comando java olamundo. Observar que o compilador javac precisa que seja informada a extenso do arquivo, e o interpretador java no, pois assume a extenso .class

Entendendo a linguagem Como funciona o java ?


Com a proposta de "write once, run anywhere" (programe uma vez, e execute em qualquer lugar) a linguagen java tinha um desafio pela frente: como lidar com os diferentes sistemas operacionais (SO), e diversos ambientes computacionais existentes ? A soluo at poderia ser criar um compilador para cada ambiente e gerar verses do programa para as diversas plataformas, mas isto iria gerar a dificuldade de manter estruturas de arquivos diferentes, formatos diferentes, fora o esforo para gerao contnua de novos e novos arquivos... Com esta necessidade surgiu a idia de possuir uma camada intermediria entre o SO e o programa em java a ser executado, esta camada chama-se Java Virtual Machine, a imagem abaixo mostra sue funcionamento

Ilustrao 1 vistual machine

A Virtual Machine garante o funcionamento de programas Java em diversas plataformas, desde servidores corporativos a dispositivos portteis. Isto permite uma flexibilidade e economia enorme, pois torna possvel "write once, run anywhere".

Pgina 10

A criao de um programa Java pode ser dividida em 3 etapas: etapa 1. codificao do programa em um arquivo .java etapa 2. compilao do programa usando javac nomearquivo.java etapa 3. execuo do bytecode, que o arquivo .class usando java nomearquivo

caractersticas da linguagem
Qualificando a linguagem Java podemos citar as seguintes caractersticas:

Simples Independente de Plataforma Orientada a Objetos Distribuda Robusta "Multithreaded" segura

A Linguagem Java possui uma grande diversidade de recursos:


Recursos essenciais de uma linguagem - Objetos, Strings, Threads, data e hora, estruturas de controle, armazenamento de dados, entrada e sada, etc ... Applets - criao de aplicaes embutidas em pginas html que so executadas no cliente Recursos de Rede - comunicao via TCP/IP, UDP, etc ... Componentes de Software - chamados JavaBeans Java Database Connectivity (JDBC) - Conexo a praticamente todos bancos de dados do mercado

Iniciando a sintaxe Entendendo o Ola mundo


Cdigo fonte
class olamundo

Explicao define o nome da classe, observar que todo programa em java uma classe, e que o nome da classe deve ser o mesmo nome do arquivo Os elementos da classe em questo esto delimitados pelas chaves "{..}"

public static void main(String args[])

Cria o mtodo main da aplicao java, os qualificadores antes do nome main sero discutidos em lies posteriores. Todo mtodo main deve estar pronto para receber os parmetros da linha de comando que o executou, desta forma criado um vetor de String chamado args que contm os parmetros recebidos na execuo do programa o mtodo println, um procedimento da Classe System, e exibe os parmetros que recebe na sada padro do ambiente de execuo java em questo

String args[]

System.out.println( "Ol mundo" );

Elementos bsicos da linguagem regra para nome de identificadores


Permite letras e nmeros Comea com uma letra "$" ou "_" Possui tamanho ilimitado No pode ser uma das palavras reservadas "Case sensitive" , diferencia maisculas de minsculas

palavras reservadas
abstract - boolean - break - byte - case - catch - char - class - const - continue - default - do - double - else extends - final - finally - float - for - goto - if - implements - import - instanceof - int - interface - long - native new - null - package - private - protected - public - return - short - static - super - switch - synchronized - this throw - throws - transient - try - void - volatile - while

Pgina 12

Comentrios
Existem 3 tipos de comentrios na linguagem Java

Comentrio de bloco "/*...*/" Comentrio na linha"//" Comentrio de bloco com documentao "/**...*/"

/** * Titulo: comentado.java * Descrio: ilustra comentrios na linguagem java * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class comentado { // main chamada automaticamente ... public static void main ( String args[] ) { /* esta uma verso do olamundo.java elterada para exibir comentrios System.out.println( "Ol mundo" ); */ } System.out.println( "Eu tenho comentrios" ); // exibe a mensagem

comentado.java

Tipos de dados e declarao de variveis


As variveis em Java, ou so de algum tipo primitivo ou so um objeto, os tipos primitivos so :

Inteiros - byte, short, int, long Ponto flutuante - float, double Caracter - char ( "a" "\n" "\u001B" ) Boleano - boolean (true ou false)

A declarao das variveis realizada usando o formato : tipo varivel Os literais das variveis ponto flutuante devem possuir um F ou um D aps o valor para indicar se o mesmo trata-se de um double ou de um float. por default sero sempre double, logo para atribuir um literal para um varivel float deve-se informar que o mesmo um float com o sufixo F aps o nmero.

/** * Titulo: variaveis.java * Descrio: ilustra declaracoes de variaveis * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class variaveis { // main chamada automaticamente ... public static void main ( String args[] ) { int Quantidade = 123; System.out.println( "Quantidade = " + Quantidade ); char Letra = 'A'; char LetraQualquer = Letra; // um valor com casas decimais por default double double MaiorValor = 60000.45; // logo para usa-lo em um float necessrio indicar com o F float Valor = 2546.34F; float OutroValor = 1500; System.out.println( "Valor = " + Valor ); boolean Permitido = false; System.out.println( "Permitido = " + Permitido ); } }

variaveis.java

Pgina 14

Operadores

igual "==" diferente "!=" atribuio "=" Maior ">" Menor "<" Maior ou igual ">=" Menor ou igual "<=" E "&" OU "|" Negao "!" E otimizado "&&" OU otimizado"||" Aritmticos padro "+" "-" "*" "/" Aritmticos Unrios "+=" "-=" "*=" "/=" Incremento unrio "++" Decremento unrio "--" Resto da diviso "%"

Veja o exemplo abaixo que demonstra o uso dos operadores.

/** * Titulo: variaveis.java * Descrio: ilustra operadores * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class operadores { public static void main ( String args[] ) { int numero = 10; boolean falso = false & ( numero++ < 200 ); System.out.println( "AND & normal - numero = " + numero ); numero = 10; falso = false && ( numero++ < 200 ); System.out.println( "AND && otimizado - numero = " + numero ); float valor /= 10; /* a legibilidade desta operador no das melhores seria melhor : valor = valor / 10

*/ valor /= 2; System.out.println( "/= valor " + valor ); int resto = 10 % 3; System.out.println( "% resto da diviso inteira " + resto ); } }

operadores.java Nota: Os operadores lgicos otimizados, devem ser usados com especial cuidado pois funcionam da seguinte maneira: o "&&" AND ao encontrar algum item da expresso com valor falso, no executa o resto da expresso, e o OR "||" ao encontrar algum elemento da expresso que seja verdadeiro no executa o resto da expresso.

Estruturas de controle
Nota: Todas as estruturas de controle executam blocos de cdigo, que so delimitados pelas chaves "{..}", identificadores criados dentro de um bloco possuem escopo somente para o referido bloco.

Interrompendo os fluxos de controle


return - interrompe a execuo do mtodo em questo retornando o controle para o mtodo chamador break - interrompe a execuo do fluxo atual saindo para a linha de comando imediatamente posterior ao final do bloco de execuo continue - desvia a execuo do programa para o incio do bloco de execuo, evitando a execuo dos trechos posteriores a chamada do continue

Pgina 16

se
o exemplo a seguir ilustra as possveis maneiras de utilizar o if em java, vale ressaltar que a expresso da condio deve possuir um resultado boleano
/** * Titulo: variaveis.java * Descrio: ilustra uso do ife do else * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class se { public static void main ( String args[] ) { int numero = 10; if ( numero >= 5 ) System.out.println( "maior ou igual " + numero ); // esta forma oferece maior legibilidade if ( numero >= 5 ) { System.out.println( "maior ou igual " + numero ); } char A = 'A'; char B = 'B'; if ( A == B ) { System.out.println( A + " igual a B " + B ); } else { System.out.println( A + " diferente de " + B ); } } }

se.java

Variando
O variando dividido em 3 partes:

inicializao da varivel de controle - tambm pode ser realizada a declarao da mesma Condio de parada - exepresso que deve retornar um valor booleano modificao1 da varivel de controle - pode ser ps ou pr-fixado, ou ainda ser uma expresso

/** * Titulo: variaveis.java * Descrio: ilustra uso do for * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class variando { public static void main ( String args[] ) { int limite = 10; for ( int n = 1 ; n <= limite ; n ++ ) { System.out.println( n ); } long fatorial = 1; int quantidade = 18; for ( int n = 1 ; n <= quantidade ; { fatorial *= n; } n ++ )

System.out.println( quantidade + "! = " + fatorial ); } }

variando.java

1 Observar que no um incremento, pois em alguns casos esta expresso de modificao realiza decrementos, nos casos em que o for precisa que a varvel de controle possua valores decrementais Pgina 18

Enquanto
Utilizado normalmente quando precisamos executar um bloco e no podemos determinar com antecedncia a quantidade de vezes, pois a quantidade ir depender de resultados da execuo do bloco

/** * Titulo: variaveis.java * Descrio: ilustra uso do while * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class enquanto { public static void main ( String args[] ) { boolean condicao = true; int n = 1; int limite = 20; while ( condicao ) { System.out.print( n + " " ); n ++; if ( n > limite ) { condicao = false; }

System.out.println( "\n---" ); n = 1; while ( ! ( n > limite ) ) { System.out.print( n + " " ); n ++; } } }

enquanto.java

Caso
o switch avalia uma expresso com resultado inteiro, logo pode ser usado para avalizar um char, podendo comparar tanto com o literal char quanto com o literal inteiro - no caso do literal inteiro ser usado para comparao com o valor da tabela ASCII do caracter Caso o break no seja usado o switch continua avaliando as prximas condies .

/** * Titulo: variaveis.java * Descrio: ilustra uso do switch * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class caso { public static void main ( String args[] ) { int mes = 8; String NomeMes; switch ( mes ) { case 1: NomeMes case 2: NomeMes case 3: NomeMes case 4: NomeMes case 5: NomeMes case 6: NomeMes case 7: NomeMes case 8: NomeMes case 9: NomeMes case 10: NomeMes case 11: NomeMes case 12: NomeMes case 32: NomeMes }

= = = = = = = = = = = = =

"Janeiro"; break; "Fevereiro"; break; "Maro"; break; "Abril"; break; "Maio"; break; "Junho"; break; "Julho"; break; "Agosto"; break; "Setembro"; break; "Outubro"; break; "Novembro"; break; "Dezembro"; break; "Espao"; break;

default: NomeMes = "Mes invlido"; break;

System.out.println( "Mes " + mes + " = " + NomeMes ); char letra = 'B'; String msg ; switch { case case case } ( letra ) 'A': msg = "a letra A"; break; 'B': msg = "b a segunda"; break; 'C': msg = "c o comeo de comeo"; break;

default: msg = "no encontrado";

System.out.println( msg ); } }

caso.java

Pgina 20

Classes bsicas String


String em java, uma classe, portanto possui mtodos e atributos. Uma caracterstica interessante das strings em java, que um literal string tambm um objeto ! Logo podemos realizar construes como "Joo".length () A comparao de strings deve ser realizada usando o mtodo equals, pois quando comparamos duas strings usando "==" estamos na verdade comparando endereos de memria onde objetos esto instanciados. Quando realizamos a atribuio de um valor literal string para uma varivel string, a virtual machine java (VM) cria uma instncia de uma string para aquele literal. Na prxima vez que este literal for usado, a VM ir procurar por uma instncia j existente. Existindo uma, ir utilizar a mesma atribuindo um endereo de memria j existente. Portanto na comparao de variveis como nome1 e nome2 (no exemplo abaixo) usando == , o resultado true.

/** * Titulo: variaveis.java * Descrio: ilustra uso da classe String * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class texto { public static void main ( String args[] ) { String nome1 = "Joo"; String nome2 = "Joo"; String nome3 = new String( "Joo" ) ; if ( nome1 == nome2 ) System.out.println( "nome1 igual nome2" ); else System.out.println( "nome1 diferente nome2" ); if ( nome1 == nome3 ) System.out.println( "nome1 igual nome3" ); else System.out.println( "nome1 diferente nome3" ); if ( nome1.equals( nome2 ) ) System.out.println( "nome1 equals nome2" ); if ( "Joo".equals( nome2 ) ) System.out.println( "Joo equals nome2" ); if ( "Joo" == nome2 ) System.out.println( "Joo == nome2" ); System.out.println( "comprimento " + "Joo".length() ); System.out.println( "substr(0,2) = " + "Joo".substring(0,2) ); System.out.println( "substr(0,2) = " + nome3.substring(0,2) );

System.out.println( String.valueOf( Math.PI ).substring(0,7) ); System.out.println( new Float( 15.43384786F ).toString().substring(0,4) );

texto.java A Converso de outros tipos de dados para String pode ser realizada usando o mtodo toString() que herdado por todas as classes da superclasse Object, ou usando o mtodo valueOf da classe String.
System.out.println( String.valueOf( Math.PI ).substring(0,7) ); System.out.println( new Float( 15.43384786F ).toString().substring(0,4) );

Classes para nmeros


Para cada tipo primitivo existe uma classe equivalente para permitir o manuseio dos dados primitivos. Merecem especial destaque as classes para manipulao de valores int e float, que so respctivamente as classes Integer e Float (ateno nas letras maisculas). Diferentemente da classe string, estas precisam ser instanciadas para serem usadas, logo, para usar uma classe como esta necessrio o operador new, o exemplo abaixo exibe diversos usos destas classes:

/** * Titulo: variaveis.java * Descrio: ilustra uso daa conversao de tipos numericos * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class numeros { public static void main ( String args[] ) { int numeroi = Integer.parseInt("45"); float numerof = Float.parseFloat("45.23F"); double numerod = Double.parseDouble("50.23F"); Float oFloat = new Float( numerof ); Integer oInteger = new Integer( numeroi ); numeroi = (int) numerof; System.out.println( "float para int = " + numeroi ); numeroi = oFloat.intValue(); System.out.println( "Float para int = " + numeroi ); numeroi = (int) numerod; System.out.println( "double para int = " + numeroi ); numerof = (float) numeroi; System.out.println( "int para float = " + numerof );

Pgina 22

numerof = oInteger.floatValue(); System.out.println( "Integer para float = " + numerof ); } }

numeros.java

Para gerar nmeros formatados use a classe NumberFormat, e o mtodo setMinimumFractionDigits(), por exemplo que determina o nmero minimo de casas decimais a serem exibidas veja o exemplo abaixo do uso da classe NumberFormat

/** * Titulo: FormatoNumerico.java * Descrio: ilustra uso da formatao de nmeros * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ class FormatoNumerico { public static void main ( String args[] ){ double numero = 10.456789; java.text.NumberFormat nf = java.text.NumberFormat.getInstance(); nf.setMinimumFractionDigits(2); nf.setMinimumIntegerDigits(2); System.out.println( "Pi " + nf.format( Math.PI ) ); System.out.println( "10.456789 " + nf.format( numero ) ); nf.setMinimumFractionDigits(5); System.out.println( "Pi (5) " + nf.format( Math.PI ) ); } }

FormatoNumerico.java

Vetores
Merece destaque o fato de que o primeiro elemento de um array em Java o zero. A declarao de vetores realizada com o uso de colchetes "[ ]". A declarao consiste em adicionar na declarao da varivel os colchetes, podendo ser antes ou depois do nome da varivel.
int [] vetorInteiros; int NovovetorInteiros [];

O vetor em java possui um tamanho definido, a definio deste tamanho realizada na inicializao do vetor. Esta pode ocorrer no momento da declarao ou posteriormente. Podemos usar o formato onde informamos o tipo de dados e o tamanho entre colchetes, ou informamos os valores dos elementos do vetor entre chaves, e separados por vrgulas. A quantidade de elementos do vetor ser definida pela quantidade de elementos informados entre chaves, veja nos exemplos abaixo:

Pgina 24

int vetorInteiros [] ; int NovovetorInteiros [] = { 1, 3, 4 }; // trs elementos; vetorInteiros = new int[10];

Nota: Observar que a inicializao de vetores usando os valores entre chaves somente pode ser usado na declarao do vetor Vetores de objetos, possuem particularidade, alm de definir os elementos e informar o tamanho do vetor, necessrio instanciar cada objeto nas respectivas posies do vetor, pois ao definir o tamanho do mesmo, somente reservamos espao na memria para comportar os objetos. Vetores multidimensionais so declarados usando mais de um par de colchetes, podendo no momento de instanciar o objeto vetor, informar o tamanho das diversas dimenses. Ou informar uma e as subdimenses informar posteriormente. Para inicializar com valores os elementos de um vetor multidimensional, basta a cada elemento dentro das chaves colocar outros elementos dentro de chaves. O exemplo abaixo mostra diversos usos de vetores, inclusive ressalta o fato que a main recebe as lista de parmetros da execuo em um vetor de Strings, e que o tamanho de um vetor pode ser obtido atravs do atributo length.
/** * Titulo: vetores.java * Descrio: ilustra uso daa conversao de tipos numericos * @author Hamilton Lima Jr athanazio@pobox.com * @version 0.0 * */ import java.text.*; class vetores { public static void main ( String args [] ) { // recebe parametros da linha de comando // em args Float parametros [] = new Float [ args.length ]; for ( int n = 0 ; n < args.length; n ++ ) { parametros[ n ] = new Float( args[n] ); } int vetorInteiros [] ; int NovovetorInteiros [] = { 1, 3, 4 }; // trs elementos; vetorInteiros = new int[10]; System.out.println( vetorInteiros [1] ); System.out.println( NovovetorInteiros [1] ); // este new somente declara um VETOR de Float no um objeto Float Float [] valores = new Float[4];

valores[0] valores[1] valores[2] valores[3]

= = = =

new new new new

Float( 10.24 ); Float( 11.35 ); Float( 12.56 ); Float( 0.1 );

System.out.println( "tamanho = " + valores.length ); NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits( 2 ); nf.setMinimumFractionDigits( 2 ); for ( int n = 0; n < valores.length ; n ++ ) { System.out.println( "valor + 70% = " + (valores[n].floatValue() * 1.7) ); float valorf = valores[n].floatValue() * 1.7F; System.out.println( "valor + 70% = " + nf.format(valorf) );

String nomes [][] = {

};

{"Laranja", "Abbora", "Alface"}, {"Maria", "Joo" }, {"10", "12", "12", "23"}

for( int n = 0; n < nomes.length; n ++ ){ for( int m = 0; m < nomes[n].length; m ++ ){ System.out.println( "nomes[" + n + "][" + m + "] = " + nomes[n][m] ); } } } }

vetores.java

Chateado com a limitao de arrays possuirem tamanho fixo ? use a classe java.util.Vector, e seja feliz

Pgina 26

Lista de exerccios

1. Receba 3 nmeros como parmetro, exiba o maior o menor e o do meio 2. Receba uma frase como parmetro (a frase deve ser digitada entre aspas) e informe o nmero de palavras que a frase contm. 3. Declare um vetor contendo 10 Strings, realize a inverso deste vetor - colocando o elemento 10 como 1, o 9 como 2 e assim por diante, e aps isto exiba o contedo do vetor invertido 4. Receba uma lista de nmeros como parmetro, aps isto exiba a mdia dos nmeros recebidos - independente da quantidade de nmeros 5. Exiba na tela a tabela ASCII, exibindo o nmero do caracter e o seu respectivo caracter - exibir de 1 a 255 6. Crie um vetor multidimensional de objetos, que possua duas dimenses, na primeira adicione um vetor de strings com os nomes dos funcionrios, na segunda um vetor de Float com os salrios dos funcionrios Receba como parmetro o percentual de aumento salarial a ser aplicado para cada funcionrio, aps isto exiba na tela os nomes dos funcionrios acompanhado do salrio atualizado pelo ndice recebido 7. Crie uma calculadora que funcione atravs da linha de comando, esta calculadora deve receber comandos aritmticos semelhantes a linguagem cobol, aps receber cada comando deve realizar o clculo e exibir o resultado MULTIPLY A BY B DIVIDE A BY B ADD A TO B SUBTRACT A FROM B 8. Receba um nome como parmetro e indique quantas vogais e quantas consoantes contm o nome, e a vogal que mais ocorreu 9. Crie uma calculadora de minutos que receba a hora inicial a a hora final e exiba a quantidade de minutos entre os dois horrios - receba os parmetros no seguinte formato HH:MM HH:MM, onde HH significa hora e MM os minutos 10. Receba o nmero do ms e o ano, e aps isto exiba o calendrio para o ms e ano solicitado no seguinte formato:

c:\>java calendario 08 2001 Agosto 2001 Dom Seg Ter Qua 1 5 6 7 8 12 13 14 15 19 20 21 22 26 27 28 29 c:\> Qui 2 9 16 23 30 Sex 3 10 17 24 31 Sab 4 11 18 25

Use a classe GregorianCalendar, mas cuidado com a representao de meses, pois nesta classe comea com ZERO !

Pgina 28

CONCEITOS DE O R I E N TA O A OBJETOS
Conceitos Novas palavras, velhas idias
Quando falamos sobre Orientao a Objetos ( OO ), pensamos logo em algo complexo Obscuro, e as vezes beirando o mgico - os que conhecem esta tecnologia acabam se assemelhando a magos ... Mas na verdade a idia no nova, muito menos original, somente um aperfeicoamento natural da idia de "Reaproveitamento de cdigo", da idia de "Escreva uma vez, e s uma mesmo". Reaproveitamento de cdigo um desafio antigo. Crivamos bibliotecas de cdigo, modelos de trabalho, "receitas de bolo", entre outras coisas. At que funcionava, porm s vezes no. O conceito mais importante em OO, entender que se trata de uma metodologia. Se desejamos colher seus frutos, devemos planejar mais do que j fazemos, porque seno, a nica mudana que teremos uma nova e trabalhosa sintaxe - que no nos oferece muito.

As novas palavras Classes


Classes - este termo em OO, significa a unidade bsica de todo o planejamento, de toda organizao em objetos. Uma classe um modelo para um objeto, a partir da definio de uma classe, podemos gerar, trazer a existncia diversos objetos - como a raa humana, todos da "classe ser humano". Apesar de serem da mesma classe so indivduos separados, com algumas caractersticas prprias.

Atributos
A estas caractersticas que mudam de indivduo para indivduo, chamamos "Atributos". So as informaes que o plano de um objeto - uma classe possui, determinando que informaoes o objeto necessitar para determinar seu comportamento e relacionamento com outros objetos.

Mtodos
O comportamento de um objeto, est na definio de seus "Mtodos" que so na verdade onde residem a programao de fato - onde as estruturas de controle aparecem. So blocos de cdigo, que utilizam os atributos do objeto para realizarem seus objetivos, e s vezes recebem informaes do mundo externo - parmetros -

quando os atributos da classe no so suficientes para a realizao de suas atividades. Considerando a classe seuhumano e o mtodo informarIidade(), consideramos os seguintes fatos: No preciso informar a voc a data do seu nascimento para que voc me diga sua idade ! Esta informao - a data de nascimento - j um atributo seu. Porm se pergunto se vc poderia me emprestar algum dinheiro, preciso passar como parmetro para este mtodo o valor desejado, para que a resposta possa acontecer corretamente.

Encapsulamento
Um conceito vital de OO, o "Encapsulamento" . Ele determina que os atributos de uma classe devem ser privativos dela, garantindo assim a confiabilidade das informaes registradas ali. Para tal so necessrios mtodos de leitura e de gravao para os atributos que precisam ser acessados por outros objetos.

Herana
Coroando OO, vem o conceito de "Herana" que determina que classes podem herdar caractersticas de outras, permitindo que comportamentos que j esto definidos em uma classe no precisem ser redefinidos em outras classes, basta criar entre elas um relacionamento de herana, para as chamadas subclasses - isto no as torna menos importantes, somente determina o sentido da herana - utilizarem as definies realizadas nas chamadas superclasses .

Representando classes Introduo


Iremos utilizar como exemplo para nosso estudo de representao de classes, uma aplicao para automatizar uma loja de animais. Todos os diagramas usados nos exemplos foram criados e exportados como gif usando a ferramenta Argo-UML, que um projeto open-source desenvolvido em java, foi usada a verso 0.8.1

Diagrama de classes
Figura 2-1. Uma Classe

Ilustrao 2exemplo de uma classe

A representao de uma classe feita atravs de um retngulo dividido em trs partes horizontais

Nome da classe Lista de atributos


Pgina 30

Lista de mtodos

Para cada um dos itens da classe podemos informar a sua "Visibilidade" que indica como o atributo ou mtodo da classe ser acessado por outras classes

(-) Privativo - representado por um hfen antes do nome do item, e somente a prpria classe tem acesso (+) Publico - representado por um + antes do nome do item, e todas classes tem acesso (#) Protegido - representado por um # antes do nome do item, e todas subclasses tem acesso

Associao
Figura 2-2. Associaes

Ilustrao 3associao de classes

As associaes entre as classes so representadas por linhas que interligam os retngulos das classes, Alm da linha que estabelece o relacionamento ainda temos a informao da "cardinalidade" que informa as quatidades possveis para o relacionamento, e por fim o nome do relacionamento que fica escrito prximo da linha Podemos ter dois nveis de leitura para um diagrama de classes, a leitura objetiva e a subjetiva Leitura objetiva

um Animal se alimenta de uma ou vrias Dietas uma Dieta pode alimentar vrios Animais ou nenhum Nem toda dieta serve a um Animal Podemos informar Dietas antes mesmo que um animal v se alimentar dela Nem toda dieta serve a um Animal Podemos informar Dietas antes mesmo que um animal v se alimentar dela Sempre que informar-mos um animal sua dieta deve ser informada antes

Leitura subjetiva, ou concluses prticas


Herana
A herana em um diagrama de classes representada atravs de uma linha que une as duas classes, a superclasse indicada por um tringulo que exibido prximo da referida classe conforme vemos no exemplo abaixo, Onde as classes Passaro e Peixe so subclasses de Animal, e Animal superclasse de de Passaro e Peixe Figura 2-3. Herana

Ilustrao 4herana

Pgina 32

U S A N D O J AVA
Classes e objetos
Ao criar uma instncia de uma classe, criamos um objeto para usarmos os mtodos definidos na classe, o exemplo a seguir demonstra isto Exemplo 2-1. Instanciando classes
public class MeuObjeto { private String nome; public MeuObjeto( String nome ) { this.nome = nome; } public String getNomeSeparado() { String retorno = ""; for (int i = 0; i < nome.length(); i++) { retorno += nome.charAt(i) + " "; } } } return retorno;

MeuObjeto.java
public class AppObjeto { public static void main(String[] args) { MeuObjeto o = new MeuObjeto("Jos"); MeuObjeto lista[] = { new MeuObjeto("Ana"), new MeuObjeto("Joo"), new MeuObjeto("Maria") }; for (int i = 0; i < lista.length; i++) { System.out.println( lista[i].getNomeSeparado() ); } }

AppObjeto.java

auto referncia da classe, para fazer referncia a instncia atual da classe, usamos a palavra reservada "this" que permite por exemplo em um mtodo receber um parmetro com o mesmo nome de uma atributo, e ser realizada a referncia ao atributo usando :
public class Exemplo { private String nome; public MeuObjeto( String nome ) { this.nome = nome; } }

todos os atributos possuem escopo dentro do bloco onde foi declarado, se declarado na classe possuir escopo da classe, se declarado dentro de um "for" somente estar visvel dentro do bloco do "for"

Melhorando as classes Construtores


contrutores, so mtodos criados nas classes visando preparar o ambiente para o uso da classe, inicializando atributos, executando mtodos necessrios para o incio do trabalho um mtodo construtor possui o mesmo nome da classe e no possui tipo de retorno, pois na verdade quando o construtor usado pelo operador "new" o retorno ser a instncia, portanto no sendo necessrio identificar o tipo de retorno

Sobrecarga
por vezes desejamos usar um mtodo com o mesmo nome porm com parmetros diferentes na sua chamada, a isto chamamos sobrecarga de mtodos, para realizar, basta declarar os mtodos com o mesmo nome e parmetros diferentes. No momento da chamada ao mtodo basta passar os parmetros no tipo e quantidade definidos em uma das declaraes de mtodos Dica: A sobrecarga tambm pode ser utilizada para construtores realizando assim a sobrecarga de construtores

Controle de acesso
a visibilidade determina como ser o relacionamento da classe com os outras classes, observar que estes qualificadores podem ser usados para qualquer elemento, seja uma classe, um mtodo ou um atributo

private - somente a prpria classe tem acesso public - todas classes tem acesso protected - somente as subclasses tem acesso

Constantes
Para definir valores constantes, basta adicionar a palavra reservada "final" aps a definio da visibilidade e
Pgina 34

antes do tipo de dado do atributo ou do mtodo Tabela 2-2. Descrio do uso do final Elemento Atributo Mtodo Classe Descrio impede que o valor atribuido na declarao seja alterado, usualmente so declarados com nome todo em maisculas no permite que subclasses sobreescrevam o mtodo, garantindo para toda a hierarquia de classes uma determinada forma de implementao no permite que hajam subclasses desta classe, impedindo desta forma que a herana ocorra

Elementos classe
por vezes desejamos usar mtodos ou ainda atributos de classes sem ter que realizar um instncia, isto promovido atravs do uso da palavra reservada "static" que define atributos e mtodos classe, usando o exemplo abaixo para acessar o valor do indice bastaria usar "Salario.INDICE"

public class Salario { private float Salario = 0; public static final float INDICE = 3.56F; public static float Calculo( float Salario ) { return Salario * INDICE; } Salario( float Salario ) { this.Salario = Salario; } Salario( String Salario ) { this.Salario = Float.parseFloat( Salario ); } }

Salario.java

Lista de exerccios
1. Receba uma lista de nomes como parmetro da linha de comando. para cada nome recebido instanciar um objeto da classe pessoa em um vetor de objetos. A classe pessoa deve possuir um atributo idade que calculado de acordo com o comprimento do nome vezes 10. O nome da pessoa informado atravs do construtor da classe pessoa, aps instnciar todos os objetos Pessoa, percorrer a lista de objetos de maneira a exibir o nome da pessoa mais velha da lista

Ilustrao 5diagrama de verba

Crie as classes descritas no diagrama acima e uma aplicao para usar a classe salrio de acordo com os requisitos abaixo descritos A classe Salario possuir um "Vector" de objetos "Verba", sendo que os objetos sero na verdade instncias das subclasses de verba, que estaro descrevendo dados necessrios para o clculo do salrio Cada subclasse de verba dever atribuir a superclasse, em seu construtor os atributos : Descricao, quantidade e valor. E dever receber em seu construtor a quantidade Observar que a classe Descontos, deve atribuir o valor negativo para a superclasse verba de maneira que os valortotal dos objetos referentes a desconto sejam negativo Verba.Valor = valor unitrio da verba em questo verba.valortotal() = retorna valor * quantidade salario.valortotal() = retorna a soma do valortotal de cada verba do Vector de verbas Em uma classe de aplicao crie um objeto do tipo Salario e execute o metodo AdicionarVerba que deve receber como parmetro objetos do tipo verba ( horas normais, horas extras, descontos ). Exibir aps isto o mtodo valortotal() da classe Salario, para exibir o valor do salrio a ser pago
Pgina 36

O R I E N TA O A OBJETOS
Herana
para permitir que as subclasses recebam os mtodos e atributos declarados na superclasse precisamos usar a palavra reservada "extends" que determina que a subclasse possui esta relao com a superclasse Exemplo 3-1. criando subclasses
public class mae { private String nome = ""; public void metodo( String n ) { setNome( "mae " + n + "\n" ); } public void setNome( String nome) { this.nome = this.nome + nome; } public String getNome() { return nome; } }

mae.java
public class filha extends mae { public void metodo( String n ) { super.metodo( n ); setNome( "filha " + n + "\n" ); } }

filha.java

Anulao
quando declaramos um mtodo na subclasse com a mesma assinatura da superclasse estamos realizando a anulao ou "override", isto determina que na subclasse ao executarmos o mtodo em questo estaremos usando o declarado na classe filha Dica: no confundir "override" com "overload" que a sobrecarga, pois a anulao oculta o mtodo da classe me, enquanto que a sobrecarga oferece mais uma alternativa de uso do mesmo mtodo por vezes precisamos no mtodo que est anulando o mtodo da classe me, usar a implementao da classe me, para isto chamamos o mtodo usando a palavra "super" seguido de um ponto e do nome do mtodo que desejamos chamar

Verificao de tipo Molde de tipo


Molde de tipo ou "type casting" permite a um objeto ser tratado como se fosse de outro tipo, bastando para tal usar o nome da classe que desejamos entre parentesis antes do objeto em questo observar que o molde de tipo somente necessrio quando precisamos que um objeto da superclasse que contenha uma instncia de uma subclasse, se faa passar por um objeto da subclasse. Pois para atribuir por exemplo uma instncia de uma subclasse para uma superclasse no necessrio molde de tipo Tabela 3-1. Uso do molde de tipo Situao Superclasse v = new Subclasse() Subclasse s = (Subclasse) v; Comentrio permitido sem necessidade de molde de tipo

permitido com necessidade de molde de tipo, e todas as chamadas a metodos da subclasse tambm so permitidos, pois a varivel v, possui na verdade uma instncia de Subclasse Dica: para verificar o tipo de um objeto pode ser usado o operador "instanceof"

Pgina 38

Exemplo 3-2. criando subclasses


public class heranca { public static void main( String [] arg ) { filha f = new filha(); f.metodo( "Exemplo" ); mae m = new filha(); m.metodo( "segundo Exemplo" ); m = f; f = (filha)m; System.out.println( f.getNome() ); System.out.println( m.getNome() ); } }

heranca.java

Classes sem objetos Classes e mtodos abstratos


Observamos que por vezes desejamos criar classes que no sejam instanciadas, que sejam somente um modelo, ou base para o comportamento de outras. nestes casos usamos o recurso de classe abstrata adicionando a palavra reservada "abstract" da mesma forma realizado nos mtodos adicionamos "abstract" quando no desejamos que o mesmo possua implementao, mas seja implementado nas classes filhas. Observar que nem toda classe abstrata precisa possuir mtodos abstratos, porm todo mtodo abstrato, herdado de um superclasse deve ser implementado a menos que a subclasse tambm seja uma classe abastrata Vejamos os exemplos baseado no diagrama abaixo

Ilustrao 6verbas

Pgina 40

Exemplo 3-3. Classe abstrata


public abstract class Verba { private private private String Descricao = ""; int Quantidade = 0; float Valor = 0;

public String getDescricao() { return Descricao; } public int getQuantidade() { return Quantidade; } public float getValor() { return Valor; } public float ValorTotal() { return Valor * Quantidade; } public void setDescricao( String Descricao ){ this.Descricao = Descricao; } public void setQuantidade( int Quantidade ){ this.Quantidade = Quantidade; } public void setValor( float Valor ){ this.Valor = Valor; } }

Verba.java

Interfaces
interfaces so muito semelhantes a classes abstratas, porm com algumas diferenas essenciais que determinam a necessidade da linguagem possuir dois recursos interfaces permitem definir assinaturas de mtodos ( implicitamente so public e abstract ) que devero ser implementados nas classes que implementam as interfaces, alm disto permitem criar atributos que implicitamente so: public, static, e final Exemplo 3-4. Uso de interface
interface Isql { String sql(); }

neta.java
interface InterfaceHtml { String html(); }

Isql.java
public class neta extends filha implements Isql, InterfaceHtml { public void metodo( String n ) { super.metodo( n ); setNome( "filha " + n + "\n" ); } public String sql(){ return "" + getNome() + ""; } public String html(){ return "<b>" + getNome() + "</b>"; } }

InterfaceHtml.java Tabela 3-2. Comparao classe abstrata e interface Recurso Classe abstrata permite definir mtodos abstratos (sem implementao) sim permite mesclar mtodos abstratos e comuns sim permite herana mltipla no Dica: Interfaces so timos lugares para guardar valores contantes Interface sim no sim

Pgina 42

ORGANIZAO DA CASA
criao de pacotes
pacotes so criados para agrupar as classes de forma organizada e promover (se necessrio) o compartilhamento de atributos e/ou mtodos entre as classes do mesmo pacote, porm mantendo estes elementos fora do alcance das classes de fora do pacote para identificar a que pacote uma classe pertence, basta que na primeira linha do arquivo seja adicionada a palavra reservada "package" seguida do nome do pacote o nome do pacote pode ser formado por vrias partes, separadas por pontos, comum as empresas colocarem como nome dos pacotes com o nome de domnio invertido, seguido do nome de fato do pacote, como : org.athanazio.sgml observar que um pacote como o citado acima dever possuir seus arquivos em um diretorio org\athanazio\sgml e no momento da compilao os arquivos devem estar dentro deste diretrio para usar classes e/ou interfaces que esto dentro de um pacote precisamos importar estes elementos. Para tal usamos a palavra chave "import" seguida do caminho completo do pacote, mais o nome do elemento que deseja importar, ou um asterisco representando que deseja importar todas as classes que esto naquele pacote Dica: O COMANDO IMPORT NO RECURSIVO Exemplo 3-5. usando pacotes
package org.athanazio.sgml; interface entidadeSgml { public String sgml( String texto ); }

entidadeSgml.java

package org.athanazio.sgml; public class para implements entidadeSgml { public String sgml( String texto ) { return "<para>" + texto + "</para>"; } }

para.java

import org.athanazio.sgml.*; public class Testesgml { public static void main( String arg [] ){ para p = new para(); System.out.println( p.sgml( "Java Rockz!" ) ); } }

Testesgml.java

Pgina 44

T R ATA N D O ERROS
Tratamento de erros
A gerao de erros no Java gera objetos de classe de erro, o tratamento dos mesmos passa pela manipulao destes objetos de erro O tratamento de erros em Java baseado nas palavras reservadas "try ... catch ... finally", para executar um bloco de cdigo protegido por um tratamento de erros, basta colocar o mesmo em um bloco aps a palavra "try", e para cada erro que desejamos tratar devemos colocar uma clusula "catch ( TipoErro variavel-erro ) {}" ou uma clusula "finally" que executada aps a execuo do bloco "try" quando um mtodo indica que pode gerar um determinado erro atravs da clusula "throws" ao ser chamado este mtodo dever estar dentro de um bloco de "try" A figura abaixo mostra a hierarquia de classes envolvidas no tratamento de erros Figura 4-1. Classes para Erros

para criar erros personalizados os mesmos devem ser subclasses de Exception, de maneira que ao declarar os mtodos que podem gerar os erros personalizados deve ser citado o erro que pode ser gerado com a clusula "throws", observar que erros da classe "Error" ocorrem quando erros da Java Virtual Machine ocorrem de maneira que os mesmos no podem ser tratados Os erros da classe "RunTimeException" possuem uma particularidade : quando so citados numa clusula "throws" no obrigatrio que a execuo ocorra num bloco de "try", isto porque se tratam de erros como acesso a um objeto no instnciado, acesso a elementos de vetor que no existem

Exemplo 4-1. Exceo personalizada


public class ExceptionCampoVazio extends Exception { public ExceptionCampoVazio( String NomeCampo ) { super("Campo " + NomeCampo + " precisa ser preenchido"); } }

ExceptionCampoVazio.java Exemplo 4-2. mtodo que gera Exceo


public class Venda { private String Nome; public void setNome( String Nome ) throws ExceptionCampoVazio { if ( Nome.equals("") ) { throw new ExceptionCampoVazio( "Nome" ); } else { this.Nome = Nome; } } }

Venda.java Exemplo 4-3. teste de Exceo


public class TesteException { public static void main(String[] args) { Venda v = new Venda(); try { v.setNome(""); } catch ( ExceptionCampoVazio erro ){ System.out.println("Erro : " + erro.getMessage() ); }

TesteException.java

Pgina 46

BANCO DE DADOS
JDBC Conceitos
"Java Database Conectivity", ou uma maneira muito simptica de construir uma camada de acesso a banco de dados independente de plataforma Como um dos objetivos da linguagem Java, escrever uma vez e executar em qualquer lugar, nada mais justo que proporcionar este tipo de alternativa para acesso a banco de dados. O desafio seria possuir drivers de acesso a banco de dados que no dependessem de recursos espcficos de plataforma, ou da biblioteca XYZ do fabricante do banco de dados para realizar o acesso. Sendo assim surgiram os drivers JDBC escritos em Java, nem todos os drivers JDBC so totalmente independentes de bibliotecas do fabricante do banco de dados, mas o ideal sempre adotar os drivers que so escritos totalmente em Java, reduzindo assim a dependencia externa.

Usando JDBC
etapa O que fazer

1. obter o driver JDBC para Acesse http://www.mysql.com/products/connector-j/index.html e procure pela acesso ao Mysql ultima verso estavel do driver 2. obter o banco de dados Mysql Realize o download da ultima verso estavel em www.mysql.com

3. instalar o banco de dados Caso o instalador esteja compactado, descompacte, procure por um arquivo Mysql chamado setup.exe, execute o mesmo, aceite os padro oferecidos ( observar que especialmente o diretrio de instalao no deve ser mudado, pois se realizar esta mudana ser necessrio configurar o banco para funcionar em outro diretorio ) 4. fazendo o banco de dados Procure no diretrio onde o banco de dados foi instalado (Ex. C:\mysql ) pelo funcionar diretrio bin, execute o programa mysqld este programa ir iniciar o banco de dados e permitir acesso ao mesmo (ateno execute somente uma vez)

etapa

O que fazer

5. como verificar se o banco O banco de dados estar ouvindo na porta 3306 por padro portanto, para de dados Mysql est verificar se esta porta estaberta, execute no prompt do MS-Dos : netstat -an e pronto ? procure pela porta 3306, veja o exemplo abaixo

observe a linha TCP 0.0.0.0:3306

0.0.0.0:0

LISTENING

indica que o computador est esperando conexes TCP/IP na porta 3306, ou seja muito provevel que o programa que est esperando tais conexes seja o banco de dados Mysql para confirmar que de fato o banco de dados Mysql que est esperando na porta 3306, execute o seguinte comando: c:\mysql\bin\mysql.exe (substitua c:\mysql\bin pelo diretrio onde foi instalado o mysql em sua maquina) voc ver uma tela semehante a esta
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 3.23.46-nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>

Pgina 48

etapa 6. preparando o banco de dados para ser usado

O que fazer Para executar nosso exemplo, precisamos criar uma tabela no banco de dados, e para isto iremos executar um script de banco dados que nada mais que um arquivo texto com diversos comandos para o banco de dados. Noss script ir executar as seguintes tarefas : a. criao do banco de dados java b. criacao do usuario teste com senha 123 c. criao da tabela cliente d. insero de dados na tabela cliente para criar o script basta colar o contedo abaixo em um arquivo texto e salvar no diretrio c:\mysql\bin
create database java; use mysql; delete from user where user = "teste"; nsert into user ( User, Password , Host ) values ("teste", password("123"), "localhost" ); insert into user ( User, Password , Host ) values ("teste", password("123"), "%" ); flush privileges; grant all on java.* to teste; flush privileges; use java; create table cliente ( id int auto_increment not null primary key, nome varchar(30) ); nsert into cliente ( nome ) values ('joao'); insert into cliente ( nome ) values ('jose'); insert into cliente ( nome ) values ('pedro');

aps criar o arquivo com o nome de banco.sql por exemplo para executa-lo basta o seguinte comando: c:\mysql\bin\mysql < c:\mysql\bin\banco.sql 7. configurando o uso do driver a. crie um diretorio c:\mysql\jdbc b. copie o arquivo .JAR do driver JDBC para o diretorio c. altere a variavel de ambiente CLASSPATH para o seguinte : CLASSPATH=.;c:\mysql\jdbc\nome-do-arquivo-jar-do-jdbc caso o conteudo de CLASSPATH ja possua algo altere para o seguinte : CLASSPATH=%CLASSPATH%;.;;c:\mysql\jdbc\nome-do-arquivo-jar-do-jdbc substitua nome-do-arquivo-jar-do-jdbc pelo nome do arquivo jar do driver jdbc :o)

Vamos finalmente aos exemplos um de leitura de dados e outr de gravao

import java.sql.*; public class LerBanco { static Connection conexao = null; static ResultSet resultado = null; static Statement instrucao = null; static String caminho = "jdbc:mysql://127.0.0.1:3306/java?user=teste&password=123"; public static void main ( String arg[] ) throws Exception { try { System.out.println( "1. nova instancia" ); Class.forName("org.gjt.mm.mysql.Driver").newInstance(); System.out.println( "2. conexao" ); conexao = DriverManager.getConnection( caminho ); instrucao = conexao.createStatement(); System.out.println( "3. executa query" ); resultado = instrucao.executeQuery( "SELECT * FROM cliente ORDER BY nome"); String nome; while ( resultado.next() ) { nome = resultado.getString("nome"); System.out.println( nome ); } } catch (SQLException E) { System.out.println("---------------------------------" ); System.out.println("Erro ao acessar o banco de dados"); System.out.println("SQLException: " + E.getMessage()); System.out.println("SQLState: " + E.getSQLState()); System.out.println("VendorError: " + E.getErrorCode()); System.out.println("---------------------------------" ); E.printStackTrace(); } // try-catch if ( resultado != null) { resultado.close(); } if ( instrucao != null) { instrucao.close(); } if ( conexao != null) { conexao.close(); } } // main } // classe

LerBanco.java

Pgina 50

import java.sql.*; public class IncluirBanco { static Connection conexao = null; static ResultSet resultado = null; static Statement instrucao = null; static String caminho = "jdbc:mysql://127.0.0.1:3306/java?user=teste&password=123"; public static void main ( String arg[] ) throws Exception { if (arg.length < 1) { System.out.println( "Uso incorreto \n" + "devem ser informados ao menos um nome para inclusao no \n" + "banco de dados" ); return; } try { System.out.println( "1. nova instancia" ); Class.forName("org.gjt.mm.mysql.Driver").newInstance(); System.out.println( "2. conexao" ); conexao = DriverManager.getConnection( caminho ); instrucao = conexao.createStatement(); System.out.println( "3. executa query" ); instrucao.executeUpdate( "INSERT INTO cliente ( nome ) VALUES ('" + arg[0] + "')"); } catch (SQLException E) { System.out.println("---------------------------------" ); System.out.println("Erro ao acessar o banco de dados"); System.out.println("SQLException: " + E.getMessage()); System.out.println("SQLState: " + E.getSQLState()); System.out.println("VendorError: " + E.getErrorCode()); System.out.println("---------------------------------" ); E.printStackTrace(); } // try-catch if ( instrucao != null) { instrucao.close(); } if ( conexao != null) { conexao.close(); } } // main } // classe

IncluirBanco.java

I N T E R FA C E S COM USURIO U S A N D O AW T

Pgina 52

Descrio da AWT
Abstract Window Toolkit, permite a gerao de interfaces grficas convencionais usando a linguagem java, entenda convencional como interface que possue janelas, botes, caixas de texto, e outros elementos grficos. A AWT, faz uso das API2 de desenho de interface de cada sistema operacional, logo um interface construda com AWT vai seguir a identidade visual do ambiente em que estiver sendo executada. O pacote de classe java.awt oferece diversas classes para a composio das interfaces, sendo que todas elas sero filhas das classes Component ou MenuComponent. O diagrama abaixo mostra as principais classes do pacote AWT (os gerentes de contedo no esto includos)

Ilustrao 7 pacote awt

2 Application Program Interface conjunto de chamadas oferecidas ao programador, permitindo ao mesmo utilizar recursos sem precisar conhecer o seu funcionamento, ou seja partes de funcionamento interno de um sistema operacional ou programa que so disponibilizados para uso externo

novos nomes Container


permite organizar os componentes visuais dentro deles, os principais containers so : Window e Panel. Usando o mtodo add() os objetos de componentes visuais so adicionados aos containers, permitindo que ao exibir um container os componetes visuais que esto dentro dele sejam exibidos. Window um container que representa uma janela possuindo duas subclasses : Frame e Dialog. Veja uma resumo dos containers:

Frame jabela com ttulo e bordas que permitem redimensionamento, e permite adicionar componente MenuBar Dialog janela simples, no redimensionvel, que no pode conter um MenuBar Panel rea retangular onde podem ser adicionados componentes visuais, observar que deve ser usando dentro de uma Window, ou na janela de um browser

Components
os componentes visuais so a essncia das interfaces, pois atravs dos mesmos que a interao com o usurios acontece, cada componente visual serve a propsitos especficos, como por exemplo um caixa de texto, normalmente usada para o usurio inserir um texto atravs do teclado, usar uma caixa de texto para que o usurio clique com o mouse para selecionar algo parece no mnimo uma interface esfinge3. Veja algumas das classes que pacote awt oferece como componentes visuais:

Button - boto CheckBox caixa de seleo permitindo assinalar sim ou no Choice caixa suspensa TextArea rea de texto com vrias linhas Label texto a ser exibido List lista de seleo TextField rea de texto com somente uma linha

3 Diz a lenda que a terrvel esfinge, criatura alada que misturava o corpo de mulher ao de leo, se postava na entrada da cidade de Tebas e propunha um enigma aos moradores. Decifra-me ou te devoro. Quem no soubesse a resposta era aniquilado. O monstro se apresentou com essa mesma ordem a dipo, o mitolgico heri grego, que acertou a adivinhao e despachou o bicho para sempre. http://www.terra.com.br/istoe/1704/ciencia/1704_palavras_dos_deuses.htm Pgina 54

Gerentes de layout
A posio e tamanho dos componentes adicionados aos containers depende dos gerentes de contedo. O container quando precisa exibir seus componentes, usa o gerente de layout que possuir atualmente para organizar os componentes visuais. Sendo assim problemas como resoluo de vdeo e diferenas de vdeo entre plataformas no precisaro entrar na lista de preocupaes de sua interface visto que o posicionamento ser realizado pelos gerentes de layout mesmo sabendo das facilidades oferecidas pelos gerentes de layout, se desejar que o container no use um gerente de layout deve alterar o mesmo para null
containerFulano.setLayout(null);

definindo o gerente de layout como null ser necessrio usar os mtodos setLocation(), setSize() ou o setBounds() para definir posicionamento e tamanho dos componentes visuais.
Caso deseje gerenciar o layout sem usar os gerentes de leyout existentes a melhor prtica criar uma classe extenda as funcionalidades da classe LayoutManager, construindo assim seu prprio gerente de layout.

Como funciona um aplicao


O cdigo abaixo exibe uma pequena aplicao que somente exibe uma janela na tela, observe que o Frame precisa que seja definida as suas dimenses, atravs do mtodo setSize( largura, altura ), e precisa tambm que seja definido como visvel atravs do mtodo setVisible(true). Este o resultado visual do cdigo abaixo

import java.awt.*; public class FrameExemplo { private Frame f; public FrameExemplo(){ f = new Frame("Titulo da janela"); } public void exibir(){ f.setSize(200,100); f.setBackground( Color.blue ); f.setVisible(true); } public static void main( String args[]){ FrameExemplo janela = new FrameExemplo(); janela.exibir(); }

FrameExemplo.java

Pgina 56

o exemplo abaixo adiciona um painel ao frame e remove o gerenciador de leyout mantendo o painel na posio inicial do frame
import java.awt.*; public class FrameComPainel { private Frame f; private Panel p; public FrameComPainel(String titulo){ f = new Frame( titulo ); p = new Panel(); } public void exibir(){ f.setSize(200,100); f.setBackground( Color.blue ); f.setLayout(null); p.setSize(100,50); p.setBackground(Color.yellow); f.add(p); f.setVisible(true);

public static void main( String args[]){ FrameComPainel janela = new FrameComPainel("com painel"); janela.exibir(); }

FrameComPainel.java

Gerentes de layout
Iremos abrodar os seguintes gerentes contedo:

FlowLayout permite que cada componente seja colocado um ao lado do outro enquanto houver espao BorderLayout divide o container em 5 regies GridLayout separa o container em linhas e colunas

Cada Container possui um gerente de loyout padro de acordo com a lista abaixo :

FlowLayout gerente de layout padro de : Panel BorderLayout gerente de layout padro de Window, Dialog e Frame

FlowLayout
O exemplo de cdigo abaixo ilustra a alterao de gerente de layout em um Frame:
import java.awt.*; public class ExemploLayout { private Frame f; private Button b1; private Button b2; public ExemploLayout(String titulo){ f = new Frame( titulo ); b1 = new Button("me toque"); b2 = new Button("NO ME TOQUE"); } public void exibir(){ f.setLayout( new FlowLayout() ); f.add(b1); f.add(b2); f.pack(); } f.setVisible(true);

public static void main( String args[]){ ExemploLayout janela = new ExemploLayout("toques"); janela.exibir(); } }

ExemploLayout.java

Pgina 58

O cdigo ExemploLayout gera janela conforme as imagens acima, observe que a janela da direita foi redimensionada e os botes foram reposiionados pois o gerente de Layout FlowLayout realiza esta tarefa automaticamente. Observar que o mtodo pack() foi chamado, este mtodo faz com os valores iniciais de tamanho do Frame, zero de altura e zero de largura, sejam alterados para permitir a visualizao dos componentes que foram acicionados a ele, sem deixar desperdcio de tela. Observar que o FlowLayout possui 3 construtores diferentes :

FlowLayout() FlowLayout( alinhamento ) FlowLayout( alinhamento, espao horizontal, espao vertical )

veja os exemplos abaixo de uso do FlowLayout:

// alinhamento a direita, espao horizontal 15 e vertical 30 setLayout( new FlowLayout( FlowLayout.RIGHT, 15, 30 ) ); // alinhamento a esquerda setLayout( new FlowLayout( FlowLayout.LEFT) );

Consulte o javadoc em java.awt na classe FlowLayout para conhecer todos alinhamentos existentes (CENTER, LEADING, LEFT, RIGHT, TRAILING) observar que todos estes valores so atributos classe e inteiros.

BorderLayout
Este gerente de layout divide a tela em 5 regies:
BorderLayout.NORTH BorderLayout.WEST BorderLayout.EAST

BorderLayout.CENTER

BorderLayout.SOUTH

Para usar um BorderLayout basta utilizar um dos seus construtores: BorderLayout() BorderLayout( espao horizontal, espao vertical ) para adicionar elementos a um container que possua o gerente de layout como o BorderLayout devemos usar o mtodo add() porm alm do objeto devemos informar em que regio do BorderLayout desejamos adicionar o elemento, conforme as opes : BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.CENTER, orderLayout.WEST e BorderLayout.EAST. o cdigo abaixo adiciona um boto em um container Painel que pode ser adicionado a outro container para ser visualizado
Panel p = new Panel(); p.setLayout(new BorderLayout()); p.add(new Button("Teste"), BorderLayout.SOUTH);

Ao adicionarmos mais de um componente em uma mesma regio de um BorderLayout somente o ltimo adicionado ficar visvel, contudo existem telas em que desejamos mais de um componente em uma determinada regio, para isto uma soluo seria criar um Panel com FlowLayout adicionar os componentes nele e adicionar o painel na regio do BorderLayout

Pgina 60

O Exemplo a seguir produz a primeira tela com o redimensionamento temos o segundo exemplo onde os elementos grficos so redimensionados.

import java.awt.*; public class ExemploBorder { private private private private private private Frame f; Button bn; Button bs; Button bc; Button bw; Button be;

public ExemploBorder(String titulo){ f = new Frame( titulo ); bn = new Button("NORTE"); bs = new Button("SUL"); bc = new Button("CENTRO"); bw = new Button("OESTE"); be = new Button("LESTE"); } public void exibir(){ f.setLayout( new BorderLayout() ); f.add(bn, BorderLayout.NORTH ); f.add(bs, BorderLayout.SOUTH ); f.add(bc, BorderLayout.CENTER ); f.add(bw, BorderLayout.WEST ); f.add(be, BorderLayout.EAST ); f.pack(); } f.setVisible(true);

public static void main( String args[]){ ExemploBorder janela = new ExemploBorder("regioes"); janela.exibir(); } }

ExemploBorder.java

GridLayout
este gerente de Layout permite a flexibilidade de dividir o container em linhas e colunas, e a cada chamada do mtodo add() um componente adicionado na grade construda no sentido da esquerda para a direita e de cima para baixo. So trs os construtores de GridLayout: GridLayout() - cria um layout de 1 linha por 1 coluna GridLayout( linhas, colunas ) GridLayout( linhas, colunas, espao horizontal, espao vertical ) o exemplo abaixo demonstra a criao de uma interface usando o GridLayout:
import java.awt.*; public class ExemploGrid { private Frame f; private Button b1, b2, b3, b4, b5; public ExemploGrid(String titulo){ f = new Frame( titulo ); b1 = new Button("1"); b2 = new Button("2"); b3 = new Button("3"); b4 = new Button("4"); b5 = new Button("5"); } public void exibir(){ f.setLayout( new GridLayout( 2, 3 ) ); f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5); f.pack(); f.setVisible(true);

public static void main( String args[]){ ExemploGrid janela = new ExemploGrid("botoes & cia"); janela.exibir(); } }

ExemploGrid.java

Pgina 62

Observe que ao redimensionar a janela a proporo entre os elementos visuais permanece

Combinando gerentes de layout


imagine a seguinte necessidade : criar uma interface para uma calculadora: Uma das solues seria criar um painel com GridLayout com os botes de operaes e adiciona-lo na regio center de um BorderLayout e adicionar um caixa de texto na regio norte, vamos ao cdigo que vai gerar as telas abaixo:

import java.awt.*; public class Calculadora { private private private private Frame f; Panel botoes; Button b1, b2, b3, b4, b5, b6, b7, b8, b9, b0; TextField valor;

public Calculadora(String titulo){ f = new Frame( titulo ); b1 = new Button("1"); b2 = new b3 = new Button("3"); b4 = new b5 = new Button("5"); b6 = new b7 = new Button("7"); b8 = new b9 = new Button("9"); b0 = new botoes = new Panel(); valor = new TextField();

Button("2"); Button("4"); Button("6"); Button("8"); Button("0");

public void exibir(){ f.setLayout( new BorderLayout() ); botoes.setLayout( new GridLayout( 4, 3 ) ); botoes.add(b1); botoes.add(b2); botoes.add(b3); botoes.add(b4); botoes.add(b5); botoes.add(b6); botoes.add(b7); botoes.add(b8); botoes.add(b9); botoes.add( new Label("")); botoes.add(b0); f.add( valor , BorderLayout.NORTH ); f.add( botoes, BorderLayout.CENTER ); f.pack(); f.setVisible(true);

public static void main( String args[]){ Calculadora janela = new Calculadora("botoes e botoes"); janela.exibir(); } }

Calculadora.java
1. crie uma layout de calculadora que adicione os botes de operaes a serem realizadas 2. crie uma tela para incluso de dados de um cliente, onde deve ser exibido um label a esquerda de cada caixa de texto (nome e email) e na regio inferior da tela deve ser exibido um boto de ok e outro de cancelar um ao lado do outro

Pgina 64

Desenhando na tela
O compoente Canvas deve ser usado quando desejamos construir um desenho personalizado na tela, para tal basta criar uma subclasse de canvas e sobreescrever o mtodo paint. Observar que o mtodo paint recebe como parmetro um objeto Graphics que possui diversas funcionalidades de primitiva de desenho, o que permite construir qualquer elemento visual personalizado, o exemplo abaixo cria uma classe boneco que desenha um boneco palito, este novo componente usado no exemplo abaixo para desenhar uma famlia de bonecos.
import java.awt.*; public class Boneco extends Canvas{ private Rectangle dimensoes; public Boneco(){ setSize( 60, 100 ); } public void paint(Graphics g){ dimensoes = getBounds(); setBackground( Color.WHITE ); g.clearRect( dimensoes.x, dimensoes.y, dimensoes.width, dimensoes.height ); int areav = (int) (dimensoes.height / 3); int areah = (int) (dimensoes.width / 4); // desenha cabeca g.drawOval( areah, 0, 2*areah, areav ); // desenha corpo g.drawLine( 2*areah, areav, 2*areah, 2*areav ); // desenha braos g.drawLine( 2*areah, (int)(1.5*areav), 3*areah, (int)(1.5*areav) ); g.drawLine( 2*areah, (int) (1.5*areav), areah, (int)(1.5*areav) ); // desenha pernas g.drawLine( 2*areah, 2*areav, 3*areah, 3*areav ); g.drawLine( 2*areah, 2*areav, areah, 3*areav ); } }

Boneco.java

import java.awt.*; public class ExemploBoneco { private private private private Frame f; Boneco b1; Boneco b2; Boneco b3;

public ExemploBoneco(String titulo){ f = new Frame( titulo ); b1 = new Boneco(); b2 = new Boneco(); b3 = new Boneco(); } public void exibir(){ f.setLayout( new GridLayout( 0, 3 ) ); f.add(b1); f.add(b2); f.add(b3); f.pack(); f.setVisible(true);

public static void main( String args[]){ ExemploBoneco janela = new ExemploBoneco("Familia boneco"); janela.exibir(); } }

ExemploBoneco.java
1. pesquise os mtodos primitivos de desenho oferecidos pela classe Graphics 2. faa uma variao da classe boneco em que o corpo do mesmo seja uma retangulo e seja passado como parmetro no seu construtor a cor de preenchimento da cabea e do corpo

Pgina 66

Componentes visuais
A tabela abaixo vai oferecer um referncia simplificada sobre os componentes visuais oferecidos pela AWT
Componente Button Uso comum Permitir ao usurio atravs do clique do mouse indicar uma ao a ser tomada Permite ao usurio indicar se verdadeiro ou falso deve ser usado o mtodo getState() para verificar se esta marcado ou no Exemplos
b0 = new Button("0"); f.add( b0 ); f.add( new Button(boto) );

CheckBox

setLayout(new GridLayout(3, 1)); /* assinala como null o grupo de checkbox e marca como selecionado */ add(new Checkbox("one", null, true)); add(new Checkbox("two")); add(new Checkbox("three"));

para torna-los mutuamente exclusivos necessrio criar um grupo de checkbox e usar o mtodo getSelectedCheckbox() para recuperar que componente est selecionado
setLayout(new GridLayout(3, 1)); CheckboxGroup cbg = new CheckboxGroup(); add(new Checkbox("one", cbg, true)); add(new Checkbox("two", cbg, false)); add(new Checkbox("three", cbg, false));

Choice

Caixa suspensa de seleo, permite escolher a partir de uma lista

Choice lista = new Choice(); lista.add("Green"); lista.add("Red"); ColorChooser.add("Blue");

o cdigo abaixo identifica o elemento atualmente selecionado


String atual = lista.getItem ( lista.getSelectedIndex() );

Componente TextField

Uso comum Caixa de texto para receber entrada de dados do usurio

Exemplos
TextField ed1, ed2, ed3, ed4; // campo de texto vazio ed1 = new TextField(); // vazio com 20 colunas ed2 = new TextField("", 20); // texto a ser exibido predefinido ed3 = new TextField("Ola"); // texto predefinido com 30 colunas ed4 = new TextField("Ola", 30); // define que a caixa de texto ir // exibir * ao invs dos caracteres // difitados ed1.setEchoChar('*'); // recupera o valor do editor 2 String texto = ed2.getText(); // define o valor dos campos // ed3 e ed4 ed3.setText( ed4.getText() ); ed4.setText( texto );

Label

Exibir um texto no container

setLayout(new FlowLayout( FlowLayout.CENTER, 10, 10)); add(new Label("ol")); add(new Label("ol de novo"));

Pgina 68

Componente List

Uso comum Exibe uma lista permitindo ao usurio escolher um dos itens da lista

Exemplos
// exibir quatro elementos na tela // e no permitir multiplas selees List lst = new List(4, false); lst.add("Mercury"); lst.add("Venus"); lst.add("Earth"); lst.add("JavaSoft"); lst.add("Mars"); lst.add("Jupiter"); lst.add("Saturn"); lst.add("Uranus"); lst.add("Neptune"); lst.add("Pluto"); cnt.add(lst);

diferente do choice o component list possui um mtodo que retorna a string ou strings selecionadas atravs dos mtodos :
// retorna uma String getSelectedItem() // retorna um array de String getSelectedItems()

TextArea

Permitir a edio de texto em mais de uma linha

// define uma rea de texto com // 5 linhas e 40 colunas new TextArea("ols", 5, 40);

Tratando Eventos
Interfaces grficas orientadas a eventos, coisa antiga, pois mesmo quando a interface era somente texto, j faziamos programas para tratar eventos do usurio. O que mudou agora a quantidade, e diversidade de eventos que precisamos tratar. Antigamente os eventos ocorriam um por vez, e eram coisas do tipo: o usurio pressionou a tecla A... Hoje temos : o usurio clicou, arrastou, clicou com o direiro, dropou pressionou Alt e clicou, passou com mouse por cima, fechou, abriu, moveu, apertou Page down, up, esquerda, direita, ... muito evento, mas felizmente escrever rotinas para tratar eventos em java muito simples, eventos pra que te quero !

Como funciona ?
As interaes do usurio com a interface gera um evento, a JVM (Java Virtual Machine) cria o objeto com os dados do evento, procura por algum objeto que esteja esperando por eventos deste determinado tipo e executa deste objeto o mtodo referente ao evento ocorrido. O objeto que espera o evento ocorrer chamado de listener, o mtodo que executado para tratar o evento chamasse event-handler. Sendo assim importante observar que caso no haja um listener adequado para um tipo de evento, quando o mesmo ocorrer no ser tratado. O listener pode ser um objeto da prpria classe ou ainda de outra classe, veja o exemplo abaixo, onde o trtador de eventos uma classe separada :
import java.awt.*; public class TesteEvento1 { private Frame f; private Button b1; private Button b2; public TesteEvento1(String titulo){ f = new Frame( titulo ); b1 = new Button("Clique em mim (1)"); b1.setActionCommand("1"); b2 = new Button("Clique em mim (2)"); b2.setActionCommand("2");

public void exibir(){ f.setLayout( new FlowLayout() ); b1.addActionListener( new TratadorBotao() ); b2.addActionListener( new TratadorBotao() ); f.add(b1);

Pgina 70

f.add(b2); f.pack(); f.setVisible(true);

public static void main( String args[]){ TesteEvento1 janela = new TesteEvento1("Eventos"); janela.exibir(); } }

TesteEvento1.java

import java.awt.event.*; public class TratadorBotao implements ActionListener { public void actionPerformed( ActionEvent e ) { System.out.println("Ocorreu uma ao"); System.out.println("comando do boto = " + e.getActionCommand() );

} }

TratadorBotao.java A chamada setActionCommand(1), determina que String ser enviada para o tratador de eventos, visando possibilitar a correta interpretao do comando enviado para o tratador de eventos. Determinando assim para cada boto um comando diferente fazendo com que cada um seja interpretado de forma diferente. O trecho addActionListener( new TratadorBotao() ) associa uma instncia da classe TratadorBotao ao boto indicando este objeto como sendo o tratador de de eventos para o mesmo. O mtodo ActionPerformed( ActionEvent e ) da classe TratadorBotao executado recebendo como parmetro um objeto de ActionEvent que descreve o evento ocorrido, entre outras intformaes, possui o ActionCommand do componente que disparou o evento. Neste outro exemplo de tratador de eventos, possumos somente uma instncia do tratador de eventos, chamamos esta classe de singleton, pois a mesma somente possuir uma instncia (observe que o construtor private), e usamos o mtodo classe get() para recuperar esta instncia. O tratador de eventos recupera o ActionCommand e usa o mesmo para identificar a posio no vetor de contadores a ser incrementada.

import java.awt.event.*; public class TratadorBotaoContador implements ActionListener { private int [] contador; private static TratadorBotaoContador instancia; public static TratadorBotaoContador get(){ if ( instancia == null ){ instancia = new TratadorBotaoContador(); } return instancia; } private TratadorBotaoContador(){ contador = new int[10]; for( int i=0; i <10; i ++ ){ contador[i] = 0; }

public void actionPerformed( ActionEvent e ) { int posicao = Integer.parseInt( e.getActionCommand() ); contador[posicao] ++; for( int i=0; i <10; i ++ ){ if ( contador[i] > 0 ){ System.out.println("contador[" + i + "]=" + contador[i] ); } }

TratadorBotaoContador.java

Pgina 72

Eventos de janelas
Os eventos de janelas so controlados a partir da interface WindowListener, que indica que a classe que a implementa deve fornecer implementao para os mtodos :

windowClosing windowClosed windowOpened windowIconified windowDeiconified windowActivated windowDeactivated

dos quais o mais comum o WindowClosing onde tornamos a janela invisvel e depois abandonamos o programa atual. Observar que neste tratador de evento seria uma bom lugar para se colocar uma pergunta ao usurio se deseja realmente abandonar o programa, ou um bom lugar para gravar configuraes do usurio. Veja o exemplo a seguir que demonstra o uso destes eventos.
import java.awt.*; import java.awt.event.*; /** * exemplo de manipulacao de eventos de janela * * @author Hamilton Lima athanazio@pobox.com * @version 17/11/2002 */ public class ExemploJanela extends Frame implements WindowListener { public ExemploJanela(String titulo){ super(titulo); init(); } private void init(){ addWindowListener(this); setSize(200,100); } public void exibir(){ setVisible(true); } public void windowClosing(WindowEvent e) { System.out.println("evento : closing"); setVisible(false); System.exit(0);

public void windowClosed(WindowEvent e) { System.out.println("evento : closed"); }

public void windowOpened(WindowEvent e) { System.out.println("evento : opened"); } public void windowIconified(WindowEvent e) { System.out.println("evento : iconified"); } public void windowDeiconified(WindowEvent e) { System.out.println("evento : deiconified"); } public void windowActivated(WindowEvent e) { System.out.println("evento : activated"); } public void windowDeactivated(WindowEvent e) { System.out.println("evento : deactivated"); } public static void main( String arg[]){ ExemploJanela e = new ExemploJanela("tratando eventos de janela"); e.exibir(); }

ExemploJanela.java O tratamento de eventos pode ser simplificado atravs dos chamados Adapters classes analogas as interfaces de tratamento de eventos contudo que so classes e implementam as interfaces necessrias para o tratamento de um determinado evento, no sendo necessrios portanto implementar todos os mtodos, to somente aqueles que de fato precisa. A linguagem java inclusive permite um recurso muito elegante de programao que so as classes annimas, para tratamento de eventos, observe no exemplo abaixo que a classe SEM NOME declarada e passada como parmetro no mtodo addWindowListener onde est sendo definido que classe cuidar dos eventos de janela, observe tambm que assim a janela no precisa implementar todos aqueles mtodos vazios de WindowListener.

import java.awt.*; import java.awt.event.*; public class JanelaSimples extends Frame { public JanelaSimples(String titulo){ super(titulo); init(); } private void init(){ setSize(200,100); // tratador de eventos anonimo addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) {

Pgina 74

setVisible(false); System.exit(0); } }); } public void exibir(){ setVisible(true); } public static void main( String arg[]){ JanelaSimples e = new JanelaSimples("tratador de eventos anonimo"); e.exibir(); }

Criando menus
A criao de menus envolve duas classes:

MenuBar a barra dos menus Menu agrupamentos de itens de menu MenuItem cada item de menu

Para a criao de menus necessrio que haja um menu container como um Frame que possa receber o componente MenuBar com seus menu itens. O tratamento de eventos realizado atravs de um ActionListener que deve ser associado a cada item de menu. O exemplo abaixo demonstra a criao de um menu e o tratamento dos eventos ocorridos neles

import java.awt.*; import java.awt.event.*; /** * exemplo de manipulacao de eventos de menu para * abrir varias janelas * * @author Hamilton Lima athanazio@pobox.com * @version 17/11/2002 */ public class Janela1 extends Frame implements ActionListener { public static final String ITEMMENU_SAIR = "sair"; public static final String ITEMMENU_NOVO = "novo"; public static final String ITEMMENU_FECHAR = "fechar"; public Janela1(String titulo){ super(titulo); init(); } private void init(){ setSize(200,100); // tratador de eventos anonimo addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } }); // cria os componentes para o menu MenuBar menu = new MenuBar(); Menu arquivo = new Menu("arquivo"); Menu ajuda = new Menu("ajuda"); // cria os itens de menu MenuItem novo = new MenuItem( ITEMMENU_NOVO ); MenuItem fechar = new MenuItem( ITEMMENU_FECHAR ); MenuItem sair = new MenuItem( ITEMMENU_SAIR );

Pgina 76

// define o tratador de eventos dos itens de menu novo.addActionListener(this); fechar.addActionListener(this); sair.addActionListener(this); // adiciona os itens aos menus arquivo.add(novo); arquivo.add(fechar); arquivo.addSeparator(); arquivo.add(sair); // adiciona os menus a barra de menus menu.add(arquivo); menu.add(ajuda); // adiciona a barra de menus ao Frame setMenuBar(menu); } public void exibir(){ setVisible(true); } public void actionPerformed( ActionEvent e ) { String comando = e.getActionCommand(); if ( comando.equals( ITEMMENU_SAIR ) ){ setVisible(false); System.exit(0); } } System.out.println("comando = " + comando );

Janela1.java

O trecho abaixo executa a janela acima:

public class AppJanela1 { public static void main( String arg[]){ Janela1 j = new Janela1("janela com menus"); j.exibir(); } }

AppJanela1.java O resultado ser uma janela como esta abaixo :

Pgina 78

EXEMPLOS DE SOLUES
Capitulo 1, exerccio 1
Receba 3 nmeros como parmetro, exiba o maior o menor e o do meio Exemplo A-1. maior menor e do meio
public class Pweb_L1_Ex1 { public static void main (String args[]) { String uso = "Use : java Pweb_L1_Ex1 n1 n2 n3 nn"; if (args.length < 1) { System.out.println(uso); System.exit(0); } int MAX = args.length; int resultado[] = new int [ MAX ]; for (int i=0; i<MAX; i++) { resultado[i] = Integer.parseInt(args[i]); } Util obj = new Util(); resultado = obj.ordenaInt(resultado); for (int i=0; i<MAX; i++) { System.out.println(resultado[i]); } } }

Pweb_L1_Ex1.java
import java.util.*; public class Util { String[] split (String str, char ch) { Vector vec = new Vector(); int i, tmp = 0; // Elimina espaos iniciais e finais str.trim();

for (i=0; i < str.length(); i++) { if (str.charAt(i) == ch) { vec.add(str.substring(tmp, i)); tmp = i+1; } } vec.add(str.substring(tmp, i)); if (vec.capacity() < 1) { return null; } else { String []tmpStr; tmpStr = new String[(vec.lastIndexOf(vec.lastElement()) + 1)]; for (i=0; i <= vec.lastIndexOf(vec.lastElement()); i++) { tmpStr[i] = (String)vec.get(i); } return tmpStr; }

int[] ordenaInt (int x[]) { int min, aux; for (int i=0; i < ((x.length) - 1); i++) { min = i; for (int j=(i + 1); j < x.length; j++) { if (x[j] < x[min]) { min = j; } } aux = x[min]; x[min] = x[i]; x[i] = aux; } return x; } }

Util.java

Pgina 80

Capitulo 1, exerccio 2
Receba uma frase como parmetro (a frase deve ser digitada entre aspas) e informe o nmero de palavras que a frase contm Exemplo A-2. numero de palavras de uma frase
public class Pweb_L1_Ex2 { public static void main (String args[]) { String uso = "Use : java Pweb_L1_Ex2 \"FRASE\""; if (args.length < 1) { System.out.println(uso); System.exit(0); } String resultado[]; // Split do argumento, com o separador ' ' Util obj = new Util(); resultado = obj.split(args[0], ' '); for (int i=0; i<resultado.length; i++) { if (resultado[i].length() > 0) { System.out.println(resultado[i]); } } } }

Pweb_L1_Ex2.java

Capitulo 1, exerccio 3
Declare um vetor contendo 10 Strings, realize a inverso deste vetor - colocando o elemento 10 como 1, o 9 como 2 e assim por diante, e aps isto exiba o contedo do vetor invertido Exemplo A-3. Inverso de vetor

/** * * InverterVetorString * * @author athanazio * @version 24/07/2003 */ public class InverterVetorString { public static void main(String[] args) { String vetor[] = { "um", "dois", "tres", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez" }; String temp = null; // divisao de inteiros resultado inteiro int meio = vetor.length / 2; for (int i = 0; i < meio; i++) { temp = vetor[i]; vetor[i] = vetor[ (vetor.length-1) - i]; vetor[ (vetor.length-1) - i] = temp; } for (int i = 0; i < vetor.length; i++) { System.out.println( vetor[i] ); } } }

Pgina 82

Capitulo 1, exerccio 4
Receba uma lista nmeros como parmetro, aps isto exiba a mdia dos nmeros recebidos - independente da quantidade de nmeros Exemplo A-4. Mdia de nmeros
// Exercicio 4 public class Pweb_L1_Ex4 { public static void main (String args[]) { String uso = "Use : java Pweb_L1_Ex4 n1 n2 n3 nn"; if (args.length < 1) { System.out.println(uso); System.exit(0); } int contador, soma = 0; for (contador=0; contador < args.length; contador++) { soma += Integer.parseInt(args[contador]); } System.out.println((float)(soma / contador)); } }

Pweb_L1_Ex4.java

Capitulo 1, exerccio 5
Exiba na tela a tabela ASCII, exibindo o nmero do caracter e o seu respectivo caracter - exibir de 1 a 255 Exemplo A-5. Tabela ASCII
/** * * ListarTabelaASCII * * @author athanazio * @version 24/07/2003 */ public class ListarTabelaASCII { public static void main(String[] args) { for (int i = 0; i <= 255; i++) { System.out.println( i + " " + (char)i); } } }

Pgina 84

Capitulo 1, exerccio 6
Crie um vetor multidimensional de objetos, que possua duas dimenses, na primeira adicione um vator de strings com os nomes dos funcionrios, na segunda um vetor de Float com os salrios dos funcionrios Receba como parmetro o percentual de aumento salarial a ser aplicado para cada funcionrio, aps isto exiba na tela os nomes dos funcionrios acompanhado do salrio atualizado pelo ndice recebido Exemplo A-6. Vetor de objetos

Pweb_L1_Ex6.java

Capitulo 1, exerccio 7
Crie uma calculadora que funcione atravs da linha de comando, esta calculadora deve receber comandos aritmticos semelhantes a linguagem cobol, aps receber cada comando deve realizar o clculo e exibir o resultado

MULTIPLY A BY B DIVIDE A BY B ADD A TO B SUBTRACT A FROM B

Exemplo A-7. Calculadora

public class Pweb_L1_Ex7 { public static void main (String args[]) { String uso = "Use : java Pweb_L1_Ex7 MULTIPLY n1 BY n2 \n" + "java Pweb_L1_Ex7 DIVIDE n1 BY n2\n" + "java Pweb_L1_Ex7 ADD n1 TO n2 \n" + "java Pweb_L1_Ex7 SUBTRACT n1 FROM n2"; if (args.length < 4) { System.out.println(uso); System.exit(0); } String int n1 String int n2 double op1 = args[0]; = Integer.parseInt(args[1]); op2 = args[2]; = Integer.parseInt(args[3]); result = 0.0;

if (op1.equals("MULTIPLY") && op2.equals("BY")) { result = (double)(n1 * n2); } else if (op1.equals("DIVIDE") && op2.equals("BY")) { result = (double)n1 / (double)n2; } else if (op1.equals("ADD") && op2.equals("TO")) { result = (double)(n1 + n2); } else if (op1.equals("SUBTRACT") && op2.equals("FROM")) { result = (double)(n1 - n2); } else { System.out.println(uso); System.exit(0); } System.out.println(result); } }

Pweb_L1_Ex7.java

Pgina 86

Capitulo 1, exerccio 8
Receba um nome como parmetro e indique quantas vogais e quantas consoantes contm o nome, e a vogal que mais ocorreu Exemplo A-8. Contagem de vogais e consoantes
public class Pweb_L1_Ex8 { public static void main (String args[]) { String uso = "Use : java Pweb_L1_Ex8 nome"; if (args.length < 1) { System.out.println(uso); System.exit(0); } char []consoante = {'b','c','d','f','g','h','j','k','l', 'm','n','p','q','r','s','t', 'v','w','x','y','z'}; char []vogal = {'a','e','i','o','u'}; int []contadorVogais = new int [vogal.length]; int contador, somaC = 0, somaV = 0; for (contador=0; contador < args[0].length(); contador++) { for (int i=0; i < consoante.length; i++) { if (args[0].charAt(contador) == consoante[i]) { somaC++; break; } } for (int i=0; i < vogal.length; i++) { if (args[0].charAt(contador) == vogal[i]) { somaV++; contadorVogais[i]++; break; } } } int []contadorVogaisTmp = new int [vogal.length]; for (int i=0; i < vogal.length; i++) { contadorVogaisTmp[i] = contadorVogais[i]; } Util obj = new Util(); int resultado[] = obj.ordenaInt(contadorVogaisTmp); String maisVezes = ""; for (int i=0; i < vogal.length; i++) { if (contadorVogais[i] == resultado[resultado.length - 1]) { maisVezes += String.valueOf(vogal[i]); } } System.out.println("Total de Vogais : " + String.valueOf(somaV)); System.out.println("Total de Consoantes : " + String.valueOf(somaC)); System.out.println("Vogais que mais ocorreram : " + maisVezes);

Pweb_L1_Ex8.java

Capitulo 1, exerccio 9
Crie um calculadora de minutos que receba a hora inicial a a hora final e exiba a quantidade de minutos entre os dois horrios - receba os parmetros no seguinte formato HH:MM HH:MM, onde HH significa hora e MM os minutos Exemplo A-9. Calculadora de minutos
public class Pweb_L1_Ex9 { public static void main (String args[]) { String uso = "Use : java Pweb_L1_Ex9 HH:MM HH:MM"; if (args.length < 2) { System.out.println(uso); System.exit(0); } String tmp1[]; String tmp2[]; // Split do argumento, com o separador ':' Util obj = new Util(); tmp1 = obj.split(args[0], ':'); tmp2 = obj.split(args[1], ':'); // Testes p/ validar formato de hora if ((tmp1.length != 2) || (tmp2.length != 2) || ((Integer.parseInt(tmp1[0]) < 0) || (Integer.parseInt(tmp1[0]) > 23)) || ((Integer.parseInt(tmp2[0]) < 0) || (Integer.parseInt(tmp2[0]) > 23)) || ((Integer.parseInt(tmp1[1]) < 0) || (Integer.parseInt(tmp1[1]) > 59)) || ((Integer.parseInt(tmp2[1]) < 0) || (Integer.parseInt(tmp2[1]) > 59))) { System.out.println(uso); System.exit(0);

int minutos1 = (Integer.parseInt(tmp1[0]) * 60) + Integer.parseInt(tmp1[1]); int minutos2 = (Integer.parseInt(tmp2[0]) * 60) + Integer.parseInt(tmp2[1]); int resultado; // No faz sentido tempo negativo if (minutos1 > minutos2) { resultado = minutos1 - minutos2; } else {

Pgina 88

resultado = minutos2 - minutos1;

System.out.println("Diferenca de " + String.valueOf(resultado) + " minutos !"); } }

Pweb_L1_Ex9.java

Capitulo 1, exerccio 10
Receba o nmero do ms e o ano, e aps isto exiba o calendrio para o ms e ano solicitado no seguinte formato:
c:\>java calendario 08 2001 Agosto 2001 Dom Seg Ter Qua 1 5 6 7 8 12 13 14 15 19 20 21 22 26 27 28 29 c:\> Qui 2 9 16 23 30 Sex 3 10 17 24 31 Sab 4 11 18 25

Exemplo A-10. Calendario


// Exercicio 10 import java.util.*; public class Pweb_L1_Ex10 { public static void main (String args[]) { // Verificacao das informacoes passadas String uso = "Use : java Pweb_L1_Ex10 MONTH YEAR"; if (args.length < 2) { System.out.println(uso); System.exit(0); } // Recupera parametros int mes = Integer.parseInt(args[0]) - 1; int ano = Integer.parseInt(args[1]); // Variaveis locais int maxLinhas = 6; int colunas = 7; int linhaCorrente = 0; String[][] calendario = new String[6][colunas]; String[] dias = {"Dom","Seg","Ter","Qua","Qui","Sex","Sab"}; String[] meses = {"Janeiro","Fevereiro","Marco","Abril", "Maio","Junho","Julho","Agosto", "Setembro","Outubro","Novembro","Dezembro" }; // Inicializa calendario com espacos vazios for (int i=0; i < maxLinhas; i++) { for (int ii=0; ii < colunas; ii++) { calendario[i][ii] = " "; } } // Instancia de um objeto GregorianCalendar GregorianCalendar cal = new GregorianCalendar(ano, mes, 1);

Pgina 90

// Primeiro e Ultimo dia do mes utilizado int primeiroDia = cal.getActualMinimum(Calendar.DATE); int ultimoDia = cal.getActualMaximum(Calendar.DATE); int ultimoDiaSemana = cal.getFirstDayOfWeek() - 1; // Carregamento do Array Calendario for (int i=primeiroDia; i <= ultimoDia; i++) { // Guarda o dia na posicao em que deve aparecer no calendario calendario[linhaCorrente][(cal.get(Calendar.DAY_OF_WEEK) - 1)] = String.valueOf(i); // Adiciona um dia no objeto cal ( // nossa instancia do GregorianCalendar) cal.add(Calendar.DATE, 1); // Se ultimo dia da semana, pula linha if (cal.get(Calendar.DAY_OF_WEEK) == ultimoDiaSemana) { linhaCorrente++; }

// Impressao na tela - Cabecalho System.out.println("\n " + meses[mes] + " " + String.valueOf(ano) + "\n"); for (int i=0; i < dias.length; i++) { System.out.print(dias[i] + " "); } System.out.println(""); // Impressao na tela - dados do Array calendario for (int i=0; i < maxLinhas; i++) { for (int ii=0; ii < colunas; ii++) { if (calendario[i][ii].length() == 1) { System.out.print(" "); } System.out.print(calendario[i][ii] + " "); } System.out.println(""); } }

Pweb_L1_Ex10.java

EXEMPLO DE APLICAO MDI


Este exemplo de aplicao MDI combina recursos de AWT e Swing em uma s aplicao, as bibliotecas Swing so usadas para gerenciar o comportamento visual de janelas filhas que permanecem internas na janela principal, as seguintes classes compes este exemplo:

AppMDI.java aplicao que chama janela principal MDIPrincipal.java janela principal que controla as janelas existentes MDIFilha.java Classe modelo para janelas filhas MDISobre tela modal de ajuda com crditos da aplicao

como diria uma amigo meu... show me the code !

public class AppMDI { public static void main( String arg[]){ MDIPrincipal mdi = new MDIPrincipal("Janela MDI"); mdi.exibir(); } }

AppMDI.java

import import import import import import

java.awt.*; java.awt.event.*; java.util.Vector; java.util.Iterator; javax.swing.*; javax.swing.event.*;

/** * MDIPrincipal * exemplo de aplicacao MDI * janela principal * * @author Hamilton Lima athanazio@pobox.com * @version 17/11/2002 */ public class MDIPrincipal extends JFrame implements ActionListener { public static final String ITEMMENU_SAIR = "sair";

Pgina 92

public static final String ITEMMENU_NOVO = "novo"; public static final String ITEMMENU_FECHAR = "fechar"; public static final String ITEMMENU_SOBRE = "sobre"; public static final String MENU_ARQUIVO = "arquivo"; public static final String MENU_AJUDA = "ajuda"; public static final String MENU_JANELA = "janela"; public static final String PREFIXO_JANELA protected protected protected protected MenuBar barraMenu; Menu menuArquivo; Menu menuJanela; Menu menuAjuda; = "Janela";

// area interna protected JDesktopPane desktop; public MDIPrincipal(String titulo){ super(titulo); init(); } private void init(){ setSize(400,300); desktop = new JDesktopPane(); desktop.setPreferredSize(new Dimension(400,300)); setContentPane(desktop); // tratador de eventos anonimo addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } }); // cria os componentes para o menu barraMenu = new MenuBar(); menuArquivo = new Menu( MENU_ARQUIVO ); menuJanela = new Menu( MENU_JANELA ); menuAjuda = new Menu( MENU_AJUDA ); // cria os itens de menu MenuItem novo = new MenuItem( ITEMMENU_NOVO ); MenuItem fechar = new MenuItem( ITEMMENU_FECHAR ); MenuItem sair = new MenuItem( ITEMMENU_SAIR ); MenuItem sobre = new MenuItem( ITEMMENU_SOBRE ); // define o tratador de eventos dos itens de menu novo.addActionListener(this); fechar.addActionListener(this); sair.addActionListener(this); sobre.addActionListener(this); // adiciona os itens aos menus menuArquivo.add(novo); menuArquivo.add(fechar); menuArquivo.addSeparator(); menuArquivo.add(sair); menuAjuda.add( sobre );

// adiciona os menus a barra de menus barraMenu.add(menuArquivo); barraMenu.add(menuJanela); barraMenu.add(menuAjuda); // adiciona a barra de menus ao Frame setMenuBar(barraMenu);

public void exibir(){ setVisible(true); } public void actionPerformed( ActionEvent e ) { String comando = e.getActionCommand(); if ( comando.equals( ITEMMENU_SAIR ) ){ setVisible(false); System.exit(0); } if ( comando.equals( ITEMMENU_NOVO ) ) novo(); if ( comando.equals( ITEMMENU_FECHAR ) ) fechar(); if ( comando.equals( ITEMMENU_SOBRE ) ) sobre(); } selecionarJanela( comando );

protected void selecionarJanela( String comando ){ Iterator iterator = listaJanelas.iterator(); MDIFilha filha = null; while (iterator.hasNext()){ filha = (MDIFilha)iterator.next(); if ( filha.toString().equals( comando ) ){ filha.show(); filha.toFront(); try { filha.setSelected(true); } catch( Exception e ){ System.out.println( "erro ao selecionar janela filha"); } break; } } } public void sobre(){ MDISobre j = new MDISobre( this ); j.show(); } private int contadorJanelas = 1; public void novo(){ atual = new MDIFilha( this, "Janela" + Integer.toString( contadorJanelas ++ ) );

Pgina 94

atual.reshape( 0, 0, 200, 100 ); // adiciona ao controle interno de janelas listaJanelas.add( atual ); // adiciona a area visivel da janela desktop.add( atual ); //exibe a janela atual.show(); //adiciona ao menu MenuItem filha = new MenuItem( atual.toString() ); filha.addActionListener(this); menuJanela.add(filha); } public void fechar(){ if ( atual != null ){ atual.fechar(); } } // metodos para o controle das janelas filhas MDIFilha atual = null; Vector listaJanelas = new Vector(); public void abrindo( MDIFilha janela ){ atual = janela; } public void fechando( MDIFilha janela ){ if ( janela == atual ) atual = null; // remove da lista Iterator iterator = listaJanelas.iterator(); while (iterator.hasNext()){ if ( iterator.next() == janela ) iterator.remove(); } // remove do menu int maximo = menuJanela.getItemCount(); for( int n = 0; n < maximo; n ++ ){ if ( menuJanela.getItem(n).getLabel().equals( janela.toString() )){ menuJanela.remove(n); break; } }

public void minimizando( MDIFilha janela ){ if ( janela == atual ) atual = null; } public void restaurando( MDIFilha janela ){ atual = janela; } public void desativando( MDIFilha janela ){ if ( janela == atual ) atual = null;

} public void ativando( MDIFilha janela ){ atual = janela; }

MDIPrincipal.java

import import import import

java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*;

/** * MDIFilha * exemplo de aplicacao MDI * janela base para criacao das janelas internas * * @author Hamilton Lima athanazio@pobox.com * @version 17/11/2002 */ public class MDIFilha extends JInternalFrame implements InternalFrameListener { MDIPrincipal dono; public MDIFilha( Frame dono, String titulo ) { super( titulo, true, true, true, true ); setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE ); addInternalFrameListener(this); this.dono = (MDIPrincipal)dono; public void fechar(){ setVisible(false); dono.fechando( this ); } public String toString(){ return getTitle(); } public void internalFrameClosing(InternalFrameEvent e) { dono.fechando( this ); } public void internalFrameClosed(InternalFrameEvent e) { } public void internalFrameOpened(InternalFrameEvent e) { dono.abrindo( this ); } public void internalFrameIconified(InternalFrameEvent e) { dono.minimizando( this ); } public void internalFrameDeiconified(InternalFrameEvent e) { dono.restaurando( this ); } public void internalFrameActivated(InternalFrameEvent e) { dono.ativando( this );

Pgina 96

} public void internalFrameDeactivated(InternalFrameEvent e) { dono.desativando( this ); } }

MDIFilha.java

import java.awt.*; import java.awt.event.*; /** * MDISobre * exemplo de aplicacao MDI * janela de ajuda com creditos da aplicacao * * @author Hamilton Lima athanazio@pobox.com * @version 17/11/2002 */ public class MDISobre extends Dialog { public static final int LARGURA = 250; public static final int ALTURA = 150; protected static String titulo = "sobre"; public MDISobre( Frame owner ){ super( owner, titulo, true ); setLayout( new GridLayout( 3, 1, 10, 10 ) ); // calcula para centralizar a janela Rectangle r = owner.getBounds(); int x = r.x + (int)((( r.width - r.x ) - LARGURA )/2); int y = r.y + (int)((( r.height - r.y ) - ALTURA )/2); reshape( x, y, LARGURA, ALTURA ); Label label = new Label.CENTER Label autor = new Label.CENTER Label("Exemplo de aplicacao MDI", ); Label("www.athanazio.org 2002", );

Button botao = new Button("Fechar"); botao.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e){ dispose(); } }); Panel panel = new Panel( new FlowLayout( FlowLayout.CENTER ) ); panel.add( botao ); add( label ); add( autor ); add( panel );

MDISobre.java

Pgina 98

Das könnte Ihnen auch gefallen