Você está na página 1de 207

Apontamentos de Java

Linguagem Java Acetatos de Apoio s Disciplinas de Sistemas e Aplicaes Distribudos em Telecomunicaes Redes Inteligentes e Aplicaes

2004/2005

Apontamentos de Java PROGRAMA 1. Programao orientada por objectos 1.1. Abstraco e Encapsulamento. 1.2. Classes e Instncias. Mtodos e Mensagens. 1.3. Composio e Herana. Polimorfismo. 2. Caractersticas e elementos da linguagem de programao Java 2.1. Modelo de Compilao. Aplicaes e Applets. 2.2. Controlo do fluxo do programa. 2.3. Arrays. 2.4. Criao de Objectos em Java. Inicializao. 2.5. Composio e Herana. Polimorfismo. 2.6. A Criao do Interface com o Utilizador. 2.7. Grficos, Imagens, Animao e Som. 2.8. Objectos Grficos e sua Organizao. 2.9. Tratamento de Eventos. 2.10. Tratamento de Erros com Excepes. 2.11. Input/Output. 2.12. Threads.
2004/2005 2

Apontamentos de Java TEXTOS RECOMENDADOS: 1 - Core Java 1.2 Volume 1 - Fundamentals Cay S. Horstmann & Gary Cornell The Sun Micosystems Press Prentice Hall, 1999, ISBN: 0130819336 2 - Thinking in Java Bruce Eckel (www.bruceeckel.com) Prentice Hall Computer Books, 1998, ISBN: 0136597238 3 - Java: How to Program (How to Program Series) Harvey Deitel, H. M. Deitel, Paul Deitel Prentice Hall, 2nd Edition, 1997, ISBN: 0138993947 4 - Programao em Java 2 Pedro Coelho FCA - Editora de Informtica, 1999, ISBN: 972-722-155-6

2004/2005

Apontamentos de Java

5 - The Java Programming Language (Java Series) Ken Arnold, James Gosling Addison-Wesley, 2nd Edition, 1997, ISBN: 0201310066 6 - Java in a Nutshell: A Desktop Quick Reference (The Java Series) David Flanagan OReilly & Associates, 2nd Edition, 1997, ISBN: 156592262X 7 - An Introduction to Object-Oriented Programming Timothy Budd Addison-Wesley, 1991, ISBN: 0-201-54709-0

2004/2005

Apontamentos de Java

Avaliao de conhecimentos:
Realizao de 2 trabalhos e prova final Trabalho Prova final - peso 50 % - peso 50 % = 10 val. = 10 val.

2004/2005

Apontamentos de Java Histria da linguagem Java Dispositivos electrnicos de consumo inteligentes 1991 - Sun Microsystems - Green project prottipo: star7 - linguagem C++ James Gosling: criou uma nova linguagem: Oak Caractersticas dos programas: pequenos, fiveis, eficientes e facilmente portveis 1993: World Wide Web ganha popularidade A linguagem desenvolvida era adequada para a WWW: programas pequenos - facilmente carregados, seguros, portveis (podem correr em diferentes plataformas).
2004/2005 6

Apontamentos de Java

1994: construram um browser, escrito na prpria linguagem, que podia correr applets - WebRunner Jan 95: brainstorm oak WebRunner --> Java --> HotJava

Maio 95: Sun anuncia formalmente a linguagem Java Agosto 95: Netscape licencia a linguagem Java A revista Time considera Java um dos 10 melhores produtos de 1995

2004/2005

Apontamentos de Java Verses da linguagem: 1.0 (1.0.2) 1.1 (1.1.7) 1.2 ou 2 1.5 ou 5

http://java.sun.com

Software de desenvolvimento da Sun: Java Development Kit (JDK), gratuito.

2004/2005

Apontamentos de Java O Modelo de Compilao

Compiladores tradicionais: Cdigo fonte --> Compilador para um dado CPU -- > Cdigo especfico para um dado CPU

Compilao de programas em Java: Cdigo fonte --> Compilador -- > Bytecodes (conjunto de bytes formatados) --> Interpretador para um dado CPU --> Cdigo especfico para um dado CPU
2004/2005 9

Apontamentos de Java

Caractersticas: Execuo mais lenta, Grande portabilidade do cdigo em bytecodes, desde que um computador disponha de interpretador Java.

2 tipos de programas: Applets: programas escritos em Java e compilados para ser executados num browser ou num emulador de browser - appletviewer. Aplicaes: programas escritos em Java e compilados que correm sozinhos.

2004/2005

10

Apontamentos de Java Definio de uma classe: class NomeDaClasse { campos mtodos } campos: variveis com informao relativa aos objectos da classe. mtodos: contm o cdigo correspondente s aces que os objectos da classe podem executar. Definio de uma mtodo: tipo nomeDoMtodo ( tipo1 arg1, tipo2 arg2, ... ) { instruo; instruo; ... }
2004/2005 11

Apontamentos de Java Definio de uma classe como sendo uma subclasse de outra: class NomeDaClasse extends NomeDaSuperclasse { campos mtodos }

2004/2005

12

Apontamentos de Java Declarao de uma classe que representa um ponto num plano a 2 dimenses: class Ponto { double x, y; public void limpar() { x = 0; y = 0; } } Extenso da classe Ponto para representar um pixel que possa ser mostrado no ecr: class Pixel extends Ponto { Color cor; public void limpar() { super.limpar(); cor = null; } }
2004/2005 13

Apontamentos de Java Pixel estende dados e comportamento da classe Ponto Criao de objectos: Ponto p1 = new Ponto(); Ponto p2 = new Ponto(); p1.x = 10.0; p1.y = 20.0; p1.limpar();

Criao de campos e/ou mtodos estticos: public static Ponto origem = new Ponto();

2004/2005

14

Apontamentos de Java Aplicao: public class Hello { public static void main (String args []) { System.out.println(Hello World !); } } Applet: import java.applet.Applet; import java.awt.Graphics; public class Hello extends Applet { public void paint (Graphics g) { g.drawString(Hello World !, 50, 20); } }
2004/2005 15

Apontamentos de Java

A nica maneira de executar um applet a partir de um documento HTML. <html> <head> <title> Primeiro Applet </title> </head> <body> Este o primeiro Applet: <br> <applet code=Hello.class width=200 height=50> </applet> </body> </html>

2004/2005

16

Apontamentos de Java

Classes e Objectos Java linguagem de programao orientada por objectos. A programao orientada por objectos uma forma de organizao lgica de programas atravs de um nvel de abstraco adequado para modelizar as entidades de um modo semelhante ao modo como se relacionam no mundo real. Trata-se de uma simulao do mundo real conceptualizado como um sistemas de objectos em interaco. As entidades reais so modelizadas atravs de objectos e classes.

2004/2005

17

Apontamentos de Java

Classes so conjuntos de objectos com caractersticas comuns. As caractersticas dos objectos podem-se exprimir atravs de: atributos e comportamentos. Os atributos dos objectos pertencentes a uma classe implementam-se atravs de variveis. Os comportamentos dos objectos pertencentes a uma classe implementam-se atravs de mtodos que so funes que podem receber parmetros (ou no), realizam uma determinada aco e podem retornar resultados (ou no).

2004/2005

18

Apontamentos de Java
Exemplo: veculos
Objecto

Veculo

Duas Rodas

Quatro Rodas

bicicleta

motorizada

automvel ligeiro

carrinha

jipe

2004/2005

19

Apontamentos de Java

Na classe veculo definem-se as caractersticas comuns a todos os objectos que a ela pertencem (tm rodas, tm uma cor, tm uma marca, ...). Os mtodos da classe veculo poderiam ser : acelerar, travar, ... Um objecto uma representao modelizada de uma entidade concreta ou abstracta. Cada objecto pertence a uma classe, e tem, em geral, valores diferentes para os atributos (declarados na classe a que pertence). Estes diferentes valores distinguem os objectos uns dos outros. Criar um objecto a partir de uma classe instanciar a classe. Um objecto uma instncia de uma classe.

2004/2005

20

Apontamentos de Java

Todo o objecto em Java pertence a uma classe que define os seus dados e comportamento. Cada classe pode ter 3 tipos de membros: Campos so variveis de dados associadas classe e aos objectos. Os campos tambm servem para armazenar resultados de clculos realizados pelos mtodos da classe. Mtodos so conjuntos de instrues que contm o cdigo executvel de uma classe. Classes e interfaces. A execuo de um programa dirigida pelo modo como os mtodos so invocados e pelo seu contedo.

2004/2005

21

Apontamentos de Java Exemplo: Consideremos a definio da classe CorpoCeleste apresentada a seguir (verso a ser melhorada): public class CorpoCeleste { public int numId; public String nome; public CorpoCeleste orbitaEmVolta; private static int proxId = 0; } Campos: numId destina-se a atribuir um identificador nico a cada objecto; nome destina-se a conter o nome do corpo celeste criado; orbitaEmVolta destina-se a conter o outro corpo celeste volta do qual o corpo celeste criado orbita.

2004/2005

22

Apontamentos de Java

A declarao de uma classe cria um nome de um tipo: orbitaEmVolta uma referncia a um objecto do tipo CorpoCeleste. Uma referncia a um objecto deste tipo pode ser declarada com a instruo: CorpoCeleste marte; Mas para criar um objecto necessrio alm de declarar uma varivel objecto (do tipo de uma qualquer classe) faz-la apontar para uma instncia do objecto.

2004/2005

23

Apontamentos de Java

Java trata as variveis de dois modos diferentes, dependendo do seu tipo: 1. Variveis de tipos de dados primitivos: byte, short, int, long, float, double, char, boolean. 2. Variveis referncia de objectos. Quando se declara: Varivel de um tipo primitivo de dados: Pode-se ler, escrever e process-la imediatamente. Varivel referncia de um objecto: No se obtm uma instncia (objecto) de uma dada classe e portanto no se pode ler, escrever ou processar essa instncia. necessrio criar essa instncia (objecto).

2004/2005

24

Apontamentos de Java

Criao e inicializao de objectos que representam corpos celestes: CorpoCeleste sol = new CorpoCeleste(); sol.numId = CorpoCeleste.proxId++; sol.nome = Sol; sol.orbitaEmVolta = null; CorpoCeleste terra = new CorpoCeleste(); terra.numId = CorpoCeleste.proxId++; terra.nome = Terra; terra.orbitaEmVolta = sol;

2004/2005

25

Apontamentos de Java

Os objectos so criados utilizando a palavra-chave new seguida do tipo de objectos que se pretende criar e de parnteses. Os objectos criados so alocados numa rea de memria designada heap. Todos os objectos so acedidos por referncias a objectos. Em geral h impreciso na distino entre os objectos e as referncias a esses objectos. Uma varivel referncia de um objecto tem o valor null quando no referencia qualquer objecto.

2004/2005

26

Apontamentos de Java Cada objecto CorpoCeleste tem a sua prpria cpia dos campos numId, nome e orbitaEmVolta. Se alterarmos o valor de um destes campos num objecto no alteramos o valor do campo com o mesmo nome noutro objecto. Estes campos designam-se por variveis instncia porque h uma cpia do campo para cada instncia (objecto) da classe. Mas, s vezes, precisamos de campos que sejam partilhados por todos os objectos da classe. Em Java obtm-se estes campos especficos da classe declarando-os static, pelo que normalmente se designam por campos estticos ou variveis de classe (porque so especficos da classe e no aos objectos da classe). Haver apenas uma cpia correspondente a um campo esttico independentemente da quantidade de objectos criados, e mesmo que no seja criado nenhum. Um campo esttico pode ser referenciado atravs da referncia de qualquer objecto ou do nome da classe (preferencial).
2004/2005 27

Apontamentos de Java

