Sie sind auf Seite 1von 193

Linguagem de Programao IV

Ementa da Disciplina
Fundamentos do paradigma orientado a objetos em Java. Bibliotecas de suporte, componentes grficos, interfaces e estruturas de dados, classes coletivas. Tratamento de exceo. Gerncia de memria. Multithreading (concorrncia). Applets Java.

Bibliografia
LIVRO TEXTO: DEITEL, H.M., DEITEL, P.J. Java, Como Programar. 4 Edio. Porto Alegre: Bookman, 2003. LEMAY, L. e CADENHEAD, R. Aprenda em 21 Dias Java 2: Professional Reference. 3a. Ed. So Paulo: Campus, 2003. OBRAS DE REFERNCIA: HORSTMANN, Cay. Big Java. Porto Alegre: Bookman, 2004. HORSTMANN, Cay, et al. Core Java 2, Volume 1: Fundamentos. S. Paulo: Makron Books, 2001. HORSTMANN, Cay, et al. Core Java 2, Volume 2: Recursos Avanados. S. Paulo: Makron Books, 2001. FURGERI, Srgio. Java 2 Ensino Didtico. So Paulo: Editora rica, 2002. CAMARO, C. e FIGUEIREDO, L. Programao de Computadores em Java. Rio de Janeiro: LTC, 2003 SANTOS, R. Introduo Programao Orientada a Objetos usando Java. Rio de Janeiro: Campus, 2003. MECENAS, I. Java 2 Fundamentos, Swing e JDBC. Rio de Janeiro: Alta Books, 2003. OLIVEIRA, Alcione P. Notas de Aula DPI-UFV. Viosa, 2001. CHAN, Mark C. et al. Java: 1001 Dicas de Programao. So Paulo: Makron Books, 1999. ECKEL, Bruce. Thinking in Java, 3rd Edition. (e-book). DAVIS, Stephen R. Aprenda Java Agora. Rio de Janeiro: Campus, 1997. LALANI, Suleiman S. e JAMSA, Kris. Java: Biblioteca do Programador. So Paulo: Makron Books, 1997. NEWMAN, A. et al. Usando Java: O Guia de Referncia Mais Completo. Rio de Janeiro: Campus, 1997. WUTKA, Mark. Java: Tcnicas Profissionais. So Paulo: Berkeley, 1997. DAMASCENO JR., Amrico. Aprendendo Java: Programao na Internet. So Paulo: rica, 1996. JEPSON, Brian. Programando Banco de Dados em Java. So Paulo: Makron Books, 1997. RITCHEY, Tim. Java! Indianpolis, EUA: New Riders, 1995. FLANAGAN, David. Java in a Nutshell. OReilley & Associates, 1997.

A histria de Java
Origem: projeto de pesquisa da Sun Microsystems, iniciado em 1991, destinado a desenvolver uma linguagem para a programao de dispositivos eletrnicos em geral (pagers, celulares, PDAs, TV a cabo, etc). Baseada em C e C++. Seu criador, James Gosling, inicialmente a chamou de Oak, mas descobriu-se que, na poca, j havia uma outra linguagem com este mesmo nome. Conta a lenda, que o nome Java foi escolhido em uma cafeteria, e refere-se a uma variedade de caf, originrio da ilha homnima, do Pacfico.

Impulso ao uso de Java: a World Wide Web explode em popularidade a partir de 1993 e a Sun percebe o seu grande potencial para a construo de pginas com contedo dinmico.
Em 1995, Java anunciada formalmente comunidade mundial. Atualmente, a tecnologia Java divide-se em J2SE, J2EE e J2ME e est na verso 1.5.0 (o chamado Core Java Software, ou, J2SE 5.0)

"Alo, Mundo" uma string de caracteres, e deve ser definida entre aspas duplas. Nem toda classe necessariamente deve possuir um mtodo main e, portanto, ser um aplicativo Java. O exemplo a seguir ilustra isto:

public class Teste { public static void main(String a[]){ AloMundo.Alo(); } } class AloMundo { public static void Alo(){ System.out.println("Alo, mundo"); } }

GUI em Java: pacote Swing


Java possui dois pacotes de interfaces grficas com o usurio. O mais antigo a AWT (Abstract Windowing Toolkit), que utiliza os componentes grficos nativos do sistema operacional. O exemplo abaixo emprega o pacote Swing (javax.swing), que emprega componentes grficos Java. //AloMundo com interface grafica import javax.swing.JOptionPane; public class AloMundo2 { public static void main(String args[]) { JOptionPane.showMessageDialog( null,"Al, Mundo!"); System.exit(0); } }

Aps digit-lo, salve com o nome da classe, ou seja: AloMundo2.java

Java possui uma extensa biblioteca de classes pr-definidas disponveis para o programador. Estas classes so agrupadas em categorias de classes relacionadas, chamadas de pacotes.

O conjunto de pacotes Java denominado biblioteca de classes Java ou Java Application Programming Interface API.
O pacote javax.swing ajuda o programador a definir interfaces grficas com o usurio (Graphical User Interfaces GUIs) import javax.swing.JOptionPane; O comando import indica a localizao da classe JoptionPane, presente no pacote de classes javax.swing

Sada do programa AloMundo2.java:

Variveis
Em Java, necessrio definir formalmente uma varivel antes de utiliz-la. Isto implica em declarar o seu nome e tipo de informao que ir armazenar.
int numero; String nome; double preco; boolean flag; uma boa prtica de programao definir uma varivel por linha. Existem trs tipos de variveis em Java: locais, de instncia e de classe. As variveis locais podem ser declaradas em qualquer lugar dentro de um mtodo. Uma boa prtica de programao consiste em defini-las imediatamente aps a chave de abertura do mtodo. Ateno: todas as variveis locais precisam ser inicializadas antes de serem utilizadas, caso contrrio, o compilador acusar erro!

As variveis de instncia podem ser declaradas em qualquer lugar dentro de uma classe. Uma boa prtica de programao consiste em defini-las imediatamente aps a chave de abertura da classe. As definies de variveis de instncia, ao contrrio das variveis locais, recebem automaticamente um valor inicial padro, especificado pelo compilador. Variveis numricas recebem 0, de caracteres, '\0', lgicas, false, objetos, null. class Teste { int numero; public static void main(String args[]) { Teste teste = new Teste(); System.out.println(teste.numero); } } Uma varivel de instncia s pode ser referenciada em uma instncia da classe.

As variveis de classe, definidas pelo modificador static, podem ser declaradas em qualquer lugar dentro de uma classe.

As definies de variveis de classe, da mesma forma que as variveis de instncia, recebem automaticamente um valor inicial padro, especificado pelo compilador. Variveis numricas recebem 0, de caracteres, '\0', lgicas, false, objetos, null.
class Teste { static int numero; public static void main(String args[]) { System.out.println(numero); } }

Uma varivel de classe pertence classe, independe de qualquer instanciao de objetos da classe.

Tipos de dados
Existem oito tipos de dados primitivos em Java para o armazenamento de inteiros, nmeros de ponto flutuante, caracteres e valores lgicos.
Ao contrrio do que acontece em outras linguagens de programao, em Java estes tipos primitivos tm o mesmo tamanho e caractersticas em qualquer plataforma de hardware e sistema operacional. boolean char byte short int long float double 08 16 08 16 32 64 32 64 bits bits bits bits bits bits bits bits true ou false '\u0000' a '\uFFFF' -128 a 127 -32.768 a 32.767 -2.147.483.648 a 2.147.483.647 at 9.223.372.036.854.775.807 at 3.40292347E+38 at 1.7976931348623157E+308

Obs.: Os caracteres Unicode so usualmente expressos em termos de um esquema de codificao hexadecimal. O prefixo \u indica um valor Unicode.

import javax.swing.JOptionPane; public class Teste { public static void main(String[] args) { JOptionPane.showMessageDialog(null,""+Double.MAX_VALUE); System.exit(0); } }

O exemplo acima ilustra a utilizao de uma varivel de classe, MAX_VALUE, da classe Double. Esta classe chamada empacotadora ou wrapper. Cada um dos tipos primitivos Java possui a sua correspondente classe empacotadora. A varivel de classe MAX_VALUE retorna o valor mximo do tipo primitivo utilizado, no caso, double.

public class Teste { public static void main(String a[]){ float total; total = 5.5F; System.out.println(total); } } O erro acontece porque Java trata todas as operaes de ponto flutuante em double e a converso de double para float no automtica. Tambm possvel declarar literais de ponto flutuante com expoentes: public class Teste { public static void main(String a[]){ double total; total = 1.0e5; System.out.println(total); } }

Literais de caracteres so expressos por meio de um nico caracter delimitado por apstrofos. Alguns literais de caracteres teis so apresentados abaixo: \n \t \b \\ \' \" nova linha tabulao retrocesso barra apstrofo aspas

public class Teste { public static void main(String a[]){ System.out.println("Clube Atletico Mineiro: \n\"Galo forte e vingador!\""); } }

Sada de dados com printf


Um novo recurso, introduzido em J2SE 5.0, o mtodo System.out. printf, capaz de formatar mais adequadamente uma sada em Java, em uma forma semelhante funo printf da linguagem C.

public class Teste { public static void main(String[] a) { String s = "Atltico"; System.out.printf(" Grandioso %s\n",s); } }
Grandioso Atltico O primeiro argumento de printf a string de formatao, composta de constantes string e caracteres de formatao. No exemplo acima, o delimitador % seguido de s indica que o mtodo deve ter um outro argumento do tipo String.

Os caracteres de formatao podem tambm ser usados para compor uma String, usando o mtodo String.format, conforme no exemplo a seguir: public class Main { public static void main(String[] args) { int a = 65; String s = String.format("char: %c integer: %d hexa: %h octal: %o",a,a,a,a); System.out.println(s); } }

Para o exemplo acima, onde usado o mesmo argumento para a formatao, existem alternativas para a codificao: String s = String.format("char: %c integer: %<d hexa: %<h octal: %<o",a);
String s = String.format("char: %1$c integer: %1$d hexa: %1$h octal: %1$o",a);

Entrada de dados com Scanner


A leitura de dados de entrada em aplicativos atravs da janela de comando do sistema operacional era surpreendentemente complexa at a verso 1.4.2 do J2SE. Isto no era problema para aplicativos com recursos GUI, mas tornava-se desconfortvel para estudantes interessados em escrever programas simples com o propsito de aprender Java. J2SE 5.0 introduz a classe java.util.Scanner para a entrada de dados, inclusive atravs da entrada padro, System.in. O exemplo a seguir apresenta uma aplicao Java para a entrada de dois nmeros pelo teclado e a sada da soma na janela de comando do sistema operacional. necessrio criar uma instncia da classe Scanner, passando como argumento o objeto padro de entrada, System.in, que ir capturar as entradas de dados via o teclado. O mtodo nextInt(), da instncia da classe Scanner, l o valor digitado e o armazena em uma varivel do tipo int.

import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); int num1; int num2; int soma; System.out.print("Entre com o primeiro nmero: "); num1 = entrada.nextInt(); System.out.print("Entre com o segundo nmero: "); num2 = entrada.nextInt(); soma = num1 + num2; System.out.printf("A soma : %d", soma); } }

Um exemplo de sada do aplicativo acima: Entre com o primeiro nmero: 34 Entre com o segundo nmero: 23 A soma : 57

O exemplo seguinte calcula o seno de um valor fornecido em tempo de execuo:


import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); double angulo; double seno; System.out.print("Entre com o ngulo em graus: "); angulo = entrada.nextDouble(); seno = Math.sin(Math.toRadians(ngulo)); System.out.println("Seno: " + seno); } }

O mtodo nextDouble(), da classe Scanner, captura um double da entrada padro System.in e o armazerna em uma varivel do tipo double. A classe Math do pacote java.lang define a constante PI atravs de uma varivel de classe. O mtodo esttico Math.sin(double)retorna o seno de um ngulo em radianos passado como argumento.