Aos objectos criados necessrio dar um estado inicial. Esse estado inicial pode ser dado pela inicializao dos campos quando declarados, mas muitas vezes necessrio realizar operaes que no podem ser expressas como simples atribuies. Para isso usam-se os construtores. public class CorpoCeleste { public int numId; public String nome = <sem_nome>; public CorpoCeleste orbitaEmVolta = null; private static int proxId = 0; CorpoCeleste() { numId = proxId ++; }

2004/2005

28

Apontamentos de Java

Criao e inicializao de objectos que representam corpos celestes: CorpoCeleste sol = new CorpoCeleste(); sol.nome = Sol; CorpoCeleste terra = new CorpoCeleste(); terra.nome = Terra; terra.orbitaEmVolta = sol;

2004/2005

29

Apontamentos de Java
Construtores Para criar um objecto, necessrio declarar uma varivel do tipo de uma classe e em seguida criar um novo (new) objecto dessa classe usando um construtor (dessa classe) conjuntamente com o operador "new". Os construtores tm o mesmo nome que a classe que inicializam, recebem zero ou mais parmetros, mas no so mtodos e no tm tipo de retorno. Pode-se associar o tipo de retomo ao nome do construtor (igual ao nome da classe). Os construtores apresentam a seguinte estrutura: NomeDaClasse ( listaDeParametros ) { ... } Os construtores servem para colocar o objecto criado num estado inicial. Os construtores so invocados depois das variveis instncia dos objectos da classe criados terem sido instanciados aos seus valores iniciais por omisso e depois da execuo dos seus inicializadores explcitos.
2004/2005 30

Apontamentos de Java
Construtor por omisso ( default constructor ) A maioria das classes tm pelo menos um construtor. Se no definido nenhum explicitamente, o compilador cria automaticamente um construtor por omisso - construtor sem argumentos (no-arg constructor). Por isso normal declarar e inicializar objectos com chamadas do tipo: Bicicleta b1 = new Bicicleta(); Cerveja cheers = new Cerveja(); Um construtor no pode ser invocado explicitamente pelo programa a no ser na criao de um objecto (embora pudesse ser til para fazer o reset do objecto, isto coloc-lo no estado inicial), porque um construtor est associado criao do objecto.

2004/2005

31

Apontamentos de Java

Mas uma classe pode ter mais que um construtor, com diferentes assinaturas (isto , diferentes listas de parmetros, porque o nome sempre o da classe). CorpoCeleste() { numId = proxId ++; } CorpoCeleste( String nomeCorpo, CorpoCeleste orbita) { this(); nome = nomeCorpo; orbitaEmVolta = orbita; } Os argumentos dos construtores permitem fornecer parmetros para a inicializao de um objecto.

2004/2005

32

Apontamentos de Java

Invocao explcita de um construtor A palavra chave this com uma lista de argumentos faz uma chamada explcita ao construtor com essa lista de argumentos. this() s pode ser usado para um construtor invocar outro construtor da mesma classe e tem de ser a primeira instruo executvel. O cdigo para construo dos objectos torna-se mais simples: CorpoCeleste sol = new CorpoCeleste(Sol, null); CorpoCeleste terra = new CorpoCeleste(Terra, sol);

2004/2005

33

Apontamentos de Java Poderamos ter um construtor para construir objectos corpos celestes que no orbitam volta de nada. CorpoCeleste() { numId = proxId ++; } CorpoCeleste( String nomeCorpo ) { this(); nome = nomeCorpo; } CorpoCeleste( String nomeCorpo, CorpoCeleste orbita) { this(nomeCorpo); orbitaEmVolta = orbita; } CorpoCeleste sol = new CorpoCeleste(Sol); CorpoCeleste terra = new CorpoCeleste(Terra, sol);
2004/2005 34

Apontamentos de Java Default constructor O construtor por omisso s criado pelo compilador, se no se fornece nenhum construtor de qualquer tipo numa classe, porque h classes para as quais um construtor sem argumentos seria incorrecto. Se se pretende ter, para alm de um ou mais construtores com argumentos, um construtor sem argumentos, tem-se de o fornecer explicitamente. O construtor por omisso equivalente ao seguinte: public class Exemplo { public Exemplo() { } } A acessibilidade do construtor por omisso igual da classe.

2004/2005

35

Apontamentos de Java

Mtodos Os mtodos so invocados como operaes em objectos atravs das suas referncias usando o operador ponto. referncia.mtodo ( listaDeParmetros ) Cada parmetro tem um tipo especfico: tipo primitivo ou tipo referncia. Os mtodos tambm tm um tipo de retorno que declarado antes do nome do mtodo. Ex.: mtodo da classe CorpoCeleste que descreve um objecto CorpoCeleste: public String toString() { String descr = numId + ( + nome + ); if ( orbitaEmVolta != null ) descr += orbita em volta de + orbitaEmVolta.toString(); return descr; }
2004/2005 36

Apontamentos de Java
O mtodo toString() um mtodo especial: se um objecto tem um mtodo pblico designado toString que no recebe argumentos e retorna uma String, quando esse objecto usado numa concatenao de strings, o mtodo toString implicitamente invocado para obter uma String. Ex.: System.out.println(Corpo Celeste + sol); System.out.println(Corpo Celeste + terra); Corpo Celeste 0 (Sol) Corpo Celeste 1 (Terra) orbita em volta de 0 (Sol) Se nenhum mtodo toString() est definido numa classe, essa classe herda o mtodo toString() da classe Object, o qual retorna uma string representativa do tipo de objecto.

2004/2005

37

Apontamentos de Java
Passagem de parmetros na chamada de mtodos Em muitas linguagens de programao h dois modos de passar argumentos na chamada de mtodos: por valor por referncia Quando um parmetro passado por valor, uma cpia do valor do argumento usada pelo mtodo chamado. Quando um parmetro passado por referncia, o mtodo chamado acede directamente esse parmetro e atravs dele pode modificar os dados do parmetro. A passagem por referncia aumenta a eficincia porque elimina a sobrecarga de copiar grandes quantidades de dados mas enfraquece a segurana, porque o mtodo chamado acede directamente os dados.
2004/2005 38

Apontamentos de Java

Em Java todos os parmetros so passados por valor: Os tipos de dados primitivos so sempre passados por valor. Os objectos so passados atravs dos valores das variveis referncia (que referenciam os respectivos objectos). Esses valores das variveis referncia so tambm passados por valor. Assim o mtodo chamado usa uma cpia do valor da varivel que referencia o objecto e acede directamente os dados do objecto podendo modificar esses dados. Por isso, algumas vezes se diz incorrectamente que os objectos so passados por referncia, mas no verdade, porque o mtodo chamado no acede directamente varivel referncia do objecto usada na invocao do mtodo. Se o mtodo chamado alterar o valor da varivel referncia do objecto (deixando de referenciar o objecto, passando a ter o valor null ou a referenciar outro objecto), no programa que chamou o mtodo, a varivel que referencia o objecto no sofre alterao.
2004/2005 39

Apontamentos de Java
Para passar um objecto a um mtodo como parmetro: na chamada do mtodo especifica-se simplesmente a referncia ao objecto dentro do mtodo o valor da varivel parmetro (varivel referncia) uma cpias do valor especificado na invocao como argumento. Quando se retorna informao de um mtodo atravs de uma instruo return, os tipos de dados primitivos so sempre retornados por valor e os objectos so retornados atravs da referncia ao objecto. Um mtodo pode retornar mais que um resultado por uma qualquer das seguintes formas: Retornando uma referncia a um objecto que armazena os resultados como campos. Possuindo um ou mais parmetros que referenciam objectos nos quais se podem armazenar os resultados. Retornando um array que contm os resultados.
2004/2005 40

Apontamentos de Java
Nomes dos argumentos dos mtodos Quando se declara um argumento de um mtodo especifica-se um nome para esse argumento. Esse nome usado dentro do corpo do mtodo. Um argumento de um mtodo pode ter o mesmo nome que as variveis membros da classe. Neste caso, o argumento esconde a varivel membro da classe. Exemplo num construtor: class Circulo { int x, y, raio; public Circulo( int x, int y, int raio) { ... } } O uso de x, y e raio dentro do construtor refere-se aos argumentos e no aos campos da classe.
2004/2005 41

Apontamentos de Java

Para aceder aos campos da classe deve-se referenciar atravs de this (o objecto corrente): class Circulo { int x, y, raio; public Circulo( int x, int y, int raio) { this.x = x; this.y = y; this.raio = raio; } } Esconder identificadores deste modo deliberadamente s considerado uma boa prtica de programao neste uso em construtores e em mtodos de acesso aos campos de um objecto. this usado no sentido de este objecto, o objecto corrente.
2004/2005 42

Apontamentos de Java

this s pode ser usada dentro de um construtor ou mtodo e produz uma referncia para o objecto corrente (o objecto construdo ou o objecto para o qual o mtodo foi chamado). Esta referncia (this) pode ser usada como qualquer outra referncia de um objecto. No entanto se dentro de um mtodo se chama outro mtodo da mesma classe no necessrio usar this basta chamar o mtodo. A palavra-chave this s deve ser usada quando necessrio usar explicitamente a referncia ao objecto corrente. A palavra-chave this usada normalmente nos seguintes casos: Dentro de um mtodo no esttico ou dentro de um construtor para referenciar o objecto corrente no qual o mtodo foi invocado se algum dos argumentos do mtodo tem o mesmo nome que um campo do objecto. Para passar uma referncia do objecto corrente como um parmetro a outros mtodos. Em instrues return para retornar a referncia ao objecto corrente.
2004/2005 43

Apontamentos de Java
normalmente usada em instrues return para retornar a referncia ao objecto corrente: // Folha.java public class Folha { private int i = 0; Folha incremento() { i++; return this; } void mostrar() { System.out.println(i = + i); } public static void main(String args []) { Folha f = new Folha(); f.incremento().incremento().incremento().mostrar(); } }
2004/2005 44

Apontamentos de Java
Mtodos estticos So mtodos que no esto associado com qualquer objecto particular de uma classe. Um uso importante dos mtodos estticos permitir chamar esses mtodos sem criar qualquer objecto. Um exemplo o mtodo main() ponto de entrada para correr uma aplicao. Os mtodos estticos no podem aceder directamente membros no estticos (campos ou mtodos) chamando simplesmente esses outros membros sem referir um nome de um objecto - dado que os membros no estticos devem estar ligados a objectos particulares. class Exemplo { int x; public static void setX( int xx) [ x = xx; } } O compilador daria o seguinte erro: no pode fazer uma referncia esttica a uma varivel no esttica. 2004/2005 45

Apontamentos de Java class Exemplo { static int x; public static void setX( int xx) [ x = xx; } } Consideremos o seguinte cdigo: Exemplo ex1 = new Exemplo(); Exemplo ex2 = new Exemplo(); ex1.x = 1; ex2.x = 2; Exemplo.setX(3); System.out.println(ex1.x = + ex1.x); System.out.println(ex2.x = + ex2.x); Produz: ex1.x = 3; ex2.x = 3;
2004/2005 46

Apontamentos de Java

Um mtodo esttico, como qualquer outro mtodo, pode criar ou usar objectos com nome, incluindo objectos do seu tipo. H 2 maneiras de referenciar um mtodo esttico: atravs de um objecto como para qualquer outro mtodo ou atravs do nome da classe (prefervel). Um mtodo esttico invocado em nome de toda a classe e no em nome de um objecto especfico da classe, e por isso se designa por mtodo da classe. Num mtodo esttico no se pode usar a plavra-chave this.

2004/2005

47

Apontamentos de Java

Overloading de Mtodos Um nome de um mtodo um nome para uma aco ou conjunto de aces. Um nome apropriado torna o programa mais fcil de ser comprendido e mantido. Na linguagem natural uma mesma palavra pode ter vrios significados, que so deduzidos pelo contexto. No necessrio ter identificadores nicos para cada conceito. Em muitas linguagens de programao necessrio ter um identificador nico para cada funo. Em Java podem existir mtodos ou construtores com o mesmo nome e diferente lista de tipos de parmetros. Cada mtodo tem uma assinatura. Assinatura de um mtodo o seu nome em conjunto com a lista dos tipos dos seus parmetros.

2004/2005

48

Apontamentos de Java Overloading a existncia de mais que um mtodo com o mesmo nome mas diferente lista de tipos de parmetros e portanto diferentes assinaturas, na mesma classe ou numa hierarquia de superclasse e subclasses. Designa-se por overloading porque o nome do mtodo tem um significado sobrecarregado (overloaded), isto , tem mais que um significado. A assinatura no inclui o tipo de retorno ou a lista de thrown exceptions, e portanto no se pode usar mtodos overload baseado nesses factores. um erro de sintaxe se um mtodo numa superclasse e outro mtodo nessa superclasse ou numa sua subclasse tm a mesma assinatura mas diferentes tipos de retorno.

2004/2005

49

Apontamentos de Java

public boolean orbita(CorpoCeleste corpo) { return (orbitaEmVolta == corpo); } public boolean orbita(int id) { return (orbitaEmVolta != null && orbitaEmVolta.numId == id); }

2004/2005

50

Apontamentos de Java

Uso de Mtodos para Controlar o Acesso No exemplo da classe CorpoCeleste o campo numId colocado (recebe um valor) de um modo automtico e correcto pelo construtor quando se cria um objecto. No entanto este campo numId, declarado com public, permite o acesso de fora da classe. Este acesso til para leitura do valor mas no deveria ser possvel alterar o valor. Para tornar o campo s de leitura (read only) fora da classe deve-se esconder o campo declarando-o private e fornecer um novo mtodo pblico para permitir a leitura do campo fora da classe.

2004/2005

51

Apontamentos de Java

Ex.: public class CorpoCeleste { private int numId; public String nome = <sem_nome>; public CorpoCeleste orbita = null; private static int proxId = 0; CorpoCeleste() { numId = proxId ++; } public int getNumId() { return numId; } }

2004/2005

52

Apontamentos de Java

Deste modo o campo numId s pode ser modificado por mtodos dentro da classe CorpoCeleste. Mtodos que regulam o acesso a dados internos designam-se por mtodos de acesso. Normalmente os campos de uma classe declaram-se como private e adicionam-se mtodos para colocar (set) e retribuir (get) os valores desses campos. Os mtodos para colocar valores nos campos devem verificar a consistncia dos dados s permitindo alteraes se adequadas. A representao interna dos dados (usada dentro da classe) no interessa aos clientes da classe e por isso deve estar escondida deles, o que facilita a possibilidade de modificao da implementao da classe e tambm simplifica a percepo que os clientes tm da classe. Os mtodos public apresentam aos clientes da classe os servios que a classe fornece.
2004/2005 53

Apontamentos de Java

Na programao orientada por objectos as variveis instncia e os mtodos esto encapsulados dentro de um objecto e por isso os mtodos podem aceder s variveis instncia. Um mtodo que permita modificar dados private deve validar os valores dos dados e traduzir a representao dos dados para a forma usada na implementao. Ainda um mtodo para alterar o valor de uma varivel instncia pode retornar valores indicando que foi feita uma tentativa de atribuio de valores invlidos a um objecto da classe. Isto permite aos clientes da classe testar os valores retornados por estes mtodos para determinar se os objectos que esto a manipular so vlidos e tomar aces apropriadas se eles no so vlidos.

2004/2005

54

Apontamentos de Java

Libertao da memria ocupada por objectos A memria ocupada por um objecto criado com new, pode ser libertada quando j no se precisa do objecto, deixando de o referenciar (terminando o mbito de validade (scope ) da varivel que o referencia ou alterando o valor dessa varivel). Ex.: { String s = Uma string; System.out.println(s); }

2004/2005

55

Apontamentos de Java

Em Java, a memria ocupada por objectos no referenciados automaticamente libertada pelo garbage collector, que corre em background, e verifica para todos os objectos criados com new os que j no esto referenciados. Um objecto no atingvel, quando no existe nenhuma referncia ao objecto em qualquer varivel de qualquer mtodo em execuo, ou em qualquer campo ou elemento de array de uma dessas variveis. O garbage collector elimina a necessidade de libertar explicitamente a memria ocupada pelos objectos, mas s realiza essa libertao de memria quando necessrio evitar que a memria fique cheia ou porque necessita de mais espao de memria.

2004/2005

56

Apontamentos de Java
Inicializao de variveis por omisso Variveis membros de classes so automaticamente inicializadas quando se criam objectos. Para cada objecto alocado memria no heap e preenchida com 0s do que resultam os seguintes valores conforme os tipos dos campos: Tipos: byte, short, int, long float double char boolean referncia de objectos Valores por omisso: 0 0.0f 0.0 \u0000 false null

Variveis locais no campos de uma classe, mas declaradas em mtodos no so automaticamente inicializadas. Estas variveis so armazenadas na stack e necessrio inicializ-las antes de as usar seno d erro de compilao.
2004/2005 57

Apontamentos de Java Arrays - Para tipos primitivos de dados: int a [] = new int [2]; a[0] = 7; a[1] = 10; Criao por inicializao directa: int a[] = {7, 10}; - Para objectos: class Ponto { double x, y; public Ponto(int x, int y) { this.x = x; this.y = y; System.out.println("Ponto (" + x + ", " + y + ")"); } } Ponto p1 = new Ponto(2, 3); Ponto p2 = p1; new Ponto(4, 5);
2004/2005 58

Apontamentos de Java
Arrays de objectos Quando se cria um array de objectos o que realmente fica criado um array de referncias inicializadas a null. Depois necessrio atribuir objectos s referncias. Ex. Ponto [] pontos = new Ponto[3]; int x,y; for (int i=0; i < pontos.length ; i++) { x = lerNumero(Coordenada x do ponto + (i+1)); y = lerNumero(Coordenada y do ponto + (i+1)); pontos[i] = new Ponto(x, y); } Ponto [] pontos = new Ponto[3]; pontos[0] = new Ponto(0, 0); pontos[1] = new Ponto(1, 1); pontos[2] = new Ponto(2, 2);
2004/2005 59

Apontamentos de Java Criao de um array de objectos por inicializao directa: Ponto [] pontos = { new Ponto(0, 0), new Ponto(1, 1), new Ponto(2, 2) } Em Java 1.1: Ponto [] pontos = new Ponto [] { new Ponto(0, 0), new Ponto(1, 1), new Ponto(2, 2) } Ponto [] pontos = { new Ponto(0, 0), new Ponto(1, 1), new Ponto(2, 2), }

Uma vrgula final na lista de inicializadores opcional (para fcil manuteno):

Array de arrays:

Ponto [][] paresDePontos = { { new Ponto(0, 0), new Ponto(0,1) }, { new Ponto(1, 1), new Ponto(1,2) }, { new Ponto(2, 2), new Ponto(2,3) }, }
60

2004/2005

Apontamentos de Java Reutilizao de Cdigo Uma das caractersticas mais importantes do Java a possibilidade de reutilizao de cdigo. A aproximao tradicional de reutilizao de cdigo consiste em copiar e adaptar. Em Java a reutilizao de cdigo consiste na criao de classes que usam outras classes j existentes. Para isso uma classe deve ser projectada para resolver problemas genricos e no casos especficos. H 2 maneiras de reutilizar cdigo: 1. Dentro de uma nova classe criam-se objectos de classes j existentes. Este mtodo designa-se por composio porque a nova classe composta de objectos de classes existentes. 2. Criando uma nova classe como um tipo de uma classe existente. Usa-se a forma da classe existente e adiciona-se cdigo. Este mtodo designa-se por herana.
2004/2005 61

Apontamentos de Java

So dois modos de criar novos tipos a partir de tipos existentes. Mas enquanto na composio apenas se utiliza a funcionalidade do cdigo e no a sua forma, na herana utiliza-se a forma do cdigo. Criao de Subclasses Declara-se que uma classe um asubclasse de outra na declarao da classe: class SubClasse extends SuperClasse { ... } Uma subclasse herda variveis e mtodos da superclasse e de todas as superclasses desta.

2004/2005

62

Apontamentos de Java
import java.awt.Color; class Ponto { double x, y; public Ponto(int x, int y) { this.x = x; this.y = y; System.out.println("Ponto (" + x + ", " + y + ")"); } } class Pixel extends Ponto { Color cor; public Pixel() { super(0,0); cor = null; } }
2004/2005 63

Apontamentos de Java
Herana Herana uma forma de reusar software (software reusability) na qual novas classes so criadas a partir de classes existentes absorvendo (herdando) os seus atributos e comportamentos e acrescentando novos atributos e comportamentos que as novas classes necessitem. Assim, ao criar uma nova classe, em vez de incorporar todas as variveis instncia e mtodos instncia novos que a classe necessita, o programador pode designar (especificar) que a nova classe herda variveis instncia e mtodos instncia de uma outra classe previamente definida. A nova classe designa-se por subclasse e a classe da qual herda variveis e mtodos instncia designa-se por superclasse. Todo o objecto da subclasse tambm um objecto da superclasse, mas o inverso no verdade. Como uma subclasse normalmente adiciona variveis instncia e mtodos instncia prprios, uma subclasse geralmente maior que a sua superclasse (tem mais caractersticas: atributos e comportamentos) mas tambm mais especfica e representa um menor grupo de objectos.

2004/2005

64

Apontamentos de Java
Overriding de Mtodos (Reescrita de Mtodos) Uma subclasse comea do mesmo que a superclase mas tem a possibilidade de definir adies ou substituies das caractersticas herdadas da superclasse. Pode acontecer que uma subclasse possa herdar variveis instncia ou mtodos instncia que no necessita ou que expressamente no deva ter. Quando um membro de uma superclasse no apropriado para uma subclasse, esse membro pode ser overriden (sobreposto, reescrito) na subclasse atravs da definio de uma varivel instncia com o mesmo nome e tipo ou de um mtodo com a mesma assinatura. Quando um mtodo overrides (se sobrepe) a um mtodo da superclasse, o mtodo da superclasse pode ser acedido da subclasse precedendo o nome do mtodo da superclasse com super seguido de ponto. Quando o mtodo invocado da subclasse sem a referncia super. a verso da subclasse automaticamente seleccionada.
2004/2005 65

Apontamentos de Java
Ex.: import java.awt.Color; class Ponto { double x, y; public void limpar() { x = 0; y = 0; } } class Pixel extends Ponto { Color cor; public void limpar() { super.limpar(); cor = null; } }
2004/2005 66

Apontamentos de Java

Construtores em Classes Estendidas Quando se estende uma classe a nova classe deve escolher um dos construtores da superclasse para invocar. Um objecto ter uma parte controlada pela superclasse que deve ser iniciada e outra parte controlada pela subclasse relativa aos campos adicionados. Num construtor de uma subclasse, pode-se invocar directamente um construtor da superclasse usando a instruo super(), que uma invocao explcita de um construtor da superclasse. Se no se invoca explicitamente um construtor da superclasse como primeira instruo executvel de um construtor, o construtor sem argumentos da superclasse automaticamente invocado antes de qualquer instruo ser executada.

2004/2005

67

Apontamentos de Java

Se a superclasse no tem um construtor sem argumentos devese invocar explicitamente um dos construtores da superclasse ou ento outro construtor da mesma classe usando this(). Se uma classe estendida no declara qualquer construtor, o compilador cria um construtor por omisso (sem argumentos) que comea por invocar o cosntrutor sem argumentos da superclasse: public class SubClasse extends SuperClasse { public SubClasse () { super(); } }

2004/2005

68

Apontamentos de Java

Converso implcita e explicita entre referncias de objectos Java efectua a converso implcita de uma referncia a um objecto de uma classe para uma referncia a um objecto de uma superclasse da classe. Esta converso designa-se por upcasting (casting up na hierarquia de classes) ou converso segura (safe casting) porque sempre vlida. Ex.: Como todas as classes so subclasses da classe Object, Object um tipo referncia genrico que pode referenciar qualquer objecto de qualquer classe: Object o = new Ponto(); o = Objecto String;

2004/2005

69

Apontamentos de Java A converso de uma referncia a um objecto de uma classe para uma referncia a uma subclasse s possvel se o objecto realmente um objecto da subclasse e necessrio efectuar uma converso explcita. Ex.: Object o1 = new Ponto(); Ponto o2 = (Ponto) o1; Esta converso designa-se por downcasting (casting down na hierarquia de classes) ou converso insegura (unsafe casting) porque nem sempre vlida. No entanto esta converso necessria para aceder s funcionalidades que a subclasse adiciona. Uma conversoexplcita para uma classe que no subclasse da classe a que o objecto pertence d erro de compilao. Uma converso explcita para uma subclasse potencialmente correcta, mas se em tempo de execuo no vlida, porque o objecto no realmente um objecto da subclasse, uma excepo ClassCastException lanada.
2004/2005 70

Apontamentos de Java

Embora um objecto de uma subclasse possa ser tratado como um objecto da superclasse os tipos subclasse e superclasse so diferentes. No entanto, possvel referenciar um objecto de uma subclasse com uma referncia da superclasse ( Java efectua uma converso implcita ). Atravs da referncia da superclasse s se pode aceder a membros da superclasse. Referncia a membros s da subclasse, atravs da referncia da superclasse causa erro de sintaxe. Referenciar um objecto de uma superclasse com uma referncia de uma subclasse causa erro de sintaxe a no ser que o objecto seja realmente um objecto da subclasse e aps um "cast" do tipo superclasse para o tipo subclasse. Se o objecto referenciado no um objecto da subclasse, no tem valores para as variveis instncia que pertencem s subclasse, pelo que no faz sentido referenci-lo atravs de uma varivel referncia da subclasse.

2004/2005

71

Apontamentos de Java

Polimorfismo O mecanismo de polimorfismo do Java permite que usando uma referncia de uma superclasse para referenciar um objecto, instncia de uma subclasse, e invocando um mtodo que exista na superclasse e que tambm exista (overriden) em uma subclasse, o programa escolher dinamicamente (isto , em tempo de execuo) o mtodo correcto da subclasse. Isto designa-se por ligao dinmica de mtodo ("dynamic method binding"). Atravs do uso de polimorfismo, uma invocao de um mtodo pode causar diferentes aces dependendo do tipo de objecto que recebe a chamada.

2004/2005

72

Apontamentos de Java

class FormaGeom { void desenhar() { System.out.println(FormaGeom.desenhar()) } } class Circunferencia extends FormaGeom { void desenhar() { System.out.println(Circunferencia.desenhar()) } } class Quadrado extends FormaGeom { void desenhar() { System.out.println(Quadrado.desenhar()) } } class Triangulo extends FormaGeom { void desenhar() { System.out.println(Triangulo.desenhar()) } }

2004/2005

73

Apontamentos de Java
public class Teste { public static FormaGeom formaGeomAleat() { switch ( (int) (Math.random() * 3) ) { case 0 : return new Circunferencia(); case 1 : return new Quadrado(); case 2 : return new Triangulo(); } } public static void main( String [] args ) { FormaGeom [] fg = new FormaGeom[6]; for (int i= 0; i < fg.length; i++) fg[i] = formaGeomAleat(); for (int i= 0; i < fg.length; i++) fg[i].desenhar(); } }
2004/2005 74

Apontamentos de Java

Exemplo de sada produzida pelo programa: Circunferencia.desenhar() Triangulo.desenhar() Circunferencia.desenhar() Quadrado.desenhar() Triangulo.desenhar() Circunferencia.desenhar()

2004/2005

75

Apontamentos de Java

Programas que invocam comportamento polimrfico podem ser escritos independentemente dos tipos de objectos para os quais as mensagens (isto , as chamadas de mtodos) so enviadas. Podem-se adicionar novos tipos de objectos que respondem a mensagens existentes sem modificar o sistema, o que promove a facilidade de extenso (extensibilidade).

2004/2005

76

Apontamentos de Java

Como uma classe implementa um tipo, normalmente sero instanciados (criados) objectos dessa classe. Contudo h casos nos quais til definir classes para as quais no se pretende instanciar objectos mas que se destinam apenas a ser usadas como superclasses, para permitir usar os mecanismos de herana e polimorfismo. Estas classes designam-se por abstractas e no podem ser instanciados objectos destas classes. Uma classe abstracta tem de ser declarada com a palavra-chave "abstract". Uma classe que contenha um mtodo abstracto (declarado com a palavra chave "abstract") uma classe abstracta e por isso deve ser explicitamente declarada como uma classe abstracta.

2004/2005

77

Apontamentos de Java

Se uma subclasse deriva de uma superclasse com um mtodo abstracto, e se na subclasse no se fornece nenhuma definio para esse mtodo abstracto (esse mtodo no "overriden" na subclasse) ento esse mtodo permanece abstracto na subclasse, pelo que a subclasse tambm uma classe abstracta e assim deve ser explicitamente declarada. A declarao de um mtodo como abstracto numa classe obriga que esse mtodo seja overriden (reescrito) nas subclasses para que se possam instanciar objectos. Embora no se possam instanciar objectos de superclasses abstractas, pode-se declarar referncias a superclasses abstractas, as quais podem ser usadas para permitir manipulaes polimrficas de objectos de subclasses. Polimorfismo particularmente adequado para implementar sistemas de software por camadas ("layered").
2004/2005 78

Apontamentos de Java

abstract class FormaGeom { public abstract void desenhar(); public String toString() { return Forma Geometrica; } } class Ponto { protected double x,y; public Ponto( double x, double y ) {this.x = x; this.y = y; } public String toString() { return Ponto de coordenadas = ( + x + , + y + ); } }

2004/2005

79

Apontamentos de Java
class SegmRecta extends FormaGeom { protected Ponto p1, p2; public SegmRecta( double x1, double y1, double x2, double y2 ) { p1 = new Ponto(x1, y1); p2 = new Ponto(x2, y2); } public double comprimento() { double dx = p1.x - p2.x; double dy = p1.y - p2.y; return Math.sqrt(dx*dx + dy*dy); } public void desenhar() { System.out.println("\tDesenhar um segmento de recta"); } public String toString() { return super.toString() + ": Segmento de Recta de comprimento = " + comprimento(); } }
2004/2005 80

Apontamentos de Java class Circunferencia extends FormaGeom { protected double raio; public Circunferencia( double r ) { raio = r ; } public void desenhar() { System.out.println("\tDesenhar uma circunferencia"); } public String toString() { return super.toString() + : Circunferencia de raio = + raio; } } class Quadrado extends FormaGeom { protected double lado; public Quadrado( double l ) { lado = l; } public void desenhar() { System.out.println("\tDesenhar um quadrado"); } public String toString() { return super.toString() + : Quadrado de lado = + lado; } }
2004/2005 81

Apontamentos de Java

class Triangulo extends FormaGeom { protected double base, altura; public Triangulo( double b, double a ) { base = b; altura = a; } public void desenhar() { System.out.println("\tDesenhar uma triangulo"); } public String toString() { return super.toString() + : Triangulo de base = + base + e de altura = + altura; } }

2004/2005

82

Apontamentos de Java

public class Teste { public static void main(String args []) throws java.io.IOException { FormaGeom fg []= new FormaGeom [3]; fg[0] = new SegmRecta(4, 5, 8, 9); fg[1] = new Circunferencia(4); fg[2] = new Quadrado(3); fg[3] = new Triangulo(4, 3); for (int i= 0; i<fg.length; i++) { System.out.println( fg[i]; fg[i].desenhar(); } System.in.read(); } }

2004/2005

83

Apontamentos de Java
Forma Geometrica: Segmento de Recta de comprimento = 5.65685 Desenhar um segmento de recta Forma Geometrica: Circunferencia de raio = 4 Desenhar uma circunferencia Forma Geometrica: Quadrado de lado = 3 Desenhar um quadrado Forma Geometrica: Triangulo de base = 4 e de altura = 3 Desenhar uma triangulo

Pretendemos que a classe FormaGeom contenha todas as caractersticas que as formas geomtricas tm em comum: campos e mtodos. Mas a classe genrica FormaGeom no deve implementar o mtodo desenhar, porque no representa uma forma concreta. Este mtodo deve ser declarado abstracto. Os mtodos abstractos so definidos sem a implementao; no tm corpo, s tm assinatura terminada por ;.

2004/2005

84

Apontamentos de Java

Classes abstractas Qualquer classe com pelo menos 1 mtodo abstracto uma classe abstracta e tem de ser declarada como tal. Uma classe abstracta no pode ser instanciada. Uma classe abstracta refere-se a conceitos to genricos que no til criar objectos dese tipo. Uma classe tambm pode ser declarada abstracta mesmo sem mtodos abstractos, ficando inibida a possibilidade de ser instanciada. Uma subclasse de uma classe abstracta pode ser instanciada se reescreve todos os mtodos abstractos da superclasse e fornece uma implementao para eles. Se uma subclasse de uma classe abstracta no implementa pelo menos 1 mtodo abstracto que herde, a subclasse abstracta e como tal deve ser declarada.
2004/2005 85

Apontamentos de Java

Interfaces Interfaces, como classes e mtodos abstractos, fornecem declaraes de comportamentos que outras classes devem implementar. A herana simples restritiva quando pretendemos usar um determinado comportamento em diferentes ramos de uma rvore hierrquica. Com herana mltipla, uma classe pode herdar de mais que uma superclasse obtendo ao mesmo tempo atributos e comportamentos de todas as superclasses. No entanto a mltipla herana torna a linguagem de programao muito mais complicada.

2004/2005

86

Apontamentos de Java

Java s possui herana simples. Para resolver o problema da necessidade de comportamentos comuns em classes em diferentes ramos de uma rvore hierrquica, Java tem outra hierarquia de comportamentos de classes, a hierarquia de interfaces. Assim quando crimos uma classe, essa classe s tem uma superclasse, mas pode escolher diferentes comportamentos da hierarquia de interfaces. Um interface em Java uma coleco de comportamentos abstractos que podem ser includos em qualquer classe para adicionar a essa classe comportamentos que no so fornecidos pelas superclasses. Um interface em Java s contm definies de mtodos abstractos e constantes estticas no contm variveis instncia nem implementao de mtodos. Os interfaces so como as classes, declarados em ficheiros fonte, compilados em ficheiros .class e podem ser usados para tipos de dados de variveis. So diferentes das classes porque no podem ser instanciados.

2004/2005

87

Apontamentos de Java

Ex.:

public interface Imposto { double calculoDoImposto(); }

Ao contrrio das classes um interface pode ser adicionado a uma das classes que j uma subclasse de outra classe. Pode-se pretender usar este interface em muitas classes diferentes: roupa, comida, carros, etc. Seria inconveniente que todos estes objectos derivassem de uma nica classe. Para alm disso cada tipo diferente poder ter um modo diferente de clculo de imposto. Assim define-se o interface Imposto e cada classe deve implementar esse interface. Um interface pode conter vrios mtodos (incluindo mtodos overloaded) e campos, mas estes tm de ser static final.

2004/2005

88

Apontamentos de Java

abstract class FormaGeom { public abstract void desenhar(); public String toString() { return "Forma Geometrica"; }; } interface Dimensoes { double area(); double perimetro(); }

2004/2005

89

Apontamentos de Java class Ponto { protected double x,y; public Ponto( double x, double y ) {this.x = x; this.y = y; } public String toString() { return super.toString() + ": Ponto de Coordenadas = (" + x + ", " + y + ")"; } } class SegmRecta extends FormaGeom { protected Ponto p1, p2; public SegmRecta( double x1, double y1, double x2, double y2 ) { p1 = new Ponto(x1, y1); p2 = new Ponto(x2, y2); } public double comprimento() { double dx = p1.x - p2.x; double dy = p1.y - p2.y; return Math.sqrt(dx*dx + dy*dy); } public void desenhar() { System.out.println("\tDesenhar um segmento de recta"); } public String toString() { return super.toString() + ": Segmento de Recta de comprimento = " + comprimento(); } }
2004/2005 90

Apontamentos de Java

class Circunferencia extends FormaGeom implements Dimensoes { protected double raio; public Circunferencia( double r ) { raio = r; } public double area() { return Math.PI * raio * raio; } public double perimetro() { return 2 * Math.PI * raio; } public void desenhar() { System.out.println("\tDesenhar uma circunferencia"); } public String toString() { return super.toString() + ": Circunferencia de raio = " + raio; } }

2004/2005

91

Apontamentos de Java

class Quadrado extends FormaGeom implements Dimensoes { protected double lado; public Quadrado( double l ) {lado = l; } public double area() { return lado * lado; } public double perimetro() { return 4 * lado; } public void desenhar() { System.out.println("\tDesenhar um quadrado"); } public String toString() { return super.toString() + ": Quadrado de lado = " + lado; } }

2004/2005

92

Apontamentos de Java
class Triangulo extends FormaGeom implements Dimensoes { protected double base, altura; public Triangulo( double b, double a ) { base = b; altura = a; } public double area() { return base * altura / 2; } public double perimetro() { return base+2*Math.sqrt(base*base/4+altura*altura); } public void desenhar() { System.out.println("\tDesenhar uma triangulo"); } public String toString(){ return super.toString() + ": Triangulo de base = "+base+" e de altura = "+altura; } }
2004/2005 93

Apontamentos de Java
public class Teste { public static void main(String args []) { FormaGeom fg []= new FormaGeom [4]; fg[0] = new SegmRecta(4, 5, 8, 9); fg[1] = new Circunferencia(4); fg[2] = new Quadrado(3); fg[3] = new Triangulo(4, 3); for(int i= 0; i<fg.length; i++) { System.out.println( fg[i] ); fg[i].desenhar(); } Dimensoes d []= new Dimensoes [3]; d[0] = (Circunferencia) fg[1]; d[1] = (Quadrado) fg [2]; d[2] = (Triangulo) fg [3]; for(int i= 0; i<d.length; i++) { System.out.println( d[i] + \n\t Area = + d[i].area() + \n\t Perimetro = + d[i].perimetro() ); } }
2004/2005 94

Apontamentos de Java

Forma Geometrica: Segmento de Recta de comprimento = 5.65685 Desenhar um segmento de recta Forma Geometrica: Circunferencia de raio = 4 Desenhar uma circunferencia Forma Geometrica: Quadrado de lado = 3 Desenhar um quadrado Forma Geometrica: Triangulo de base = 4 e de altura = 3 Desenhar uma triangulo Forma Geometrica: Circunferencia de raio = 4 Area = 50.2655 Perimetro = 25.1327 Forma Geometrica: Quadrado de lado = 3 Area = 9 Perimetro = 12 Forma Geometrica: Triangulo de base = 4 e de altura = 3 Area = 6 Perimetro = 11.2111
2004/2005 95

Apontamentos de Java

Faa um programa que construa uma tabela para os quadrados dos inteiros de 1 a 5 e outra para os cubos dos inteiros dos mltiplos de 10 entre 10 e 50.

interface Funcao { public abstract int f(int x); } class Quadrado implements Funcao{ public int f(int x) { return x*x; } } class Cubo implements Funcao { public int f(int x) { return x*x*x; } }

2004/2005

96

Apontamentos de Java

class Tabela { public static void tabela(Funcao t, int a, int b, int incr) { System.out.println( "x\t| f(x)\n--------------"); for (int x=a; x<b; x+=incr) System.out.println(x+"\t| "+t.f(x)); System.out.println(); } public static void main(String args []){ Funcao t = new Quadrado(); tabela(t, 1, 5, 1); t = new Cubo(); tabela(t, 10, 50, 10); }

2004/2005

97

Apontamentos de Java

x | f(x) -------------1 |1 2 |4 3 |9 4 | 16 5 | 25 x | f(x) -------------10 | 1000 20 | 8000 30 | 27000 40 | 64000 50 | 125000

2004/2005

98

Apontamentos de Java

Polimorfismo A herana usada com 2 objectivos: reutilizao de cdigo, e implementao de polimorfismo. O benefcio do polimorfismo permitir que numa hierarquia de tipos com o mesmo interface (os mesmos mtodos pblicos), cdigo que funciona com um tipo genrico tambm funcione com qualquer objecto que seja subtipo desse tipo. Isto simplifica a escrita de cdigo, a leitura e compreenso e a manuteno. Os comportamentos comuns definem-se na classe base (superclasse). Qualquer objecto de um subtipo pode receber as mesmas mensagens que a classe base, e pode ser tratado como um objecto da classe base. Ainda permite uma fcil extenso de um programa com um mnimo de modificaes, pois cdigo que funciona com um tipo genrico tambm funciona com novos subtipos que se criem.
2004/2005 99

Apontamentos de Java
Composio vs Herana Usa-se a composio quando se pretende as caractersticas de uma classe existente dentro da nova classe, mas no o interface da classe existente. Usa-se a herana quando se pretende especializar uma classe existente para um fim particular. Um modo claro de determinar se se deve usar composio ou herana obtm-se determinando a relao entre os objectos da classe que se pretende criar e da classe existente: A relao tem-um (has-a) expressa atravs da composio e a relao -um (is-a) exprime-se atravs da herana. Ex. de composio: Uma circunferncia tem um ponto que o centro mas uma circunferncia no um ponto. Ex. de herana: Um carro um veculo mas um carro no contm um veculo.
2004/2005 100

Apontamentos de Java
Packages Os packages permitem criar um grupo de classes relacionadas (logicamente). Usam-se para: tornar mais fcil encontrar e usar classes, evitar conflitos de nomes entre classes, controlar o acesso de umas classes s outras. Um package uma unidade de uma biblioteca (library) de classes formada por um dado conjunto de classes. Conflitos entre nomes: Os nomes de todos os membros de uma classe esto isolados dos nomes dos membros de outras classes. Mas os nomes de classes podem coincidir.

2004/2005

101

Apontamentos de Java
Para criar um package coloca-se uma classe dentro dele. Para incluir uma classe num package coloca-se a instruo package no incio do ficheiro fonte no qual a classe est definida. package utilitarios; O nome do package implicitamente prefixado a cada nome de classe (tipo) contido no package. Uma instruo package deve ser a primeira instruo de um ficheiro (para alm dos comentrios). O mbito de validade de um instruo package estende-se a todo o ficheiro fonte. Em cada ficheiro s pode existir uma declarao de um package. Se no se usa a instruo package a classe pertence ao unnamed package. Todos os tipos que no especificam nome de package so tratados como pertencendo ao mesmo package, nico para a mquina virtual em execuo.
2004/2005 102

Apontamentos de Java

Ficheiros fonte e ficheiros classe Um ficheiro fonte constitui uma unidade de compilao, pode conter mais que uma classe, mas s pode haver uma classe pblica, que deve ter o mesmo nome que o ficheiro fonte (incluindo letras maisculas, mas excluindo a extenso .java). Depois de compilado obtm-se um ficheiro para cada classe, com o nome da classe e a extenso .class. Se um ficheiro fonte no contm nenhuma classe pblica, pode ter qualquer nome. Os ficheiros classe devem ser colocados num directrio cujo nome reflecte o nome do package, para que o compilador e o interpretador possam encontrar as classes.

2004/2005

103

Apontamentos de Java
A varivel de ambiente CLASSPATH (colocada atravs do sistema operativo ou do ambiente de desenvolvimento) contm um ou mais directrios que so usados como razes para pesquisa de ficheiros .class. No ambiente de desenvolvimento Visual J++ a varivel CLASSPATH colocada seguindo os menus Tools, Options, Directories. Ex.: CLASSPATH=.;G:\JAVA\biblio Classes pertencentes ao: package utilitarios; devem ser colocadas no directrio G:\JAVA\biblio\utilitarios Classes pertencentes ao: package curso.graficos.trab2; devem ser colocadas no directrio G:\JAVA\biblio\curso\graficos\trab2 Para nomes de packages usam-se normalmente sempre letras minsculas.
2004/2005 104

Apontamentos de Java
Acesso a packages Ao escrever cdigo fora do package que necessite de classes (tipos) declarados dentro de um package pode-se: preceder cada nome de um tipo pelo do package, ou importar parte ou todo o package. Ex.: utilitarios.Classe1 c1 = new utilitarios.Classe1(); import utilitarios.Classe1; import utilitarios.*; Classe1 c1 = new Classe1(); Cdigo de um package importa outro cdigo do package que necessite implicitamente. A instruo import deve ser colocada depois de uma declarao de package, mas antes de outro cdigo.

2004/2005

105

Apontamentos de Java Coliso entre nomes de classes Se duas bibliotecas so importadas e incluem classes com o mesmo nome, mas no efectuado nenhum acesso a qualquer uma dessas classes com o mesmo nome, no h problema. Se necessrio aceder a algumas dessas classes temos de especificar o nome completo da classe prefixando o nome do package.

Compilao automtica A primeira vez que se cria um objecto ou se acede a um membro esttico de uma classe importada (seja por ex. classe A), o compilador procura o ficheiro com o nome da classe e extenso .class (A.class) no directrio apropriado. Se tambm encontra um ficheiro com o nome da classe e extenso .java (A.java) e se este ficheiro mais recente que o .class, automaticamente o recompila para gerar um ficheiro .class actualizado.
2004/2005 106

Apontamentos de Java

Acesso a classes e membros de classes Java possui especificadores de acesso para permitir ao criador de uma biblioteca de classes especificar o que est disponvel para o programador cliente e o que no est. Deste modo o criador da biblioteca pode fazer modificaes (melhoramentos) sem afectar o cdigo do programador cliente. Normalmente os campos e alguns mtodos no se destinam a ser usados directamente pelo programador cliente. Os nveis de acesso so: public friendly ou package (sem palavra-chave) protected private

2004/2005

107

Apontamentos de Java

Acesso a classes Alguns especificadores de acesso podem ser usados para determinar que classes de uma biblioteca esto disponveis para um utilizador dessa biblioteca. Uma classe pode ter 2 tipos de acesso: pblico e package ou friendly. public: declaradas com a palavra-chave public, tornam a classe acessvel ao programador cliente a partir de qualquer package. friendly:no se coloca nenhum especificador de acesso, a classe s acessvel de outra qualquer do mesmo package, mas no de fora do package. No entanto os membros estticos pblicos de uma classe friendly so acessveis de outros packages.Este tipo de acesso usa-se para classes que apenas suportam tarefas realizadas por outras classes.. Deste modo o criador da classe no necessita de criar documentao e mantm a possibilidade de poder alter-la porque nenhum programa cliente depende da implementao particular da classe.
2004/2005 108

Apontamentos de Java Acesso a membros de classes Os especificadores de acesso public, protected e private colocados frente na definio de cada membro (campo ou mtodo) de uma classe controlam o acesso a esses membros. Acesso public Um membro de uma classe declarado com o modificador de acesso public pode ser acedido por qualquer programa que tenha acesso classe desse membro. Acesso friendly o tipo de acesso por omisso, quando no se especifica nenhum modificador de acesso. Todas as classes no mesmo package tm acesso a membros friendly, mas classes de outros packages no tm acesso.

2004/2005

109

Apontamentos de Java Acesso private Membros declarados com o modificador de acesso private s podem ser acedidos por mtodos dentro da prpria classe.. Normalmente campos e mtodos que apenas auxiliam outros mtodos so declarados private para assegurar que no so usados acidentalmente e assim podem ser modificados sem que afectem outras classes no mesmo package. Acesso protected Um membro declarado com o modificador de acesso protected pode ser acedido por todas as classes no mesmo package e por classes, mesmo que noutros packages, que herdem da classe a que o membro pertence. Uma classe que herde de outra classe (superclasse) herda todos os campos e mtodos dessa superclasse. Os membros privados e friendly da superclasse embora herdados no so acessveis da subclasse, enquanto que os membros pblicos so acessveis no s da subclasse como tambm de todas as outras classes. O modificador de acesso protected til para permitir acesso s subclasses, sem permitir aceso a todas as outras classes no relacionadas.
2004/2005 110

Apontamentos de Java

No entanto se uma classe B uma subclasse de A pertencente a um package diferente, a classe B pode aceder a membros protected (campos ou mtodos) de A mas s em objectos do tipo B ou de subclasses de B. A classe B no pode aceder a membros protected de A em objectos do tipo A.

Ex.: package primeiro; class A { protected int i; protected void f() { System.out.println(Classe A metodo protected); } }

2004/2005

111

Apontamentos de Java

package segundo; import primeiro.*; class B extends A { public static void main(String args []) throws java.io.IOException { A a = new A(); B b = new B(); b.i = 5; b.f(); // a.i = 5; ilegal // a,f(); ilegal System.in.read(); } }

2004/2005

112

Apontamentos de Java

Encapsulamento O encapsulamento, caracterstico da programao orientada por objectos, consiste: na incluso de dados e mtodos dentro de classes, e no controlo do acesso aos membros da classe. O controlo do acesso estabelece o que o programador cliente pode usar separando-o das estruturas e mecanismos internos, isto , separa o interface da implementao.

2004/2005

113

Apontamentos de Java

Inicializao de um objecto de uma subclasse Quando se cria um objecto de uma subclasse (classe derivada) ele contm dentro dele um sub-objecto da classe base. Este sub-objecto contm o mesmo contedo que teria se se criasse um objecto da classe base. Para que o sub-objecto da classe base seja inicializado correctamente Java automaticamente insere uma chamada a um construtor da classe base na sublasse (um construtor da classe base tem o conhecimento e privilgios apropriados para efectuar essa inicializao). Se o construtor da classe base no tem uma invocao explcita do construtor da superclasse, Java automaticamente chama o construtor por omisso (sem argumentos) da superclasse. Em qualquer dos casos o sub-objecto da classe base inicializado (com a execuo de um ou mais construtores da classe base) antes dos construtores da subclasse acederem ao objecto.
2004/2005 114

Apontamentos de Java
class A { B b1 = new B(1); A() { System.out.println("Construtor A()"); } } class B { B(int i) { System.out.println("Construtor B("+i+")"); } } class SubA extends A { B b2 = new B(2); SubA() { System.out.println("Construtor SubA()"); } } public class Sub1 { public static void main(String args[]) { SubA sa = new SubA(); } } Construtor B(1) Construtor A() Construtor B(2) Construtor SubA()

2004/2005

115

Apontamentos de Java
class A { A(int i) { System.out.println("Construtor A("+i+")"); } } class B { B(int i) { System.out.println("Construtor B("+i+")"); } } class SubA extends A { B b1, b2 = new B(2); SubA(int i) { super(i); b1 = new B(i); } } public class Sub2 { public static void main(String args[]) { SubA sa = new SubA(1); } } Construtor A(1) Construtor B(2) Construtor B(1)
2004/2005 116

Apontamentos de Java
class Pao { Pao() { System.out.println("Pao()"); } } class Queijo { Queijo() { System.out.println("Queijo()"); } } class Alface { Alface() { System.out.println("Alface()"); } } class Refeicao { Refeicao() { System.out.println("Refeicao()"); } } class Almoco extends Refeicao { Almoco() { System.out.println("Almoco()"); } } class Sandwich extends Almoco { Pao p = new Pao(); Queijo q = new Queijo(); Alface a = new Alface(); Sandwich() { System.out.println("Sandwich()"); } public static void main(String args []) throws java.io.IOException { new Sandwich(); System.in.read(); Refeicao() } Almoco() Pao() Queijo() Alface() Sandwich() 117

2004/2005

Apontamentos de Java

Sumariando o processo de inicializao: Carregamento da classe: Inicializao esttica da classe base. Inicializao esttica da classe derivada. Se um objecto da subclasse criado: Todos os campos (da classe base e da subclasse) so colocados nos valores por omisso (0s binrios); Inicializaes dos campos da classe base; Chamada do construtor da classe base (o construtor da classe base invocado explicitamente na subclasse ou o construtor por omisso); Inicializaes dos campos da classe derivada; Execuo do resto do construtor da classe derivada;

2004/2005

118

Apontamentos de Java class Flor { Flor(int i) { System.out.println("Flor(" + i + ")"); } void cor(int i) { System.out.println("cor(" + i + ")"); } } class Jarra { Flor f1 = new Flor(1); static Flor f2 = new Flor(2); Jarra() { System.out.println("Jarra()"); f3.cor(3); } static Flor f3 = new Flor(3); } | Flor(2) | Flor(3) public class InicializacaoEstatica { | Flor(1) public static void main(String[] args) { | Jarra() System.out.println("No main"); | cor(3) new Jarra(); //(2) | No main Jarra.f2.cor(2); //(2) | Flor(1) } | Jarra() static Jarra j = new Jarra(); //(1) | cor(3) } | cor(2)
2004/2005

| Sem (1): | | | Flor(2) | Flor(3) | No main | Flor(1) | Jarra() | cor(3) | cor(2)

| Sem | (1) | e (2) | | | | | | No | main


119

Apontamentos de Java A palavra-chave final A palavra-chave final significa que no pode ser alterado. Para campos: static final tipo var - um nico armazenamento que no pode ser mudado. final tipo-primitivo var constante. final tipo-objecto var esta referncia no pode ser alterada para apontar para outro objecto, mas o objecto pode ser modificado. Em Java no possvel impor que um objecto seja uma constante. Todos os campos declarados final ou so inicializados quando declarados ou ento tm de ser inicializados antes de serem usados (blank finals).
2004/2005 120

Apontamentos de Java

Para argumentos de mtodos: dentro do mtodo no podem ser mudados os valores dos argumentos. Ex.: int f(final int i) { return i+1; } Para mtodos: uma classe que herde um mtodo final no pode mudar o seu significado (no o pode reescrever). Mtodos private numa classe so implicitamente final.

Para classes: no permite criar subclasses desta classe.

2004/2005

121

Apontamentos de Java

UML UML Unified Modeling Language um formalismo de representao de sistemas computacionais, atravs de diagramas. Ajuda a capturar a viso inicial de um sistema, comunic-la e mant-la durante o projecto e criao do sistema. UML consiste de um dado nmero de elementos grficos que combinados, segundo determinadas regras, formam diagramas. O objectivo dos diagramas apresentar vrias vistas de um sistema. O conjunto dos diagramas de um sistema, designados por modelo UML do sistema, descrevem o que o sistema deve realizar e no como deve ser implementado. UML define vrios tipos de diagramas. Vamos apenas descrever os diagramas de classes.

2004/2005

122

Apontamentos de Java Diagramas de classes em UML Um sistema computacional para representar e interactuar com o mundo necessita de simular e manipular vrias entidades e aceder s suas caractersticas. Podemos distinguir dois tipos dessas caractersticas: atributos e comportamentos. A organizao das vrias entidades envolvidas leva s categorias a que cada entidade naturalmente pertence. Estas categorias designam-se por classes. Uma classe um conjunto de entidades que tm atributos e comportamentos semelhantes. Um diagrama de classes um diagrama que mostra classes, interfaces e suas relaes. Classes Uma classe representada por um rectngulo dividido em 2 ou 3 partes. Na parte superior coloca-se o nome da classe, na parte do meio os atributos (campos ou variveis), e na inferior os comportamentos (mtodos). Se uma classe representada apenas por 2 compartimentos, as variveis, embora possam existir, no so mostradas.Se representada apenas por um compartimento s contm o nome da classe.
2004/2005 123

Apontamentos de Java
Cada varivel ou mtodo precedida de um smbolo que indica a visibilidade: + public # protected private e seguida de : Tipo para indicar o tipo da varivel ou do retorno do mtodo, excepto se um mtodo retorna void, caso em que no se coloca. Exemplo: Classe1 -campo1: Tipo = valor1 -campo2: Tipo constructor +Classe1() misc +metodo1(var1:Tipo1, var2:Tipo2):Tipo3 +metodo2()
2004/2005 124

Apontamentos de Java

Um valor inicial para uma varivel indicado a seguir ao tipo. Os parmetros formais dos mtodos consistem do nome e tipo, separados por vrgulas. Num diagrama UML palavras entre aspas como constructor designam-se por esteretipos e so usados para qualificar o que segue. O estertipo constructor indica construtores e o esteretipo misc indica mtodos normais. Classes ou mtodos abstractos so escritos em itlico. Interfaces Os interfaces so desenhados de um modo semelhante s classes, com a excepo do nome, no compartimento superior, que precedido pelo esteretipo interface.

2004/2005

125

Apontamentos de Java

Relaes entre classes e interfaces Uma linha contnua com uma seta fechada indica a relao de herana entre uma subclasse e a sua superclasse. Uma linha ponteada ou tracejada com uma seta fechada indica que uma classe implementa um interface. Uma linha contnua com uma seta aberta indica uma relao entre classes e/ou interfaces designada por associao. interface Interface1

ClasseA

ClasseB

ClasseC

2004/2005

126

Apontamentos de Java Opcionalmente a meio da linha que representa a associao pode aparecer um nome para a associao (com inicial maiscula) com a indicao do sentido em que deve ser lida essa associao. A seta na extremidade da linha que representa a associao indica o sentido dessa associao. Para clarificar a natureza da associao, o nome do papel que cada classe desempenha na associao pode aparecer ( em minsculas) nas extremidades da linha que representa a associao, ao lado da correspondente classe. Normalmente tambm se indica a quantidade de instncias de cada classe que participam numa ocorrncia de uma associao. Este indicador de multiplicidade pode aparecer de cada lado de uma associao e pode consistir em: - um simples nmero, por ex. 0 ou 1 - uma gama de nmeros, por ex. 0..2 - 0 .. *, ou *, significando qualquer nmero de instncias - 1 .. *, significando pelo menos 1 instncia.
2004/2005 127

Apontamentos de Java

Uma classe com mltiplas subclasses pode ser desenhada como segue: ClasseA

ClasseB

ClasseC

ClasseD

2004/2005

128

Apontamentos de Java

2004/2005

129

Apontamentos de Java

Sintaxe da linguagem Java


Identificadores Identificadores em Java usados para nomes de entidades declaradas tais como variveis, constantes, nomes de classes ou mtodos Tm que comear por: uma letra, _ ou $, seguida de letras, dgitos ou ambos. Os identificadores so case sensitive: upper case lower case Ex.: soma Soma

2004/2005

130

Apontamentos de Java
As palavras-chave da linguagem no podem ser utilizadas como identificadores:

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 package private protected public return short static

super switch synchronized this throw throws transient try void volatile while

Tambm no podem ser usados como identificadores os literais: null, true e false.
2004/2005 131

Apontamentos de Java

Tipos de dados: Tipos primitivos de dados: contm um valor nico: inteiro, real, carcter ou booleano. Tipos referncia: contm uma referncia para um objecto: arrays, classes ou interfaces. Todas as variveis tm que ser declaradas antes de serem usadas e devem ser de um tipo de dados. O tipo de dados determina os valores que a varivel pode ter e as operaes que lhe podem ser aplicadas.

2004/2005

132

Apontamentos de Java
Tipos primitivos de dados: byte short int long float double char boolean 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits n.os inteiros entre 128 e 127 n.os inteiros entre 32768 e 32767 n.os inteiros entre aprox. 2x108 e 2x108 n.os inteiros entre aprox. 9x1018 e 9x1018 n.os reais preciso simples (1.4E-45 a 3.4E+38) n.os reais preciso dupla (4.9E-324 a 1.7E+308)

16 bits caracteres em Unicode 1 bit pode ter o valor true ou false

Unicode cdigo de caracteres internacional standard capaz de representar a maior parte das lnguas do mundo escritas. Os ambientes existentes de Java lem ASCII e convertem em Unicode. Os primeiros 256 caracteres do Unicode so o conjunto de caracteres Latinos. Como poucos editores de texto suportam caracteres Unicode, Java reconhece sequncias escape \udddd, onde cada d um dgito hexadecimal.

2004/2005

133

Apontamentos de Java Literais So os valores que as variveis podem ter 4 tipos de literais: numricos de caracteres de string lgicos ou booleanos Literais numricos: Ex.: 178 023 0x5A 0.25 2e5 2E-22

n. no sistema decimal n. no sistema octal n. no sistema hexadecimal n. real n. real n. real

2004/2005

134

Apontamentos de Java
Constantes inteiras so cadeias de dgitos octais, decimais ou hexadecimais. O incio da constante determina a base do nmero: 0 (zero) denota octal, 0x ou 0X denota hexadecimal e qualquer outro conjunto de dgitos assumido como decimal. Uma constante inteira do tipo long se termina em l ou L (L preferido porque l confunde-se com 1). Seno assumida como sendo do tipo int. Se um literal int atribudo directamente a uma varivel short ou byte e se o seu valor est dentro da gama de valores vlidos, o literal inteiro convertido no respectivo tipo short ou byte. Se a atribuio no directa necessrio explicitar o casting. Nmeros em vrgula flutuante so expressos com nmeros decimais com ponto decimal e expoente opcionais. Constantes de vrgula flutuante so assumidas como double, a no ser que terminem por f ou F, o que as torna float. Se terminam por d ou D especificam uma constante double. Uma constante double no pode ser atribuda directamente a uma varivel float, mesmo que o valor esteja dentro da gama de valores vlidos. 2004/2005 135

Apontamentos de Java

Literais de caracteres: So expressos por um carcter nico dentro de pelicas Ex.: a x 8 Alguns literais de caracteres representam caracteres que no so impressos ou acessveis atravs do teclado sequncias escape: \n \t \b \r \\ newline tab backspace carriage return backslash

2004/2005

136

Apontamentos de Java

Literais de string: Cadeias de caracteres inserida entre aspas. Podem conter sequncias escape. Ex.: String s1 = Nome \tEndereo; Em Java uma string um objecto e no armazenada num array com em C. Quando um literal de string usado, Java armazena esse valor como um objecto String, sem termos de criar explicitamente um novo objecto, como necessrio com outros objectos. Como strings so objectos, existem mtodos para combinar strings, modificar strings e determinar se duas strings tm o mesmo valor. Literais booleanos: So os valores true e false.

2004/2005

137

Apontamentos de Java

Variveis Localizao de memria, utilizada durante a execuo de um programa, para conter informao. Cada varivel possui 3 componentes: Nome Tipo de dados Valor Nome: case sensitive, comea por letra, _ ou $. Tipo de dados: byte, short, int, long, float, double, char, boolean, array, ou objecto. Variveis tm de ser declaradas antes de ser usadas.

2004/2005

138

Apontamentos de Java
Uma varivel declarada numa classe (membro de uma classe) automaticamente inicializada a: 0 variveis numricas \0 caracteres false booleanos null (referncia a) objectos Mas uma varivel local (declarada num mtodo) deve ser inicializada explicitamente antes de ser usada num programa, seno d erro de compilao. Variveis locais podem ser declaradas em qualquer lugar dentro de um mtodo. Ex.: int a; int b,c,d; int a = 10, b = 12; Atribuio de valores a variveis:
2004/2005

a = b = c = 2;
139

Apontamentos de Java

Constantes Tipo especial de varivel cujo valor nunca muda durante a execuo do programa. A declarao tem de ser precedida da palavra-chave final e incluir a atribuio de um valor a essa varivel. Ex.: final int max = 10; final double taxa = 0.17;

2004/2005

140

Apontamentos de Java Scope (mbito de validade) de uma varivel Determina quer a visibilidade quer o tempo de vida da varivel Ex.:
{ int x = 10; /* s x est disponvel { int y = 20; /* x e y esto ambos disponveis } /* s x est disponvel, y fora de scope }

Em Java no permitido o seguinte (legal em C e C++):


{ int x = 10; { int x = 20; } }

Resulta um erro ao compilar.


2004/2005 141

Apontamentos de Java
Todas as instrues terminam por ; excepto a instruo composta ou bloco de instrues: { instr1; instr2; instr3;

Comentrios: /* . . . */ incio e fim de comentrio; o comentrio pode estender-se por mais que uma linha. tudo direita deste smbolo at ao fim da linha comentrio. incio e fim de comentrio utilizado para gerar documentao (javadoc).

// /** . . . */

2004/2005

142

Apontamentos de Java

Casting
Java uma linguagem fortemente tipada que verifica sempre que possvel a compatibilidade de tipos em tempo de compilao. Pode ser necessrio realizar converso de um tipo de dados noutro: em operaes de atribuio de um valor a uma varivel; em operandos dentro de expresses; ou quando se usam valores como parmetros de mtodos. Alguns tipos de converso so feitos automaticamente (implicitamente) enquanto que outros tm de ser forados explicitamente (quando a compatibilidade de um tipo s pode ser determinada em tempo de execuo ou quando se pretende efectuar a converso entre tipos primitivos de dados que diminuem a gama de valores representveis). Java permite efectuar o casting de qualquer tipo primitivo de dados para outro qualquer tipo primitivo de dados excepto boolean.
2004/2005 143

Apontamentos de Java

Converso implcita Quando necessrio realizar uma converso, de um tipo primitivo de dados para outro tipo primitivo de dados que suporte uma maior gama de valores, no necessrio explicitar o casting - geralmente no h perda de informao. Java efectua a converso implcita de tipos inteiros em tipos de vrgula flutuante, mas no o inverso. No h perda na gama de valores representveis quando se passa de long para float, mas nesta converso implcita pode-se perder preciso, porque um float tem 32 bits enquanto que um long tem 64 bits. Um char pode ser usado onde um int seja vlido

2004/2005

144

Apontamentos de Java

Converso explcita Quando necessrio realizar uma converso de um tipo de dados para outro tipo de dados que apenas suporte uma menor gama de valores temos de efectuar o casting explicitamente porque se corre o risco de perder informao. ( tipo ) ( expresso ) Ex.: int x = (int) (y/0.1);

Quando um nmero em vrgula flutuante (float ou double) convertido num inteiro, a parte fraccional cortada. Na converso entre inteiros os bits mais significativos so cortados.

2004/2005

145

Apontamentos de Java

Operadores
Operadores aritmticos + * / % adio subtraco multiplicao diviso ( se entre inteiros produz resultados inteiros ) mdulo ( resto da diviso inteira ).

A diviso inteira trunca o resultado, no arredonda. Operadores abreviados de atribuio: a = a + b; a = a - b; a = a * b; a = a / b;


2004/2005

a += b; a -= b; a *= b; a /= b;
146

Apontamentos de Java
Incrementar o valor de uma varivel: i = i + 1; ++ i; i ++;

Em qualquer uma destas notaes o valor da varivel incrementado, mas: Se o operador ++ colocado antes da varivel,o valor da varivel usado na instruo o novo valor depois de incrementado. Se o operador ++ colocado depois da varivel, o valor da varivel usado na instruo o valor antes de incrementado. Ex.: b = 3; a = ++b; b = 3; a = b++; Depois da execuo: a = 4, b = 4. Depois da execuo: a = 3, b = 4.

Decrementar o valor de uma varivel: i = i - 1; -- i i -2004/2005

-- i;

i --;

primeiro decrementa e depois usa i. primeiro usa i e depois decrementa.


147

Apontamentos de Java

Operadores Bitwise: ~ & | ^ inverso operador unrio and operador binrio or operador binrio exclusive-or operador binrio

Estes operadores s realizam operaes em valores inteiros. O operador inverso inverte os bits que constituem o valor inteiro, e os outros operadores realizam a respectiva operao ao nvel do bit: o bit de ordem n do resultado calculado usando os bits de ordem n de cada operando. Valores byte, short, e char so convertidos em int antes de uma operao bitwise ser aplicada. Ainda se um operador bitwise binrio tem um operando long, o outro convertido para long antes da operao.
2004/2005 148

Apontamentos de Java Operadores Shift (operadores binrios): << left shift >> right shift >>>unsigned right shift Estes operadores causam o desvio dos bits do operando da esquerda o nmero de vezes especificado no outro operando. Valores byte, short, e char do operando esquerdo so convertidos em int antes da operao ser aplicada. Se o operando esquerdo um int s os ltimos 5 bits do operando direito so considerados (num int, 32 bits, s se pode efectuar desvios 32 vezes); se o operando esquerdo long s os ltimos 6 bits do operando direito so considerados (num long, 64 bits, s se pode efectuar desvios 64 vezes). O operador << efectua o desvio para a esquerda sendo os bits direita cheios com 0s. O operador >> efectua o desvio para a direita sendo os bits esquerda cheios com o valor do bit mais esquerda antes da operao. O operador >>> efectua o desvio para a direita sendo os bits esquerda cheios com 0s.
2004/2005 149

Apontamentos de Java

Operadores lgicos
Os operadores lgicos AND, OR, XOR e NOT produzem um valor booleano baseado na relao lgica dos seus argumentos. S podem ser aplicados a valores booleanos. AND (E) expr1 && expr2 ou expr1 & expr2 verdadeiro (true) se e s se expr1 e expr2 so verdadeiras. expr1 && expr2: expr1 & expr2: OR (OU) expr1 || expr2 ou expr1 | expr2 verdadeiro (true) se expr1 ou expr2 verdadeira. expr1 || expr2: expr1 | expr2:
2004/2005

se expr1 falsa, expr2 j no avaliada. ambas as expresses so avaliadas.

se expr1 verdadeira, expr2 j no avaliada. ambas as expresses so avaliadas.


150

Apontamentos de Java

Operadores lgicos
XOR (OU Exclusivo) expr1 ^ expr2 verdadeiro se apenas uma das expresses verdadeira.

NOT ! expr

verdadeiro se expr falsa, e falsa se expr verdadeira.

2004/2005

151

Apontamentos de Java

Operadores relacionais (de comparao)


Os operadores relacionais avaliam a relao entre os valores dos operandos e produzem um valor booleano. == != < > <= >= igual diferente menor que maior que menor ou igual a maior ou igual a determina se uma referncia a um objecto (o operando esquerdo) uma instncia da classe, interface ou tipo de array especificado no operando direito.

instanceof

2004/2005

152

Apontamentos de Java

Operador ternrio Condicional ? :


O operador condicional ? : tem 3 operandos. valor = ( exprBool ? expr0 : expr1 ) ; Se exprBool verdadeira o operador produz o valor de expr0, seno produz o valor de expr1. if ( exprBool ) valor = expr0; else valor = expr1; A diferena principal entre o operador condicional e a instruo if que o operador condicional produz um valor.
Exemplo: static int menor ( int i, int j ) { return i < j ? i : j ; } static int menorAlternativo ( int i, int j ) { if (i < j) return i ; return j ; }

2004/2005

153

Apontamentos de Java

Operador + usado para concatenar Strings


O operador + pode ser usado para concatenar Strings. Se um dos operandos numa operao + uma String ento o outro operando convertido para uma String. Ex.: int x = 1; y = 2; String s= Valores de x e y: ; System.out.println( s + x + y ); Java possui definies de converso para String de todos os tipos primitivos de dados. Todos os tipos primitivos de dados so impliciatmente convertidos em objectos String quando usados em expresses deste tipo, mas no noutra alturas. Por exemplo, a um mtodo que recebe um parmetro String deve ser-lhe passado uma String. Se o operando a converter para String um objecto, o seu mtodo toString() invocado.
2004/2005 154

Apontamentos de Java
Precedncia dos operadores - ordem de avaliao das expresses H ierarquia de precedncias (das mais altas para as mais baixas): ++ (postfixo), -- (postfixo) ++ (prefixo), -- (prefixo), + (unrio), - (unrio), ~, ! (tipo) *, /, % + (binrio), - (binrio) <<, >>, >>> <, >, >=, >= instanceof ==, != & ^ | && || ?: =, +=, -=, *=, /=, %=, >>=, <<=, >>>=, &=, ~=, !=
2004/2005 155

Apontamentos de Java

Estruturas de Controlo do Fluxo do Programa Estruturas de deciso: 1 - A estrutura if


if ( cond ) instruo; ou if ( cond ) { blocoDeInstrues }

A condio cond avaliada; se for verdadeira (true) a instruo ou bloco de instrues so executados; se for falsa (false) a instruo ou bloco de instrues so ignorados.
Ve rd a d e iro Ac o

Te ste d a C o n d i o

Fa lso

2004/2005

156

Apontamentos de Java

2 - A estrutura if . . . else
if ( cond ) instruo1; else instruo2; ou if ( cond ) { blocoDeInstrues1 } else { blocoDeInstrues2 }

A condio cond avaliada; se for verdadeira (true) a instruo1 ou o bloco de instrues 1 executado; se for falsa (false) a instruo2 ou bloco de instrues 2 executado.

Falso Aco

Teste da Condio

Verdadeiro Aco

2004/2005

157

Apontamentos de Java Podem-se encadear vrios if . . . else if ( cond1 ) instr1; else if ( cond 2) instr2; else if ( cond 3) instr3; else instr4; Um else sempre associado com o ltimo if excepto se se usam chavetas para exprimir de um modo diferente. Ex.1: if ( cond1 ) if ( cond 2 ) instrA; else instrB; if ( cond1 ) { if ( cond 2 ) instrA; } else instrB;

Ex.2:

No Ex.1 o compilador associa o else ao segundo if enquanto que no Ex.2 o else associado ao primeiro if.
2004/2005 158

Apontamentos de Java

3 - A estrutura sw itch
A estrutura sw itch usada para substituir estruturas encadeadas de clusulas if . . . else if . . . mas s quando o valor da expresso a testar do tipo: byte , short, int ou char. switch ( expr ) { case valor1: instruo1; break; case valor2: instruo2; break; ... default: instruon; } A instruo break causa o abandono da estrutura switch A instruo default opcional.
2004/2005 159

Apontamentos de Java

Exemplo: int deci; switch ( ch ) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: deci = ch 0; break; case a: case b: case c: case d: case e: case f: deci = ch a + 10; break; case A: case B: case C: case D: case E: case F: deci = ch A + 10; break; default: System.out.println(Caracter nao hexadecimal); }
2004/2005 160

Apontamentos de Java

4 - A estrutura for
A estrutura for usada para repetir uma instruo um nmero especificado de vezes at se verificar uma dada condio. for ( inicializao; teste; incremento ) instruo; ou for ( inicializao; teste; incremento ) { blocoDeInstrues }

Inicia lizao

Teste da Condio

Ve rdadeiro Aco

Incremento

Falso

2004/2005

161

Apontamentos de Java

Ex.: for (int i = 1; i < 5; i++) System.out.println(i);

Na inicializao e no incremento pode haver mais do que uma instruo separadas por vrgulas, sendo neste caso estas instrues avaliadas sequencialmente. Ex.: for (int i = 0, j = i; i < 10 && j != 10 ; i++, j = i*2 ) { System.out.println( i= + i + j= + j ); }

2004/2005

162

Apontamentos de Java

5 - A estrutura while
A estrutura while usada para que enquanto uma condio seja verdadeira, uma instruo ou um bloco de instrues sejam executados repetidamente. while ( cond ) instrucao; ou while ( cond ) { blocoDeInstrues }

Ex: int i = 1; while ( i < 5 ) { System.out.println(i); i ++; }


Te ste d a C o n d i o Ve rd a d e iro Ac o

Fa lso

2004/2005

163

Apontamentos de Java

6 - A estrutura do . . . while
A estrutura do . . . while usada para repetir uma instruo ou um bloco de instrues enquanto uma condio for verdadeira. do instruo; while ( cond ); do { blocoDeInstrues } while ( cond );

A condio s testada no fim. A instruo ou bloco de instrues executado pelo menos uma vez.

Ac o

Te ste d a C o n d i o

Ve rd a d e iro

Fa lso

2004/2005

164

Apontamentos de Java

A instruo break
A instruo break interrompe a execuo de um ciclo. O programa continua executando as instrues fora desse ciclo. while (cond1) { instrA; if (cond2) break; instrB; } Se cond2 verdadeira o ciclo terminado mesmo que cond1 se mantenha verdadeira. A instruo break tambm pode ser utilizada em ciclos for e do, interrompendo a execuo desses ciclos.

2004/2005

165

Apontamentos de Java

A instruo continue
A instruo continue quando includa no bloco de instrues de um ciclo, faz com que sejam ignoradas as instrues que se lhe seguem no bloco de instrues iniciando-se um novo ciclo depois do teste da condio de ciclo no caso dos ciclos while e do, e depois do incremento e do teste no caso do ciclo for. Ex.: while ( cond1 ) { instrA; if ( cond2 ) continue; instrB; } Se cond2 for avaliada como verdadeira a instrB ignorada e a cond1 avaliada. Se for verdadeira o ciclo repete-se. Assim pode haver iteraes em que a instrB executada e iteraes em que o no .
2004/2005 166

Apontamentos de Java

No caso de ciclos encadeados o efeito das instrues break e continue afecta apenas o ciclo onde esto integradas. Ex.: for (int i=1; i<5; i++) { while ( cond1 ) { instrA; while ( cond2 ) { instrX; if ( cond3 ) break; instrY; } } } Se cond3 verdadeira a instruo break cancela a execuo do ciclo onde est integrada e a execuo do programa continua no ciclo while (cond1) comeando por testar cond1.
2004/2005 167

Apontamentos de Java
Suponhamos que se pretendia que fosse continuado o ciclo for quando cond3 fosse verdadeira. Deve-se usar um label, e a instruo continue label. Designemos o label por retomar: Ex.:
retomar: for (int i=1; i<5; i++) { while ( cond1 ) instrA; while ( cond2 ) { instrX; if ( cond3 ) continue retomar; instrY; } } }

continue retomar leva a retomar a execuo do ciclo for, comeando pelo incremento seguido do teste.
2004/2005 168

Apontamentos de Java Um label um identificador seguido por dois pontos. Em Java um label usado quando se tem ciclos encaixados e se pretende que o efeito das instrues break ou continue se propaguem atravs de mais que um nvel. Em Java um label coloca-se imediatamente antes de uma instruo de iterao ou switch. Um continue pra a execuo da iterao corrente e regressa ao princpio do ciclo para comear uma nova iterao. Um continue com label salta para o label e entra no ciclo imediatamente a seguir ao label. Um break abandona o ciclo sem executar o resto das instrues do ciclo. Um break com label abandona no s o ciclo corrente mas todos os ciclos at ao denotado pelo label, o qual tambm abandona. Quando um break de um label causa a sada de um mtodo pode-se usar simplesmente return.
2004/2005 169

Apontamentos de Java

Arrays
As semelhanas entre Java e C relativamente a arrays so apenas superficiais e baseadas apenas na sintaxe. Os arrays em C esto muito relacionados com apontadores. Java no revela os apontadores aos programadores. No existem variveis do tipo apontador. Java trata os apontadores implicitamente. Arrays so um tipo referncia. Arrays so objectos. Quando se declara um array obtm-se uma varivel que pode conter uma referncia a um array. Mas ainda necessrio criar o array.

2004/2005

170

Apontamentos de Java
Ao declararmos um array (assim como outro qualquer objecto) apenas obtemos uma localizao de memria que pode conter um apontador para o objecto.Quando se instancia o objecto preenche-se essa localizao. Declarao de array: ou Criao do array: int numeros []; int [] numeros; numeros = new int [20];

Declarao e criao de um array: int numeros [] = new int [20]; ou int [] numeros = new int [20]; Em Java todos estes dados so automaticamente inicializados a: 0 para inteiros; 0.0 para reais; \0 para caracteres; false para booleanos; null para variveis referncia.
2004/2005 171

Apontamentos de Java

Depois de um array ser criado com um dado tamanho, no possvel modificar esse tamanho. O tamanho de um array um campo de dados da classe Array. Em Java os arrays so alocados dinamicamente (em tempo de execuo) enquanto que em C tm o tamanho fixo em tempo de compilao. Para alterar o tamanho de um array em Java poder-se-ia criar um outro array com o tamanho desejado e do mesmo tipo, copiar o contedo do array para o novo array criado (System.arraycopy( ... ); e finalmente copiar a varivel referncia do novo array para a varivel referncia do antigo array.

2004/2005

172

Apontamentos de Java

Um array tambm pode ser criado por inicializao directa dos elementos do array: int valores [] = {1, 2, 3, 4, 5, 6}; Os literais incluem-se dentro de chavetas. Uma srie de valores dentro de chavetas s podem ser usados em instrues de inicializao e no em instrues de atribuio posteriores. Os ndices dos arrays so verificados em tempo de execuo (runtime). Se um ndice tenta uma referncia fora dos limites do array, causa uma excepo e termina a execuo.

2004/2005

173

Apontamentos de Java

Os elementos de um array so acedidos do modo usual: valores[0] = 1; O tamanho de um array obtem-se referenciando <nomeDoArray>.length int a[] = new int [20]; a.length e no a.length() porque length um final data field criado e instanciado quando o objecto array criado. No uma chamada a um mtodo.

2004/2005

174

Apontamentos de Java

Arrays de arrays: No h arrays multidimensionais em Java. Declarao de arrays de arrays: int matriz [] []; matriz = new int [2] [3]; ou ou int matriz [] [] = new int [2] [3]; int [] [] matriz = new int [2] [3];

Tambm se podem criar arrays de arrays por inicializao directa: int matriz [] [] = { {4, 6, 1}, {8, 1, 2}} Assim matriz[0][0] = 4 matriz[0][1] = 6 matriz[0][2] = 1 matriz[1][0] = 8 matriz[1][1] = 1 matriz[1][2] = 2
175

2004/2005

Apontamentos de Java

Em arrays de arrays, os arrays de nvel mais baixo no necessitam de ter todos o mesmo tamanho. Ex. Assim int b [] [] = { {1, 2}, {3, 4, 5}} b[0][0] = 1 b[0][1] = 2 b[1][0] = 3 b[1][1] = 4 b[1][2] = 5

b[0] tem 2 elementos e b[1] tem 3 elementos.

2004/2005

176

Apontamentos de Java

Passagem de arrays como parmetros na chamada de mtodos Os arrays, porque so objectos em Java, so passados a mtodos atravs da varivel referncia. O nome de um array uma referncia para o objecto que contm os elementos do array e para a varivel instncia length que indica o nmero de elementos do array. Para passar um argumento array a um mtodo, especifica-se o nome do array sem parnteses rectos. No necessrio passar o tamanho do array, porque em Java todo o objecto Array conhece o seu prprio tamanho (atavs da varivel instncia length).

2004/2005

177

Apontamentos de Java
Exemplo: Escreva um programa que calcule o tringulo de Pascal at uma profundidade de 10, armazenando cada fila do tringulo num array de tamanho apropriado e colocando cada array correspondente a uma fila num array de 10 arrays de inteiros. Um tringulo de Pascal o seguinte padro de nmeros inteiros 1 1 1 1 1 4 1 3 6 2 3 4 1 1 1

1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 no qual cada inteiro dentro do tringulo a soma dos dois inteiros acima dele.

2004/2005

178

Apontamentos de Java
public class TrianguloPascal { private int triangulo[][]; /** Cria um tringulo de Pascal at uma profundidade especificada. */ public TrianguloPascal(int linhas) { triangulo = new int[linhas][]; for (int lin = 0; lin < linhas; lin++) { triangulo[lin] = new int[lin + 1]; if (lin == 0) triangulo[0][0] = 1; else for (int col = 0; col <= lin; col++) { triangulo[lin][col] = 0; // se no est na extremidade direita, adiciona o nodo de cima direita if (col < lin) triangulo[lin][col] += triangulo[lin - 1][col]; // se no est na extremidade esquerda, adiciona o nodo de cima esquerda if (col > 0) triangulo[lin][col] += triangulo[lin - 1][col - 1]; } } } 2004/2005 179

Apontamentos de Java

/** Imprime o triangulo de Pascal */ public void print() { for (int i = 0; i < triangulo.length; i++) { for (int j = 0; j < triangulo[i].length; j++) System.out.print(triangulo[i][j] + " "); System.out.println(); } } /** Cria um tringulo de Pascal at uma profundidade de 10 e imprime-o. */ public static void main(String[] args) throws java.io.IOException { TrianguloPascal tp = new TrianguloPascal(10); tp.print(); System.in.read(); } }
2004/2005 180

Apontamentos de Java

Aplicaes versus Applets H duas maneiras diferentes de correr um programa Java: Como Aplicao: programa independente e autnomo (stand-alone) que pode ser invocado da linha de comandos. Como Applet: programa embebido numa pgina Web, que corre quando a pgina visualizada por um browser. Aplicaes e Applets diferem nos privilgios de execuo e no modo como indicam onde comear a execuo.

2004/2005

181

Apontamentos de Java Browsers de pginas Web assim como o appletviewer tratam cdigo HTML (HyperText Markup Language). Assim como h tags html para colocar texto em bold, ou incluir imagens, tambm h tags html para correr um applet Java existente num ficheiro .class. Um exemplo de cdigo HTML (colocado, por exemplo, no ficheiro exApplet.html) que invoca um applet existente no ficheiro exApplet.class mostra-se a seguir: <title> Exemplo de um Applet </title> <applet code=exApplet.class width=300 height=50> </applet> Os campos width e height (largura e altura) so obrigatrios, e so medidos em pixeis (pontos de resoluo no ecr do computador). Os applets correm num objecto janela, e necessrio indicar ao browser o tamanho da janela no qual o applet deve comear.
2004/2005 182

Apontamentos de Java

Os applets e as aplicaes so invocados de maneira diferente. As aplicaes comeam a execuo num mtodo pblico designado main() com uma assinatura especfica, de um modo semelhante linguagem C. Quando a aplicao corre, main() executado e a partir de main() implementado o comportamento que se pretende que o programa tenha. A conveno para os applets diferente e envolve a reescrita (override) de certos mtodos que so automaticamente chamados pelo browser. Estes mtodos existem definidos na classe Applet, sem qualquer funcionalidade. O programa de um applet deve criar mtodos que anulem os correspondentes mtodos definidos na classe Applet (tendo a mesma assinatura), para executar as tarefas especficas pretendidas. Quando um applet carregado, Java cria uma instncia da classe carregada (que um objecto Applet) e uma srie de mtodos especiais Applet so chamados nessa instncia.
2004/2005 183

Apontamentos de Java Os cinco mtodos mais importantes na execuo de um applet so: public void init() public void start() public void stop() public void destroy() public void paint(Graphics g) 1. O browser ou o appletviewer carrega o applet no sistema e comea por chamar o mtodo init() mtodo nunca chamado pelo programa. Este mtodo chamado quando o applet carregado pela primeira vez ou recarregado (load ou reload). O mtodo init() normalmente usado para criar os objectos grficos de interface com o utilizador (GUI Graphical User Interface) e threads. 2. Em seguida automaticamente chamado o mtodo start() mtodo nunca chamado pelo programa. S se usa se se necessitar de iniciar qualquer coisa tal como threads.
2004/2005 184

Apontamentos de Java
3. Depois automaticamente chamado o mtodo paint() mtodo que em geral nunca directamente chamado pelo programa. Normalmente o programa chama outro mtodo, repaint(), que por sua vez chama o mtodo paint(). O mtodo paint() recebe como parmetro um objecto da classe Graphics, criado e passado ao mtodo paint() pelo browser. Este objecto grfico contm o estado grfico do applet, isto , as caractersticas correntes da superfcie de desenho. Desenhando neste objecto, desenha-se no applet e os resultados aparecem no ecr. Porque um applet uma janela Java no usa o input/output standard. Usa as facilidades disponveis para janelas, tais como desenhar uma string em determinadas coordenadas. O mtodo paint() o lugar onde o trabalho do applet realmente ocorre. Painting pode ocorrer muitas vezes durante o ciclo de vida de um applet, depois de um applet ser inicializado, se o browser colocado detrs de outra janela no ecr e depois trazido outra vez para a frente, se a janela do browser movida para uma posio diferente do ecr, ou se chamado pelo programa do applet para, por exemplo, realizar animao.
2004/2005 185

Apontamentos de Java Como paint() recebe como argumento uma instncia da classe Graphics, se se usa este mtodo necessrio importar a classe Graphics para o cdigo do applet, atravs da seguinte instruo: import java.awt.Graphics; 4. Se o browser deixa a pgina, isso causa uma chamada automtica ao mtodo stop() mtodo nunca chamado pelo programa. Neste mtodo pode-se parar threads que tenham sido lanadas pelo applet. Se o browser regressa pgina que contm o applet, isto causa uma chamada automtica ao mtodo start() e o fluxo de actividade continua a partir do ponto 2 acima. 5. Se o browser descarrega a pgina causa uma chamada ao mtodo destroy() mtodo nunca chamado pelo programa. Este mtodo informa o applet que deve terminar tudo.

2004/2005

186

Apontamentos de Java Grficos, Fontes e Cores Grficos Para desenhar no ecr em Java necessrio um contexto grfico. Um contexto grfico mantido num objecto da classe Graphics e controla o modo como a informao desenhada. Objectos da classe Graphics contm mtodos para desenhar, manipular fontes e cores. necessrio usar um objecto da classe Graphics para se desenhar. Um objecto da classe Graphics passado pelo sistema ao mtodo paint() como argumento, quando uma operao paint ocorre. O mtodo paint() normalmente no directamente chamado pelo programador. Quando um applet inicialmente executado, o mtodo paint() automaticamente chamado ( depois da chamada dos mtodos init() e start() ). Para que paint() volte novamente a ser chamado necessrio que ocorra um evento tal como um redimensionamento (resizing) do applet. Se o programador necessita de chamar um mtodo que efectue o painting, deve chamar o mtodo repaint() ( public void repaint() )que efectua um clear seguido de um paint.
2004/2005 187

Apontamentos de Java

O browser cria um objecto grfico (um objecto da classe Graphics) que contm o estado grfico do applet as caractersticas correntes da superfcie de desenho, tais como cores de foreground e background e passa este objecto ao mtodo paint() sempre que invoca a sua execuo. O mtodo paint() tem o seguinte formato: public void paint( Graphics g) { .............. } Por este motivo necessrio importar a classe Graphics para o cdigo do applet: import java.awt.Graphics;
2004/2005 188

Apontamentos de Java

Para desenhar objectos no ecr, chamam-se mtodos de desenho disponveis na classe Graphics. Todos os mtodos de desenho tm argumentos representando pontos no sistema de coordenadas do applet. O sistema de coordenadas do applet Java tem a origem (0, 0) no canto superior esquerdo. Valores positivos da coordenada x correspondem a pontos situados direita da origem e valores positivos da coordenada y correspondem a pontos situados abaixo da origem.
(0, 0) x

2004/2005

189

Apontamentos de Java Desenho e Preenchimento (Filling) A classe Graphics possui um conjunto de primitivas grficas para desenhar, incluindo: 1. Linhas, 2. Rectngulos, 3. Rectngulos arredondados, 4. Polgonos, 5. Ovais, 6. Arcos. 1. Desenho de Linhas Mtodo drawLine - classe Graphics

public void drawLine( int x1, int y1, int x2, int y2) => desenha uma linha entre os pontos [x1, y1] e [x2, y2].
2004/2005 190

Apontamentos de Java

2. Desenho de Rectngulos Mtodo drawRect Mtodo fillRect Mtodo clearRect - classe Graphics - classe Graphics - classe Graphics

public void drawRect( int x, int y, int width, int heigh) public void fillRect( int x, int y, int width, int heigh) public void clearRect( int x, int y, int width, int heigh) => Estes mtodos desenham um rectngulo com o canto superior esquerdo nas coordenadas [x, y] e de largura width e altura heigh. drawRect() -desenha o rectngulo com uma linha na cor corrente. fillRect() - desenha o rectngulo slido na cor corrente. clearRect() -desenha o rectngulo slido na cor corrente do background.

2004/2005

191

Apontamentos de Java 3. Desenho de Rectngulos Arredondados rectngulos com cantos arredondados Mtodos drawRoundRect e fillRoundRect - classe Graphics public void drawRoundRect( int x, int y, int width, int heigh, int arcWidth, int arcHeigh) public void fillRoundRect( int x, int y, int width, int heigh) int arcWidth, int arcHeigh) => Estes mtodos desenham um rectngulo com cantos arredondados, situado dentro de um rectngulo com o canto superior esquerdo nas coordenadas [x, y] e de largura width e altura heigh. As ovais que formam os cantos do rectngulo tm largura arcWidth e altura arcHeigh. drawRoundRect() fillRoundRect() desenha o rectngulo arredondado. desenha o rectngulo arredondado slido.

O canto superior esquerdo especificado na chamada destes mtodos est a alguma distncia acima e esquerda da linha oval do canto.
2004/2005 192

Apontamentos de Java 4. Desenho de Polgonos Mtodo drawPolygon - classe Graphics Mtodo fillPolygon - classe Graphics Pode-se escolher o modo como indicar a lista de coordenadas dos pontos vrtices do polgono: ou como arrays de coordenadas x e coordenadas y ou como uma instncia da classe Polygon. Usando o primeiro modo, os mtodos drawPolygon() e fillPolygon() recebem 3 argumentos. Java automaticamente fecha o polgono. Para deixar a linha incompleta, tem de se usar o mtodo drawPolyline(). public void drawPolygon( int xPoints[], int yPoints[], int points) public void fillPolygon( int xPoints[], int yPoints[], int points) => Estes mtodos desenham um polgono na cor corrente com o nmero de pontos points, em que a coordenada x de cada ponto est especificada no array xPoints e a coordenada y no correspondente elemento do array yPoints.
2004/2005 193

Apontamentos de Java

Usando o 2 modo necessrio primeiro criar um objecto Polygon. public void drawPolygon( Polygon p) public void fillPolygon( Polygon p) public Polygon( int xValues[], int yValues[], int numberOfPoints) => Este construtor constri um novo objecto polgono com o nmero de lados numberOfPoints em que cada ponto tem uma coordenada x do array xValues e coordenada y do array yValues.

Para desenhar uma linha poligonal aberta usa-se o mtodo drawPolyline() que funciona como o 1 modo de desenhar polgonos.
2004/2005 194

Apontamentos de Java 5. Desenho de Ovais: elipses ou crculos Mtodo drawOval - classe Graphics Mtodo fillOval - classe Graphics public void drawOval( int x, int y, int width, int height ) public void fillOval( int x, int y, int width, int height) => Estes mtodos desenham uma oval (elpse ou crculo) na cor corrente situada dentro de um rectngulo com o canto superior esquerdo no ponto [x, y] e de largura width e altura height. drawOval() - desenha uma linha oval na cor corrente. fillOval() - desenha uma oval slida na cor corrente. O canto superior esquerdo especificado na chamada destes mtodos est a alguma distncia acima e esquerda da linha oval. mais simples pensar na posio do rectngulo no qual a oval fica inscrita.
2004/2005 195

Apontamentos de Java 6. Desenho de Arcos Mtodo drawArc e fillArc - classe Graphics

Um arco parte de uma oval. O modo mais simples de pensar num arco como uma seco de uma oval completa. Um arco desenhado entre 2 ngulos: o ngulo de partida e o ngulo do arco. Os ngulos dos arcos so medidos em graus. Zero graus corresponde posio de um ponteiro nas 3 horas, graus positivos correspondem ao sentido contrrio ao do movimento dos ponteiros do relgio, e graus negativos correspondem ao sentido do movimento dos ponteiros do relgio. public void drawArc( int x, int y, int width, int height, int startAngle, int arcAngle) public void fillArc( int x, int y, int width, int height, int startAngle, int arcAngle) => Estes mtodos desenham um arco na cor corrente que parte de uma oval situada dentro de um rectngulo com o canto superior esquerdo no ponto [x, y] e de largura width e altura height. O arco comea no ngulo startAngle e estende-se arcAngle ngulos.
2004/2005 196

Apontamentos de Java

drawArc() - desenha a linha de um arco, parte de uma oval, na cor corrente. fillArc() - desenha um arco preenchido, parte de uma oval slida, na cor corrente. Arcos slidos (preenchidos) so desenhados como se fossem seces de ovais: ambos os pontos extremos se juntam ao centro da oval. O canto superior esquerdo, largura e altura especificados na chamada destes mtodos no so o ponto de partida, largura e altura dos arcos desenhados no ecr. Eles determinam a forma da oval da qual o arco uma parte. Os ltimos 2 argumentos determinam os pontos inicial e final do arco. O penltimo argumento o ngulo do ponto inicial e o ltimo argumento indica a amplitude do varrimento e o sentido do arco ao longo da oval, e no indica o ngulo do ponto final.

2004/2005

197

Apontamentos de Java

Fontes e Texto Pode-se imprimir texto no ecr usando a classe Graphics em conjuno com a classe Font. Para desenhar texto no ecr, primeiro necessrio criar uma instncia da classe Font. Os objectos da classe Font representam uma fonte individual, isto , o nome, estilo (plain, bold, italic) e tamanho em points. Os nomes das fontes so strings representativas da famlia da fonte, como por exemplo TimesRoman, Courier, ou Helvetica. Os estilos das fontes so constantes do tipo inteiro definidas na classe Font com as designaes Font.PLAIN, Font.BOLD, e Font.ITALIC. Para criar uma fonte usa-se o construtor de 3 argumentos, como no exemplo: Font f = new Font (TimesRoman, Font.BOLD, 14); necessrio importar a classe Font antes de usar este construtor: import java.awt.Font
2004/2005 198

Apontamentos de Java Como os estilos de fontes so constantes inteiras podem ser adicionados para criar estilos combinados. Por exemplo Font.BOLD + Font.ITALIC produz uma fonte que ao mesmo tempo bold e italic. A fonte corrente parte do estado (contexto) grfico que mantido pelo objecto grfico no qual se est a desenhar. Sempre que se desenha texto no ecr, Java desenha esse texto na fonte corrente. Para mudar a fonte de texto, necessrio primeiro criar um objecto Fonte e em seguida coloc-la como fonte corrente, usando o mtodo setFont() aplicvel a objectos da classe Graphics. Ex.: import java.awt.Font; import java.awt.Graphics; public class ExemploFont extends java.applet.Applet { public void paint(Graphics g) { Font f = new Font("TimesRoman", Font.PLAIN, 72); g.setFont(f); g.drawString("This is a big font", 10, 100);
} }

2004/2005

199

Apontamentos de Java

Cores Uma cor representada como uma combinao de vermelho, verde e azul (Red, Green and Blue RGB). Cada componente da cor pode ter um valor entre 0 e 255. Preto (0,0,0) e branco (255, 255, 255). Na classe Color existem definidos um conjunto de objectos representando cores standards, para facilitar o uso das cores mais vulgares, tais como: Nome da cor: Color.white Color.black Color.gray Color.red Color.green Color.blue Color.yellow Color.pink Color.orange
2004/2005

R(ed) G(reen) 255 0 128 255 0 0 255 255 255 255 0 128 0 255 0 255 175 200

B(lue) 255 0 128 0 0 255 0 175 0


200

Apontamentos de Java

Para desenhar um objecto numa cor particular, deve-se criar uma instncia da classe Color para representar essa cor. Se a cor que se pretende usar no um objecto Color standard, pode-se criar um objecto Color com qualquer combinao de valores para red, green e blue, atravs do construtor Color(red, green, blue), como no exemplo: Color c = new Color(140, 140, 140) Para desenhar um objecto ou texto numa determinada cor necessrio primeiro criar um objecto cor correspondente cor pretendida, e em seguida coloc-lo como a cor corrente, usando o mtodo setColor() aplicvel a objectos da classe Graphics. Para alm de ser possvel colocar uma cor corrente para o contexto grfico, tambm possvel colocar as cores de background e foreground do prprio applet usando os mtodos setBackground() e setForeground() definidos na classe java.awt.Component, que so herdados pela classe Applet e pelas classes por ns criadas.
2004/2005 201

Apontamentos de Java Exemplo: import java.awt.Graphics; import java.awt.Color; public class ExemploCor extends java.applet.Applet { public void init() { setBackground(Color.white); } public void paint(Graphics g) { g.setColor(Color.red); g.drawString("Window text is this color", 20, 50); g.setColor(Color.green); g.fillRect(5, 60, 180, 20); } }

2004/2005

202

Apontamentos de Java

Eventos As aplicaes grficas so guiadas por eventos; no fazem nada at que o utilizador mova o rato, clique um boto ou prima uma tecla. Um programa guiado por eventos estruturado volta do modelo de processamento de eventos. H 2 modelos de processamento de eventos correspondentes a 2 verses da linguagem Java: 1.0 e 1.1. Os eventos so gerados e fluem no sistema de um modo semelhante em qualquer um dos modelos. Os dois modelos diferem no modo como o programa que construmos recebe e processa os eventos.

2004/2005

203

Apontamentos de Java
Tratamento dos Eventos O sistema operativo reporta aos programas que esto a correr, os eventos que ocorrem. Cada programa decide o que fazer com esses eventos. Visual Basic esconde a fila de eventos (event queue) do programador. Cada componente grfico de interface com o utilizador responde a um conjunto fixo de eventos (sendo impossvel mudar os eventos a que responde um componente Visual Basic). Cada componente tem um procedimento associado a cada evento a que responde e Vbasic activa o cdigo desse procedimento em resposta ocorrncia do evento. No C standard, em contraste com a simplicidade do Visual Basic, um programa guiado por eventos necessita de filtrar constantemente a fila de eventos reportada pelo sistema operativo. Deste modo muito mais difcil de programar mas tem a vantagem de no limitar os eventos a que se pode responder como no Vbasic. Java usa uma aproximao intermdia entre o C standard e Visual Basic resultando uma tcnica poderosa com uma complexidade intermdia. possvel responder a todos os eventos conhecidos pelo AWT e especificar a que eventos um dado componente responde. 2004/2005 204

Apontamentos de Java

Modelo de Eventos 1.0 Em Java 1.02 todos os eventos so representados pela classe Event. Esta classe tem variveis instncia que descrevem o evento. Uma destas variveis, id, especifica o tipo de evento. Na classe Event define-se um nmero de constantes que so os possveis valores do campo id. O campo target especifica o objecto que gera o evento, ou no qual o evento ocorreu. Em Java 1.02 a ocorrncia de um evento causa a chamada do mtodo handleEvent() (classe Component): public boolean handleEvent(Event evt) A implementao, por omisso, deste mtodo verifica o campo id do objecto Event, e para os tipos de eventos mais vulgarmente usados chama um dos mtodos especficos (definidos na classe Component):
2004/2005 205

Apontamentos de Java

id = ACTION_EVENT id = GOT_FOCUS id = LOST_FOCUS id = KEY_PRESS id = KEY_RELEASE id = MOUSE_DOWN id = MOUSE_UP id = MOUSE_ENTER id = MOUSE_EXIT id = MOUSE_DRAG id = MOUSE_MOVE

public boolean action(Event evt, Object arg) public boolean gotFocus(Event evt, Object what) public boolean lostFocus(Event evt, Object what) public boolean keyDown(Event evt, int key) public boolean keyUp(Event evt, int key) public boolean mouseDown(Event evt, int x, int y) public boolean mouseUp(Event evt, int x, int y) public boolean mouseEnter(Event evt, int x, int y public boolean mouseExit(Event evt, int x, int y) public boolean mouseDrag(Event evt, int x, int y) public boolean mouseMove(Event evt, int x, int y)

Para processar um destes eventos deve-se reescrever (override) o respectivo mtodo. Deve ser criado uma subclasse para definir o comportamento pretendido.

2004/2005

206

Apontamentos de Java

Nem todos os tipos de eventos so encaminhados por handleEvent() para mtodos mais especficos. Por isso se se est interessado num evento para o qual no existe nenhum mtodo especfico (como por exemplo eventos para scroll bars), deve-se reescrever (override) o mtodo handleEvent(). Se se reescreve handleEvent() na classe que implementamos, nenhum dos mtodos mais especficos ser chamado por omisso, a no ser que sejam chamados explicitamente no corpo de handleEvent(). A melhor maneira de ultrapassar este problema testar o evento no qual estamos interessados, e se o evento no esse, chamar super.handleEvent() para que a superclasse que define handleEvent() possa processsar todos os outros eventos. Exemplo:
public boolean handleEvent(Event evt) { if (evt.id == Event.MOUSE_DOWN) { // processar o evento mouse down return true; } else return super.handleEvent(evt); } 207

2004/2005

Apontamentos de Java

O mtodo handleEvent(), e todos os mtodos especficos de determinados tipos de eventos, retornam valores booleanos. Se um mtodo de tratamento de eventos retorna false, como todos fazem por omisso, significa que o evento no foi tratado, portanto ele vai ser passado ao container do componente corrente para ver se esse container est interessado no seu processamento. Se um mtodo retorna true significa que o evento foi tratado e no necessrio mais processamento sobre esse evento. O facto de os eventos no tratados serem passados para o container o que permite, por exemplo, tratar os eventos do tipo ACTION_EVENT que so gerados pelos botes (componentes grficos de interface com o utilizador), reescrevendo o mtodo action().

2004/2005

208

Apontamentos de Java

O sistema de gesto de eventos do AWT (Abstract Window Toolkit) funciona como um sistema de filtragem de eventos. Um dos eventos mais comuns num applet o clique no mouse. Eventos de clique no mouse ocorrem quando o utilizador clica no mouse algures dentro do applet. Podem-se interceptar os cliques do mouse para desencadear alguma aco ou podem ser usados em conjunto com movimentos do mouse para efectuar outras aces. Quando se clica no mouse geram-se dois eventos: um evento mouse down quando o boto premido, e um evento mouse up quando o boto libertado. Estes dois eventos so gerados porque em certas situaes associam-se aces diferentes (embora relacionadas) a cada um destes dois eventos. Por exemplo num menu pull-down, o evento mouse down estende o menu e o evento mouse up selecciona um item.
2004/2005 209

Apontamentos de Java

Para tratar eventos do mouse deve-se reescrever a definio dos mtodos apropriados no applet. Quando ocorre um evento mouse down o browser ou o viewer chamam o seguinte mtodo: public boolean mouseDown(Event evt, int x, int y) Quando ocorre um evento mouse up chamado o mtodo: public boolean mouseUp(Event evt, int x, int y) Estes mtodos recebem 3 parmetros: o evento e as coordenadas x e y onde o evento (mouse down ou mouse up) ocorreram.

2004/2005

210

Apontamentos de Java
Sempre que o mouse se move um simples pixel em qualquer direco um evento mouse move gerado. Como um evento gerado por cada pixel de movimento do mouse, mover o mouse de um lado do applet para o outro resulta em centenas de eventos. H 2 tipos de movimentos do rato: mouse drags onde o movimento ocorre com o boto do mouse premido, que produzem eventos que originam a chamada do mtodo public boolean mouseDrag(Event evt, int x, int y) e movimentos do mouse sem o boto do mouse premido que produzem eventos que originam a chamada do mtodo public boolean mouseMove(Event evt, int x, int y) Para estes 2 mtodos "mouseUp() e mouseDrag() os argumentos das coordenadas x e y so as novas localizaes do mouse e no so a localizao de partida.
2004/2005 211

Apontamentos de Java Construa um applet que desenhe um crculo azul quando se clica com o mouse dentro do applet at um mximo de 10 crculos. Cada crculo deve ser desenhado volta do ponto onde se clica com um dimetro de 20 pixels. import java.awt.Graphics; import java.awt.Color; import java.awt.Event; public class Pintas extends java.applet.Applet { final int MAX = 10; int xPintas[] = new int[MAX]; int yPintas[] = new int[MAX]; int nPintas = 0; public void init() { setBackground(Color.white); }
2004/2005 212

Apontamentos de Java

public boolean mouseDown(Event evt, int x, int y) { if (nPintas < MAX) { adicionaPinta(x,y); return true; } else return false; } void adicionaPinta(int x,int y) { xPintas[nPintas] = x; yPintas[nPintas] = y; nPintas++; repaint(); } public void paint(Graphics g) { g.setColor(Color.blue); for (int i = 0; i < nPintas; i++) { g.fillOval(xPintas[i] - 10, yPintas[i] - 10, 20, 20); } } }
2004/2005 213

Apontamentos de Java

A cor de fundo colocada no mtodo init(), e no no paint(), porque uma aco que s executada uma vez. O mtodo paint() deve ser chamado sempre que um novo pinta adicionada; se a cor de fundo fosse colocada no mtodo paint(), este mtodo tornar-se-ia desnecessariamente mais lento. Sempre que ocorre um evento mouse down o programa verifica se a quantidade de pintas menor que 10, adiciona as coordenadas aos respectivos arrays, incrementa a varivel que armazena a quantidade de pintas e chama repaint(). O mtodo repaint() efectua um clear e depois chama o mtodo paint(). Por este motivo necessrio de cada vez que uma pinta adicionada, pintar todas. Para pintar todas as pintas sempre que uma adicionada, necessrio guardar as coordenadas de todas.

2004/2005

214

Apontamentos de Java Construa um applet que permita desenhar segmentos de recta no ecr, at o mximo de 10, arrastando o rato de um ponto (incio) at outro (extremidade do segmento de recta). Enquanto o rato est a ser arrastado para desenhar uma linha, essa linha deve ser mostrada, na cor azul, desde o ponto de partida at posio corrente do mouse. import java.awt.Graphics; import java.awt.Color; import java.awt.Event; import java.awt.Point; public class Linhas extends java.applet.Applet { final int MAX = 10; Point inicios[] = new Point[MAX]; Point fins[] = new Point[MAX]; Point ancora; // principio da linha corrente Point pontoCorrente; // fim actual da linha corrente int nLinhas = 0; // numero de linhas
2004/2005 215

Apontamentos de Java

public void init() { setBackground(Color.white); } public boolean mouseDown(Event evt, int x, int y) { if (nLinhas < MAX) { ancora = new Point(x,y); return true; } else return false; } public boolean mouseUp(Event evt, int x, int y) { if (nLinhas < MAX) { adicionaLinha(x,y); return true; } else return false; } public boolean mouseDrag(Event evt, int x, int y) { if (nLinhas < MAX) { pontoCorrente = new Point(x,y); repaint(); return true; } else return false; }
2004/2005 216

Apontamentos de Java
void adicionaLinha(int x,int y) { inicios[nLinhas] = ancora; fins[nLinhas] = new Point(x,y); nLinhas++; pontoCorrente = null; ancora = null; repaint(); } public void paint(Graphics g) { // desenha as linhas existentes for (int i = 0; i < nLinhas; i++) { g.drawLine(inicios[i].x, inicios[i].y, fins[i].x, fins[i].y); } // desenha a linha corrente g.setColor(Color.blue); if (pontoCorrente != null) g.drawLine(ancora.x,ancora.y, pontoCorrente.x, pontoCorrente.y); } }
2004/2005 217

Apontamentos de Java A classe Point usada para representar as coordenadas x e y de um ponto encapsuladas num simples objecto. Este applet trata 3 eventos (se o nmero de segmentos de recta armazenados ainda menor que 10): mouse down: - para colocar o ponto ancora para a linha corrente. mouse drag: - para criar objectos referenciados por pontoCorrente contendo a extremidade actual da linha que est a ser desenhada e actualizar o desenho (repaint()). mouse up: - para armazenar uma nova linha que une o ponto ancora at ao ponto onde ocorreu este evento e actualizar o desenho. Para animar a linha que est a ser desenhada, quando se arrasta o mouse, movendo-o desordenadamente, necessrio desenhar a linha constantemente entre o ponto ancora e o ponto corrente do mouse o que se faz efectuando repaint() sempre que ocorre mouse drag. Enquanto no se est a desenhar uma linha, o mtodo paint() no deve efectuar o desenho da linha corrente, para o que se coloca anchor e pontoCorrente com o valor null.
2004/2005 218

Apontamentos de Java

/* Construa um applet que permita ao utilizador desenhar (sarrabiscar) com o rato. */ import java.awt.*; import java.applet.*; public class Scribble1 extends Applet { public boolean mouseDrag(Event evt, int x, int y) { Graphics g = getGraphics(); g.fillOval(x, y, 4, 4); return true; } }

2004/2005

219

Apontamentos de Java

// Outras verses import java.awt.*; import java.applet.*; public class Scribble2 extends Applet { int x=0, y=0; public boolean mouseDown(Event evt, int x1, int y1) { x = x1; y = y1; return true; } public boolean mouseDrag(Event evt, int x1, int y1) { Graphics g = getGraphics(); g.drawLine(x, y, x1, y1); x = x1; y = y1; return true; } }
2004/2005 220

Apontamentos de Java import java.awt.*; import java.util.Vector; import java.applet.*; public class Scribble3 extends Applet { Vector linhas = new Vector(100, 100); Vector linCorrente; public boolean mouseDown(Event evt, int x, int y) { linCorrente = new Vector(100, 100); linhas.addElement(linCorrente); linCorrente.addElement(new Point(x,y)); return true; } public boolean mouseDrag(Event evt, int x1, int y1) { Point p = (Point) linCorrente.lastElement(); Graphics g = getGraphics(); g.drawLine(p.x, p.y, x1, y1); linCorrente.addElement(new Point(x1,y1)); return true; }
2004/2005 221

Apontamentos de Java

public void paint(Graphics g) { for (int j=0; j < linhas.size(); j++) { linCorrente = (Vector) linhas.elementAt(j); Point p = (Point) linCorrente.elementAt(0); for (int i=1; i<linCorrente.size(); i++) { Point p1 = (Point) linCorrente.elementAt(i); g.drawLine(p.x, p.y, p1.x, p1.y); p = p1; } } } }

2004/2005

222

Apontamentos de Java

Modelo de Eventos 1.1 H objectos (componentes grficos de interface com o utilizador) que podem produzir eventos. Um evento a que se pretende responder enviado para outro objecto que sabe responder convenientemente a esse evento. Este modelo de tratamento de eventos um modelo de delegao de eventos que permite uma maior flexibilidade de programao. No processamento de um evento intervm 3 objectos: 1) Um objecto fonte do evento no qual ocorre o evento; um objecto que pode registar objectos listener para serem notificados se determinados eventos ocorrem. 2) Um objecto listener instncia de uma classe que implementa um interface apropriado listener interface o qual, para ser registado, usado como argumento de um mtodo do objecto fonte do evento. 3) Um objecto evento, criado pelo objecto fonte do evento quando ocorre o evento, que enviado (pelo objecto fonte do evento) para todos os objectos listeners registados para esse evento (invocando o mtodo apropriado do objecto listener e passando-lhe o objecto evento).
2004/2005 223

Apontamentos de Java

A ocorrncia de um evento destina-se a causar uma aco, que pode ser realizada pelo prprio objecto ou por outro qualquer objecto. Assim o objecto mais adequado para realizar as aces a serem executadas quando ocorre um evento o objecto que deve ser registado como listener. O objecto listener ao implementar o interface apropriado significa que possui mtodos com as assinaturas correctas para responderem ocorrncia dos eventos.

2004/2005

224

Apontamentos de Java

Classes internas (Inner classes) Uma classe interna (inner class) tem acesso aos membros da classe que a contm. A classe interna mantm uma referncia ao objecto particular da classe que a contm e que criou o objecto. Um acesso a um membro da classe envolvente usa essa referncia (escondida) para seleccionar esse membro. Um objecto de uma classe interna s pode ser criado em associao com um objecto da classe envolvente. O processo de construo requer a inicializao da referncia ao objecto da classe envolvente e o compilador dar erro se no pode aceder a essa referncia. Uma referncia ao objecto da classe exterior obtm-se atravs do nome da classe exterior seguido de ponto e seguido de this.

2004/2005

225

Apontamentos de Java

As 3 pginas seguintes contm tabelas dos principais eventos gerados nos componentes grficos, dos correspondentes interfaces que devem ser implementados pelos objectos listeners, e dos mtodos invocados para os objectos listeners (passando-lhe o objecto evento como parmetro) quando os eventos ocorrem.

2004/2005

226

Apontamentos de Java // Scribble1.java - Modelo de tratamento de eventos 1.1 import java.applet.*; import java.awt.*; import java.awt.event.*; public class Scribble1 extends Applet implements MouseListener, MouseMotionListener { private int x, y; Graphics g; public void init() { g = getGraphics(); addMouseListener(this); addMouseMotionListener(this); }

2004/2005

227

Apontamentos de Java public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } public void mouseDragged(MouseEvent e) { int x1= e.getX(); int y1= e.getY(); g.drawLine(x, y, x1, y1); x = x1; y = y1; } // Metodos nao usados do interface MouseListener: public void mouseReleased(MouseEvent e) {}; public void mouseClicked(MouseEvent e) {}; public void mouseEntered(MouseEvent e) {}; public void mouseExited(MouseEvent e) {}; // Metodos nao usados do interface MouseMotionListener: public void mouseMoved(MouseEvent e) {}; }
2004/2005 228

Apontamentos de Java

// Scribble2.java - Objectos listeneres (2) pertencem a classes internas import java.applet.*; import java.awt.*; import java.awt.event.*; public class Scribble2 extends Applet { private int x, y; public void init() { addMouseListener(new ListenerMA()); addMouseMotionListener(new ListenerMMA()); }

2004/2005

229

Apontamentos de Java class ListenerMA extends MouseAdapter { public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } } class ListenerMMA extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); int x1= e.getX(); int y1= e.getY(); g.drawLine(x, y, x1, y1); x = x1; y = y1; } } }
2004/2005 230

Apontamentos de Java

// Scribble3.java - Objectos listeneres (2) pertencem a classes internas annimas import java.applet.*; import java.awt.*; import java.awt.event.*; public class Scribble3 extends Applet { private int x, y; public void init() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } });
2004/2005 231

Apontamentos de Java

addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); int x1= e.getX(); int y1= e.getY(); g.drawLine(x, y, x1, y1); x = x1; y = y1; } }); } }

2004/2005

232

Apontamentos de Java

// Scribble4.java - Pode-se alterar a visibilidade do applet


import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Vector;

public class Scribble4 extends Applet {


private int x, y; Vector linhas = new Vector(100, 100); Vector linCorrente; public void init() { addMouseListener(new ListenerMA()); addMouseMotionListener(new ListenerMMA()); }

class ListenerMA extends MouseAdapter { public void mousePressed(MouseEvent e) { linCorrente = new Vector(100, 100); linhas.addElement(linCorrente); linCorrente.addElement( new Point(e.getX(), e.getY())); } }
2004/2005 233

Apontamentos de Java
class ListenerMMA extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); int x1= e.getX(); int y1= e.getY(); Point p = (Point) linCorrente.lastElement(); g.drawLine(p.x, p.y, x1, y1); linCorrente.addElement(new Point(x1,y1)); } } public void paint(Graphics g) { for (int j=0; j < linhas.size(); j++) { linCorrente = (Vector) linhas.elementAt(j); Point p = (Point) linCorrente.elementAt(0); for (int i=1; i<linCorrente.size(); i++) { Point p1 = (Point) linCorrente.elementAt(i); g.drawLine(p.x, p.y, p1.x, p1.y); p = p1; } } } } 2004/2005 234

Apontamentos de Java

Objectos Grficos
1. Label
Label string de texto no editvel utilizada normalmente como legenda ou ttulo para outros elementos grficos Construtores: Label() Label(String s) cria um label vazio. cria um label com a string passada como parmetro. Label(String s, int alignment) cria um label com a string passada como parmetro e o alinhamento especificado que pode ser um dos seguintes valores: Label.LEFT, Label.CENTER, ou Label.RIGHT.
2004/2005 235

Apontamentos de Java

Mtodos que permitem obter os parmetros de um label ou modific-los: String getText() retorna o texto do Label. void setText(String s) coloca o texto do Label. void setAlignment(int alignment) coloca o alinhamento em Label.LEFT, Label.CENTER, ou Label.RIGHT. Por omisso, um label alinha o texto no seu interior esquerda. Pode-se utilizar o seguinte cdigo: Label etiqueta; // cria uma varivel instncia. etiqueta = new Label(Texto1); // cria uma instncia da classe Label. add(etiqueta); // mtodo da classe Container que // adiciona o label ao container applet. ou simplesmente o seguinte: add( new Label(Texto1)); // cria uma instncia da classe Label e // adiciona-a ao applet.
2004/2005 236

Apontamentos de Java

2. Button
Button componente de interface com o utilizador que quando pressionado (ou seleccionado) com o rato desencadeia (trigger) uma determinada aco. Um boto gera um evento quando o utilizador clica o boto com o rato. Construtores: Button() - cria um boto sem label. Button(String s) - cria um boto com o label indicado no parmetro. Mtodos que permitem obter os parmetros de um boto ou modific-los: - retorna o label do boto ou null se no possuir label. void setLabel(String s) - altera o label do boto para o valor do argumento especificado.
2004/2005 237