Import Static
A verso J2SE 5.0 incorporou o recurso import static, que permite importar os mtodos e atributos estticos, permitindo utiliz-los sem o prefixo de classe.
O cdigo anterior pode ser reescrito, a partir da verso 5.0, conforme abaixo:
import java.util.Scanner; import static java.lang.Math.*; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); double angulo; double seno; System.out.print("Entre com o ngulo em graus: "); angulo = entrada.nextDouble(); seno = sin(toRadians(ngulo)); System.out.println("Seno: " + seno); } }

Entrada de dados com Swing


O prximo exemplo apresenta uma soluo para a soma de dois nmeros inteiros usando o pacote javax.swing de interface grfica de Java.
import javax.swing.JOptionPane; import static javax.swing.JOptionPane.*; public class Adio { public static void main(String[] args){ String s1, s2; int num1, num2, soma; s1 = JOptionPane.showInputDialog ("Entre com o 1 nmero"); s2 = JOptionPane.showInputDialog ("Entre com o 2 nmero"); num1 = Integer.parseInt(s1); num2 = Integer.parseInt(s2); soma = num1 + num2; JOptionPane.showMessageDialog(null,"A soma " + soma, "Resultado", PLAIN_MESSAGE); System.exit(0); } }

O mtodo parseInt(String) da classe Integer recebe como argumento um valor String e retorna o valor convertido em inteiros. Se o argumento no puder ser convertido, a mquina virtual Java lanar uma exceo do tipo NumberFormatException.
public class ParseInt { static int i; public static void main(String[] args) { i = Integer.parseInt("um"); System.out.println(i); } }

As classes empacotadoras Double e Float, dentre outras, possuem tambm seus mtodos parse, para a converso do valor de um objeto String em tipos primitivos float e double, respectivamente.
public class ParseDouble { public static void main(String[] args) { double d = Double.parseDouble("25.4"); System.out.println(d); } }

Autoboxing
A verso J2SE 5.0 incorporou o recurso denominado autoboxing, que consiste na converso automtica entre tipos primitivos e seus wrappers (classes empacotadoras). public class AutoBoxing { public static void main(String[] args) { int meuInt = 25; Integer meuInteger = meuInt; System.out.printf("Integer: %d\tint: %d", meuInteger, meuInt); } } public class Unboxing { public static void main(String[] args) { Integer meuInteger = new Integer("12"); int meuInt = meuInteger; System.out.println(meuInt); } }

Comando if / else
import javax.swing.JOptionPane; public class ParImpar{ public static void main(String args[]) { String s; String resp = "O nmero "; int i; s = JOptionPane.showInputDialog( "Entre com o\nnmero inteiro"); i = Integer.parseInt(s); if((i % 2) == 0) resp = resp + s + " par!"; else resp = resp + s + " mpar!"; JOptionPane.showMessageDialog(null, resp, "Par ou mpar", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } }

O exemplo anterior faz uma comparao entre uma varivel e um literal do tipo primitivo int. Cuidado com expresses relacionais para comparar objetos, ao invs de tipos primitivos.
import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String string; System.out.print("Digite Sim: "); string = entrada.nextLine(); if(string == "Sim") System.out.println("Iguais"); else System.out.println("Diferentes"); } }

O resultado impresso ser Diferentes, uma vez que o objeto sim referencia uma posio de memria diferente do literal Sim.

Para comparar se o contedo de dois objetos String so idnticos, uma sugesto empregar o mtodo equals() da classe String. import java.util.Scanner; public class Teste { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String string; System.out.print("Digite Sim: "); string = entrada.nextLine(); if(string == "Sim") System.out.println("Iguais"); else System.out.println("Diferentes"); } }

Outros dois mtodos da classe String so equalsIgnoreCase(), semelhante a equals() e charAt(), que obtm o tipo primitivo char correspondente a posio informada como argumento para o mtodo.

Um applet Java simples


Um applet Java um tipo especial de programa que executado em um navegador de pginas da World Wide Web.
import javax.swing.JApplet; import java.awt.Graphics; public class AloMundoApplet extends JApplet { public void paint(Graphics g){ g.drawString("Al, Mundo!",25,25); } }

Para executar o programa acima em um browser, necessrio um arquivo html do tipo AloMundoApplet.html, que carrega a classe AloMundoApplet: <html> <applet code="AloMundoApplet.class" width=300 height=30> </applet> </html>

A palavra-chave extends indica que a classe AloMundoApplet uma subclasse (ou classe derivada) de JApplet (chamada superclasse ou classe bsica). A classe JApplet faz parte do pacote javax.swing. Herana: AloMundoApplet herda todos os atributos (dados) e comportamentos (mtodos) da classe JApplet. AloMundoApplet sobrescreve o mtodo paint da classe JApplet. Este mtodo requer como parmetro um objeto da classe Graphics, por conveno nomeado por g, usado por paint para desenhar imagens no applet. A classe Graphics pertence ao pacote java.awt.

O mtodo drawString da classe Graphics desenha o string de caracteres Al, Mundo! no applet, a partir da posio 25 pixels na horizontal e 25 pixels, na vertical. A origem das coordenadas o canto superior esquerdo do applet.

import javax.swing.*; import java.awt.*; public class AloMundo2Applet extends JApplet { public void paint(Graphics g) { g.setColor(Color.red); g.drawLine(15,10,210,10); g.drawLine(15,30,210,30); g.drawString("Al, Mundo!",25,25); } } O mtodo setColor(Color.red) define a cor vermelha para a instncia g da classe Graphics. red uma constante da classe Color do pacote java.awt. O mtodo drawLine da classe Graphics desenha linhas no applet. Os 4 argumentos referem-se as coordenadas x e y do pixel inicial e do pixel final da linha a ser desenhada.

Estrutura de repetio while


public class Soma { public static void main(String[] args) { int i = 1; int soma = 0; while (i <= 100) { soma = soma + i; i = i + 1; } System.out.println(soma); } }

necessrio uma chave de abertura { e uma chave de fechamento } de bloco, delimitando o conjunto de instrues associadas a estrutura de repetio.

import java.text.DecimalFormat; import java.util.Scanner; public class Teste { public static void main(String args[]) { Scanner entrada = new Scanner(System.in); byte n = 0; //contador de notas int nota, soma = 0; double media; System.out.print("Nota do aluno, -1 termina: "); nota = entrada.nextInt(); while (nota != -1) { soma = soma + nota; n = (byte) (n + 1); System.out.print("Nota do aluno, -1 termina: "); nota = entrada.nextInt(); } DecimalFormat df = new DecimalFormat("0.00"); if (n != 0) { media = soma / n; System.out.println("Media igual a " + df.format(media)); } else System.out.println("Nenhuma nota foi digitada"); } }

O pacote java.text disponibiliza classes para formatao de valores e expresses. A classe DecimalFormat usada neste exemplo. O formato 0.00 especifica que a sada ter pelo menos um dgito esquerda do ponto decimal e exatamente dois dgitos direita do ponto decimal. O mtodo format desta classe usado para formatar uma varivel do tipo primitivo double. Este exemplo apresenta um operador de coero explcita (casting) para converter o resultado da expresso (n + 1) em um valor do tipo byte. Esta converso necessria porque o literal 1 do tipo int o que implica que a expresso retornar um valor tambm do tipo int. public class CoercaoExplicita { public static void main(String[] args) { float f; f = (float) 5.5; System.out.print(Float.toString(f)); } }

A partir de J2SE 5.0, a classe Formatter, atravs do mtodo printf, tambm pode ser usada para a formatao da sada em System.out. import java.util.Scanner; import static java.lang.Math.*; public class Teste { public static void main(String args[]){ double raio; double area; Scanner entrada = new Scanner(System.in); System.out.print("Informe o raio do crculo: "); raio = entrada.nextDouble(); area = PI * pow(raio, 2); System.out.printf ("A area do circulo equivale a %6.2f", area); } }

O mtodo esttico Math.pow(base,exp) implementa a exponenciao. Este mtodo recebe dois argumentos double e retorna um valor double.

A tabela a seguir apresenta alguns cdigos de formatao da classe Formatter e usados em System.out.printf.
f e,E g,G d o nmero de ponto flutuante em formato fixo nmero de ponto flutuante em notao exponencial (formato cientfico) nmero em ponto flutuante em formato genrico (fixo para nmeros pequenos e exponencial para grandes) inteiros em decimal. nmero inteiro em octal

x,X Nmero inteiro em hexadecimal


s,S converte qualquer valor e apresenta em string t,T formato para data e hora (com cdigos adicionais para dia, ms, ano, etc.)

import java.util.Date; public class Teste { public static void main(String args[]){ System.out.printf("Hoje: %1$td de %1$tB de %1$tY", new Date()); } }

A classe Date instancia um objeto contendo a data e hora do sistema operacional. Os caracteres de formatao d, B e Y exibem, respectivamente, o dia, com 2 caracteres, o ms, por estenso, e o ano, com 4 dgitos. A tabela de caracteres de formatao para data e hora contempla diversas outras possibilidades de apresentao.
Hoje: 05 de Janeiro de 2005

public class Incremento { public static void main(String args[]) { int i; i = 1; System.out.println(i); System.out.println(i++); System.out.println(i); i = 1; System.out.println(i); System.out.println(++i); System.out.println(i); } }
1 1 2 1 2 2 Os operadores de incremento e decremento (++ e --) incrementam e decrementam variveis de tipo inteiro de uma unidade. Na forma pr-fixada o operador modifica o valor da varivel antes que o valor seja usado na expresso. Na forma ps-fixada o operador modifica o valor da varivel depois que o valor usado na expresso onde est a varivel.

Estrutura de repetio for


A estrutura for em Java constituda de um valor inicial, um teste e um passo, delimitados por ponto-e-vrgula. import java.awt.Graphics; import javax.swing.JApplet; public class TesteFor extends JApplet { public void paint(Graphics g) { for (int i = 1; i <= 10; i++) g.drawLine(10, 10, 250, i * 10); } } Exemplo de Applet Java utilizando a estrutura de repetio for. Observe que no foi necessrio definir chaves de abertura e fechamento para delimitar um bloco de comandos associados ao for, uma vez que s h uma linha de instruo.

Exemplo: programa para somar os nmeros pares entre 0 e 100, usando lao for.

import javax.swing.JOptionPane; import static javax.swing.JOptionPane.*; public class SomaPar { public static void main(String args[]) { int soma = 0; for (int i = 2; i <= 100; i += 2) soma += i; JOptionPane.showMessageDialog(null, "Valor da soma: " + soma, "Soma dos pares at 100", INFORMATION_MESSAGE); System.exit(0); } }

Este exemplo utiliza a classe JTextArea do pacote javax.swing. Esta classe define um componente GUI capaz de armazenar e exibir mltiplas linhas de texto. Os mtodos setText(String) e append (String) permitem, respectivamente, atribuir e acrescentar Strings na instncia da classe JTextArea. public class TestaFor { static int i; public static void main(String[] args) { for( ; i < 10; ) System.out.print(i++ + " "); } }

Uma estrutura for pode ser construda sem um ou mais de seus componentes.

Estrutura de seleo mltipla switch


import javax.swing.*; public class Calculadora { public static void main(String args[]) { String s1, s2, s3; float f1, f2, f3=0; char c; s1 = JOptionPane.showInputDialog("Primeiro operando: "); s2 = JOptionPane.showInputDialog("Segundo operando: "); s3 = JOptionPane.showInputDialog("Operador aritmtico: "); f1 = Float.parseFloat(s1); f2 = Float.parseFloat(s2); c = s3.charAt(0); switch (c) { case '+' : f3 = f1 + f2; break; case '-' : f3 = f1 - f2; break; case '*' : case 'x' : f3 = f1 * f2; break; case '/' : f3 = f2 / f1; break; default: } JOptionPane.showMessageDialog(null, "Resultado: " + f3, "calculadora", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } }

A varivel ou expresso de controle da estrutura de seleo switch deve assumir um valor inteiro, ou seja, do tipo byte, short, int ou char. O comando break necessrio para impedir que a execuo do programa continue nas clusulas case seguintes. A clusula default no obrigatria. O mtodo charAt() da classe String permite selecionar o caracter cuja posio especificada como parmetro. A posio inicial corresponde a 0.

Estrutura de repetio do/while


A estrutura do/while testa a condio de continuao do lao depois do corpo do lao ser executado. Portanto, o corpo do lao sempre executado pelo menos uma vez. public class TestaDoWhile { public static void main(String args[]) { byte i; do { i = (byte) (Math.random() * 10); System.out.print(i + " "); } while (i != 0); } } O mtodo random() da classe Math gera um nmero aleatrio do tipo double compreendido entre 0, inclusive, e 1, exclusive. No necessrio o comando import para a classe Math, que pertence ao pacote java.lang.

Operadores Lgicos
Java possui vrios operadores lgicos que podem ser utilizados para obter combinaes lgicas do tipo AND, OR, XOR e NOT. Para combinaes AND, os operadores lgicos & e && so utilizados. Se & for empregado, as expresses em ambos os lados so avaliadas. Para combinaes OR, os operadores lgicos | e || so utilizados. A combinao XOR possui o operador lgico ^. Isto resulta em um valor true se a expresso contiver um valor true e um false. A combinao NOT utiliza o operador lgico !. public class TestaOR1 { public static void main(String args[]) { int i = 2; int j = 3; if((j == i++) | (i < ++j)) System.out.println("i = " + i + " j = " + j); } }

public class TestaOR2 { public static void main(String args[]) { int i = 2; int j = 3; if((j == i++) || (i < ++j)) System.out.println("i = " + i + " j = " + j); } } Os dois exemplos retornam o mesmo resultado. Na prtica, para avaliao de expresses lgicas, recomenda-se empregar os operadores && e ||. public class TestaXOR { public static void main(String args[]) { int i = 2; int j = 3; if((j == i++) ^ (i < ++j)) System.out.println("XOR OK"); else System.out.println("XOR not OK"); } }

Neste exemplo, a classe NomeUsuario, definida pelo programador, invoca o mtodo readLine da classe Console. A definio desta classe encontra-se no pacote corejava. Esta classe no faz parte da Java API. Foi escrita por outros programadores Java e disponibilizada para uso em [Horstmann, 2001].
A classe do usurio Saudao abaixo, utiliza um mtodo definido pelo usurio chamado imprime. Este mtodo possui um argumento do tipo String e no retorna nenhum valor. um mtodo do tipo void.

import java.util.Scanner; public class Saudao { public static void main(String args[]) { Scanner entrada = new Scanner(System.in); String nome = entrada.nextLine(); imprime(nome); } static void imprime(String s){ System.out.printf("Ol, %s", s); } }

public class QuadInt { public static void main(String args[]) { int i; for(int x = 1; x <= 10; x++) { i = quadrado(x); System.out.printf ("Quadrado de %02d: %03d\n", x, i); } } //Mtodo quadrado public static int quadrado(int y){ return (int) Math.pow(y, 2); } } A classe do usurio QuadInt utiliza um mtodo definido pelo usurio chamado quadrado. Este mtodo possui um argumento do tipo int e retorna um valor tambm do tipo int.

import javax.swing.*; import java.awt.*; public class Celsius extends JApplet { double c; double f; public void init() { String sc; sc = JOptionPane.showInputDialog ("Entre com a temperatura\nem graus Celsius"); c = Double.parseDouble(sc); f = ( 9 * c ) / 5 + 32; } public void paint(Graphics g) { g.drawString("A temperatura " + c + "C equivale a " + f + "F", 25, 25); } }

A classe do usurio Celsius sobrescreve os mtodos init() e paint() de JApplet. Em um applet, o mtodo paint() deve ser usado unicamente para formatar uma sada utilizando mtodos da classe Graphics.

Regras de Escopo
Todos os exemplos vistos at aqui utilizam identificadores para nomes de variveis e de objetos. Identificadores tambm so usados para nomear classes e mtodos definidos pelo usurio. Cada identificador tem como atributos a durao e o escopo. A durao ou tempo de vida o perodo durante o qual o identificador existe na memria. O escopo diz respeito ao local onde o identificador pode ser referenciado no programa.

public class Escopo { int x = 1; public static void main(String args[]) { Escopo escopo = new Escopo(); int x = 5; System.out.println("x vale " + x); escopo.metodoA(); escopo.metodoB(); escopo.metodoA(); escopo.metodoB(); System.out.println("x vale " + x); }

public void metodoA() { int x = 25; System.out.println("x x++; System.out.println("x } public void metodoB() { System.out.println("x x *= 10; System.out.println("x } }
x x x x x x x x x x vale em A em A em B em B em A em A em B em B vale 5 vale vale vale vale vale vale vale vale 5 25 26 1 10 25 26 10 100

em A vale " + x); em A vale " + x); em B vale " + x); em B vale " + x);

Uma varivel local s visvel no mtodo onde foi criada, este o seu escopo. Uma varivel de instncia visvel em todo o contexto da instncia da classe, este o seu escopo. Uma varivel de classe visvel por todas as instncias da classe. Durao: uma varivel local existe apenas durante a execuo do mtodo. Uma varivel de instncia existe durante a existncia da instncia da classe.

Sobrecarga de Mtodos
Java permite que vrios mtodos com o mesmo nome sejam definidos, contanto que tais mtodos tenham diferentes conjuntos de parmetros. Esta caracterstica chamada sobrecarga de mtodos. public class Sobreposicao { public static void main(String args[]) { Sobreposicao sobre = new Sobreposicao(); System.out.println("Quadrado de 3: " + sobre.quadrado(3)); System.out.println("Quadrado de 3.5: " + sobre.quadrado(3.5)); } public int quadrado(int i) { return i*i; } public double quadrado(double f) { return f*f; } }

Arrays
Um array um grupo de posies contguas na memria que possuem o mesmo nome e o mesmo tipo. Em java, os arrays so tratados como objetos e, portanto, devem ser instanciados com o comando new. int[] array; int array[]; array = new int[12]; //declara o array //declara o array //instancia o array

Que tambm pode ser escrito na forma: int[] array = new int[12]; // ou... int array[] = new int[12]; Quando um array instanciado, seus elementos so automaticamente inicializados com zero para tipos de dados numricos e null para referncias a objetos.

Em Java, o primeiro elemento de um array sempre referenciado pelo ndice 0. O array array acima, poder ser referenciado pelos ndices de 0 a 11.

import javax.swing.*; public class Array { public static void main(String args[]) { String saida = ""; int[] i; i = new int[10]; saida += "ndice - Valor\n"; for (int j = 0; j < i.length; j++) { i[j] = (int) (Math.random() * 10); saida += j + " - " + i[j] + "\n"; } JOptionPane.showMessageDialog(null, saida, "Inicializando um array", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } } A varivel de instncia length a forma adequada de "percorrer" os elementos de um array em Java.

Passando arrays para mtodos


Existem duas maneiras de se passar argumentos para mtodos: por valor e por referncia. Em java, variveis de tipo primitivo so sempre passadas por valor e objetos, incluindo arrays, so sempre passados por referncia.
public class Parametro { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5}; System.out.println("Valores originais do array:"); for(int i = 0; i < array.length; i++) System.out.print(array[i] + " "); Parametro p = new Parametro(); p.modificaArray(array); System.out.println("\nValores modificados no metodo:"); for(int i = 0; i< array.length; i++) System.out.print(array[i] + " "); System.out.println ("\nValor de a[3] antes da passagem: " + array[3]); p.modificaElemento(array[3]); System.out.println ("Valor de a[3] depois da passagem: " + array[3]); }

Arrays multidimensionais
Arrays com dois ndices so utilizados normalmente para representar tabelas de valores consistindo de informaes organizadas em linhas e colunas.

Em java, um array bidimensional, do tipo m[2][2], pode ser declarado e inicializado com:
int[][] m = {{1, 2}, {3, 4}}; O exemplo abaixo apresenta algumas das potencialidades de arrays em Java:

public class Arrays { public static void main(String[] args) { String[][] s1 = new String[2][2]; s1[0][0] = "Rita"; String[] s2 = {"Julia", "Augusto"}; s1[1] = s2; for(int i = 0; i < s1.length; i++) for(int j = 0; j < s1[i].length; j++) System.out.println(s1[i][j]); } }

Rita null Julia Augusto

Estrutura for each


J2SE 5.0 apresenta a estrutura for each, capaz de fazer a iterao de arrays (e tambm outras estruturas de dados avanadas de Java). public class TestaForEach { public static void main(String args[]) { int[] array = new int[10]; for(int i : array) { array[i] = (int) (Math.random() * 10); System.out.printf("%02d\n",array[i]); } } } A nova estrutura for each torna a iterao de arrays mais simples e elegante, e deve ser empregada sempre que possvel pelo programador Java.

Parmetros na linha de comando


Os argumentos digitados na linha de comando so passados para o mtodo main() da classe invocada por meio de um vetor de Strings. Por exemplo, se for executada a linha de comando java Teste um dois trs o mtodo main() da classe Teste receber o seguinte vetor de Strings: args[0] = "um" args[1] = "dois" args[2] = "trs"

O espao serve como separador de argumentos. Se for necessrio tratar uma cadeia de caracteres com espao como um nico argumento ser preciso delimitla com aspas duplas. Assim, o comando java teste um "dois trs" resulta no seguinte vetor:
args[0] = "um" args[1] = "dois trs" O exemplo a seguir imprime a soma dos argumentos passados na linha de comando.

public class Argumentos { public static void main(String[] args) { int soma = 0; for(int i = 0; i < args.length; i++) soma += Integer.parseInt(args[i]); System.out.print("Soma dos argumentos: "); System.out.println(soma); } }

Para uma entrada do tipo java Argumentos 1 2 3 4 a sada ser:


Soma dos argumentos: 10

No exemplo anterior, a referncia para a instncia s2 apontada para o mesmo endereo de memria da instncia s1, logo a sada da aplicao ser:

s1 igual a s2
public class Strings2 { public static void main(String[] args) { String s1 = new String("abcdef"); String s2 = "abcdef"; if(s1 == s2) System.out.print("s1 igual a s2"); else System.out.print("s1 diferente de s2"); } } s1 diferente de s2 Neste caso, a nova instncia s2 criada referencia um endereo de memria diferente daquele apontado pela instncia s1. Trata-se de objetos distintos!

Uma instncia da classe String um objeto imutvel. public class Strings3 { public static void main(String[] args) { String s1 = "abc"; String s2 = s1; s1 = s1.concat("def"); if(s1 == s2) System.out.print("s1 igual a s2"); else System.out.print("s1 diferente de s2"); } }

s1 diferente de s2
Sendo um objeto String imutvel, a linha s1 = s1.concat("def"); ir passar a referncia ao objeto s1 para um outro endereo de memria. Assim, as instncias s1 e s2 no mais referenciam mesma posio de memria.

Classe StringBuffer
A classe StringBuffer uma alternativa mais adequada para a manipulao de cadeias de caracteres quando for necessrio fazer muitas alteraes nos valores armazenados. Ao contrrio da classe String, objetos da classe StringBuffer podem ser alterados sem que a MVJ modifique a referncia na memria. public class TestaStringBuffer { public static void main(String[] args) { StringBuffer sb1 = new StringBuffer("abc"); StringBuffer sb2 = sb1; sb1 = sb1.append("def"); if(sb1 == sb2) System.out.print("sb1 igual a sb2"); else System.out.print("sb1 diferente de sb2"); } }

sb1 igual a sb2 O mtodo append() da classe StringBuffer altera o valor da instncia sb1, mantendo a referncia a mesma posio de memria. Assim, sb2 e sb1 continuam apontando para o mesmo endereo. No possvel fazer uma converso direta de String para StringBuffer, conforme visto abaixo: StringBuffer sb = new StringBuffer(); String s = "abcdef"; sb = s; O mtodo append() da classe StringBuffer pode ser usado para este fim: StringBuffer sb = new StringBuffer(); String s = "abcdef"; sb.append(s); Para converter um objeto StringBuffer em String, deve empregar o mtodo toString(): s = sb.toString();

Enumerated Types
J2SE 5.0 incorpora (finalmente!) o recurso de tipos enumerados, comum em C/C++. Um enum um tipo especial de classe, definida em java.lang.Enum.
public class TestaEnums { enum Times {ATLTICO, VASCO, GRMIO, CORITIBA, BAHIA}; public static void main(String[] args) { for(Times time : Times.values()) System.out.printf("%s\n", time); } }

ATLTICO VASCO GRMIO CORITIBA BAHIA

Cada identificador (ex.: Times.ATLTICO) um objeto da classe Enum.

possvel percorrer parte de um enum usando o mtodo java.util. EnumSet.range, conforme no exemplo que se segue.
import java.util.EnumSet; public class Teste { enum Semana {DOMINGO, SEGUNDA, TERA, QUARTA, QUINTA, SEXTA, SBADO}; public static void main(String[] args){ for(Semana dia : EnumSet.range (Semana.SEGUNDA, Semana.SEXTA)) System.out.println(dia); } }

Uma outra situao recomendada para o uso de enums em comandos de seleo mltipla switch, conforme exemplo que se segue.

import java.util.Scanner; public class Teste { enum Operador {MAIS, MENOS, VEZES, DIVIDIDO_POR}; public static void main(String[] args) { double x = Double.parseDouble(args[0]); double y = Double.parseDouble(args[1]); double res = 0; for (Operador op : Operador.values()) { switch(op) { case MAIS: res = x + y; break; case MENOS: res = x - y; break; case VEZES: res = x * y; break; case DIVIDIDO_POR:res = x / y; } System.out.printf("%2.2f %s %.2f = %2.2f\n", x, op, y, res); } } }

Programao baseada em objetos


Em linguagens como Pascal e C, a programao orientada ao. Em Java, a programao orientada a objetos.

Os programadores Java concentram-se em escrever seus prprios tipos definidos pelo usurio, chamados classes. Cada classe contm dados (atributos) bem como o conjunto de mtodos que manipulam os dados.
class Produto extends Object { public int codigo; public String nome; public int quantidade; public double preco; public Produto(int c, String n, int q, double p){ codigo = c; nome = n; quantidade = q; preco = p; } }

Utilize agora o BlueJ para instanciar alguns objetos da classe Produto.

Voc pode criar uma nova instncia da classe Produto clicando com o boto direito do mouse sobre o cone da classe.

Voc pode acessar os atributos de cada um dos objetos dando um duplo clique sobre o cone das instncias.

Inclua uma nova classe do usurio TestaProd em seu projeto no BlueJ. class TestaProd { public static void main(String a[]){ String s = " "; Produto produto; produto = new Produto(10, "Sabonete", System.out.println(produto.codigo + s produto.nome); System.out.println(produto.quantidade produto.preco); produto.quantidade = 100; System.out.println(produto.quantidade produto.preco); produto.preco *= 1.10; System.out.println(produto.quantidade produto.preco); } }

12, 1.20); + + s +

+ s +
+ s +

A classe TestaProd declara uma varivel produto do tipo Produto e a instancia, atravs do comando new, que invoca o mtodo construtor.

A linha tracejada indica que a classe TestaProd usa mtodos e/ou atributos da classe Produto.

Atente para o importante fato de que a classe TestaProd s conseguiu acessar diretamente os atributos da classe Produto porque estes foram declarados como public. O que aconteceria se eles fossem declarados como private?

class Empregado { private String nome; private double salario; //Mtodo Construtor public Empregado(String n, double s) { nome = n; salario = s; } public void print() { System.out.println(nome + " " + salario); } public void aumentaSalario(double percentual) { salario *= 1 + percentual / 100; } } Os modificadores de acesso tem por objetivo definir a visibilidade de um membro de uma classe (atributo ou mtodo) em relao outras classes. O modificador private permite ao acesso apenas aos membros da prpria classe.

Sobrecarga de construtores
Os mtodos de uma classe podem ser sobrecarregados. Para sobrecarregar um mtodo construtor, simplesmente fornea uma definio separada de cada um dos mtodos sobrecarregados. Tais mtodos devem possuir listas de parmetros diferentes. class Empregado { private String nome; private double salario; public Empregado(String n, double s) { nome = n; salario = s; } public Empregado(String n) { nome = n; salario = 500; }

Mtodos set e get


As variveis de instncia definidas como privadas s podem ser manipuladas atravs de mtodos da prpria classe. Todavia, as classes podem fornecer mtodos public para permitir a clientes da classe atribuir valores (set) ou obter (get) variveis de instncia declarados como private. public class Cliente { private String nome; private String endereco; private String telefone; public Cliente(String n, String e, String t) { nome = n; endereco = e; telefone = t; } public void setNome(String n) {nome = n;} public void setEndereco(String e) {endereco = e;} public void setTelefone(String t) {telefone = t;} public String getNome() {return nome;} public String getEndereco() {return endereco;} public String getTelefone() {return telefone;} }

public class TestaCliente { public static void main(String args[]) { Cliente fulano = new Cliente ("Fulano", "Rua Halfeld", "3213-5000"); Cliente beltrano = new Cliente ("Beltrano", "Rua Marechal", "3224-1000"); System.out.println("Cliente 1: " + fulano.getNome()+ ", " + fulano.getEndereco() + ", " + fulano.getTelefone() + "\n"); System.out.println("Cliente 2: " + beltrano.getNome() + ", "+ beltrano.getEndereco() + ", " + beltrano.getTelefone() + "\n"); fulano.setNome("Ciclano"); beltrano.setEndereco("Rua Sao Joao"); fulano.setTelefone(beltrano.getTelefone()); System.out.println("Cliente 1: " + fulano.getNome()+ ", " + fulano.getEndereco() + ", " + fulano.getTelefone() + "\n"); System.out.println("Cliente 2: " + beltrano.getNome() + ", "+ beltrano.getEndereco() + ", " + beltrano.getTelefone() + "\n"); } }

Varargs
J2SE 5.0 apresenta um novo recurso denominado varargs, que permite passar um nmero varivel de argumentos a um mtodo, sem a necessidade de encapsul-lo em um array, por exemplo. class VarOla { public static void printSaudao(String... nomes) { for(String n : nomes) { System.out.println("Ol " + n + ". "); } } public static void main(String[] args) { printSaudao("Wander", "Rita", "Julia","Augusto"); } }

A declarao de um argumento como varargs denotada pelo seu tipo seguido de reticncias (...) e o nome.

Em tempo de compilao, um varargs convertido para um array. Isto explica porque o cdigo abaixo executa sem problemas, alterando a clssica assinatura do mtodo main. class VarOla { public static void printSaudao(String... nomes) { for(String n : nomes) { System.out.println("Ol " + n + ". "); } } public static void main(String... args) { printSaudao(args); } }

A Sun, inclusive, aconselha o uso de varargs em lugar de arrays na assinatura do mtodo main.

Sobrecarga com Varargs


O exemplo a seguir ilustra o comportamento do compilador Java no caso de haver mtodos sobrecarregados com e sem varargs disputando a execuo.
public class QualMtodo { QualMtodo(Integer... size) { System.out.println("Verso com varargs"); } QualMtodo(int i, int j) { System.out.println("Verso com tipo int"); } QualMtodo(Integer i, Integer j) { System.out.println("Verso com Integer"); } public static void main(String[] args) { System.out.println("Chamada com tipo int"); new QualMtodo(2, 3); System.out.println("Chamada com Integer"); new QualMtodo(new Integer(2), new Integer(3)); } }

Chamada com tipo int Verso com tipo int Chamada com Integer Verso com Integer Observa-se que a chamada com varargs no tem precedncia, quando da existncia de mtodos com assinatura igual chamada. Ainda usando o exemplo anterior, somente ser chamado o mtodo com varargs em situaes como a apresentada abaixo, onde no h correspondncia com um mtodo especfico. public static void main(String[] args) { System.out.println("Chamada com tipo int"); new QualMtodo(2, 3, 4); }

Chamada com tipo int Verso com varargs

Referncia this
Em algumas situaes necessrio referenciar o prprio objeto corrente. Por essa razo todo objeto possui um atributo especial identificado por this que uma referncia para o prprio objeto. O exemplo abaixo mostra um uso tpico do atributo this. Ele mostra um mtodo cujo parmetro formal possui o mesmo nome de um atributo de instncia. Para distingui-los necessrio qualificar o atributo da instncia com o atributo this. import java.awt.Color; public class ObjGeo { private Color cor; private int larg; private int alt; public ObjGeo (Color cor, int larg, int alt) { this.cor = cor; this.larg = larg; this.alt = alt; } public Color getCor() {return cor;} public int getLarg() {return larg;} public int getAlt() {return alt;} }

import java.awt.Color; public class TestaObjGeo { public static void main(String args[]) { ObjGeo obj = new ObjGeo(Color.red,4,8); System.out.println("Cor: " + obj.getCor()); System.out.println("Largura: " + obj.getLarg()); System.out.println("Altura: " + obj.getAlt()); } } Cor: java.awt.Color[r=255,g=0,b=0] Largura: 4 Altura: 8
A classe Color, do pacote java.awt, responsvel pela manipulao das cores em Java. A Color.red define a cor vermelha para a instncia obj do objeto ObjGeo.

Modificador static
Cada instncia de um objeto tem sua prpria cpia de todas as variveis de instncia. Porm, em certas situaes, pode ser til usar uma varivel de classe, esttica, cujo valor compartilhado por todas as instncias da classe. public class Socio { private String nome; private String endereco; private static int numSocios; public Socio (String n, String e) { nome = n; endereco = e; numSocios++; } public String getNome() {return nome;} public String getEndereco() {return endereco;} public static int getNumSocios() {return numSocios;} }

public class TestaSocio { public static void main(String args[]) { Socio s1 = new Socio("Pedro","Rua Santa Rita"); Socio s2 = new Socio("Paulo","Av. dos Andradas"); Socio s3 = new Socio("Jose","Av. Rio Branco"); System.out.println("Socios do clube:\n"+ s1.getNome() + ", " + s1.getEndereco() + "\n" + s2.getNome() + ", " + s2.getEndereco() + "\n" + s3.getNome() + ", " + s3.getEndereco()); System.out.println("Numero de socios: "+ Socio.getNumSocios()); } }

Socios do clube: Pedro, Rua Santa Rita Paulo, Av. dos Andradas Jose, Av. Rio Branco Numero de socios: 3

Pacotes
Pacotes a soluo proposta pela Sun para reunir interfaces e classes relacionadas formando uma biblioteca. Esta organizao evita a coliso de nomes de classes. Veja a extenso do problema: sendo Java uma linguagem para atuar na internet, como evitar que classes obtidas por download no tenham os mesmos nomes de classes j existentes na mquina?! Toda classe pertence a um pacote. Apenas o pacote default, que refere-se as classes do diretrio corrente e o pacote java.lang, que agrupa as classes do ncleo bsico de Java, no precisam ser importados com o comando import. As classes de um pacote devem colocadas em um diretrio obedecendo a estrutura do nome do pacote, a partir de algum diretrio presente na varivel de ambiente classpath. Suponha que eu tenha criado um conjunto de classes de objetos geomtricos. Poderia criar um pacote chamado wander para colocar as classes.

package wander; public class ObjGeo { Color cor; int x; int y; public ObjGeo (Color cor, int x, int y) { this.cor = cor; this.x = x; this.y = y; } } A varivel de ambiente classpath poderia ser definida como: set classpath = .;c:\...\jdk1.4.1\lib;c:\java; O arquivo ObjGeo.class deve ser colocado no diretrio:

c:\java\wander
Os atributos da classe ObjGeo foram definidos com o modificador de acesso default. Isto significa que somente classes do pacote wander podero acessar estes atributos.

Redefinio da classe TestaObjGeo dentro do pacote wander: package wander; import java.awt.Color; public class TestaObjGeo { public static void main(String[] args) { ObjGeo obj = new ObjGeo(Color.CYAN, 10, 10); System.out.println(obj.cor); System.out.println(obj.x); System.out.println(obj.y); } } O programa compila normalmente. Qual seria o comportamento do compilador se os atributos da classe ObjGeo fossem definidos com o modificador de acesso protected? E com private?

import java.awt.Color; public class FormaGeo { protected Color cor; protected int x, y; public FormaGeo(Color c, int x, int y) { cor = C; this.x = x; this.y = y; } public Color getCor() { return cor; } public int getX() { return x; } public int getY() { return y; } }

A linha contnua indica que a classe Circulo herda mtodos e/ou atributos da classe Forma.

Observe que voc pode criar objetos (instncias) da classe Forma e tambm da classe Circulo, utilizando o BlueJ.

import java.awt.Color; public class TestaHeranca { public static void main(String[] args) { FormaGeo fg = new FormaGeo(Color.red, 4, 8); Circulo circ = new Circul (Color.blue, 2, 5, 10); System.out.println ("Cor da Forma Geometrica: " + fg.getCor()); System.out.println ("Cor do Circulo: " + circ.getCor()); System.out.println ("Area do Circulo: " + circ.area()); System.out.println ("Coordenada X da Forma Geometrica: " + fg.getX()); System.out.println("Coordenada Y do Circulo: " + circ.getX()); } }

public class Circulo extends Ponto { protected double raio; public Circulo(double r, int a, int b) { super(a, b); raio = r; System.out.println("Circulo - " + this); } public String toString() { return super.toString() + ", Raio: " + raio; } }

public class TestaHeranca { public static void main(String[] args) { Ponto pt; Circulo circ1; Circulo circ2; pt = new Ponto(10, 5); circ1 = new Circulo(4.5, 72, 29); circ2 = new Circulo(10, 5, 5); } }

Classes abstratas
Uma classe abstrata no pode ser instanciada, ou seja, no h objetos que possam ser construdos diretamente de sua definio. Por exemplo, a compilao do seguinte trecho de cdigo dar erro: abstract class ClasseAbstrata { public static void main(String[] args) { ClasseAbstrata ca = new ClasseAbstrata(); } }

Somente classes concretas, ou seja, que no foram definidas como abstratas, que podem ser instanciadas.
As classes abstratas definem um conjunto de funcionalidades das quais pelo menos uma est especificada mas no est definida ou seja, contm pelo menos um mtodo abstrato. abstract class ClasseAbstrata { public abstract int metodo(); }

Um mtodo abstrato no cria uma definio, mas apenas uma declarao de um mtodo que dever ser implementado em uma classe derivada. Assim, para que uma classe derivada de uma classe abstrata possa instanciar objetos, os mtodos abstratos devem ser definidos nestas classes derivadas. class ClasseConcreta extends ClasseAbstrata { public int metodo() { return 0; } } O exemplo a seguir ilustra um caso simples de uso de classe abstrata. A classe Time define o mtodo abstrato meuTime(), que sobrescrito em seguida por 3 classes concretas. public abstract class Time { abstract void meuTime(); public static void futebol() { System.out.println("Eu gosto de futebol"); } }

public class America extends Time { void meuTime() { System.out.println("Eu sou americano..."); } } public class Atletico extends Time { void meuTime() { System.out.println("Eu sou ATLETICANO!"); } } public class Cruzeiro extends Time { void meuTime() { System.out.println("Eu sou cruzeirense..."); } } As classes America, Atletico e Cruzeiro redefinem o mtodo abstrato meuTime(), de acordo com as particularidades de cada torcedor.

public class Ponto extends Forma { protected int x, y; public Ponto() { x = 0; y = 0; } public Ponto(int a, int b) { x = a; y = b; } public int getX() { return x; } public int getY() { return y; } public String getNome() { return "Ponto"; } public String toString() { return "[" + x + ", " + y + "]"; } }

public class Circulo extends Ponto { protected double raio; public Circulo() { raio = 0; } public Circulo(double r, int a, int b) { super(a, b); raio = r; } public double area() { return Math.PI * Math.pow(raio,2); } public String toString() { return "Centro: " + super.toString() + ", Raio: " + raio; } public String getNome() { return "Circulo"; } }

public class Retangulo extends Ponto { protected int base; protected int altura; public Retangulo() { base = 0; altura = 0; } public Retangulo(int x, int y, int b, int h) { super(x, y); base = b; altura = h; } public double area() { return base * altura; } public String toString() { return "Centro: " + super.toString() + ", Base:" + base + ", Altura: " + altura; } public String getNome() { return "Retangulo"; } }

As classes Circulo e Retngulo estendem Ponto e sobrescrevem os mtodos area() e getNome() de Forma e tambm o mtodo toString() de Ponto. public class Desenha { public static void main(String args[]) { Ponto pt = new Ponto(7, 11); Circulo circ = new Circulo(3.5, 22, 8); Retangulo ret = new Retangulo(10, 10, 5, 8); Forma[] forma = new Forma[3]; forma[0] = pt; forma[1] = circ; forma[2] = ret; for(int i = 0; i < forma.length; i++) System.out.println(forma[i].getNome() + ": " + forma[i].toString() + "\nArea = " + forma[i].area()); } }

A figura apresenta todas as classes e os relacionamentos existentes entre elas em um projeto construdo no BlueJ.

Ponto: [7, 11] Area = 0.0 Circulo: Centro: [22, 8], Raio: 3.5 Area = 38.48451000647496 Retangulo: Centro: [10, 10], Base:5, Altura: 8 Area = 40.0

Interfaces
Interfaces so classes abstratas completamente no implementadas, ou seja, todos os mtodos so abstratos e devem ser sobrescritos por mtodos das classes concretas que as implementam. A forma geral de uso de uma interface em Java : class Identificador implements Interface1,Interface2... Considerando que todos os mtodos de uma interface so abstratos, quando uma classe implementa esta interface, deve escrever o cdigo de todos esses mtodos abstratos. Este o chamado contrato entre a interface e a classe que a implementa.

O conceito de interface permite a implementao de uma espcie de herana mltipla em Java, sobrepondo a regra de que uma subclasse somente pode ser herdada de uma nica superclasse.
O exemplo a seguir define uma interface Radio e uma interface Relogio. A classe concreta RadioRelogio que herda os mtodos destas interfaces.

import java.util.Date; public class RadioRelogio implements Radio, Relogio { private Date horario; private double estacao; public void setEstacao(double d) { estacao = d; } public double getEstacao() { return estacao; } public void setHorario(Date d) { horario = d; } public Date getHorario() { return horario; } public static void main(String[] args) { RadioRelogio rr = new RadioRelogio(); rr.setEstacao(1.5); rr.setHorario(new Date()); System.out.println(rr.getEstacao()); System.out.println(rr.getHorario()); } }

Classes Internas
Em Java possvel declarar uma classe dentro da declarao de outra classe. Tais classes so denominadas classes internas. public class Externa { private int x = 7; class Interna { public void imprimeExterna() { System.out.println("x vale " + x); } } }

Neste exemplo, a classe interna est acessando um membro privado da classe externa. Isto est correto, afinal, a classe interna tambm um membro da classe externa.

public class Externa { private int x = 7; public void instanciaInterna(){ Interna in = new Interna(); //instancia interna in.imprimeExterna(); //invoca mtodo da interna } class Interna { public void imprimeExterna() { System.out.println("x vale " + x); } } //fim da classe interna public static void main(String[] args){ Externa ex = new Externa(); //instancia externa ex.instanciaInterna(); //invoca mtodo da externa } } Para instanciar uma classe interna, necessrio uma instncia da classe externa. Acima, a instncia ex que instancia um objeto in da classe interna.

public class Externa { private int x = 7; class Interna { public void imprimeExterna() { System.out.println("x vale " + x); } } public static void main(String[] args){ Externa ex = new Externa(); Externa.Interna in = ex.new Interna(); in.imprimeExterna(); } }

Voltando a classe Externa da pgina anterior, este exemplo ilustra como criar um objeto da classe interna fora do cdigo da instncia da classe externa.
A instanciao de uma classe interna o nico cenrio em Java em que se faz necessrio chamar new a partir de uma instncia.

Classes Internas Annimas


Java permite que se crie um objeto de uma classe interna sem nome, chamada classe interna annima. class Externa { public void imprime(){ System.out.println("Eu sou a classe externa"); } } public class TestaAnonima { Externa ex = new Externa() { public void imprime() { System.out.println ("Eu sou a classe interna annima"); } }; public static void main(String[] args){ TestaAnonima ta = new TestaAnonima(); ta.ex.imprime(); } }

Tratamento de excees
Um erro para o qual pode existir um tratamento chamado, em computao, de exceo. Exemplos de excees incluem diviso por zero, parmetros de mtodos invlidos, overflow e subscrito de arrays fora dos limites. Utilizar tratamento de excees permite ao programador remover o cdigo de tratamento de erros da linha principal de execuo do programa. Isso melhora a clareza e a modificabilidade do cdigo fonte. public class Excecao { public static void main(String[] args) { System.out.println("Antes do erro"); try { System.out.print(10 / 0); } catch(RuntimeException e){ System.out.println("Erro"); } System.out.println("Depois do erro"); } }

class Matematica { public static void main(String[] args) { try { int op1 = Integer.parseInt(args[0]); int op2 = Integer.parseInt(args[1]); System.out.println("Soma = " + (op1 + op2)); System.out.println("Subtracao = " + (op1 - op2)); System.out.println("Produto = " + (op1 * op2)); System.out.println("Divisao = " + (op1 / op2)); } catch(ArithmeticException ae) { System.out.println("Erro de divisao por zero"); } catch(ArrayIndexOutOfBoundsException aie) { System.out.println("Numero de argumentos invalido"); } catch(NumberFormatException nfe) { System.out.println("Digite apenas numeros inteiros"); } } }

Soma = 15 Subtracao = 5 Produto = 50 Divisao = 2

ArithmeticException, ArrayIndexOutOfBounds Exception e NumberFormatException so subclasses

de RuntimeException e, portanto, o programador no obrigado a capturar estas excees.

import java.io.*; public class Adicao { public static void main(String[] args) { String s; int num1, num2, soma; try { System.out.println("Entre com o 1o. numero: "); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); s = br.readLine(); num1 = Integer.parseInt(s); System.out.println("Entre com o 2o. numero: "); s = br.readLine(); num2 = Integer.parseInt(s); soma = num1 + num2; System.out.println("Soma = " + soma); } catch(IOException e) { System.out.println("Erro na entrada de dados"); } } }

import java.io.*; public class Adicao { public static void main(String[] args) throws IOException { String s; int num1, num2, soma; System.out.println("Entre com o 1o. numero: "); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); s = br.readLine(); num1 = Integer.parseInt(s); System.out.println("Entre com o 2o. numero: "); s = br.readLine(); num2 = Integer.parseInt(s); soma = num1 + num2; System.out.println("Soma = " + soma); } }

Para lanar explicitamente uma exceo, utiliza-se o operador throw. O exemplo a seguir cria uma classe do usurio chamada NumeroPositivo, que lana uma exceo Exception se for passado um argumento invlido. class NumeroPositivo { private int num; public NumeroPositivo(int n) throws Exception { if (n < 1) throw new Exception("Nmero no positivo"); num = n; } } A clusula throws, na assinatura do mtodo, especifica que pode ser lanada uma exceo da classe Exception. O comando throw cria um novo objeto da classe Exception e ainda acrescenta um argumento referente a esta exceo. A classe TestaExcecao, definida a seguir, instancia um novo objeto da classe NumeroPositivo, passando um valor como argumento. A exceo lanada por NumeroPositivo ser capturada pelo bloco try-catch de TestaExcecao.

Excees do programador
Se o programador considerar que nenhuma exceo se encaixa no tipo de erro que pretende lanar, pode criar uma nova subclasse de Exception para representar essa exceo.
class PosiviteNumberException extends Exception { public PosiviteNumberException(String s) { super(s); } } A classe PosiviteNumberException estende a classe Exception. O argumento String s passado para a superclasse. A classe do usurio NumeroPositivo foi reescrita para lanar Posivite NumberException ao invs de Exception. A execuo de Testa Excecao obter o mesmo resultado visto anteriormente.

class NumeroPositivo { private int num; public NumeroPositivo(int n) throws PosiviteNumberException { if (n < 1) throw new PosiviteNumberException ("Nmero no positivo"); num = n; } } Existe ainda uma clusula opcional do bloco try-catch chamada finally. Seu propsito conter um trecho de cdigo que deve ser executado independentemente de ocorrer ou no uma exceo. O exemplo seguinte uma adaptao da classe Matematica (pg. 117), incluindo uma clusula finally aps o ltimo catch. Para uma execuo do tipo java Matematica 3 0 a sada :
Soma = 3 Subtracao = 3 Produto = 0 Erro de divisao por zero Obrigado por usar a calculadora

class Matematica { public static void main(String[] args) { try { int op1 = Integer.parseInt(args[0]); int op2 = Integer.parseInt(args[1]); System.out.println("Soma = " + (op1 + op2)); System.out.println("Subtracao = " + (op1 - op2)); System.out.println("Produto = " + (op1 * op2)); System.out.println("Divisao = " + (op1 / op2)); } catch (ArithmeticException e) { System.out.println("Erro de divisao por zero"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println ("Numero de argumentos invalido"); } catch (NumberFormatException e) { System.out.println ("Digite apenas numeros inteiros"); } finally { System.out.println ("Obrigado por usar a calculadora"); } } }

GUIs AWT e Swing


Java possui dois pacotes para manipulao de componentes GUI. O pacote java.awt (Abstract Windowing Toolkit) est diretamente associado com as capacidades de GUI da plataforma local. O pacote javax.swing surgiu na verso 1.2 (Java 2) e seus componentes GUI so chamados Java puros, por apresentarem o mesmo look&feel em qualquer plataforma. Frame o componente do pacote AWT responsvel pela criao de janelas no ambiente grfico utilizado. Este componente gera uma janela com barra de ttulo, bordas e pode ter outros componentes em seu interior, como caixas de texto, botes, caixas de rolamento, etc.
Ao se utilizar o pacote swing, usamos o componente JFrame, que herda os atributos e comportamentos de Frame. O exemplo a seguir demonstra a criao de uma janela por intermdio da classe JFrame do pacote javax.swing.

import java.awt.*; import javax.swing.*; public class Janela extends JFrame { public Janela() { //mtodo construtor da classe setTitle(Uma janela qualquer); setSize(400,50); setLocation(150,150); setResizable(false); getContentPane().setBackground(Color.red); } public static void main(String args[]) { Janela j = new Janela(); j.show(); //Exibe a Janela j.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } }

Uma janela da classe JFrame ou qualquer subclasse s exibida na tela quando o mtodo show invocado. Alm disso, o tamanho de uma janela deve ser definido atravs do mtodo setSize, herdado da classe java.awt.Component. A posio da janela especificada com o mtodo setLocation, tambm do pacote Component. A cor de fundo atribuda atravs do mtodo setBackground. O mtodo setResizable determina se a janela pode ou no ser redimensionada. O mtodo main do exemplo define uma ou mais instrues responsveis pelo fechamento da janela. Isto necessrio para encerrar a janela DOS ao trmino da execuo do aplicativo. O mtodo setDefaultCloseOperation da classe JFrame responsvel por esta tarefa.

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TestaRotulo extends JFrame { private JLabel Rot1,Rot2; public TestaRotulo() { super("Teste de JLabel");//para setTitle() Container C = getContentPane(); C.setLayout(new FlowLayout()); Rot1 = new JLabel(" CES/JF sem logo"); Rot1.setToolTipText("Rtulo 1"); C.add(Rot1); Icon Ces = new ImageIcon("c:\\ceslogo.gif"); Rot2 = new JLabel(" CES/JF com logo"); Rot2.setIcon(Ces); Rot2.setHorizontalTextPosition (SwingConstants.CENTER); Rot2.setVerticalTextPosition (SwingConstants.BOTTOM); Rot2.setToolTipText("Rtulo 2"); C.add(Rot2); setSize(200,200); show(); }

public static void main(String args[]) { TestaRotulo T = new TestaRotulo(); T.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); } } A classe TestaRotulo instancia dois componentes JLabel. O comando super, por herana, invoca o mtodo setTitle de JTable. Lembre-se que TestaRotulo uma subclasse de JTable. O mtodo setLayout da classe Container define o tipo do gerenciador de leiaute para a interface com o usurio do aplicativo Java. Se voc vai usar mais de um componente grfico em um Container, dever usar tambm um gerenciador de leiaute para conter todos os componentes. FlowLayout o gerenciador mais simples e que coloca os componentes GUI anexados da esquerda para a direita at o limite do Container.

Um evento com botes (Jbutton)


import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Classico extends JFrame{ private JButton Cruzeiro, Atletico; public Classico() { super("Classico mineiro"); Container C = getContentPane(); C.setLayout(new FlowLayout()); Cruzeiro = new JButton("Cruzeiro"); C.add(Cruzeiro); Atletico = new JButton("Atletico"); C.add(Atletico); TrataBotao B = new TrataBotao(); Cruzeiro.addActionListener(B); Atletico.addActionListener(B); setSize(250,100); show(); } Cria dois botes, Cruzeiro e Atltico
Instancia os botes, definindo os rtulos

Instancia a classe interna para tratamento de eventos dos botes

public static void main(String args[]) { Classico clas = new Classico(); clas.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); } //classe interna para tratamento de evento de boto: private class TrataBotao implements ActionListener { //mtodo para tratamento de evento de boto: public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "O melhor de Minas: "+e.getActionCommand()); } //Fim do mtodo actionPerformed } //Fim da classe interna TrataBotao } //Fim da classe Classico Este exemplo apresenta o objeto boto, um componente grfico em que o usurio clica sobre o objeto para acionar uma ao especfica. Um Jbutton gera um ActionEvent que deve ser tratado pelo mtodo actionPerfomed a partir da classe interna que implementa ActionListener.

Eventos com caixas de texto


O exemplo a seguir, uma calculadora com as quatro operaes aritmticas, ilustra a incluso de caixas de texto JTextField e botes JButton em uma janela Jframe, com os respectivos tratamento de eventos.

Caixas de texto (JTextField)

Botes (JButton)

import java.awt.*; import java.awt.event.*; import javax.swing.*; class Calcula extends JFrame implements ActionListener { JLabel L1,L2,L3; //Cria 3 rtulos JButton B1,B2,B3,B4,B5; //Cria 5 botes JTextField T1,T2,T3; //Cria 3 caixas de texto

public static void main(String args[]){ Calcula calc = new Calcula(); calc.show(); calc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public Calcula() { setTitle("Calculadora"); setSize(350,150); setLocation(50,50); getContentPane().setLayout(new GridLayout(3,4)); L1 = new JLabel("Operando1"); L2 = new JLabel("Operando2"); L3 = new JLabel("Resultado"); B1 = new JButton("+"); B1.addActionListener(this); B2 = new JButton("-"); B2.addActionListener(this); Associa ouvintes B3 = new JButton("x"); de eventos para B3.addActionListener(this); cada um dos B4 = new JButton("/"); B4.addActionListener(this); botes criados B5 = new JButton("Limpar"); B5.addActionListener(this);

T1 = new JTextField(); T2 = new JTextField(); T3 = new JTextField(); T3.setEditable(false); getContentPane().add(L1); getContentPane().add(T1); getContentPane().add(B1); getContentPane().add(B2); getContentPane().add(L2); getContentPane().add(T2); getContentPane().add(B3); getContentPane().add(B4); getContentPane().add(L3); getContentPane().add(T3); getContentPane().add(B5); }

Torna a caixa de texto T3 no-editvel pelo usurio

Aloca os objetos de rtulos, botes e caixas de texto ao gerenciador de leiaute.

Este aplicativo utiliza um novo tipo de gerenciador de leiaute, chamado GridLayout. Este gerenciador especifica, como argumentos, o nmero de linhas e o de colunas para o leiaute. As suas posies vo sendo alocadas sempre de cima para baixo e da esquerda para a direita.

public void actionPerformed(ActionEvent e) { if(e.getSource()==B5) { T1.setText(""); T2.setText(""); Limpa as caixas de texto T3.setText(""); return; } float op1=0,op2=0,res=0; try { op1 = Float.parseFloat(T1.getText()); op2 = Float.parseFloat(T2.getText());} catch(NumberFormatException erro) { T3.setText("Erro!!"); return;} if(e.getSource() == B1) res = op1 + op2; if(e.getSource() == B2) res = op1 - op2; if(e.getSource() == B3) res = op1 * op2; if(e.getSource() == B4) res = op1 / op2; T3.setText(""+res); } }

Listas de Seleo JList


As listas de seleo so objetos swing que possibilitam a escolha de um ou vrios valores armazenados em uma lista de opes. Esta lista manipulada a partir da classe JList. O exemplo seguinte ilustra a utilizao desta classe.
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class Quitanda extends JFrame implements ListSelectionListener { JTextField tf; JList lista; DefaultListModel dlm; double[] preco = {0.8, 4.0, 3.5, 5.0, 0.7};

public static void main(String args[]){ Quitanda q = new Quitanda(); q.show(); q.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } Quitanda() { setLocation(300,100); setTitle("Quitanda do Prof. Wander"); setSize(250,70); tf = new JTextField(); tf.setEditable(false); dlm = new DefaultListModel(); dlm.addElement("Banana"); Os itens devem ser inseridos dlm.addElement("Pera"); em um objeto da classe dlm.addElement("Ma"); DefaultListModel dlm.addElement("Uva"); dlm.addElement("Laranja"); lista = new JList(dlm); lista.addListSelectionListener(this); JScrollPane painel = new JScrollPane(lista); getContentPane().setLayout(new GridLayout(2,1)); getContentPane().add(painel); getContentPane().add(tf); }

public void valueChanged(ListSelectionEvent e){ tf.setText("Fruta: " + lista.getSelectedValue() + " - Preo: R$ " + preco[lista.getSelectedIndex()]); } }

O pacote javax.swing.event necessrio para a manipulao de eventos de JList. Cada vez que o usurio escolhe um item da lista gerado um evento a ser tratado pelo mtodo valueChanged. tambm necessrio implementar a interface ListSelectionListener para que as opes de JList possam ser reconhecidas medida que o usurio seleciona um item da lista. Os itens a serem colocados em um JList devem antes ser inseridos em objeto DefaultListModel para depois serem associados a uma lista JList. O mtodo addListSelectionListener deve ser invocado para que a opo escolhida seja reconhecida no momento da ao do usurio. O mtodo getSelectedValue() retorna o texto do elemento selecionado na lista. O mtodo getSelectedIndex() retorna um nmero inteiro correspondente ao ndice do elemento selecionado.

Caixas de seleo JComboBox


As caixas de seleo JComboBox permitem que o usurio selecione apenas um nico item de sua lista, e uma opo ao componente grfico JList.
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class Quitanda extends JFrame implements ItemListener { JTextField tf; JComboBox cb; double[] preco = {0.8, 4.0, 3.5, 5.0, 0.7};

public static void main(String args[]) { Quitanda q = new Quitanda(); q.show(); q.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

Quitanda() { setLocation(300,100); setTitle("Quitanda do Prof. Wander"); setSize(250,100); tf = new JTextField(); tf.setEditable(false); String frutas[] = {"Banana","Pera","Ma","Uva","Laranja"}; cb = new JComboBox(frutas); cb.addItemListener(this); getContentPane().setLayout(new GridLayout(2,1)); getContentPane().add(cb); getContentPane().add(tf); } //fim do mtodo Quitanda public void itemStateChanged(ItemEvent e) { tf.setText("Fruta: " + cb.getSelectedItem() + " - Preo: R$ " + preco[cb.getSelectedIndex()]); } //fim do mtodo itemStateChanged }

A interface ItemListener responsvel por reconhecer eventos relacionados ao componente JComboBox.

Na inicializao do objeto cb, sua lista passa a conter as Strings armazenadas em um array de itens: cb = new JComboBox(frutas);

O mtodo addItemListener registra o objeto cb para que as mudanas de seleo sejam reconhecidas e tratadas pelo mtodo itemStateChanged. O mtodo getSelectedItem retorna o contedo do texto selecionado.
O mtodo getSelectedIndex retorna um valor inteiro contendo o ndice da opo selecionada.

Caixas de Opo JCheckBox


As caixas de opo JCheckBox so objetos swing que permitem representar opes que podem ser ativadas e desativadas com um simples clique do mouse.

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Estilo extends JFrame implements ItemListener { JLabel jl; JCheckBox cb1,cb2; // cria dois objetos JCheckBox static int negrito=0,italico=0; public static void main(String args[]) { Estilo est = new Estilo(); est.show(); est.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //fim do mtodo main

Estilo() Cria uma cor com os { valores RGB getContentPane().setBackground 180, 180, 180 (newColor(180,180,180)); setTitle("Estilo de letras"); setSize(300,70); Cria um rtulo getContentPane().setLayout usando a fonte (newFlowLayout(FlowLayout.CENTER)); Arial, corpo 20 jl = new JLabel("Tupi "); jl.setFont(new Font("Arial",Font.PLAIN,20)); jl.setForeground(Color.black); cb1 = new JCheckBox("Negrito"); cb1.setBackground(new Color(180,180,180)); cb1.addItemListener(this); cb2 = new JCheckBox("Italico"); cb2.setBackground(new Color(180,180,180)); cb2.addItemListener(this); getContentPane().add(jl); getContentPane().add(cb1); getContentPane().add(cb2); }

public void itemStateChanged(ItemEvent e) { if(e.getSource()==cb1) { if(e.getStateChange()==ItemEvent.SELECTED) negrito=Font.BOLD; else negrito=Font.PLAIN; } if(e.getSource()==cb2) { if(e.getStateChange()==ItemEvent.SELECTED) italico=Font.ITALIC; else italico=Font.PLAIN; } jl.setFont(new Font("Arial",negrito+italico,20)); } //fim do mtodo itemStateChanged }

Ao se utilizar o padro RGB (red-green-blue) para definir uma nova cor para um objeto swing, os valores numricos para estas trs tonalidades devem variar entre 0 e 255.

Para que a seleo seja reconhecida pelo mtodo itemStateChanged, necessrio invocar o mtodo addItemListener para cada um dos objetos JCheckBox instanciados. O mtodo addItemListener ser executado sempre que o usurio clicar em um dos botes JCheckBox. A comparao e.getStateChange()==ItemEvent.SELECTED utilizada para verificar se o componente JCheckBox est marcado ou no. As propriedades SELECTED e DESELECTED indicam que o objeto est, respectivamente, marcado e desmarcado.

As constantes Font.PLAIN, Font.BOLD e Font.ITALIC so previamente definidas em Java e possuem como valor 0, 1 e 2, respectivamente e devem ser tratados como int. A combinao de seus valores gera estilos diferentes de letras para a instncia jl de Jlabel em jl.setFont(new Font ("Arial",negrito + italico,20));. O argumento 20 significa que a fonte ser exibida com 20 pontos de altura (ponto uma unidade de medida comum em artes grficas. Uma polegada possui 72 pontos).

Painis e botes de rdio


Os painis JPanel so utilizados quando mais de um tipo de leiaute precisa ser inserido em uma janela. Desta forma, por exemplo, um painel pode ser FlowLayout e o outro GridLayout.
Os botes de rdio JRadioButton permitem que uma entre vrias opes seja escolhida pelo usurio. Os botes de rdio devem sempre ser agrupados em um ButtonGroup para cada conjunto de botes a serem inseridos no JFrame.
import java.awt.*; import java.awt.event.*; import javax.swing.*; class Desconto extends JFrame implements ItemListener { JLabel l1,l2; float n=0,res=0; JTextField tf1,tf2; JPanel p1,p2; //cria dois painis JRadioButton rb1,rb2,rb3; //cria trs botes de rdio ButtonGroup rg; //cria um conjunto de botes

public static void main(String args[]) { JFrame d = new Desconto(); d.show(); d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } Desconto() { setTitle("Clculo do Desconto"); setSize(350,120); getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER)); l1 = new JLabel("Digite o preo do produto"); l1.setForeground(Color.red); l2 = new JLabel("Valor do desconto: "); l2.setForeground(Color.red); tf1 = new JTextField(5); //campo de texto p/preo tf2 = new JTextField(5); //campo de texto p/valor tf2.setEditable(false); p1 = new JPanel(); p2 = new JPanel(); rb1 = new JRadioButton("10%"); rb2 = new JRadioButton("20%"); rb3 = new JRadioButton("30%"); rg = new ButtonGroup(); rg.add(rb1); //adiciona rb1 ao grupo de botes de rg.add(rb2); //adiciona rb2 ao grupo de botes de rg.add(rb3); //adiciona rb3 ao grupo de botes de

do produto do desconto

rdio rdio rdio

} public void itemStateChanged(ItemEvent e) { if (tf1.getText().length()==0) return; try { n = Float.parseFloat(tf1.getText()); if (e.getSource()==rb1) res = (n * 10)/100; if (e.getSource()==rb2) res = (n * 20)/100; if (e.getSource()==rb3) res = (n * 30)/100; } catch(NumberFormatException erro) { tf2.setText("Erro"); return; } tf2.setText(""+res); } //fim do mtodo itemStateChanged

rb1.addItemListener(this); //registra o evento do boto rb1 rb2.addItemListener(this); //registra o evento do boto rb2 rb3.addItemListener(this); //registra o evento do boto rb3 p1.setLayout(new FlowLayout(FlowLayout.CENTER)); p2.setLayout(new GridLayout(2,3)); p1.add(l1); //adiciona o rtulo l1 ao painel p1 p1.add(tf1); //adiciona o campo de texto tf1 ao painel p1 p2.add(rb1); //adiciona o boto de rdio rb1 ao painel p2 p2.add(rb2); //adiciona o boto de rdio rb2 ao painel p2 p2.add(rb3); //adiciona o boto de rdio rb3 ao painel p2 p2.add(l2); //adiciona o rtulo l2 ao painel p2 p2.add(tf2); //adiciona o campo de texto tf2 ao painel p2 getContentPane().add(p1); //adiciona o painel p1 ao frame getContentPane().add(p2); //adiciona o painel p2 ao frame

O exemplo declara dois painis JPanel p1 e p2 que podem ser encarados da mesma forma que as janelas JFrame, pois possuem as mesmas propriedades: cor de fundo, leiaute, objetos que contm, etc. Depois de definidas as propriedades de um painel, ele inserido em uma janela. Assim, uma janela pode conter vrios painis, cada qual com a sua prpria formatao e leiaute.

O painel p1 definido como FlowLayout e contm um rtulo e um campo de texto. O painel p2 definido como GridLayout contendo 2 linhas e 3 colunas e contm, alm de um campo de texto e um rtulo, o agrupamento de botes de rdio.

Barras de rolagem JScrollBar


As barras de rolagem JScrollBar permitem variar um valor numrico dentro de uma faixa estabelecida por um mnimo e um mximo.

A sintaxe para criar uma barra de rolagem utilizando JScrollBar : JScrollBar(orientao,valor inicial,intervalo do meio, valor mnimo,valor mximo) A orientao um valor inteiro que define se a barra de rolagem horizontal (0) ou vertical (1). A orientao tambm pode ser definida pelas constantes JScrollBar.HORIZONTAL e JScrollBar.VERTICAL.
O intervalo do meio um valor do tipo inteiro que define o incremento ou decremento do valor da barra de rolagem quando o usurio clicar nessa rea.
import import import import java.awt.*; java.awt.event.*; javax.swing.*; java.text.DecimalFormat;

public class Conversao extends Jframe implements AdjustmentListener { JScrollBar sb1; JLabel l1,l2; DecimalFormat df; public static void main(String args[]) { JFrame c = new Conversao(); c.show(); c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } Conversao() { setSize(250,100); setTitle("Converso de Medidas"); getContentPane().setLayout(new GridLayout(3,1)); sb1 = new JScrollBar(JScrollBar.HORIZONTAL,0,5,0,105); sb1.addAdjustmentListener(this); l1 = new JLabel(Centmetros",JLabel.CENTER); l2 = new JLabel(Polegadas",JLabel.CENTER); getContentPane().add(sb1); getContentPane().add(l1); getContentPane().add(l2); }

public void adjustmentValueChanged(AdjustmentEvent e) { l1.setText(sb1.getValue() + " Centmetros"); DecimalFormat nf; df = new DecimalFormat(0.000); double pol = sb1.getValue() / 2.54; l2.setText(df.format(pol) +" Polegadas"); } }

A interface AdjustmentListener utilizada para reconhecer a interao do usurio com um objeto JScrollBar.

Os argumentos JScrollBar.HORIZONTAL,0,5,0,105 definem uma barra de rolagem horizontal, com valor inicial 0, com valor de incremento e decremento para o intervalo do meio 5, com valor mnimo 0 e valor mximo 105. Na realidade, o valor mximo exibido ser 100, porm este argumento deve receber o valor mximo acrescido do intervalo do meio.
O mtodo addAdjustmentListener registra a barra de rolagem para que o evento seja gerado por ela.

reas de texto JTextArea


As reas de texto JTextArea j foram apresentadas anteriormente. Aqui so vistas algumas caractersticas deste componente Swing, cuja sintaxe JTextArea(texto inicial, nmero de linhas iniciais, dimenso). texto inicial deve ser um objeto String e este argumento opcional. nmero de linhas iniciais define o n de linhas que a rea de texto ter, sem o uso de uma barra de rolagem, que pode ser definida atravs do componente JScrollPane.

dimenso deve ser um valor inteiro que especifica o nmero de caracteres W (o caracter mais largo do alfabeto) que cabem em uma linha na rea de texto. Em razo desta definio, em geral cabem bem mais caracteres do que o nmero que for introduzido como argumento.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CopiaTexto extends JFrame implements ActionListener { JTextArea ta1,ta2; JButton b1,b2; public static void main(String args[]) { JFrame cp = new CopiaTexto(); cp.show(); cp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } CopiaTexto() { setSize(480,280); setTitle("Copia Texto"); getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER)); b1 = new JButton("Copia Tudo"); b1.addActionListener(this); b2 = new JButton("Copia Seleo");

b2.addActionListener(this); ta1 = new JTextArea(5,40); ta2 = new JTextArea(5,40); JScrollPane p1 = new JScrollPane(ta1); JScrollPane p2 = new JScrollPane(ta2); getContentPane().add(p1); getContentPane().add(b1); getContentPane().add(b2); getContentPane().add(p2); } public void actionPerformed(ActionEvent e) { if (e.getSource()==b1) //copia o contedo de ta1 em ta2 ta2.setText(ta1.getText()); if (e.getSource()==b2) //copia a seleo de ta1 em ta2 ta2.setText(ta1.getSelectedText()); } }

Os mtodos getText e getSelectedText da classe JTextArea obtm, respectivamente, o texto do componente e o texto selecionado do componente.

Swing: menus
O primeiro passo para se criar um menu em Java definir uma barra de menus JMenuBar, que dever conter o conjunto de menus que aparece na parte superior da janela grfica. Alm disso, necessrio definir a barra de menus padro da janela, utilizando o mtodo setJMenuBar.
Em seguida, deve-se criar os menus JMenu a serem inseridos na barra de menus atravs do mtodo <nome da barra de menus>.add(<nome do menu>). O passo seguinte criar um novo item de menu JMenuItem e inclu-lo no seu menu atravs do mtodo <nome do menu>.add(<nome do item>).

Menu
Itens do Menu Barra de Menus

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Menus extends JFrame implements ActionListener { JMenuBar mb; JTextField tf; JMenu Cadastro, Relatorio; JMenuItem Ccliente, Cfornec, Csair, Rcliente, Rfornec; public static void main(String args[]) { JFrame m = new Menus(); m.show(); m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } Menus() { setTitle("Exemplo com Menus"); setSize(270,130); setLocation(50,50); tf = new JTextField(); mb = new JMenuBar(); //cria a barra de menus Cadastro = new JMenu("Cadastro"); //cria um novo menu Relatorio = new JMenu("Relatrios"); //cria um novo menu Ccliente = new JMenuItem ("Cliente"); //cria um novo item Ccliente.addActionListener(this); //registra o evento Cfornec = new JMenuItem ("Fornecedor"); //cria um novo item Cfornec.addActionListener(this); //registra o evento Csair = new JMenuItem ("Sair do sistema"); //cria um novo item Csair.addActionListener(this); //registra o evento

} public void actionPerformed(ActionEvent e) { if (e.getSource() == Ccliente) tf.setText("Escolhido o item Cliente"); if (e.getSource() == Cfornec) tf.setText("Escolhido o item Fornecedor"); if (e.getSource() == Rcliente) tf.setText("Escolhido o item Relao de Clientes"); if (e.getSource() == Rfornec) tf.setText("Escolhido o item Relao de Fornecedores"); if (e.getSource() == Csair) System.exit(0); }

Cadastro.add(Ccliente); //adiciona o item ao menu Cadastro.add(Cfornec); //adiciona o item ao menu Cadastro.add(Csair); Rcliente = new JMenuItem ("Relao de Clientes"); Rcliente.addActionListener(this); Rfornec = new JMenuItem ("Relao de Fornecedores"); Rfornec.addActionListener(this); Relatorio.add(Rcliente); //adiciona o item ao menu Relatorio.add(Rfornec); //adiciona o item ao menu mb.add(Cadastro); //adiciona o menu barra mb.add(Relatorio); //adiciona o menu barra setJMenuBar(mb); //define a barra de menus como padro getContentPane().add(tf);

O exemplo a seguir apresenta um menu com um aspecto mais sofisticado, utilizando subitens, cones, barra divisria e teclas de atalho para acessar os itens do menu.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Profissa extends JFrame implements ActionListener { JMenuBar mb; JMenu Arquivo, Save; JMenuItem Novo, Abrir, Sair, Salvar, SalvarComo, SalvarTudo; public static void main(String args[]) { JFrame p = new Profissa(); p.show(); p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

public Profissa() { setTitle("Menu Profissional"); setSize(250,150); mb = new JMenuBar(); //cria a barra de menus Arquivo = new JMenu("Arquivo"); //cria um novo menu Arquivo.setMnemonic(KeyEvent.VK_A); Arquivo.addActionListener(this); Save = new JMenu("Save"); //cria um novo menu Novo = new JMenuItem ("Novo",new ImageIcon("icon2.gif")); Novo.addActionListener(this); Novo.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_N, ActionEvent.ALT_MASK)); Novo.setMnemonic(KeyEvent.VK_N); Abrir = new JMenuItem ("Abrir",new ImageIcon("PASTA2.gif")); Abrir.addActionListener(this); Abrir.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_A, ActionEvent.ALT_MASK)); Abrir.setMnemonic(KeyEvent.VK_B); Salvar = new JMenuItem ("Salvar",new ImageIcon("disk_cat.gif")); Salvar.addActionListener(this); Salvar.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_S, ActionEvent.CTRL_MASK)); Salvar.setMnemonic(KeyEvent.VK_S); SalvarComo = new JMenuItem ("Salvar Como"); SalvarComo.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_C, ActionEvent.CTRL_MASK));

SalvarComo.addActionListener(this); SalvarComo.setMnemonic(KeyEvent.VK_C); SalvarTudo = new JMenuItem ("Salvar Tudo"); SalvarTudo.addActionListener(this); SalvarTudo.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_T, ActionEvent.CTRL_MASK)); SalvarTudo.setMnemonic(KeyEvent.VK_T); Sair = new JMenuItem ("Sair",new ImageIcon("DOOR_EXI.gif")); Sair.addActionListener(this); Sair.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_X, ActionEvent.ALT_MASK)); Sair.setMnemonic(KeyEvent.VK_A); Save.add(Salvar); //adiciona o item ao menu Save.add(SalvarComo); //adiciona o item ao menu Save.add(SalvarTudo); //adiciona o item ao menu Arquivo.add(Novo); //adiciona o item ao menu Arquivo.add(Abrir); //adiciona o item ao menu Arquivo.add(Save); //adiciona o item ao menu Arquivo.addSeparator(); //adiciona uma barra divisria Arquivo.add(Sair); //adiciona o item ao menu mb.add(Arquivo); //adiciona o menu barra setJMenuBar(mb); //define a barra de menus como padro }

public void actionPerformed(ActionEvent e) { if (e.getSource() == Novo) JOptionPane.showMessageDialog(null,"menu Novo.", "Usando menus",JOptionPane.INFORMATION_MESSAGE); if (e.getSource() == Abrir) JOptionPane.showMessageDialog(null,"menu Abrir.", "Usando menus",JOptionPane.INFORMATION_MESSAGE); if (e.getSource() == Salvar) JOptionPane.showMessageDialog(null,"Sub-menu Salvar.", "Usando menus",JOptionPane.INFORMATION_MESSAGE); if (e.getSource() == SalvarComo) JOptionPane.showMessageDialog(null,"Sub-menu Salvar Como.", "Usando menus",JOptionPane.INFORMATION_MESSAGE); if (e.getSource() == SalvarTudo) JOptionPane.showMessageDialog(null,"Sub-menu Salvar Tudo.", "Usando menus",JOptionPane.INFORMATION_MESSAGE); if (e.getSource() == Sair) System.exit(0); } }

Arquivo.setMnemonic(KeyEvent.VK_A) cria um sublinhado embaixo da letra especificada, neste caso, a letra A. Assim, os itens do menu Arquivo podem ser acessados via teclado, usando a combinao ALT + A.

O mtodo setAccelerator utilizado para criar um atalho para um item de menu. Duas constantes devem ser passadas para este mtodo. Por exemplo, as constantes KeyEvent.VK_N e ActionEvent.ALT_MASK definem o atalho como ALT + N. O mtodo addSeparator() cria uma barra divisria no menu.

Outros objetos grficos tambm podem ser inseridos em nenus, tais como botes de rdio JRadioButton ou caixas de marcao JCheckBox. Para inseri-los em um menu, basta utilizar o mtodo add.

Eventos do mouse
As classes receptoras de eventos relacionados ao uso do mouse em Java so MouseListener e MouseMotionListener. MouseListener refere-se aos eventos gerados pelo mouse quando clicado, entra na rea de um componente, sai da rea de um componente, etc.

MouseMotionListener refere-se a eventos do mouse gerados pela sua movimentao sobre um componente.
Os mtodos para registrar os objetos usados em uma aplicao swing, no que se refere ao uso dos eventos do mouse so addMouseListener() e addMouseMotionListener(). Ao ser gerado um evento do mouse, necessrio declarar os respectivos mtodos para tratamento do evento. Os mtodos a serem declarados para um evento do tipo MouseEvent gerado pela classe MouseListener so mousePressed, mouseClicked, mouseEntered, mouseExited e mouseReleased. Observe que obrigatrio declarar todos estes mtodos, mesmo que apenas um venha a ser realmente utilizado.

Existem ainda mtodos que permitem verificar as caractersticas do evento do mouse. Por exemplo, possvel detectar se foi dado um clique ou um duplo clique no mouse. Veja alguns mtodos associados aos eventos do mouse: int getClickCout() retorna o nmero de vezes que o mouse foi clicado; int getX() retorna a posio X do ponteiro do mouse sobre o componente swing; int getY() retorna a posio Y do ponteiro do mouse; boolean isAltDown() retorna true se a tecla ALT foi pressionada em conjunto com o mouse; boolean isControlDown() retorna true se a tecla CRTL foi pressionada em conjunto com o mouse;

boolean isShiftDown() retorna true se a tecla SHIFT foi pressionada em conjunto com o mouse;
O exemplo seguinte, EventoMouse, ilustra uma aplicao bsica de tratamento de eventos do mouse.

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class EventoMouse extends JFrame implements MouseListener { Container C1; JButton B1; JTextField T1; public static void main(String args[]) { JFrame Janela = new EventoMouse(); Janela.show(); Janela.setDefaultCloseOperation(EXIT_ON_CLOSE); } public EventoMouse() { setTitle("Trata evento do mouse"); setSize(250,100); C1 = getContentPane(); C1.setLayout(new FlowLayout()); B1 = new JButton("Galor forte e vingador"); B1.addMouseListener(this); T1 = new JTextField(20); C1.add(B1); C1.add(T1); } public void mousePressed(MouseEvent e) { T1.setText("O boto do mouse foi pressionado"); }

public void mouseClicked(MouseEvent e) { T1.setText("O boto do mouse foi solto"); } public void mouseReleased(MouseEvent e) { T1.setText("O ponteiro do mouse foi arrastado"); } public void mouseEntered(MouseEvent e) { T1.setBackground(Color.black); T1.setForeground(Color.white); T1.setText("O ponteiro do mouse entrou na rea"); } public void mouseExited(MouseEvent e) { T1.setBackground(Color.gray); T1.setForeground(Color.black); T1.setText("O ponteiro do mouse saiu da rea"); } }

A figura ao lado ilustra uma sada para a aplicao EventoMouse.


Como j foi dito, necessrio declarar todos os mtodos para tratamento de eventos do mouse, mesmo que apenas um venha a ser efetivamente usado.

Classes adaptadoras
Algumas das interfaces ouvintes de eventos de Java, a exemplo de MouseListener, exigem do usurio a implementao de vrios mtodos, o que nem sempre desejvel. Para solucionar este inconveniente, os pacotes java.awt.event e java. swing.event fornecem classes adaptadoras de ouvintes de eventos. Uma classe adaptadora implementa uma interface e fornece uma implementaopadro, com o corpo do mtodo vazio, para cada um dos mtodos. Por exemplo, a classe adaptadora MouseAdapter implementa a interface MouseListener e a classe adaptadora MouseMotionAdapter implementa a interface MouseMotionListener.

Das könnte Ihnen auch gefallen