String getLabel()

Apontamentos de Java

Tratamento de Eventos
Modelo de eventos da verso 1.02 Os eventos que ocorrem nos componentes grficos de interface com o utilizador, permitem que o applet ou a aplicao reajam a entradas (input) do utilizador. Estes eventos so tratados pelo prprio componente, podendo ser usados pelo programa a um nvel mais alto. Por exemplo, os botes usam eventos de aco (action events) que so desencadeados quando o boto premido, no sendo necessrio preocuparmo-nos com os eventos mouse down, mouse up, e onde estes eventos ocorreram. O label um componente que no gera eventos.

2004/2005

238

Apontamentos de Java Os eventos gerados pelos componentes bsicos de interface com utilizador podem ser dos seguintes tipos: 1. Action events (eventos de aco): so os eventos mais importantes para a maior parte dos componentes, que indicam que o componente foi seleccionado. So gerados quando: Um boto pressionado; Um Checkbox ou radio box seleccionado ou desseleccionado; Um item de um Choice menu seleccionado; premido Return ou Enter dentro de um TextField. 2. List select e deselect events: eventos gerados quando um item de um Checkbox ou Choice menu so seleccionados. 3. Got focus ou lost focus events: eventos gerados em resposta ou a um clique do rato ou obteno do foco de entrada (input focus) usando a tecla Tab.
2004/2005 239

Apontamentos de Java

Tratamento dos action events Como so os eventos mais vulgarmente usados existe um mtodo especial para os tratar. Este mtodo permite interceptar um action event gerado por qualquer componente grfico de interface com o utilizador public boolean action( Event evt, Object arg) { ............... } Este mtodo (da classe Component) sempre chamado (pelo browser ou pelo viewer) quando ocorre um evento do tipo action event A este mtodo -lhe passado um objecto do tipo Event com informao especfica acerca do componente que gerou o evento e do evento que ocorreu, e um segundo argumento, o qual depende do componente grfico que gerou a aco.

2004/2005

240

Apontamentos de Java
Apresenta-se em seguida o tipo desse segundo argumento e contedo para cada componente grfico: Componente: Button Checkbox Radio button Choice menu TextField List Tipo de arg.: String boolean boolean String String String Contedo: Contm o label do button. trueou false. true ou false. Contm o label do item selec. Contm o texto. Contm o label do item selec

Dentro do mtodo action() deve-se determinar que componente grfico gerou a aco, porque diferentes componentes podem gerar este tipo de eventos action events. O objecto do tipo Event passado ao mtodo action() contm uma varivel instncia com o nome target que contm uma referncia ao objecto que recebeu o evento (alvo).
2004/2005 241

Apontamentos de Java

Para determinar que componente gerou o evento usa-se o operador instanceof, como se exemplifica: public boolean action( Event evt, Object arg) { if ( evt.target instanceof TextField) return processarText(evt.target); else if ( evt.target instanceof Choice) return processarChoice(arg); ... return false; } normal construir mtodos separados tais como processarText() ou processarChoice() para incluir o cdigo que realmente trata os eventos, no enchendo de cdigo o mtodo action() para o tornar mais claro. O mtodo action() deve retornar um valor booleano. Deve retornar true se action() trata o evento ou false se no trata o evento ou ento se passa o controlo para outro mtodo, retornando o valor retornado por esse outro mtodo.
2004/2005 242

Apontamentos de Java

Se se tem mais que um componente grfico da mesma classe, o segundo argumento permite determinar qual o componente que gerou o evento. Exemplo: public boolean action( Event evt, Object arg) { if ( evt.target instanceof Button) { String label1 = (String) arg; if (label1.equals(OK)) processarOK(); else if (label1.equals(Cancel)) processarCancel(); ... return false; } Notar o cast do argumento antes de efectuar as comparaes de strings.

2004/2005

243

Apontamentos de Java // Construa um applet que crie 2 botes: um para iniciar e outro para // incrementar um contador cujo valor deve ser mostrado num label. import java.awt.*; public class Contador extends java.applet.Applet { Button incr, iniciar; Label mostra; int conta=0; public void init() { add(iniciar = new Button("Iniciar")); add(incr = new Button("Incrementar")); add(mostra = new Label(" "+0)); } public boolean action(Event evt, Object arg) { if (evt.target instanceof Button ) { if (evt.target.equals(incr)) conta++; else if(evt.target.equals(iniciar)) conta = 0; mostra.setText(""+conta); return true; } else return false; } }
2004/2005 244

Apontamentos de Java
// Com tratamento de eventos da verso 1.1 import java.awt.*; import java.awt.event.*; public class Contador2 extends java.applet.Applet { Button incr, iniciar; Label mostra; int conta=0; public void init() { add(iniciar = new Button("Iniciar")); add(incr = new Button("Incrementar")); add(mostra = new Label(" "+0)); incr.addActionListener(new TrataEv()); iniciar.addActionListener(new TrataEv()); } class TrataEv implements ActionListener { public void actionPerformed(ActionEvent e) { Object botao = e.getSource(); if (botao == incr) conta++; else if (botao.equals(iniciar)) conta = 0; mostra.setText(" "+conta); } } }

2004/2005

245

Apontamentos de Java // Construa uma applet que crie 3 botes. Cada boto muda a cor // do fundo do applet para a cor designada no respectivo label. import java.awt.*; import java.awt.event.*; public class Cores2 extends java.applet.Applet { Button verm, azul, verde; public void init() { setBackground(Color.white); verm = new Button("Vermelho"); add(verm); verm.addActionListener(new ProcessaBotao(Color.red)); azul = new Button("Azul"); add(azul); azul.addActionListener(new ProcessaBotao(Color.blue)); verde = new Button("Verde"); add(verde); verde.addActionListener(new ProcessaBotao(Color.green)); }
2004/2005 246

Apontamentos de Java

class ProcessaBotao implements ActionListener { Color cor; ProcessaBotao(Color c) { cor = c; } public void actionPerformed(ActionEvent e) { setBackground(cor); } } }

2004/2005

247

Apontamentos de Java

3. Checkbox
Checkbox componente grfica de interface com o utilizador que tem 2 estados: checked ou unchecked (true ou false). Ao contrrio dos botes, um Checkbox geralmente no desencadeia aces directas nas interfaces com o utilizador, mas usado para indicar caractersticas opcionais de uma outra aco. Os Checkboxes podem ser usadas de 2 modos: No exclusivos: dado um conjunto de Checkboxes qualquer um pode ser seleccionado. Exclusivas: dado um conjunto de Checkboxes s um pode ser seleccionado de cada vez. Este tipo de Checkboxes designam-se por radio boxes.

2004/2005

248

Apontamentos de Java

Construtores dos Checkboxes no exclusivos: Checkbox() Checkbox(String s) - cria um Checkbox vazio, no seleccionado. - cria uma Checkbox tendo como label a string passada como parmetro, inicialmente no seleccionado. Checkbox(String s, boolean state) -cria um Checkbox tendo como label a string passada como parmetro e est seleccionado ou no conforme o valor do 2 argumento s Java 1.1. Checkbox(String s, null, boolean state) -cria um Checkbox tendo como label a string passada como parmetro e est seleccionado ou no conforme o valor do 3 argumento s Java 1.02.

2004/2005

249

Apontamentos de Java

Mtodos que permitem obter os parmetros de um Checkbox ou modific-los: void setState(boolean state) boolean getState() void setLabel(String s) String getLabel() coloca o estado do Checkbox no estado especificado no parmetro. retorna um valor booleano representando o estado do Checkbox. coloca como label do Checkbox a string passada como parmetro. retorna o label da Checkbox ou null se no possuir label.

2004/2005

250

Apontamentos de Java Construa um applet que crie um textField com o texto "Observe a mudana de estilo da fonte" e 2 checkboxes para mudar o estilo da fonte: um com o label "Bold" e outro com o label "Italic". Qualquer checkbox quando seleccionado deve resultar na aplicao desse estilo fonte do textField. import java.applet.Applet; import java.awt.*; public class Checkbox1 extends Applet { Font f; TextField t; Checkbox bold, italic; public void init() { t = new TextField( "Observe a mudana de estilo da fonte" ); f = new Font( "TimesRoman", Font.PLAIN, 14 ); t.setFont( f ); add( t ); bold = new Checkbox( "Bold" ); italic = new Checkbox( "Italic" ); add( bold ); add( italic ); }
2004/2005 251

Apontamentos de Java

public boolean action( Event evt, Object o ) { if (evt.target instanceof Checkbox) { int valBold = ( bold.getState() ? Font.BOLD : Font.PLAIN ); int valItalic = ( italic.getState() ? Font.ITALIC : Font.PLAIN ); f = new Font( "TimesRoman", valBold + valItalic, 14 ); t.setFont( f ); return true; } else return false; } }

2004/2005

252

Apontamentos de Java
// Com o modelo de tratamento de eventos da verso 1.1 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Checkbox1 extends Applet { Font f; TextField t; Checkbox bold, italic; public void init() { t = new TextField( "Observe a mudana de estilo da fonte" ); f = new Font( "TimesRoman", Font.PLAIN, 14 ); t.setFont( f ); add( t ); bold = new Checkbox( "Bold" ); italic = new Checkbox( "Italic" ); add( bold ); add( italic ); TrataEv t = new TrataEv(); bold.addItemListener(t); italic.addItemListener(t); } class TrataEv implements ItemListener { public void itemStateChanged( ItemEvent e ) { if (e.getSource() instanceof Checkbox) { int valBold = ( bold.getState() ? Font.BOLD : Font.PLAIN ); int valItalic = ( italic.getState() ? Font.ITALIC : Font.PLAIN ); f = new Font( "TimesRoman", valBold + valItalic, 14 ); t.setFont( f ); } } } }

2004/2005

253

Apontamentos de Java

4. Radio Buttons
Radio Buttons componente grfica de interface com o utilizador (GUI) constitudo por um grupo de botes onde s um boto no grupo pode estar seleccionado. Seleccionando um qualquer boto fora todos os outros botes do grupo a passarem ao estado no seleccionado. O nome radio buttons deriva dos antigos botes de seleco manual das estaes de rdio. Quando se pressionava um boto, todos os outros saltavam e ficavam no seleccionados. Para criar um conjunto de radio buttons necessrio criar primeiro uma instncia da classe CheckboxGroup: CheckboxGroup cbg = new CheckboxGroup();

2004/2005

254

Apontamentos de Java
Em seguida criam-se radio buttons individuais, objectos da classe Checkbox, e adicionam-se ao conjunto. A criao de radio buttons individuais pertencentes a um determinado CheckboxGroup efectuada por mtodos diferentes dependendo da verso do Java. Em Java 1.02 Checkbox(String s, CheckboxGroup cbg, boolean state) Em Java 1.1 Checkbox(String s, boolean state, CheckboxGroup cbg) Estes construtores criam um radio button com o label s, pertencente ao CheckboxGroup cbg, e no estado seleccionado ou no conforme o valor do respectivo argumento. add(new Checkbox(Yes, cbg, true); add(new Checkbox(No, cbg, false); O ltimo boto true a ser adicionado ao grupo ser o seleccionado. Se por outro lado, se criar um conjunto de botes todos no seleccionados, inicialmente aparecero no seleccionados.
2004/2005 255

Apontamentos de Java Construa um applet que crie um textField com o texto "Observe a mudana de fonte" e um grupo de 3 "radio buttons" para mudar a fonte para Courier ou TimesRoman ou Helvetica. import java.awt.*; public class CheckboxGroup1 extends java.applet.Applet { Font f; TextField t; CheckboxGroup cbg; Checkbox courier, timesRoman, helvetica; public void init() { t = new TextField( "Observe a mudana de fonte" ); f = new Font( "TimesRoman", Font.PLAIN, 14 ); t.setFont( f ); add( t ); cbg = new CheckboxGroup(); add(courier = new Checkbox("Courier", cbg, false)); add(timesRoman = new Checkbox("TimesRoman", cbg, true)); add(helvetica = new Checkbox("Helvetica", cbg, false)); }
2004/2005 256

Apontamentos de Java public boolean action( Event evt, Object o ) { String fonte; if (evt.target instanceof Checkbox) { if (courier.getState()) fonte = "Courier"; else if (timesRoman.getState()) fonte = "TimesRoman"; else fonte = "Helvetica"; f = new Font(fonte, Font.PLAIN, 14 ); t.setFont( f ); return true; } else return false; } }

2004/2005

257

Apontamentos de Java // Com o modelo de tratamento de eventos da verso 1.1 import java.awt.*; import java.awt.event.*; public class CheckboxGroup1 extends java.applet.Applet { Font f; TextField t; CheckboxGroup cbg; Checkbox courier, timesRoman, helvetica; public void init() { t = new TextField( "Observe a mudana de fonte" ); f = new Font( "TimesRoman", Font.PLAIN, 14 ); t.setFont( f ); add( t ); cbg = new CheckboxGroup(); add(courier = new Checkbox("Courier", cbg, false)); add(timesRoman = new Checkbox("TimesRoman", cbg, true)); add(helvetica = new Checkbox("Helvetica", cbg, false)); TrataEv t = new TrataEv(); courier.addItemListener(t); timesRoman.addItemListener(t); helvetica.addItemListener(t); }
2004/2005 258

Apontamentos de Java

class TrataEv implements ItemListener { public void itemStateChanged( ItemEvent e ) { String fonte; if (e.getSource() instanceof Checkbox) { if (courier.getState()) fonte = "Courier"; else if (timesRoman.getState()) fonte = "TimesRoman"; else fonte = "Helvetica"; f = new Font(fonte, Font.PLAIN, 14 ); t.setFont( f ); } } } }

2004/2005

259

Apontamentos de Java

5. TextField
TextField campo de texto constitudo por uma linha de texto na qual o utilizador pode digitar texto a partir do teclado ou simplesmente usada para mostrar texto.

Quando o utilizador digita Enter num TextField um evento ACTION_EVENT gerado e o texto digitado pode ser usado no programa.

2004/2005

260

Apontamentos de Java

A classe TextField assim como a classe TextArea derivam da classe TextComponent que por sua vez deriva da classe Component, a qual deriva directamente de Object. Object Component TextComponent

TextField

TextArea

2004/2005

261

Apontamentos de Java

Construtores: TextField() - constri um objecto textField vazio. TextField(int cols) - constri um objecto textField vazio com o nmero especificado de colunas. TextField(String s) - constri um objecto textField inicializado com a string s. TextField(String s, int cols) - constri um objecto textField inicializado com a string s e com o nmero especificado de colunas. Mtodos: void setEchoChar(char c) - coloca o carcter c medida que o utilizador digita no textField. til para entrar passwords.

2004/2005

262

Apontamentos de Java
Mtodos da classe TextComponent herdados pela classe TextField: void setEditable(boolean b) - coloca o textField editvel (true) ou no (false). boolean isEditable() - retorna um valor booleano indicando se o campo de texto editvel. void setText(String s) - coloca o texto s no campo de texto. String getText() - retorna a string do texto do campo de texto. String getSelectedText() - retorna a string do texto seleccionado. int getSelectionStart() - retorna a posio do primeiro carcter seleccionado do campo de texto. int getSelectionEnd() - retorna a posio do ltimo carcter seleccionado do campo de texto. void select(int selectionStart, int selectionEnd) - efectua a seleco de texto entre os limites especificados. void selectAll() - selecciona todo o texto do campo de texto.

2004/2005

263

Apontamentos de Java
Exemplo: import java.awt.*; import java.applet.Applet; public class TextField1 extends Applet { TextField msg1, msg2, password; String s; public void init() { s = "lp2"; msg1 = new TextField("Digite a password:"); msg1.setEditable(false); password = new TextField(12); password.setEchoCharacter('*'); msg2 = new TextField(30); msg2.setEditable(false); add(msg1); add(password); add(msg2); } public boolean action(Event evt, Object o) { if (evt.target instanceof TextField) if (evt.target == password) if (evt.arg.equals(s)) msg2.setText("Acesso permitido"); else msg2.setText("Password invalida."); return true; } }

2004/2005

264

Apontamentos de Java

2004/2005

265

Apontamentos de Java

6. TextArea
TextArea rea de edio de texto que pode ter mais que uma linha e scrollbars horizontal e vertical. Quando o utilizador digita Enter numa textArea um evento ACTION_EVENT gerado e o texto digitado pode ser usado no programa. A classe TextArea assim como a classe TextField derivam da classe TextComponent. Construtores: TextArea() - constri um objecto textArea vazio. TextArea(int rows, int cols) - constri um objecto textArea vazio com o nmero de linhas e colunas especificado. TextArea(String texto) - constri um objecto textArea inicializado com o texto especificado. TextArea(String texto, int rows, int cols) - constri um objecto textArea inicializado com o texto, linhas e colunas especificados.
2004/2005 266

Apontamentos de Java
Mtodos: void appendText (String s) - acrescenta a string s ao texto existente na rea de texto. void insertText (String s, int pos) - insere a string s, a partir da posio especificada, ao texto existente na rea de texto. void replaceText (String s, int start, int end) - substitui a parte do texto, entre as posies especificadas, pela string s. void setColumns(int cols) - coloca o nmero de colunas no valor especificado. void setRows(int rows) - coloca o nmero de linhas no valor especificado. int getColumns() - retorna o nmero de colunas na rea de texto. int getRows() - retorna o nmero de linhas na rea de texto. Mtodos da classe TextComponent herdados pela classe TextArea: void setEditable(boolean b) boolean isEditable() void setText(String s) String getText()
2004/2005

String getSelectedText() int getSelectionStart() int getSelectionEnd() void select(int selStart, int selEnd) void selectAll()
267

Apontamentos de Java

7. Choice
Choice lists componentes que mostram uma lista de itens permitindo a seleco de apenas um. Para criar uma choice list necessrio criar um objecto da classe Choice e em seguida adicionar os elementos da lista a esse objecto. Construtor: Choice() - constri um objecto da classe Choice.

2004/2005

268

Apontamentos de Java Mtodos: void addItem (String s) - adiciona um item choice list. int countItems () - retorna o nmero de elementos da choice list. String getItem(int pos) - retorna a string correspondente ao item especificado. void select (int pos) - coloca o respectivo item seleccionado. void select (String s) - coloca o respectivo item seleccionado. int getSelectedIndex() - retorna o ndice correspondente ao item seleccionado. String getSelectedItem() - retorna a string correspondente ao item seleccionado. Choice c = new Choice(); c.addItem(TimesRoman); c.addItem(Courier); c.addItem(Helvetica); add(c);
2004/2005 269

Apontamentos de Java

List
Scrolling List uma lista de itens dos quais apenas uma quantidade fixa mostrada, permitindo efectuar scrolling com scrollbar se necessrio. Uma scrolling list pode permitir mltipla seleco. Um nico clique num item selecciona o item, se no estava seleccionado, ou coloca o item no seleccionado se estava seleccionado. Mtodos: String getSelectedItems() retorna um array de Strings com os itens seleccionados. Um duplo clique num item cria um evento do tipo ACTION_EVENT. No modelo de eventos 1.0 o mtodo action() chamado tendo como 2. argumento a String que representa o item sobre o qual se fez duplo clique. No modelo de eventos 1.1 o evento criado do tipo ActionEvent e o mtodo invocado actionPerformed().
2004/2005 270

Apontamentos de Java
Exemplo: Crie uma scrolling list com 10 nomes de pases tendo apenas 5 visveis, que permita mltiplas seleces. Crie ainda um boto designado Copiar >>> e outra scrolling list vazia com 5 itens visveis. Quando pressionado o boto devem ser copiados os itens seleccionados da 1. lista para a 2.. import java.applet.Applet; import java.awt.*; public class List1 extends Applet { private List listaPaises, listaCopia; private Button copiar; private String paises[] = { "Portugal", "Espanha", "E.U.A", "Inglaterra", "Frana", "Sua", "Blgica", "Holanda", "Alemanha", "China" }; public void init() { listaPaises = new List( 5, true ); for ( int i = 0; i < paises.length; i++ ) listaPaises.addItem( paises[ i ] ); add( listaPaises ); copiar = new Button( "Copiar >>>" ); add( copiar ); listaCopia = new List( 5, false ); add( listaCopia ); }

2004/2005

271

Apontamentos de Java
public boolean action( Event e, Object o ) { String paisesC[]; if (e.target == copiar) { paisesC = listaPaises.getSelectedItems(); for ( int i = 0; i < paisesC.length; i++ ) listaCopia.addItem( paisesC[ i ] ); return true; } else return false; } }

2004/2005

272

Apontamentos de Java

Layout Manager
A forma como os componentes grficos so colocados numa janela controlada pelo gestor de posicionamento (layout manager). A disposio dos componentes para a maior parte dos gestores baseada na ordem pela qual os componentes so adicionados. Os layout managers adaptam a disposio dos componentes s dimenses do applet ou da janela da aplicao. Se as dimenses da janela mudam, o tamanho, forma e colocao dos componentes pode mudar. As classes Applet e Frame so subclasses de classe Container. O mtodo setLayout() da classe Container permite escolher o layout manager.

2004/2005

273

Apontamentos de Java FlowLayout Este o gestor de posicionamento por omisso para os applets. Corresponde a colocar os componentes fluindo da esquerda para a direita at que a linha de cima esteja cheia, depois passa para a linha seguinte continuando o fluxo de colocao dos componentes, do mesmo modo que as palavras de um texto numa pgina. Com FlowLayout os componentes tomam um tamanho natural, por exemplo, um boto ter o tamanho da string que constitui o respectivo label. Para criar um gestor de posicionamento para um container necessrio criar uma instncia layout manager tal como: FlowLayout fl = new FlowLayout(); E torn-lo o gestor do container com o mtodo setLayout() da classe Container: setLayout(fl);
2004/2005 274

Apontamentos de Java

Construtores: FlowLayout() - os componentes grficos so alinhados ao centro.

FlowLayout(int align) - define uma das trs possveis formas de alinhamento dos componentes: FlowLayout.CENTER, FlowLayout.LEFT ou FlowLayout.RIGHT. FlowLayout(int align, int hgap, int vgap) - define o tipo de alinhamento, o espaamento horizontal (segundo argumento) e o espaamento vertical (terceiro argumento) entre os componentes grficos.

2004/2005

275

Apontamentos de Java Exemplo: import java.awt.FlowLayout; import java.awt.Button; import java.awt.Color; import java.applet.Applet; public class FlowLayout1 extends Applet { Button b1 = new Button(Um); Button b2 = new Button(Dois); FlowLayout fl = new FlowLayout(); public void init() { setBackgroud(Color.white); setLayout(fl); add(b1); add(b2); } }
2004/2005 276

Apontamentos de Java

GridLayout
O gestor de posicionamento GridLayout divide o Container numa grelha com um dado nmero de linhas e de colunas e coloca os componentes da esquerda para a direita e de cima para baixo medida que so adicionados. Com GridLayout os componentes enchem o espao disponvel para eles em cada clula. Construtores: GridLayout(int rows, int cols) - cria um gestor de posicionamento especificando o nmero de linhas e o nmero de colunas. GridLayout(int rows, int cols, int hgap, int vgap) - cria um gestor de posicionamento especificando o nmero de linhas, o nmero de colunas, o espaamento horizontal e vertical entre os componentes grficos.
2004/2005 277

Apontamentos de Java Exemplo: import java.awt.GridLayout; import java.awt.Button; import java.awt.Color; import java.applet.Applet; public class GridLayout1 extends Applet { Button b1 = new Button("1"); Button b2 = new Button("2"); Button b3 = new Button("3"); Button b4 = new Button("4"); Button b5 = new Button("5"); Button b6 = new Button("6"); Button b7 = new Button("7"); Button b8 = new Button("8"); Button b9 = new Button("9"); Button b0 = new Button("0"); GridLayout gl = new GridLayout(4, 3, 10, 10); public void init() { setBackground(Color.white); setLayout(gl); add(b1); add(b2); add(b3); add(b4); add(b5); add(b6); add(b7); add(b8); add(b9); add(b0); } }
2004/2005 278

Apontamentos de Java

BorderLayout
O gestor de posicionamento BorderLayout divide o Container em 5 seces: norte, sul, este, oeste e centro. Os componentes so adicionados usando uma chamada do mtodo add() da classe Container diferente dos anteriores: add( String nome, Component comp); O primeiro argumento uma string indicando que parte do BorderLayout atribuda ao componente. O primeiro argumento pode ter 5 valores possveis: North, South, East, West e Center. Construtores: BorderLayout() - cria um gestor de posicionamento com os espaamentos standard entre os componentes.

BorderLayout(int hgap, int vgap) - cria um gestor de posicionamento com os espaamentos horizontais e verticais especificados.

2004/2005

279

Apontamentos de Java
Exemplo:

import java.applet.Applet; public class BorderLayout1 extends Applet { Button norte= new Button("Clula Norte"); Button sul = new Button("Clula Sul"); Button este = new Button("Clula Este"); Button oeste = new Button("Clula Oeste"); Button centro = new Button("Clula Centro"); BorderLayout bl = new BorderLayout(3, 3); public void init() { setBackground(Color.white); setLayout(bl); add("North", norte); add("South", sul); add("East", este); add("West", oeste); add("Center", centro);
} } 2004/2005 280

Apontamentos de Java

Panel
Um painel um contentor que fornece espao para agrupar componentes juntos. uma estrutura invisvel mas essencial para obter uma boa apresentao de um interface, devido ao facto de se poderem inserir painis no interior dos layouts e layouts dentro de painis. Ainda possvel misturar painis e outros componentes num mesmo layout. Um painel tem o seu prprio gestor de posicionamento (layout manager). O gestor de posicionamento por omisso para um painel o gestor FlowLayout. Os componentes devem ser colocados no painel antes dele ser posto num contentor maior. Exemplo de construo de um painel, colocao de gestor de posicionamento e adicionamento de dois botes: BorderLayout bl = new BorderLayout(); Panel p = new Panel(); p.setLayout(bl); Button boto1= new Button(Boto 1); Button boto2= new Button(Boto 2); p.add(North, boto1); p.add(Center, boto2);
2004/2005 281

Apontamentos de Java

H 3 classes usadas normalmente para contentores: Frame - uma janela do nvel mais alto que pode conter uma barra de menus, um cursor e cone prprios. Dialog - uma janela de dilogo. Panel - um contentor que no tem a sua prpria janela est contido dentro de outro qualquer contentor. Ao contrrio de Dialog e Frame, Panel um contentor que no cria uma janela separada prpria, tem de estar contido dentro de outro contentor. Panel adequado para conter pores de um interface maior dentro de um Frame parent, ou Dialog ou dentro de outro Panel.

2004/2005

282

Apontamentos de Java

CardLayout
um gestor de posicionamento em que os componentes so mostrados um de cada vez. S um carto (card) visvel estando os outros escondidos. Muitas vezes este gestor de posicionamento usado criando um painel para cada carto. Neste caso necessrio, em primeiro lugar, adicionar alguns componentes a cada painel (usando qualquer gestor de posicionamento) e s depois os painis so adicionados ao contentor (container) que usa o gestor de posicionamento CardLayout. A mudana de carto visvel pode ser desencadeada pelo programa, ou ento pela aco do utilizador noutro objecto grfico, o que desencadeia no programa a aco de mudar o carto. Com este gestor obtm-se a possibilidade de ter diferentes forms que podem surgir (pop up) comandadas pelo programa.
2004/2005 283

Apontamentos de Java

Exemplo de CardLayout e Panel Construa um applet contendo 3 objectos grficos (botes) dispostos pelo gestor CardLayout. Para efectuar a mudana de carto visvel crie tambm 3 botes que quando pressionados tornam visvel o respectivo carto. import java.awt.*; import java.applet.Applet; public class CardLayoutTest extends Applet { Button primeiro = new Button("Primeiro"), segundo = new Button("Segundo"), terceiro = new Button("Terceiro"); Panel cartes; CardLayout cl;

2004/2005

284

Apontamentos de Java

public void init() { setLayout(new BorderLayout()); Panel p = new Panel(); p.setLayout(new FlowLayout()); p.add(primeiro); p.add(segundo); p.add(terceiro); add("North", p); cartes = new Panel(); cartes.setLayout(cl=new CardLayout()); cartes.add("Primeiro carto", new Button("O primeiro carto")); cartes.add("Segundo carto", new Button("O segundo carto")); cartes.add("Terceiro carto", new Button("O terceiro carto")); add("Center", cartes); }
2004/2005 285

Apontamentos de Java public boolean action(Event evt, Object arg) { if (evt.target.equals(primeiro)) cl.first(cartes); else if (evt.target.equals(segundo)) { cl.first(cartes); cl.next(cartes); } else if (evt.target.equals(terceiro)) cl.last(cartes); else return super.action(evt, arg); return true; } }

2004/2005

286

Apontamentos de Java

Canvas
Canvas uma rea de desenho que pode receber eventos. A classe Canvas herda da classe Componente. Um componente canvas representa uma rea rectangular do ecr na qual uma aplicao pode desenhar ou a partir da qual a aplicao pode capturar eventos do utilizador. Em objectos da classe Canvas no possvel desenhar porque o mtodo paint() s coloca a cor de fundo do canvas. Para desenhar num objecto canvas, o mtodo paint() tem de ser reescrito. Isto obtm-se criando uma subclasse de Canvas. Desenhar num objecto canvas realiza-se a partir do canto superior esquerdo do canvas. Uma aplicao deve criar uma subclasse de Canvas para obter funcionalidade til (reescrevendo o mtodo paint() para realizar operaes grficas) e criar componentes prprios. Construtor: public Canvas() Mtodos:
2004/2005

- cria um objecto canvas.

public void paint(Graphics g)


287

Apontamentos de Java

Exemplo de Canvas import java.awt.*; import java.applet.*; public class CanvasTest extends Applet { BorderLayout bl = new BorderLayout(); Label l = new Label("Sarrabiscos"); Canvas1 c = new Canvas1(); public void init() { setLayout(bl); add("North", l); add("Center", c); c.setBackground(Color.yellow); } }

2004/2005

288

Apontamentos de Java

class Canvas1 extends Canvas { int x, y; public boolean mouseDown(Event evt, int x1, int y1) { x = x1; y = y1; return true; } public boolean mouseDrag(Event evt, int x1, int y1) { Graphics g = getGraphics(); g.drawLine(x, y, x1, y1); x = x1; y = y1; return(true); } }

2004/2005

289

Apontamentos de Java Os mtodos de desenho so chamados no objecto da classe Graphics e no no objecto canvas, porque o objecto da classe Graphics enviado ao mtodo paint(), assim como o retornado por getGraphics() contem o contexto grfico do componente e portanto trata de todas as operaes de desenho que tm lugar nesse componente. Os mtodos mouseDown() e mouseDrag() devem definir-se dentro da Classe Canvas1 para funcionarem apenas no objecto c (canvas). Se estivessem definidos globalmente actuariam sobre toda a janela do applet. Exemplo de Panel e Canvas Construa um applet que apresente 3 instrumentos de desenho: Linha, Rectngulo e Oval, uma palette de 6 cores: Preto, Branco, Vermelho, Azul, Verde e Amarelo e uma rea de desenho onde arrastando o rato pode desenhar linhas, rectngulos ou ovais de uma qualquer das cores da palette conforme o instrumento de desenho e cor previamente seleccionados.
2004/2005 290

Apontamentos de Java import java.awt.*; import java.applet.*; public class Desenhar1 extends Applet { Panel instrumentos, palette; Button linha, rect, oval; Button preto, branco, vermelho, azul, verde, amarelo; Canvas1 areaDesenho; public void init() { setLayout(new BorderLayout()); palette = new Panel(); palette.setLayout(new GridLayout(2,3,5,5)); preto = new Button("Preto"); branco = new Button("Branco"); vermelho = new Button("Vermelho"); azul = new Button("Azul"); verde = new Button("Verde"); amarelo = new Button("Amarelo"); palette.add(preto); palette.add(branco); palette.add(vermelho); palette.add(azul); palette.add(verde); palette.add(amarelo); add("South", palette);
2004/2005 291

Apontamentos de Java

instrumentos = new Panel(); instrumentos.setLayout(new GridLayout(3,1,5,5)); linha = new Button("Linha"); rect = new Button("Rectngulo"); oval = new Button("Oval"); instrumentos.add(linha); instrumentos.add(rect); instrumentos.add(oval); add("West", instrumentos); areaDesenho = new Canvas1(this, Color.black, 0); add("Center", areaDesenho); validate(); }

2004/2005

292

Apontamentos de Java

public boolean action(Event evt, Object obj) { if (evt.target == linha) areaDesenho.instr = 0; if (evt.target == rect) areaDesenho.instr = 1; if (evt.target == oval) areaDesenho.instr = 2; if (evt.target == preto) areaDesenho.cor = Color.black; if (evt.target == branco) areaDesenho.cor = Color.white; if (evt.target == vermelho) areaDesenho.cor = Color.red; if (evt.target == azul) areaDesenho.cor = Color.blue; if (evt.target == verde) areaDesenho.cor = Color.green; if (evt.target == amarelo) areaDesenho.cor = Color.yellow; return true; } }

2004/2005

293

Apontamentos de Java class Canvas1 extends Canvas { Desenhar1 d; Color cor; int instr; int x, y, x1, y1; public Canvas1(Desenhar1 des, Color c, int inst) { d = des; cor = c; instr = inst; } public boolean mouseDown(Event evt, int x1, int y1) { x = x1; y = y1; return(true); } public boolean mouseDrag(Event evt, int x, int y) { x1 = x; y1 = y; repaint(); return(true); } public void paint(Graphics g) { g.setColor(cor); if (instr == 0) g.drawLine(x, y, x1, y1); else if (instr == 1) g.fillRect(x, y, x1-x, y1-y); else if (instr == 2) g.fillOval(x, y, x1-x, y1-y); } }
2004/2005 294

Apontamentos de Java

2004/2005

295

Apontamentos de Java Os mtodos mouseDown, mouseDrag e paint devem definir-se dentro da Classe Canvas1 para funcionarem apenas no objecto areaDesenho. Se estivessem definidos globalmente actuariam sobre toda a janela do applet.

Frame
Um frame uma janela do nvel mais alto com um ttulo e um bordo. Um frame pode ter uma barra de menus. Construtores: public Frame() - constri um frame inicialmente invisvel e sem ttulo. public Frame(String ttulo) - constri um frame inicialmente invisvel e com o ttulo especificado. Mtodos: public void setTitle(String ttulo) - coloca o ttulo deste frame no ttulo especificado. public String getTitle() - retorna o ttulo do frame ou null se o frame no tem ttulo.
2004/2005 296

Apontamentos de Java

Exemplo de criao de um frame a partir de um applet import java.awt.*; public class AppletFrame extends java.applet.Applet { Frame window; public void init() { add(new Button("Open Window")); add(new Button("Close Window")); window = new Frame("Uma janela solta"); window.setLayout(new BorderLayout()); Label l = new Label("Isto uma janela", Label.CENTER); l.setFont(new Font("TimesRoman", Font.PLAIN, 14)); window.add("Center", l); window.resize(150,150); window.show(); }

2004/2005

297

Apontamentos de Java public boolean action(Event evt, Object arg) { if (evt.target instanceof Button) { String label = (String)arg; if (label.equals("Open Window")) { if (!window.isShowing()) window.show(); } else if (label.equals("Close Window")) if (window.isShowing()) window.hide(); return true; } else return false; }

2004/2005

298

Apontamentos de Java

Criao de Aplicaes com Interface Grfico com o Utilizador (GUI Graphical user Interface) So poucas as diferenas entre um applet Java e uma aplicao grfica para alm do ambiente em que cada um corre. Os mtodos grficos, os componentes de interface com o utilizador, eventos, janelas e caixas de dilogo podem ser usados do mesmo modo em aplicaes Java como em applets. As aplicaes tm a vantagem de no estarem sujeitas s restries dos applets. Para criar uma aplicao grfica Java a classe principal da aplicao deve herdar de Frame. Dentro do mtodo main() da aplicao deve-se criar uma nova (new) instncia da classe (subclasse de Frame), o que nos dar uma nova janela AWT, a qual podemos redimensionar (setSize()) e tornar visvel (show()) de um modo idntico a qualquer janela AWT. Dentro do mtodo construtor desta classe deve-se colocar o ttulo, adicionar o gestor de disposio, criar, configurar e adicionar componentes de um modo semelhante ao que se fazia no mtodo init() de um applet.
2004/2005 299

Apontamentos de Java

Exemplo de uma aplicao grfica


Construa uma aplicao que crie 2 botes: um para iniciar e outro para incrementar um contador cujo valor deve ser mostrado num label. import java.awt.*; public class AplicContador extends Frame { Button incr, iniciar; Label mostra; int conta=0; public AplicContador(String titulo) { super(titulo); setLayout(new FlowLayout()); add(iniciar = new Button("Iniciar")); add(incr = new Button("Incrementar")); add(mostra = new Label(" "+0)); }

2004/2005

300

Apontamentos de Java

public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) System.exit(0); else return super.handleEvent(evt); return true; } public boolean action(Event evt, Object arg) { if (evt.target instanceof Button ) { if (evt.target == incr) conta++; else if(evt.target.equals(iniciar)) conta = 0; mostra.setText(""+conta); return true; } else return false; }

2004/2005

301

Apontamentos de Java
public static void main(String args[]) { AplicContador apl = new AplicContador("Aplicao Grfica: Contador"); apl.setSize(300, 300); apl.show(); } }

2004/2005

302

Apontamentos de Java import java.awt.*; import java.awt.event.*; public class Scribble5 extends Frame { private int x, y; public Scribble5() { setTitle("Janela para Sarrabiscar"); setSize(300, 200); addWindowListener(new Terminator()); addMouseListener(new ListenerMA()); addMouseMotionListener(new ListenerMMA()); } class ListenerMA extends MouseAdapter { public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } }
2004/2005 303

Apontamentos de Java class ListenerMMA extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); int x1= e.getX(); int y1= e.getY(); g.drawLine(x, y, x1, y1); x = x1; y = y1;
} }

class Terminator extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String[] args) { Frame jan = new Scribble15(); jan.show();
} } 2004/2005 304

Apontamentos de Java
// Construa uma aplicacao que crie uma janela com 3 botes. // Cada boto muda a cor do fundo da janela para a cor do respectivo label. import java.awt.*; import java.awt.event.*; public class Cores3 extends Frame { Button verm, azul, verde; public Cores3() { setTitle("Janela com Botoes"); setLayout(new FlowLayout()); setSize(300, 200); addWindowListener( new Terminator()); setBackground(Color.white); verm = new Button("Vermelho"); add(verm); verm.addActionListener(new ProcessaBotao(Color.red)); azul = new Button("Azul"); add(azul); azul.addActionListener(new ProcessaBotao(Color.blue)); verde = new Button("Verde"); add(verde); verde.addActionListener(new ProcessaBotao(Color.green)); } 2004/2005 305

Apontamentos de Java
class ProcessaBotao implements ActionListener { Color cor; ProcessaBotao(Color c) { cor = c; } public void actionPerformed(ActionEvent e) { setBackground(cor); } } class Terminator extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String[] args) { Frame jan = new Cores3(); jan.show(); } }

2004/2005

306

Apontamentos de Java

Frame
Um frame uma janela do nvel mais alto com um ttulo e um bordo. Um frame pode ter uma barra de menus. Construtores: public Frame() - constri um frame inicialmente invsvel e sem ttulo. public Frame(String ttulo) - constri um frame inicialmente invisvel e com o ttulo especificado. Mtodos: void setTitle(String ttulo) - coloca o ttulo deste frame no ttulo especific. String getTitle() - retorna o ttulo do frame ou null se o frame no tem ttulo. void setMenuBar(MenuBar mb) - coloca a barra de menus deste frame na barra de menus especificada. MenuBar getMenuBar() - retorna a barra de menus para este frame, ou null, se o frame no tem uma barra de menus. void setResizable(boolean resizable) determina se este frame deve ser redimensionvel. Por omisso um frame redimensionvel. void isResizable(boolean resizable) indica se este frame redimension. void remove(MenuComponent m) remove a barra de menus especificada.
2004/2005 307

Apontamentos de Java

MenuBar (subclasse de MenuComponent)


Esta classe encapsula o conceito de plataforma de uma barra de menus ligada a um frame. Para ligar uma barra de menus a um frame deve-se chamar o mtodo setMenuBar() da classe Frame. Construtor: Mtodos: Menu add(Menu m) adiciona o menu especificado barra de menus. Retorna o menu adicionado int countMenus() retorna o nmero de menus na barra de menus. Menu getMenu(int i) retorna o menu da barra de menus na posio especificada. void remove(int index) remove da barra de menus o menu localizado no ndice especificado. void remove(MenuComponent m) remove da barra de menus o menu especificado.
2004/2005 308

public MenuBar() cria uma nova barra de menus.

Apontamentos de Java

Menu (subclasse de MenuItem)


Um menu um componente pull-down de uma barra de menus. Cada item num menu pertence classe MenuItem. Cada item pode ser uma instncia de MenuItem, um submenu (uma instncia de Menu) ou um checkbox (uma instncia de CheckboxMenuItem). Construtores: public Menu(String label) constri um novo menu com o label especificado. public Menu(String label, boolean tearoff) constri um novo menu com o label especificado. Se o 2. argumento true o menu permanece no ecr depois do rato ter sido libertado.

2004/2005

309

Apontamentos de Java Mtodos: MenuItem add(MenuItem mi) adiciona o item de menu especificado a este menu. Se o item de menu parte de outro menu, remove-o desse menu. Retorna o item de menu adicionado. void add(String label) adiciona um item com o label especificado a este menu. MenuItem getItem(int index) retorna o item localizado no ndice especificado deste menu. void remove(MenuComponent item) apaga o item de menu especificado deste menu. Se o item no parte do menu, nada acontece. void remove(int index) apaga o item do ndice especificado neste menu. int countItems() retorna o nmero de elementos deste menu. void addSeparator() adiciona uma linha separadora a este menu na posio corrente. boolean isTearOff() retorna true se um menu tear-off.
2004/2005 310

Apontamentos de Java

MenuItem (subclasse de MenuComponent)


Todos os itens de um menu devem pertencer classe MenuItem ou a uma subclasse. No modelo de eventos 1.0 quando um item de um menu seleccionado, um evento de aco enviado para o frame que contm o menu item, e o mtodo action() chamado: public boolean action( Event evt, Object arg) evt.target o item do menu, e arg a string do item do menu. No modelo de eventos 1.1 chamado o mtodo actionPerformed(). A subclasse Menu reescreve este comportamento e no envia qualquer evento para o frame at que um dos seus subitens esteja seleccionado.

2004/2005

311

Apontamentos de Java Construtores: public MenuItem(String label) constri um novo item de menu com o label especificado. O label -constri um separador entre os itens. Por omisso todos os itens do menu excepto os separadores so seleccionveis pelo utilizador. Mtodos: void setLabel(String label) muda o label do item deste menu para o label especificado. String getLabel() retorna o label deste item do menu ou null se este item do menu no tem label. void enable() torna o item do menu seleccionvel pelo utilizador. void disable() torna o item do menu no seleccionvel. void enable(boolen sel) torna o item do menu seleccionvel ou no. boolean isEnabled() verifica se o item do menu seleccionvel.
2004/2005 312

Apontamentos de Java
// Construa uma aplicao que crie uma janela com 3 botes, e uma barra de menus // com um menu constitudo por 3 itens. A seleco de um boto ou de um item // permite mudar a cor fundo da janela para a cor designada no respectivo label. import java.awt.*; import java.awt.event.*; public class MultSources extends Frame { private Button verm, azul, verde; public MultSources() { setTitle("Multiple Event Sources"); setLayout(new FlowLayout()); setSize(300, 200); addWindowListener( new Terminator());

2004/2005

313

Apontamentos de Java
Menu m = new Menu("Cores"); MenuItem vermItem = new MenuItem("Vermelho"); m.add(vermItem); vermItem.addActionListener(pbVerm); MenuItem azulItem = new MenuItem("Azul"); m.add(azulItem); azulItem.addActionListener(pbAzul); MenuItem verdItem = new MenuItem("Verde"); m.add(verdItem); verdItem.addActionListener(pbVerd); MenuBar mbar = new MenuBar(); mbar.add(m); setMenuBar(mbar); setBackground(Color.white); verm = new Button("Vermelho"); add(verm); verm.addActionListener(pbVerm); azul = new Button("Azul"); add(azul); azul.addActionListener(pbAzul); verde = new Button("Verde"); add(verde); verde.addActionListener(pbVerd); } 2004/2005 314

Apontamentos de Java
class ProcessaBotao implements ActionListener { Color cor; ProcessaBotao(Color c) { cor = c; } public void actionPerformed(ActionEvent e) { setBackground(cor); } } class Terminator extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String[] args) { Frame jan = new Botoes9(); jan.show(); } } 2004/2005 315

Apontamentos de Java
// Construa uma aplicacao que crie uma janela com 2 botes // Um boto cria novas janelas enquanto que o outro fecha todas as janelas. import java.awt.*; import java.awt.event.*; public class MultListeners extends Frame { private Button newWindow, closeAll; private int contador = 0; public MultListeners() { setTitle("Multiplos Listeners"); setLayout(new FlowLayout()); setSize(300, 200); addWindowListener( new Terminator()); newWindow = new Button("New"); add(newWindow); newWindow.addActionListener(new NovaJanela()); closeAll = new Button("Close All"); add(closeAll); } 2004/2005 316

Apontamentos de Java
class NovaJanela implements ActionListener { public void actionPerformed(ActionEvent e) { Frame f = new Frame(); contador ++; f.setTitle("Janela n. " + contador); f.setSize(200, 150); f.setLocation(30*contador, 30*contador); f.show(); closeAll.addActionListener(new FechaJanela(f)); } } class FechaJanela implements ActionListener { private Frame jan; public FechaJanela(Frame f) { jan = f; } public void actionPerformed(ActionEvent e) { jan.dispose(); } }

2004/2005

317

Apontamentos de Java

class Terminator extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String[] args) { Frame jan = new MultListeners(); jan.show(); } }

2004/2005

318

Apontamentos de Java

D ialog (subclasse de W indow)


Esta classe representa uma caixa de dilogo, uma janela que recebe input do utilizador. As caixas de dilogo destinam-se a ser janelas temporrias, que apresentam informao especfica ao utilizador ou que permitem ao utilizador especificar opes para a actividade corrente. Cada caixa de dilogo deve pertencer a um Frame. Na criao de uma caixa de dilogo necessrio a indicao de qual o seu parent frame. Uma caixa de dilogo pode ser ou no modal. Uma caixa de dilogo modal bloqueia todos os eventos para outras janelas forando a que o utilizador elim ine esta janela. Todos os eventos de rato, teclado e foco que ocorrem sobre a janela de dilogo so enviados para o objecto Dialog. Quando criada invisvel, pelo que a aplicao deve usar o mtodo show() para fazer aparecer a caixa de dilogo. O gestor de posicionamento (layout manager) por omisso para uma caixa de dilogo o BorderLayout.
2004/2005 319

Apontamentos de Java

Construtores: public Dialog(Frame parent, boolean modal) - cria uma caixa de dilogo inicialmente invisvel. parent o frame a que a janela dialog est associada. O 2. argumento deve ser true se se pretende que a janela seja do tipo modal ou false se a janela no deve ser modal. public Dialog(Frame parent, String title, boolean modal) - cria caixa de dilogo com o ttulo especificado. Mtodos: String getTitle() - retorna o ttulo desta caixa de dilogo. boolean isModal() - retorna true se esta caixa de dilogo modal, false se no . void setTitle() - coloca o ttulo desta caixa de dilogo.
2004/2005 320

Apontamentos de Java

FileDialog (subclasse de Dialog) Esta classe representa uma caixa de dilogo na qual o utilizador pode seleccionar um ficheiro. Como uma caixa de dilogo modal, aps a execuo do mtodo show() bloqueia o resto da aplicao at que o utilizador escolha o ficheiro. public class java.awt.FileDialog extends java.awt.Dialog Constantes estticas inteiras: public static final int LOAD; public static final int SAVE; LOAD SAVE indica que a caixa de dilogo se destina a determinar o ficheiro para leitura. indica que a caixa de dilogo se destina a determinar o ficheiro para escrita.

2004/2005

321

Apontamentos de Java

Construtores: public Dialog(Frame parent, String title) - cria uma caixa de dilogo com o ttulo especificado para carregar um ficheiro. Os ficheiros mostrados so os do directrio corrente. public Dialog(Frame parent, String title, int mode) - cria uma caixa de dilogo com o ttulo especificado para carregar ou gravar um ficheiro. O argumento mode deve ter o valor LOAD ou SAVE. Mtodos: public String getDirectory() retorna o directrio corrente. public String getFile() retorna o ficheiro seleccionado ou null se nenhum est seleccionado.

2004/2005

322

Apontamentos de Java

Window (subclasse de Container)


Um window uma janela do nvel mais alto. No tem bordo nem barra de menu nem o atributo modal. Necessita, tal como a Dialog, de um parent frame. Pode ser usada para implementar menus pop-up. O layout por omisso para um window BorderLayout. Construtor: public Window(Frame parent) constri uma janela nova invisvel. A janela comporta-se como modal bloqueando input para outras janelas da aplicao. O mtodo show() torna a janela visvel. Mtodos: void dispose() destri esta janela e qualquer recurso por ela usado. void show() se a janela no visvel torna-a visvel; seno tr-la para a frente. void toBack() envia a janela para trs. void toFront() traz a janela para a frente.
2004/2005 323

Apontamentos de Java

Container (subclasse de Component)


A classe Container a superclasse abstracta que representa todos os componentes que podem conter outros componentes. Mtodos:
Component add(Component comp) - adiciona o componente especificado ao fim do container. Component add(Component comp, int pos) - indica a posio na qual adicionar este componente. Component add(String name, Component comp) - adiciona o componente especificado ao fim do container. Tambm adiciona o componente ao gestor de posicionamento, usando o tag name especificado compreendido pelo gestor de posicionamento. void setLayout(LayoutManager mgr) - coloca o gestor de posicionamento (layout manager) para este container. void validate() - valida este container e todos os seus subcomponentes. Este mtodo causa o container ser novamente organizado depois de lhe serem adicionados ou removidos componentes. Reescreve validate() da classe Component. 2004/2005 324

Apontamentos de Java Component (subclasse de Object) A classe Component a superclasse abstracta de muitas classes AWT. Representa qualquer coisa que tem uma posio e um tamanho, pode ser pintada no ecr, e pode receber eventos de entrada. Mtodos (chamados quando ocorre um evento dentro do componente, no modelo de eventos 1.0): boolean handleEvent(Event evt) boolean action(Event evt, Object obj) boolean gotFocus(Event evt, Object obj) boolean lostFocus(Event evt, Object obj) boolean keyDown(Event evt, int key) boolean keyUp(Event evt, int key) boolean mouseEnter(Event evt, int x, int y) boolean mouseExit(Event evt, int x, int y) boolean mouseMove(Event evt, int x, int y) boolean mouseDrag(Event evt, int x, int y) boolean mouseDown(Event evt, int x, int y) boolean mouseUp(Event evt, int x, int y)
2004/2005 325

Apontamentos de Java Outros mtodos: void paint(Graphics g) - pinta o componente. void repaint() - causa uma chamada ao mtodo update() logo que possvel. void repaint(int x, int y, int width, int height) repinta o rectngulo especificado deste componente. void update(Graphics g) - limpa o componente enchendo-o com a cor de fundo, coloca a cor do contexto grfico na cor corrente (foreground) e chama o mtodo paint() para redesenhar o componente. Graphics getGraphics() - retorna o contexto grfico deste componente. void resize(int width, int height) redimensiona este componente para a largura e altura especificadas. Componentes que esto dentro de um container com um gestor de posicionamento no devem chamar este mtodo explicitamente.

2004/2005

326

Apontamentos de Java Outros mtodos: void show() - mostra o componente. void hide() - esconde o componente (no visvel). boolean isShowing() - indica se o componente visvel. void move(int x, int y) - move o componente. Color getForeground() - retorna a cor de foreground. void setForeground(Color c) - coloca a cor de foreground Color getBackground() - retorna a cor de background. void setBackground(Color c) - coloca a cor de background. Font getFont() - retorna a fonte deste componente. void setFont(Font f) - coloca a fonte deste componente. void validate(c) - valida este componente se necessrio. Este componente e qualquer subcomponente so colocados novamente se necessrio. Container getParent() - retorna o parent deste componente.

2004/2005

327

Apontamentos de Java

Tratamento de Erros com Excepes


Idealmente os erros de um programa deviam ser apanhados em tempo de compilao porque cdigo errado no deveria ser executado. Mas como nem todos os erros podem ser detectados em tempo de compilao, deve existir um formalismo de tratamento de erros em tempo de execuo. Em muitas linguagens o formalismo consiste no retorno de um valor especial ou na colocao de uma flag pela funo na qual se verificou o erro, e o programa que chamou a funo devia testar o valor retornado ou a flag, e determinar qual o problema. Mas, a maior parte das vezes, os programas no testam as condies de erro. Se testassem todos os potenciais erros sempre que uma funo era chamada o cdigo tornar-se-ia ilegvel.

2004/2005

328

Apontamentos de Java

Benefcios das excepes No ponto do programa onde ocorre um problema, conhecem-se as caractersticas do problema que ocorreu, mas em geral, nesse contexto (contexto corrente) no se tem informao suficiente para lidar com o problema. Num contexto mais alto, noutra parte do programa, existe a informao necessria para decidir o que fazer. Outro benefcio das excepes resulta num programa limpo de cdigo de tratamento de erros. No necessrio testar a ocorrncia de um erro particular e trat-lo em vrios stios de um programa. A excepo garante que o erro tratado. Deste modo o problema s tratado num stio. Alm de se poupar cdigo, separa-se cdigo com o que se pretende fazer, do cdigo de tratamento de erros.

2004/2005

329

Apontamentos de Java

Lanamento de uma excepo Uma excepo (condio excepcional) um problema que no permite a continuao do mtodo ou scope em execuo. Quando ocorre uma excepo no se pode continuar o processamento corrente porque no se tem informao necessria para tratar do problema no contexto corrente e relega-se o problema para um contexto mais alto, lanando uma excepo. Quando se lana uma excepo (usa-se a palavra-chave throw), um objecto excepo criado (atravs da chamado de um construtor da respectiva classe) e sai-se do mtodo ou do scope corrente, sendo retornada a referncia ao objecto excepo criado. O fluxo de execuo corrente parado e passa do contexto corrente para o local de tratamento da excepo para onde tambm passada a referncia do objecto excepo. Exemplo de lanamento de uma excepo: if (t == null) throw new NullPointerException();
2004/2005 330

Apontamentos de Java

Em todas as excepes standard (classes) h 2 construtores: um sem argumentos, e outro com 1 argumento do tipo String. Normalmente lana-se uma excepo de uma classe diferente para cada tipo diferente de erro, para que no contexto mais amplo se possa determinar o que fazer (tomar a deciso apropriada) apenas atravs do conhecimento do tipo de objecto excepo. Quando uma excepo lanada o mecanismo de tratamento de excepes toma conta do controlo do fluxo do programa e termina a execuo do mtodo no qual a excepo lanada, assim como os mtodos dos quais este mtodo foi chamado e a execuo continua numa parte do programa que se destina a tratar excepes daquele tipo ( exception handler ).

2004/2005

331

Apontamentos de Java Bloco try - regio guardada Para que throw no cause a sada de um mtodo, deve existir dentro desse mtodo um bloco para capturar a excepo Uma excepo lanada capturada imediatamente a seguir a um bloco try por clusulas denotadas pela palavra-chave catch, designadas clusulas catch ou clusulas de tratamento de excepes (exception handlers). Cada clusula catch toma 1 e s 1 argumento de um tipo particular. try { cdigo que pode gerar excepes } catch (Type1 id1) { // tratamento de excepes do tipo Type1 } catch (Type2 id2) { // tratamento de excepes do tipo Type2 ... } Normalmente o tratamento da excepo baseado no tipo da excepo sem necessidade de usar o identificador, mas em qualquer dos casos o identificador tem de ser declarado.
2004/2005 332

Apontamentos de Java

As clusulas catch devem aparecer directamente depois do bloco try, tendo cada clusula sempre 1 s argumento. Este tratamento de excepes separa o cdigo colocado num bloco try (cdigo com o que se pretende fazer), do tratamento de erros colocado nas clusulas onde se capturam e tratam as excepes (clusulas catch). Se uma excepo lanada, o mecanismo de tratamento de excepes procura a primeira clusula catch com um argumento do tipo da excepo. Se encontra executa o cdigo dessa clusula catch e sai.

2004/2005

333

Apontamentos de Java

Lista de Especificao das Excepes Java obriga a declarar as excepes que um mtodo lana na declarao do mtodo depois da lista de argumentos. A especificao das excepes feita atravs da palavra-chave throws seguida de uma lista de todos os tipos de potenciais excepes. void mtodo() throws excepo1, excepo2 { ... } Se a especificao das excepes declaradas no estiver correcta, o compilador detecta isso e informa que determinada excepo deve ser tratada, ou ento indicada na especificao das excepes, significando que pode ser lanada do mtodo.

2004/2005

334

Apontamentos de Java

Java contem um classe chamada Throwable que descreve tudo o que pode ser lanado como excepo. Throwable tem 2 subclasses: Error descreve erros de compilao e do sistema; Exception o tipo de erros que podem ser lanados de qualquer mtodo das classes de bibliotecas standard ou de mtodos que escrevemos. Todas as excepes que possam ocorrer so objectos de classes que so subclasses do tipo Exception. possvel capturar qualquer tipo de excepo capturando uma excepo do tipo base Exception. catch (Exception e) { System.out.println(Capturando a excepo + e.getMessage()); }

2004/2005

335

Apontamentos de Java

Ao objecto excepo podem aplicar-se mtodos da classe Throwable, ou ainda mtodos da classe Object (superclasse de todas as classes). Mtodos da classe Throwable String getMessage() - retorna a mensagem de erro associada com a excepo. String toString() - retorna uma descrio do objecto. void printStackTrace() - imprime para o standard erro. void printStackTrace(PrintStream) - imprime para um stream especificado (por exemplo System.out). printStackTrace() mostra a sequncia dos mtodos invocados que levaram ao ponto onde a excepo foi lanada. Mtodo da classe Object: getClasse() - retorna um objecto pertencente classe Class representando a classe desse objecto excepo. A este objecto retornado pode aplicar-se o mtodo getName(), que retorna o nome da classe.
2004/2005 336

Apontamentos de Java

Relanamento de uma Excepo (Rethrowing an exception) Para voltar a lanar uma excepo que foi capturada executa-se throw referncia. Uma excepo depois de capturada (por uma clusula catch) pode voltar a ser relanada para ser tratada num contexto mais alto. catch (Exception e) { System.out.println(Excepo:); e.printStackTrace(); throw e; }

2004/2005

337

Apontamentos de Java

Exemplo: public class RelancamentoExcepcoes { public static void f() throws Exception { System.out.println("No metodo f()"); throw new Exception("Excepcao lancada em f()"); } public static void g() throws Throwable { try { f(); } catch (Exception e) { System.out.println("No metodo g()"); e. printStackTrace(); throw e; } }
2004/2005 338

Apontamentos de Java

public static void main(String args []) throws Throwable { try { g(); } catch (Exception e) { System.out.println("Capturada no main, e.printStackTrace()"); e.printStackTrace(); } System.in.read(); } }

2004/2005

339

Apontamentos de Java

Excepes RunTimeException Java realiza verificaes, em tempo de execuo, de excepes da classe RuntimeException. Excepes deste tipo so automaticamente lanadas e no necessrio inclu-las nas especificaes das excepes. Todos os tipos de potenciais excepes tm de ser includos na declarao de um mtodo (lista com a especificao das excepes) excepto excepes do tipo RuntimeException. Excepes do tipo RuntimeException representam erros de programao. Estes erros tais como NullPointException ou ArrayIndexOutOfBoundsException se no forem capturados so reportados na sada do programa auxiliando no processo de depurao (debugging). Excepes do tipo RuntimeException ou de classes que herdam deste tipo no necessitam de pertencer lista de especificao de excepes na declarao de um mtodo.
2004/2005 340

Apontamentos de Java Exemplo:

public class RuntimeExcepcao { static void f() { throw new RuntimeException(Do metodo f()); } public static void main(String args()) { f(); } } Sada produzida:

Se uma excepo do tipo RuntimeException lanada e no apanhada, na sada do programa printStackTrace() chamado para essa excepo.
2004/2005 341

Apontamentos de Java
Criao de Excepes Podemos criar as nossas prprias excepes para denotar algum erro especial. Para criar uma classe de excepes necessrio herdar de um tipo existente de excepes. Mostramos, em seguida, um exemplo no qual o mtodo main() chama o mtodo f(), o qual chama o mtodo divide(). O mtodo divide() pode lanar uma excepo. Apresentamos vrias situaes: 1. Sem tratamento das excepes. O programa d erro de execuo. 2. O mtodo divide() pode lanar uma excepo, mas no capturada nem declarada. D erro de compilao. 3. O mtodo divide() declara a excepo, mas o mtodo f() no a captura nem a declara. D erro de compilao. 4. O mtodo divide() e o mtodo f() declaram a excepo, mas o mtodo main() no a captura nem a declara. D erro de compilao. 5. Os mtodos divide(), f() e main() declaram a excepo. O programa compila mas d erro de execuo. 6. A excepo capturada no mtodo divide(). O mtodo main() completado. 7. A excepo capturada no mtodo f(). O mtodo main() completado. 8. A excepo capturada no mtodo main(). O mtodo main() no completado, porque o lanamento da excepo causado pela invocao da 2 instruo do mtodo main() causa o abandono do cdigo do bloco try.

2004/2005

342

Apontamentos de Java
class Excepcao1 extends Exception { public Excepcao1() { } public Excepcao1(String msg) { super(msg); } } public class Teste0 { public static int divide(int a,int b) { return a/b; } public static int f(int a,int b) { return divide(a, b); } public static void main(String args []) { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } } 2004/2005 343

Apontamentos de Java
class Excepcao1 extends Exception { public Excepcao1() { } public Excepcao1(String msg) { super(msg); } } public class Teste { public static int divide(int a,int b) { if (b==0) throw new Excepcao1("Divisao por zero!"); return a/b; } public static int f(int a,int b) { return divide(a, b); } public static void main(String args []) { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } } error J0122: Exception 'Excepcao1' not caught or declared by 'int Teste.divide(int a, int b)' 2004/2005 344

Apontamentos de Java

public class Teste { public static int divide(int a,int b) throws Excepcao1 { if (b==0) throw new Excepcao1("Divisao por zero!"); return a/b; } public static int f(int a,int b) { return divide(a, b); } public static void main(String args []) { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } } error J0122: Exception 'Excepcao1' not caught or declared by 'int Teste.f(int a, int b)'

2004/2005

345

Apontamentos de Java

public class Teste { public static int divide(int a,int b) throws Excepcao1 { if (b==0) throw new Excepcao1("Divisao por zero!"); return a/b; } public static int f(int a,int b) throws Excepcao1 { return divide(a, b); } public static void main(String args []) { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } } error J0122: Exception 'Excepcao1' not caught or declared by 'void Teste.main(String[] args)'

2004/2005

346

Apontamentos de Java
public class Teste { public static int divide(int a,int b) throws Excepcao1 { if (b==0) throw new Excepcao1("Divisao por zero!"); return a/b; } public static int f(int a,int b) throws Excepcao1 { return divide(a, b); } public static void main(String args []) throws Excepcao1 { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } }

2004/2005

347

Apontamentos de Java
public class Teste { public static int divide(int a,int b) { try { if (b==0) throw new Excepcao1("Divisao por zero!"); return a/b; } catch (Exception e) { e.printStackTrace(); System.out.println("Resultado nao valido:"); return 0; } } public static int f(int a,int b) { return divide(a, b); } public static void main(String args []) { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } } 2004/2005 348

Apontamentos de Java
public class Teste { public static int divide(int a,int b) throws Excepcao1 { if (b==0) throw new Excepcao1("Divisao por zero!"); return a/b; } public static int f(int a,int b) { try { return divide(a, b); } catch (Exception e) { e.printStackTrace(); System.out.println("Resultado nao valido:"); return 0; } } public static void main(String args []) { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } } 2004/2005 349

Apontamentos de Java
public class Teste { public static int divide(int a,int b) throws Excepcao1 { if (b==0) throw new Excepcao1("Divisao por zero!"); return a/b; } public static int f(int a,int b) throws Excepcao1 { return divide(a, b); } public static void main(String args []) { try { System.out.println(f(5, 2)); System.out.println(f(3, 0)); System.out.println(f(4, 1)); } catch (Exception e) { e.printStackTrace(); System.out.println("Resultado nao valido:"); // return 0; } } }

2004/2005

350

Apontamentos de Java
Quando se reescreve um mtodo s se podem lanar excepes que foram especificadas no mtodo da classe base. Deste modo cdigo que funciona com a classe base tambm funcionar com qualquer objecto derivado da classe base incluindo excepes. Por vezes h a necessidade de executar algum cdigo, quer ocorra ou no uma excepo num bloco try, para colocar qualquer coisa no seu estado inicial, tal como um ficheiro aberto ou uma ligao a outro computador. Isso consegue-se usando uma clusula finally no fim do tratamento das excepes. try { // . . . regio guardada } catch( Excepo1 e1 ) { ... } catch( Excepo2 e2 ) { ... } finally { ... }

2004/2005

351

Apontamentos de Java
Exemplo: public class Teste1 { static int count = 0; public static void main (String args []) { while (true) { try { if (count++ == 0) throw new Exception(); System.out.println("Excepcao lancada"); } catch (Exception e) { System.out.println("Execepcao capturada"); } finally { System.out.println("Clausula finally"); if (count == 2) break; } } } }

2004/2005

352

Apontamentos de Java
Na determinao da clusula catch que captura uma excepo lanada, o mecanismo de tratamento das excepes procura a primeira clusula catch para a qual o tipo de excepo o tipo ou subtipo do argumento da clusula catch. class A extends Exception { } class B extends A { } public class Teste2 { public static void main(String args []) { try { throw new B(); } catch (A a) { System.out.println("Capturada excepcao A"); } } } A excepo B capturada pela clusula catch(A a).

2004/2005

353

Apontamentos de Java
O cdigo seguinte dar erro de compilao porque a clusula catch (B b) nunca ser atingida: class A extends Exception { } class B extends A { } public class Teste { public static void main(String args []) { try { throw new B(); } catch (A a) { System.out.println(Capturada excepo A); } catch (B b) { System.out.println(Capturada excepo B); } } } Mensagem de erro produzida: error J0102: Handler for 'B' hidden by earlier handler for 'A' 2004/2005 354

Apontamentos de Java

Exemplo: Programa que efectua 3 leituras de um nmero inteiro. Se a entrada no pode ser convertida num nmero, lana uma excepo que capturada e imprime a mensagem Errado. import java.io.*; class Numero1{ public static String lerString(String msg) throws java.io.IOException { DataInputStream din = new DataInputStream(System.in); System.out.print(msg); return din.readLine(); }

2004/2005

355

Apontamentos de Java
public static void main(String args []) throws java.io.IOException { int n; for(int i=0; i<3; i++) { String s = lerString("Digite um numero: "); try { n = Integer.parseInt(s); System.out.println("Numero valido: " +n); } catch (NumberFormatException nfe) { //nfe.printStackTrace(); System.out.println("Errado."); } } System.out.println("Fim."); System.in.read(); } }

2004/2005

356

Apontamentos de Java

Exemplo: Programa que efectua a leitura de um nmero inteiro at a entrada poder ser convertida num nmero. import java.io.*; class Numero2{ public static String lerString(String msg) throws java.io.IOException { DataInputStream din = new DataInputStream(System.in); System.out.print(msg); return din.readLine(); }

2004/2005

357

Apontamentos de Java
public static void main(String args []) throws java.io.IOException { boolean lido = false; int n; do { String s = lerString("Digite um numero: "); try { n = Integer.parseInt(s); lido = true; } catch (NumberFormatException nfe) { //nfe.printStackTrace(); System.out.println("Tente outra vez:"); } } while (!lido); System.out.println("Fim."); System.in.read(); } }

2004/2005

358

Apontamentos de Java

Ficheiros e Streams O armazenamento de dados em variveis, arrays ou objectos sempre temporrio, porque os dados so perdidos quando as variveis ou as referncias aos objectos saem fora do mbito de validade ou quando o programa termina. Os ficheiros so usados para reteno dos dados. Dados mantidos em ficheiros designam-se por dados persistentes. Os browsers no permitem aos applets ler ou escrever em ficheiros por razes de segurana. Por isso, programas de processamento de ficheiros so implementados como aplicaes. Para realizar processamento de ficheiros em Java temos de importar o package java.io.

2004/2005

359

Apontamentos de Java Apresenta-se a seguir a hierarquia de classes de ficheiros e streams mais importantes: Object File InputStream FileInputStream FiterInputStream DataInputStream BufferedInputStream ObjectInputStream OutputStream FileOutputStream FiterOutputStream DataOutputStream BufferedOutputStream PrintStream ObjectOutputStream RandomAccessFile
2004/2005 360

Apontamentos de Java

As entradas e sadas de dados em Java so baseados no uso de streams, que so sequncias de bytes ou caracteres que fluem de uma fonte para um destino atravs de um dado caminho de comunicao. InputStream e OutputStream so classes abstractas que declaram mtodos para realizar input e output. As classes derivadas destas reescrevem estes mtodos. As classes FileInputStream e FileOutputStream destinam-se a criar objectos que abrem ficheiros para leitura ou para escrita, passando aos construtores uma string com o nome do ficheiro. Um ficheiro aberto para escrita, se j existe inicializado (perdendo-se todo o seu contedo) e se no existe criado. No h o conceito de abrir um ficheiro para escrita de texto ASCII ou de dados binrios. Pode-se escrever qualquer coisa sem fazer distino entre caracteres e outros dados.
2004/2005 361

Apontamentos de Java

O interface DataInput implementado pela classe DataInputStream e pela classe RandomAccessFile, declarando mtodos para ler tipos primitivos de dados de streams. O interface DataOutput implementado pela classe DataOutputStream e pela classe RandomAccessFile, declarando mtodos para escrever tipos primitivos de dados em streams. Os interfaces DataInput e DataOutput fornecem mtodos que suportam o input/output independente da mquina.

2004/2005

362

Apontamentos de Java

Para abrir um ficheiro para escrita, usa-se um FileOutputStream construdo com um objecto String ou File para o nome do ficheiro. Para escrever de um modo formatado temos que construir um objecto DataOutputStream usando como argumento do construtor o objecto FileOutputStream. A classe DataOutputStream fornece a capacidade de escrever objectos String e tipos primitivos para uma stream de sada.

2004/2005

363

Apontamentos de Java

Escrever Dados num Ficheiro Podemos escrever dados num ficheiro criando um objecto do tipo DataOutputStream passando como argumento ao seu construtor um objecto FileOutputStream representando o ficheiro. FileOutputStream fileOutput = new FileOutputStream(info.dat); DataOutputStream output = new DataOutputStream(fileOutput); Esta tcnica designa-se por encadeamneto de objectos e normalmente realizada apenas pela instruo: DataOutputStream output = new DataOutputStream( new FileOutputStream(info.dat));

2004/2005

364

Apontamentos de Java

Para abrir um ficheiro para leitura, usa-se um FileInputStream construdo com um objecto String ou File para o nome do ficheiro. Para ler de um modo formatado temos que construir um objecto DataInputStream usando como argumento do construtor o objecto FileInputStream. A classe DataInputStream fornece a capacidade de ler objectos String e tipos primitivos de uma stream de entrada.

2004/2005

365

Apontamentos de Java

Ler Dados de um Ficheiro Podemos ler dados de um ficheiro criando um objecto do tipo DataInputStream passando como argumento ao seu construtor um objecto FileInputStream representando o ficheiro. FileInputStream fileInput = new File InputStream(info.dat); DataInputStream input = new DataInputStream(fileInput); De um modo idntico escrita em ficheiros este encadeamneto de objectos normalmente realizada apenas pela instruo: DataInputStream input = new DataInputStream( new FileInputStream(info.dat));

2004/2005

366

Apontamentos de Java
Excepes Quando se cria um objecto FileOutputStream para abrir um ficheiro, o programa testa se a operao de abertura teve sucesso. Se a operao falha (por exemplo se no h espao de disco disponvel) gera-se uma excepo IOException que pode ser capturada pelo programa. Exemplo: try { DatOutputStream output = new DataOutputStream( new FileOutputStream(info.dat)); } catch (IOException e) { System.err.println(Ficheiro no aberto\n + e.toString()); System.exit(1); } Neste exemplo se a tentativa de abrir o ficheiro gera uma excepo IOException a mensagem de erro mostrada e o programa termina. O argumento do mtodo exit() retornado ao ambiente do qual o programa foi invocado, normalmente o sistema operativo. O argumento 0 indica que o programa terminou normalmente e qualquer outro valor indica que o programa terminou devido a um erro. Este valor pode ser usado pelo ambiente que invocou o programa para reagir em conformidade. 2004/2005 367

Apontamentos de Java

De um modo semelhante, quando se cria um objecto FileInputStream para abrir um ficheiro para leitura, o programa testa se a operao de abertura teve sucesso. Se a operao falha (ficheiro no existente, ou no permisso de leitura do ficheiro) gera-se uma excepo IOException que pode ser capturada pelo programa. Exemplo: try { DataInputStream input = new DataInputStream( new FileInputStream(info.dat)); } catch (IOException e) { System.err.println(Ficheiro no aberto\n + e.toString()); System.exit(1); }

2004/2005

368

Apontamentos de Java
Os dados devem ser lidos de ficheiros no mesmo formato no qual foram escritos no ficheiro. Os interfaces DataInput e DataOutput definem mtodos que transmitem tipos primitivos de dados atravs de um stream. As classes DataInputStream e DataOutputStream fornecem uma implementao para cada interface. Os mtodos de leitura e escrita existentes aos pares para cada tipo so: Leitura: boolean byte short int long float double char String readBoolean() readByte() readShort() readInt() readLong() readFloat() readDouble() readChar() readUTF() Escrita: void writeBoolean(boolean) void writeByte(byte) void writeShort(short) void writeInt(int) void writeLong(long) void writeFloat(float) void writeDouble(double) void writeChar(char) void writeUTF(String) Tipo: boolean byte short int long float double char String

Os mtodos readUTF() e writeUTF() lem e escrevem no formato UTF. UTF (Unicode Transmission Format) o formato de transmisso Unicode. uma forma binria que compacta caracteres Unicode de 16 bits em bytes de 8 bits. 2004/2005 369

Apontamentos de Java
Para alm destes mtodos ainda referimos outro de leitura: String readLine() throws IOException l uma String at atingir \n, \r ou o par \r\n. A sequncia fim de linha no includa na String. Retorna null se atinge o fim do input. E outro de escrita: void writeChars(String s) throws IOException escreve uma string como uma sequncia de char. Uma string escrita com o mtodo writeChars() deve ser lida usando um ciclo com readChar. necessrio escrever primeiro o comprimento da string ou usar um separador para marcar o fim.

2004/2005

370

Apontamentos de Java
Os mtodos complementares, tais como writeDouble() e readDouble(), permitem recuperar a informao armazenada num ficheiro, mas para os mtodos de leitura funcionarem correctamente deve-se conhecer a colocao exacta dos dados no ficheiro. Portanto ou os dados so armazenados no ficheiro num formato fixo ou informao extra deve ser armazenada no ficheiro que permita determinar onde e como os dados esto localizados (por exemplo precedendo cada item de dados por um par de bytes que informam o tipo e comprimento). O mtodo close() fecha uma stream de entrada ou de sada e liberta os recursos associados com a stream. No caso de uma stream de sada qualquer dado escrito para a stream armazenado antes de a stream ser desalocada. O mtodo available() retorna o nmero de bytes que podem ser lidos sem bloqueamento, o que para um ficheiro significa at ao fim do ficheiro.
2004/2005 371

Apontamentos de Java

Exemplo 1: Programa que grava num ficheiro os primeiros 1000 nmeros naturais e em seguida l o mesmo ficheiro testando o fim de ficheiro com o mtodo available(). import java.io.*; public class File1 { public static void main (String args []) throws java.io.IOException { int [] valores = new int[1000]; for (int i=0; i<1000; i++) valores[i]=i+1; FileOutputStream fileOutput = new FileOutputStream("out.txt"); DataOutputStream output = new DataOutputStream(fileOutput);

2004/2005

372

Apontamentos de Java

for (int i=0; i<valores.length; i++) output.writeInt(valores[i]); output.close(); FileInputStream fileInput = new FileInputStream("out.txt"); DataInputStream input = new DataInputStream(fileInput); int v; while (input.available() != 0) { v=input.readInt(); System.out.println(v); } input.close(); System.in.read(); } }

2004/2005

373

Apontamentos de Java Exemplo 2: Aplicao que grava no ficheiro nomes.dat um array de strings, usando o mtodo writeChars() e um separador para marcar o fim de cada string. O tamanho do array gravado no incio para permitir na leitura criar um array do mesmo tamanho. Depois o programa abre o ficheiro para leitura, l o seu contedo para outro array de strings que cria, e mostra essas strings. import java.io.*; public class DataIO { static char SEP = '|'; static String readChars(DataInputStream in, char separador) throws IOException { String s=""; char ch = in.readChar(); while (ch != separador) { s += ch; ch = in.readChar(); } return s; }
2004/2005 374

Apontamentos de Java
public static void writeData(String[] s, String fich) throws IOException { FileOutputStream fout = new FileOutputStream(fich); DataOutputStream out = new DataOutputStream(fout); out.writeInt(s.length); for (int i=0; i< s.length; i++) { out.writeChars(s[i]); out.writeChar(SEP); } out.close(); } public static String [] readData(String fich) throws IOException { FileInputStream fin = new FileInputStream(fich); DataInputStream in = new DataInputStream(fin); String [] s2 = new String[in.readInt()]; for (int i=0; i< s2.length; i++) s2[i] = readChars(in, SEP); in.close(); return s2; } 2004/2005 375

Apontamentos de Java

public static void main (String args []) throws java.io.IOException { String [] nomes ={"Miguel", "Ana", "Carlos", "Joaquim"}; writeData(nomes, "nomes.txt"); String [] nomes2; nomes2 = readData("nomes.txt"); for (int i=0; i<nomes2.length; i++) System.out.println(nomes2[i]); System.in.read(); } }

2004/2005

376

Apontamentos de Java
Exemplo 3: Aplicao que cria vrios objectos da classe Conta, coloca-os num array e grava-os num ficheiro. Em seguida cria um novo vector de referncias para objectos Conta e preenche-o com objectos lidos do mesmo ficheiro. Finalmente mostra o contedo do vector criado. A classe Conta permite construir uma conta com um dado nmero (num), primeiro nome (pNome), ltimo nome (uNome), e saldo (saldo), e tambm gravar num dado stream o contedo de um objecto Conta (writeConta()) assim como ler de um stream o contedo de um objecto (readConta()) criando o respectivo objecto. import java.io.*; class Conta { private int num; private String pNome, uNome; private double saldo; public Conta(int num, String pNome, String uNome, double saldo) { this.num = num; this.pNome = pNome; this.uNome = uNome; this.saldo = saldo; } 2004/2005 377

Apontamentos de Java
public void writeConta(DataOutputStream out) throws java.io.IOException { out.writeInt(num); out.writeUTF(pNome); out.writeUTF(uNome); out.writeDouble(saldo); } public static Conta readConta(DataInputStream in) throws java.io.IOException { return new Conta( in.readInt(), in.readUTF(), in.readUTF(), in.readDouble() ); } public void print() { System.out.println(num + ": " + pNome + " " + uNome + " -> saldo = " + saldo); } }

2004/2005

378

Apontamentos de Java
public class DataIO { static void writeData(Conta [] c, String ficheiro) throws java.io.IOException { DataOutputStream out = new DataOutputStream( new FileOutputStream( ficheiro ) ); out.writeInt(c.length); for (int i=0; i<c.length; i++) c[i].writeConta(out); out.close(); } static Conta [] readData (String ficheiro) throws java.io.IOException { DataInputStream in = new DataInputStream( new FileInputStream(ficheiro)); Conta [] c = new Conta[in.readInt()]; for (int i=0; i< c.length; i++) c[i] = Conta.readConta(in); in.close(); return c; }

2004/2005

379

Apontamentos de Java
public static void main (String args []) throws java.io.IOException { Conta vect[] = new Conta[3]; vect[0] = new Conta (1, "Carlos", "Miguel", 4234.21); vect[1] = new Conta (2, "Jorge", "Silva", 231.15); vect[2] = new Conta (3, "Manuel", "Santos", 8421.5); writeData(vect, "contas.dat"); Conta [] v = readData("contas.dat"); for (int i=0; i<v.length; i++) v[i].print(); System.in.read(); } }

O mtodo writeData da classe DataIO abre o ficheiro para escrita e escreve o tamanho do array. Depois escreve, objecto a objecto, o contedo do array. Finalmente fecha o ficheiro. O mtodo readData da classe DataIO abre o ficheiro para leitura, l o tamanho do array e cria um array de objectos. Depois, para cada elemento do array, invoca o mtodo readData da classe Conta que retorna um objecto criado com o contedo lido do ficheiro. Finalmente fecha o ficheiro.
2004/2005 380

Apontamentos de Java RandomAccessFile RandomAccessFile uma classe que descende directamente da classe Object, mas que implementa os interfaces DataInput e DataOutput. Esta classe fornece a capacidade ler ou escrever directamente em localizaes especficas de um ficheiro (movendo o apontador do ficheiro para uma posio arbitrria). Este acesso aleatrio suportado pelos seguintes mtodos: getFilePointer() - retorna a localizao corrente do apontador do ficheiro; seek() - move o apontador do ficheiro para uma nova localizao; length() - retorna o tamanho do ficheiro em bytes. O construtor desta classe necessita de dois parmetros do tipo String: o 1. com o nome do ficheiro e o 2. indicando o modo de abertura do ficheiro - s para leitura (r) ou para leitura e escrita (rw). O acesso s para leitura evita um ficheiro de ser inadvertidamente modificado.
2004/2005 381

Apontamentos de Java import java.io.*; class File1 { public static void main (String args []) throws java.io.IOException { int [] valores = new int[10]; for (int i=0; i<1000; i++) valores[i]=i+1; int v; // escrita dos dados RandomAccessFile fo = new RandomAccessFile("out.txt", "rw"); for (int i=0; i<valores.length; i++) fo.writeInt(valores[i]); fo.close(); // leitura aleatria dos dados RandomAccessFile fi = new RandomAccessFile("out.txt", "r"); // Exemplo da leitura dos dados armazenados de 8 em 8 bytes for (int i=0; i<fi.length(); i=i+8) { fi.seek(i); v=fi.readInt(); System.out.println(v); } fi.close(); System.in.read(); } }
2004/2005 382

Apontamentos de Java

/* Outro exemplo com ficheiro de acesso aleatrio */ import java.io.*; class File1 { public static int lerInteiro(String s) throws java.io.IOException { System.out.print(s); BufferedReader d = new BufferedReader( new InputStreamReader(System.in)); int x = Integer.parseInt(d.readLine()); return x; } public static void main (String args []) throws java.io.IOException { int [] valores = new int[20]; for (int i=0; i<20; i++) valores[i]=i+1; RandomAccessFile fo = new RandomAccessFile("out.txt", "rw"); // escrita dos dados for (int i=0; i<valores.length; i++) fo.writeInt(valores[i]); fo.close();
2004/2005 383

Apontamentos de Java

// leitura e escrita aleatoria dos dados RandomAccessFile fi = new RandomAccessFile("out.txt", "r"); int i=lerInteiro("Escreva uma posicao do ficheiro: "); int v; System.out.println( "Leitura e escrita aleatoria dos dados (termine com a posicao -1)"); fi = new RandomAccessFile("out.txt", "rw"); i=lerInteiro("Escreva uma posicao do ficheiro: "); while (i!=-1) { fi.seek(i); v=fi.readInt(); System.out.println("Valor existente: " + v); int j= lerInteiro("Valor a reescrever nessa posicao : "); fi.seek(i); fi.writeInt(j); i=lerInteiro("Escreva uma posicao do ficheiro: "); } fi.close(); } }
2004/2005 384

Apontamentos de Java /* Aplicao que cria vrios objectos da classe Conta, coloca-os num array e grava-os num ficheiro. Em seguida cria um novo array de referncias para objectos Conta, preenche-o com objectos lidos do mesmo ficheiro e mostra o contedo do vector criado. Ainda criado mais um objecto da classe Conta que adicionado ao ficheiro. No fim todo o contedo do ficheiro listado. */ import java.io.*; class Conta { private int num; private String pNome, uNome; private double saldo; public Conta( int num, String pNome, String uNome, double saldo) { this.num = num; this.pNome = pNome; this.uNome = uNome; this.saldo = saldo; }
2004/2005 385

Apontamentos de Java
public void writeConta(DataOutputStream out) throws java.io.IOException { out.writeInt(num); out.writeUTF(pNome); out.writeUTF(uNome); out.writeDouble(saldo); } public void writeConta(RandomAccessFile out) throws java.io.IOException { out.writeInt(num); out.writeUTF(pNome); out.writeUTF(uNome); out.writeDouble(saldo); } public static Conta readConta(DataInputStream in) throws java.io.IOException { return new Conta( in.readInt(), in.readUTF(), in.readUTF(), in.readDouble() ); } public void print() { System.out.println( num + ": " + pNome + " " + uNome +" -> saldo = " + saldo); } } 2004/2005 386

Apontamentos de Java class DataIO { static void writeData(Conta [] c, String ficheiro) throws java.io.IOException { DataOutputStream out = new DataOutputStream( new FileOutputStream( ficheiro ) ); out.writeInt(c.length); for (int i=0; i<c.length; i++) c[i].writeConta(out); out.close(); } static Conta [] readData (String ficheiro) throws java.io.IOException { DataInputStream in = new DataInputStream( new FileInputStream(ficheiro)); Conta [] c = new Conta[in.readInt()]; for (int i=0; i< c.length; i++) c[i] = Conta.readConta(in); in.close(); return c; }
2004/2005 387

Apontamentos de Java
public static void main (String args []) throws java.io.IOException { Conta vect[] = new Conta[3]; vect[0] = new Conta (1, "Carlos", "Miguel", 4234.21); vect[1] = new Conta (2, "Jorge", "Silva", 231.15); vect[2] = new Conta (3, "Manuel", "Santos", 8421.5); writeData(vect, "contas.dat"); Conta [] v1 = readData("contas.dat"); for (int i=0; i<v1.length; i++) v1[i].print(); // append de uma nova Conta Conta nova = new Conta (4, "Outra", "Conta", 0.5); RandomAccessFile f = new RandomAccessFile("contas.dat", "rw"); int quant = f.readInt() + 1; f.seek(0); f.writeInt(quant); f.seek(f.length()); nova.writeConta(f); f.close(); Conta [] v2 = readData("contas.dat"); for (int i=0; i<v2.length; i++) v2[i].print(); System.in.read();
} }

2004/2005

388

Apontamentos de Java

Serializao Serializao o processo de converter objectos para um formato adequado para entrada ou sada de stream. Des-serializao o processo de voltar a converter um objecto serializado numa instncia de um objecto. Para que um objecto possa ser serializado tem de implementar o interface Serializable. O mecanismo de des-serializao para objectos restaura o contedo de cada campo com o valor e tipo que tinha quando foi escrito. Referncias a outros objectos faz com que esses objectos sejam lidos do stream. Grafos de objectos so restaurados correctamente usando um mecanismo de partilha de referncias. Novos objectos so sempre alocados quando desserializados, o que evita que objectos existentes sejam reescritos. Os interfaces DataInput e DataOutput fornecem mtodos que suportam o input/output independente da mquina. Os interfaces ObjectInput e ObjectOutput extendem os interfaces DataInput e DataOutput para trabalhar com objectos.
2004/2005 389

Apontamentos de Java

Input/Output de Objectos As classes ObjectOutputStream e ObjectInputStream permitem escrever e ler de streams, objectos e tipos primitivos de dados. Estas classes implementam os interfaces ObjectOutput e ObjectInput. Dos mtodos especificados por ObjectOutput, o mtodo writeObject() o mais importante escreve objectos que implementem o interface Serializable para um stream. O interface ObjectInput declara o mtodo readObject() para ler os objectos escritos para um stream pelo mtodo writeObject(). Quando um objecto escrito na forma serializado, juntamente com o objecto armazenada informao que identifica a classe Java a partir da qual o contedo do objecto foi gravado, o que permite restaurar o objecto como uma nova instncia dessa classe. Quando um objecto serializado, todos os objectos no estticos atingveis a partir desse objecto so tambm armazenados com esse objecto. O interface Serializable usado para identificar objectos que podem ser escritos para um stream. Este interface no define quaisquer constantes ou mtodos.
2004/2005 390

Apontamentos de Java

import java.io.*; class Conta implements Serializable { private int num; private String pNome, uNome; private double saldo; public Conta( int num, String pNome, String uNome, double saldo) { this.num = num; this.pNome = pNome; this.uNome = uNome; this.saldo = saldo; } public void print() { System.out.println( num + ": " + pNome + " " + uNome +" -> saldo = " + saldo); } }
2004/2005 391

Apontamentos de Java
class DataIO { public static void main (String args []) throws java.io.IOException, java.lang.ClassNotFoundException { Conta vect[] = new Conta[3]; vect[0] = new Conta (1, "Carlos", "Miguel", 4234.21); vect[1] = new Conta (2, "Jorge", "Silva", 231.15); vect[2] = new Conta (3, "Manuel", "Santos", 8421.5); String fich = "contas.dat"; ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(fich)); out.writeInt(vect.length); for (int i=0; i<vect.length; i++) out.writeObject(vect[i]); out.close(); ObjectInputStream in = new ObjectInputStream( new FileInputStream(fich)); Conta [] v = new Conta[in.readInt()]; for (int i=0; i< v.length; i++) v[i] = (Conta) in.readObject(); in.close(); for (int i=0; i<v.length; i++) v[i].print(); System.in.read(); } } 2004/2005 392

Apontamentos de Java
/* Verso com a escrita e leitura de um nico objecto: o array de objectos Conta */ class DataIO { public static void main (String args []) throws java.io.IOException, java.lang.ClassNotFoundException { Conta vect[] = new Conta[3]; vect[0] = new Conta (1, "Carlos", "Miguel", 4234.21); vect[1] = new Conta (2, "Jorge", "Silva", 231.15); vect[2] = new Conta (3, "Manuel", "Santos", 8421.5); String fich = "contas.dat"; ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(fich)); out.writeObject(vect); out.close(); ObjectInputStream in = new ObjectInputStream( new FileInputStream(fich)); Conta [] v = (Conta []) in.readObject(); in.close(); for (int i=0; i<v.length; i++) v[i].print(); System.in.read(); } } 2004/2005 393

Apontamentos de Java

Threads
A estruturao de um programa em classes e a criao de objectos permitem dividir um programa em seces independentes. Por vezes, surge tambm a necessidade de separar um programa em subtarefas que possam correr independentemente. Cada subtarefa independente designa-se por thread. Um processo - um programa autnomo em execuo com o seu prprio espao de endereamento. Um sistema operativo multitarefa - um sistema operativo capaz de correr mais que um processo de cada vez. Um thread - um fluxo de controlo sequencial nico dentro de um processo. Um s processo pode ter mltiplos threads em execuo corrente.

2004/2005

394

Apontamentos de Java

Usos de Multithreading Suponhamos que temos um boto quit que quando pressionado termina o programa. Pretendemos que o boto responda rapidamente quando pressionado. Para no termos que verificar o estado do boto regularmente em todas as partes do cdigo que escrevemos, crimos um thread para fazer essa verificao e colocmo-lo a correr independentemente. Normalmente cria-se um thread para qualquer parte do programa ligada a um determinado evento ou recurso, que corre independentemente do programa principal. O tempo do CPU repartido entre todos os threads, o que reduz a eficincia da computao, mas o melhoramento no projecto do programa e no balanceamento de recursos compensa.

2004/2005

395

Apontamentos de Java

Programas com 1 nico thread podem conseguir uma iluso de mltiplos threads quer atravs de interrupes ou por polling (algumas actividades do programa intercaladas com outras). Mas, num programa, a mistura de 2 funes no relacionadas, resulta num cdigo complexo e de difcil manuteno. Muitos problemas de software so melhor resolvidos usando mltiplos threads de controlo. Um thread de controlo pode actualizar o que mostrado, outro responde a entradas do utilizador, etc.

2004/2005

396

Apontamentos de Java

Criao de Threads Os threads existem definidos numa classe Thread da biblioteca standard Java. Para criar um thread, poder-se-ia criar um objecto thread: ( Thread t = new Thread(); ), e em seguida configurar o thread colocando a prioridade inicial e nome, e invocando o mtodo start() que bifurca um thread de controlo com os dados do objecto thread, e retorna. Depois a mquina virtual Java (interpretador) invocaria o mtodo run() do thread, tornando o thread activo at que esse mtodo run() retorne, altura em que o thread termina. Mas a implementao do mtodo run() da classe Thread no faz nada. Para ter um thread que faa qualquer coisa temos que reescrever o mtodo run() e para isso necessrio criar uma subclasse de Thread. Outro processo para criar um thread consiste em criar um objecto que implemente o interface Runnable (definindo o mtodo run()) e passando esse objecto Runnable ao construtor da classe Thread.
2004/2005 397

Apontamentos de Java Classe Thread public class Thread extends Object implements Runnable Construtores: public Thread() public Thread(String nome) public Thread(Runnable obj) public Thread(Runnable obj, String nome) Mtodos de classe: public static boolean interrupted(); public static void sleep(long milis) throws InterruptedException; Mtodos instncia: public synchronized void start(); public void run(); public final void suspend(); public final void resume(); public final void stop();
2004/2005 398

Apontamentos de Java start() inicia a execuo de um thread, stop() pra essa execuo, suspend() pra o thread temporariamente, resume() retoma a execuo do thread, sleep(t) pra o thread durante uma quantidade especificada de tempo em milisegundos. O mtodo run() do thread o corpo do thread. Comea a executar quando o mtodo start() do objecto thread chamado. O thread corre at que o mtodo run() retorne ou o mtodo stop() seja invocado. Exemplos A maneira mais simples de criar um thread herdar da classe Thread a qual possui os mtodos necessrios para criar e correr threads. O mtodo mais importante run(), o qual se deve reescrever com o cdigo que ser executado simultaneamente com os outros threads no programa. Exemplo 1: Programa cria 2 threads que imprimem as palavras sim e nao com cadncias diferentes.

2004/2005

399

Apontamentos de Java
public class T extends Thread { private String palavra; private int temp; private int cont=0; public T( String p, int t, int c) { palavra = p; temp = t; cont = c; } public void run() { int i = 0; try { while ( i++ <= cont ) { System.out.println(palavra); sleep(temp); } } catch (InterruptedException e) { return; } }

2004/2005

400

Apontamentos de Java
public static void main(String args []) throws java.io.IOException { T t = new T("sim", 20, 10); t.start(); t = new T("nao", 100, 5); t.start(); System.in.read(); } }

2004/2005

401

Apontamentos de Java

O mtodo sleep(t) da classe Thread causa uma paragem durante t milisegundos. Este mtodo pode lanar uma excepo do tipo InterruptedException se interrompido. Mas o mtodo T.run() no pode lanar excepes porque reescreve o mtodo Thread.run() e este no lana qualquer excepo. Assim necessrio capturar a excepo que sleep() pode lanar dentro do mtodo T.run(). O mtodo T.main() cria 2 objectos do tipo T (threads) e invoca o mtodo start() para cada objecto.

2004/2005

402

Apontamentos de Java Exemplo 2: Programa cria 3 threads. Cada thread imprime o seu nmero seguido do valor de um contador que decrementa de 5 at 1.

public class A extends Thread { private int cont = 5; private int id; private static int ultId=0; public A() { id = ++ultId; System.out.println("Criado thread n. " + id); } public void run() { while (true) { System.out.println( "Thread n. " + id + "(" + cont + ")"); if (--cont == 0) return; } }
2004/2005 403

Apontamentos de Java

public static void main (String args []) throws java.io.IOException { for (int i=0; i<3; i++) // A a = new A(); // a.start(); new A().start(); System.out.println("Todos os threads iniciados."); System.in.read(); } }

2004/2005

404

Apontamentos de Java Usando Runnable O interface Runnable abstrai o conceito de tudo o que executa cdigo enquanto activo. O interface Runnable declara 1 nico mtodo: public void run() A classe Thread implementa o interface Runnable. Thread pode ser estendida para criar threads com execues especficas, mas esta aproximao pode ser difcil de usar, porque Java s permite herana simples. Se uma classe estendida (como subclasse de Thread) j no pode ser estendida como subclasse de outra classe, mesmo que se precise. Implementando Runnable mais simples em muitos casos. Pode-se executar um objecto Runnable num thread prprio passando-o ao construtor Thread. Se um objecto thread construdo com um objecto Runnable, a implementao de Thread.run() invocar o mtodo run() do objecto Runnable. Vejamos uma verso Runnable do 1. exemplo apresentado.
2004/2005 405

Apontamentos de Java
public class RunT implements Runnable { private String palavra; private int temp; private int cont=0; public RunT( String p, int t, int c) { palavra = p; temp = t; cont = c; } public void run() { int i = 0; try { while ( i++ <= cont ) { System.out.println(palavra); Thread.sleep(temp); } } catch (InterruptedException e) { return; } } 2004/2005 406

Apontamentos de Java
public static void main(String args []) throws java.io.IOException { Runnable sim = new RunT("sim", 20, 10); Runnable nao = new RunT("nao", 100, 5); Thread t = new Thread(sim); t.start(); t = new Thread(nao); t.start(); System.in.read(); } }

2004/2005

407

Apontamentos de Java

Este programa muito idntico ao 1. exemplo apresentado, diferindo apenas na superclasse (Runnable versus Thread) e no mtodo main(). A implementao do mtodo run() a mesma. Nesta implementao criam-se 2 objectos Runnable (RunT) e em seguida 2 objectos Thread, passando cada objecto runnable como argumento ao construtor do objecto Thread.

2004/2005

408

Apontamentos de Java Sincronizao Um thread pode realizar uma tarefa independentemente de outro thread. Tambm dois threads podem partilhar o acesso ao mesmo objecto. Quando dois threads podem modificar o mesmo dado, se ambos os threads realizam a sequncia ler-modificar-escrever de um modo intercalado podem corromper esse dado. Como exemplo suponhamos que 2 threads actualizam o saldo de uma conta (objecto c) aps um depsito, aproximadamente ao mesmo tempo.
thread1 s1 = c.getSaldo(); thread2 s2 = c.getSaldo();

s1 += deposito;

s2 += deposito;

c.setSaldo(s1);

c.setSaldo(s2);

2004/2005

409

Apontamentos de Java

Se as sequncias ler-modificar-escrever so realizadas intercaladamente s o ltimo depsito afecta o saldo perdendo-se a primeira modificao. Um modo de resolver este problema no permitir o acesso ao objecto enquanto estiver a ser usado. O 2 thread ter de esperar at o objecto ser liberto pelo 1 thread. Sempre que 2 threads necessitam de usar o mesmo objecto, h a possibilidade de operaes intercaladas corromperem os dados. Para sincronizar os acessos de vrios threads a um dado objecto de modo a no corromperem os dados, um thread coloca um lock (fecho) no objecto, e quando outro thread tenta aceder ao objecto, fica bloqueado at que o primeiro thread termine. Mas nem todos os mtodos de um thread podem corromper os dados (por exemplo mtodos de leitura). Por isso s os mtodos de um thread que possam interferir com outros so declarados synchronized.
2004/2005 410

Apontamentos de Java

Se um thread invoca um mtodo sincronizado num objecto, esse objecto fica no estado locked (fechado) por esse thread. Se outro thread invocar um mtodo sincronizado para esse mesmo objecto, bloquear at o objecto ser liberto do lock. A invocao de um mtodo no sincronizado prossegue normalmente sem ser afectado por qualquer lock. Cada estado locked de um objecto existe por thread, por isso a invocao de um mtodo sincronizado num objecto de dentro de outro mtodo sincronizado que colocou esse objecto no estado locked prossegue sem bloqueamento, ficando o objecto liberto de lock quando o mtodo sincronizado mais externo retorna. Threads sincronizados so mutuamente exclusivos no tempo.

2004/2005

411

Apontamentos de Java

O exemplo da actualizao do saldo da mesma conta aps um depsito por mais que um thread poderia ser feito a partir da seguinte classe Conta: class Conta { private double saldo; public Conta( double depositoInicial ) { saldo = depositoInicial; } public synchronized double getSaldo() { return saldo; } public synchronized void deposito( double deposito ) { saldo += deposito; } } Se o valor de um campo pode mudar, no deve ser permitido ler esse valor ao mesmo tempo que outro thread o escreve, pois a leitura pode retornar um valor invlido. O acesso ao campo deve ser sincronizado e por isso o campo no deve poder ser acedido directamente fora da classe (campo pblico ou protected). O campo deve ser declarado private e deve existir um mtodo de acesso sincronizado ao valor desse campo.
2004/2005 412

Apontamentos de Java

Instrues sincronizadas Uma instruo sincronizada permite executar cdigo sincronizado que coloca um objecto no estado locked durante a execuo desse cdigo sem necessidade de invocar um mtodo sincronizado para esse objecto. synchronized (expr) { instrues } expr deve ser colocada dentro de parnteses e deve produzir uma referncia para um objecto. Em seguida mostra-se um exemplo que troca cada elemento negativo de um array pelo seu valor absoluto. public static void valorAbs(int [] a) { synchronized (a) { for (int i=0; i<a.length; i++) if (a[i] < 0) a[i] = -a[i]; } }
2004/2005 413

Apontamentos de Java

Para usar uma classe em que nenhum mtodo sincronizado num ambiente de mltiplos threads pode-se criar uma classe estendida (subclasse) e reescrever os mtodos que se pretendem que sejam sincronizados declarando-os sincronizados com chamadas aos respectivos mtodos da superclasse atravs da palavra-chave super.

2004/2005

414