Você está na página 1de 147

Maio/2009 http://www.lac.inpe.br/~rafael.

santos 1

Programao de Aplicaes Grficas
em Java
Rafael Santos
C
o
r
r
i
g
i
d
o

e
a
m
p
l
i
a
d
o

e
m
M
a
i
o
/
2
0
0
9
Maio/2009 http://www.lac.inpe.br/~rafael.santos 2
Tpicos

Brevssima introduo linguagem Java

rientao a o!"etos# criando classes

$riando aplicaes grficas em Java

Janelas# componentes e%istentes# eventos&

'screvendo componentes especficos

'%emplos
Maio/2009 http://www.lac.inpe.br/~rafael.santos 3
Tpicos

(eremos&&&

Alguns e%emplos prticos com c)digo *ue funciona&

Algumas implementaes de conceitos simples *ue podem ser


facilmente e%pandidos&

+o veremos&&&

,etal-es so!re a linguagem# componentes ou layouts muito


comple%os# colees# entrada e sada# JSP.Servlets&&&

(e"a -ttp/00111&lac&inpe&!r02rafael&santos para apresentaes


so!re outros t)picos3

Perguntas so !em4vindas3

'stou assumindo um con-ecimento !sico de Java3


Maio/2009 http://www.lac.inpe.br/~rafael.santos 4

Brevssima introduo linguagem Java
Maio/2009 http://www.lac.inpe.br/~rafael.santos 5
Linguagem Java

Simples# orientada a o!"etos&

5erdou muitos conceitos de $# $..# outras&

$)digo compilado para bytecodes# interpretado por uma


m*uina virtual&

Bytecodes compatveis entre sistemas operacionais6&

Base compatvel entre m*uinas virtuais&

AP7s dependem da finalidade# mas c)digo de neg)cio 8 porttil63

timi9ao de bytecodes mel-ora a performance&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 6
Princpios bsicos de orientao a objetos

Encapsulamento

Atri!utos e funes relevantes a um


domnio ou pro!lema so encapsulados
em uma classe de forma *ue/

Somente atri!utos e funes relevantes


se"am representados:

;ma interface para acesso se"a criada


para *ue usurios0desenvolvedores
ten-am acesso somente a funes e
atri!utos *ue podem ser acessados
diretamente&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 7
Princpios bsicos de orientao a objetos

Herana

;ma classe pode ser descrita de forma incremental usando


classes " e%istentes&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 8
Princpios bsicos de orientao a objetos

Polimorfismo

$lasses *ue tem relao de -erana podem ser processadas


de forma igual e transparente <com algumas condies=&

Relao -um-tipo-de&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 9
Princpios bsicos de orientao a objetos

nterfaces

$ontratos de implementao de funes&

Se a interface cont8m uma funo >/

+a interface esta funo 8 somente declarada&

+a classe ela deve ser escrita de forma completa&

$lasses *ue implementam uma mesma interface mant8m relao


-um-tipo-de&

$lasses podem implementar mais de uma interface&

!lasses "bstratas

Similares interfaces# mas com restries na -erana&

Podem ter m8todos a!stratos# atri!utos e m8todos *ue sero


-erdados&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 10
Princpios bsicos de orientao a objetos

!lasses so descritas em Java para representar modelos ou


conceitos&

#bjetos ou nst$ncias so criados ou instanciados a partir


das classes&

$riao pela palavra4c-ave new&

%efer&ncias so usadas para acesso aos o!"etos&

;ma classe pode ser usada para criar muitos o!"etos&

s atri!utos de cada o!"eto sero independentes&&&

&&& a no ser *ue ten-am sido declarados como estticos <compartil-ados=&

Alguns m8todos so ?mgicos@ <e%& construtores#


toString=
Maio/2009 http://www.lac.inpe.br/~rafael.santos 11
Princpios bsicos de orientao a objetos

$lasses podem ser organi9adas em pacotes&

'%istem regras de visi!ilidade *ue indicam *ue atri!utos e


m8todos so visveis&&&

'ntre classes do mesmo pacote&

'ntre classes de diferentes pacotes&

,entro de uma classe# todos os m8todos e atri!utos so


visveis&

$lasses podem# evidentemente# usar instAncias de outras


classes <e at8 dela mesma3=
Maio/2009 http://www.lac.inpe.br/~rafael.santos 12
Programando em Java

Tudo so classes <e%ceto atri!utos de tipos nativos=&

'ada 8 declarado independente <fora= de uma classe&

'strutura geral/
B& ,eclarao de pacotes:
C& 7mportao de classes e%ternas:
D& ,eclarao da classe e atri!utos <e%& e%tenso=&
E& ,eclarao de campos e m8todos&

Boas prticas/

$ada classe em um ar*uivo com nome igual e e%tenso &"ava:

Atri!utos declarados antes dos m8todos:

7ndentao e comentrios3
Maio/2009 http://www.lac.inpe.br/~rafael.santos 13
(m e)emplo de classe
package applets;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
public class Circulo
{
protected Color cor;
protected int x,y;
protected int raio;

public Circulo(Color c,int x,int y,int r)
{
cor c;
this.x x; this.y y; raio r;
!

public void "raw(Graphics2D g)
{
g.setColor(cor);
Ellipse2D.#loat circ new Ellipse2D.#loat(x$raio,y$raio,raio%2,raio%2);
g."raw(circ);
!

!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 14
(m e)emplo de classe

+o e%emplo anterior vimos&&&

,eclarao de pacote&

7mportao de classes e%ternas necessrias&

,eclarao da classe&

Atri!utos e classe com declaraes de visi!ilidade&

$onstrutor&

F8todos&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 15
(m e)emplo de classe com *erana
package applets;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
public class Circulo&ree'chi"o extends Circulo
{
protected Color cor&;
public Circulo&ree'chi"o(Color c,Color p,int x,int y,int r)
{
super(c,x,y,r);
cor& p;
!

public void "raw(Graphics2D g)
{
g.setColor(cor&);
Ellipse2D.#loat circ new Ellipse2D.#loat(x$raio,y$raio,raio%2,raio%2);
g.(ill(circ);
super."raw(g);
!

!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 16
(m e)emplo de classe com *erana

+o e%emplo anterior vimos&&&

,eclarao de classe *ue -erda de outra&

'%ecuo de construtor ancestral <super=&

Acesso a campos -erdados <diretamente=&

Acesso a m8todos -erdados <super=&

So!recarga de m8todos <m8todos com mesmo nome nas duas


classes=&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 17
E)emplo mais comple)o
package applets;
import java.awt.%;
import javax.swi'g.%;
public class )estaCirculo extends *Compo'e't
{
public Dime'sio' get&re(erre"+i,e()
{
return new Dime'sio'(2--,2--);
!
public void pai'tCompo'e't(Graphics g)
{
Graphics2D g2" (Graphics2D)g;
Circulo x new Circulo(Color.YELLOW,./,./,.-); x."raw(g2");
new Circulo(Color.BLUE,0/,0/,./)."raw(g2");
Circulo&ree'chi"o y new Circulo&ree'chi"o(Color.RED,Color.GREEN,1/,1/,2-); y."raw(g2");
Circulo , new Circulo&ree'chi"o(Color.RED,Color.BLUE,..-,..-,2-); ,."raw(g2");
!

public static void mai'(+tri'g34 args)
{
*#rame ( new *#rame();
(.a""(new )estaCirculo());
(.set5isi6le(true);
(.pac7();
(.setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 18
E)emplo mais comple)o

+o e%emplo anterior vimos&&&

Fais -erana&

F8todos ?mgicos@ <getPreferredSize#


paintComponent= so!reescritos&

F8todo ?mgico@ main&

7nstAncias anGnimas3

Polimorfismo <e%emplo !em simples=&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 19

$riando aplicaes grficas em Java
Maio/2009 http://www.lac.inpe.br/~rafael.santos 20
!omo criar aplica+es grficas em Java

A maioria das 7,'s permite a criao de interfaces grficas <aplicaes#


applets# dilogos= por composio visual&

Realmente Htil para layouts comple%os&

I importante sa!er como c)digo relacionado funciona para compreender o


*ue a 7,' escreve3
Maio/2009 http://www.lac.inpe.br/~rafael.santos 21
!riando uma janela grfica ,Frame-

Simples3 $riamos uma classe *ue -erda de JFrame&

construtor pode ser usado para montar a interface grfica&

A pr)pria classe pode ter um m8todo main *ue simplesmente cria


uma instAncia dela mesma&

(antagens do uso do mecanismo de -erana/

(rios m8todos de JFrames podem ser e%ecutados pela nossa


classe&

Podemos so!reescrever m8todos com comportamento especfico&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 22
!riando uma janela grfica ,Frame-
import javax.swi'g.*#rame;
public class &rimeira9plicacao extends *#rame
{
public &rimeira9plicacao()
{
super(:&rimeira 9plica;<o:);
!

public static void mai'(+tri'g34 args)
{
new &rimeira9plicacao();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 23
!riando uma janela grfica ,Frame-

Ao e%ecutar o c)digo# nada aparece3

Jaltou e%ecutar m8todos *ue definem aparKncia e


comportamento !sico da aplicao3

Reve"a o c)digo& *ue vocK ac-a *ue esta aplicao fa9L


Maio/2009 http://www.lac.inpe.br/~rafael.santos 24
!riando uma janela grfica ,Frame-
import javax.swi'g.*#rame;
public class +egu'"a9plicacao extends *#rame
{
public +egu'"a9plicacao()
{
super(:+egu'"a 9plica;<o:);
set+i,e(2--,2--);
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new +egu'"a9plicacao();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 25
!riando uma janela grfica ,Frame-
import javax.swi'g.*#rame;
public class )erceira9plicacao extends *#rame
{
public )erceira9plicacao(+tri'g t,int l,int a)
{
super(t);
set+i,e(l,a);
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new )erceira9plicacao(:*.:,.--,.--);
new )erceira9plicacao(:*2:,2--,.--);
new )erceira9plicacao(:*0:,0--,.--);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 26
!riando uma janela grfica ,Frame- .
import javax.swi'g.*#rame;
import javax.swi'g.*=a6el;
public class 9plicacaoComCompo'e'te extends *#rame
{
public 9plicacaoComCompo'e'te(+tri'g t,int l,int a)
{
super(t);
getCo'te't&a'e().a""(new *=a6el(:>e'sagem "e 6oas$vi'"as:));
set+i,e(l,a);
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new 9plicacaoComCompo'e'te(:>e'sagem:,.--,.--);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 27
!riando uma janela grfica ,Frame- .
import javax.swi'g.*#rame;
import javax.swi'g.*=a6el;
public class 9plicacaoComCompo'e'te2 extends *#rame
{
public 9plicacaoComCompo'e'te2(+tri'g t)
{
super(t);
getCo'te't&a'e().a""(new *=a6el(:>e'sagem "e 6oas$vi'"as:));
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new 9plicacaoComCompo'e'te2(:>e'sagem:);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 28
(sando componentes

'%istem vrios tipos de componentes de interfaces com


usurios

$ustomi9veis por c-amada a m8todos ou -erana&

Para criar aplicaes com interfaces grficas/

$riamos instAncias das classes dos componentes e as


adicionamos ao JFrame&

Fodificamos atri!utos destas instAncias&

Adicionamos estas instAncias interface grfica&

Registramos eventos *ue indicam o *ue fa9er se -ouver interao


com o componente&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 29
(sando componentes

$omo os componentes sero arran"ados e e%i!idos na


interface grficaL

Layouts&

'%istem vrios layouts simples# implementados como


classes&

Podemos implementar layouts diferente ou no usar nen-um3

Para usar um layout# e%ecutamos um m8todo para indicar o


layout do painel de conteHdo da aplicao&

layout tam!8m indica como os componentes sero


rearran"ados se o taman-o da "anela mudar&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 30
"lguns layouts grficos/ BorderLayout
import java.awt.%;
import javax.swi'g.%;
public class Ex?or"er=ayout extends *#rame
{
public Ex?or"er=ayout()
{
super(:Exemplo "e ?or"er=ayout:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(new ?or"er=ayout());
c.a""(new *=a6el(:@orte:),?or"er=ayout.NORTH);
c.a""(new *=a6el(:+ul:),?or"er=ayout.SOUTH);
c.a""(new *=a6el(:=este:),?or"er=ayout.EAST);
c.a""(new *=a6el(:8este:),?or"er=ayout.WEST);
*=a6el ce'tro new *=a6el(:Ce'tro:);
ce'tro.set#oregrou'"(Color.RED);
ce'tro.set?or"er(?or"er#actory.createEmptyBorder(.-,.-,.-,.-));
c.a""(ce'tro,?or"er=ayout.CENTER);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new Ex?or"er=ayout();
!
!
Norte
Sul
Oeste Leste Centro
Maio/2009 http://www.lac.inpe.br/~rafael.santos 31
"lguns layouts grficos/ FlowLayout
import java.awt.%;
import javax.swi'g.%;
public class Ex#low=ayout extends *#rame
{
public Ex#low=ayout()
{
super(:Exemplo "e #low=ayout:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(new #low=ayout());
c.a""(new *=a6el(:C.:));
c.a""(new *=a6el(:C2:));
c.a""(new *=a6el(:Compo'e'te 0:));
c.a""(new *=a6el(:C2:));
c.a""(new *=a6el(:Compo'e'te /:));
c.a""(new *=a6el(:C1:));
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new Ex#low=ayout();
!
!
$B $C $omponente D $E
$omponente M $N
Maio/2009 http://www.lac.inpe.br/~rafael.santos 32
"lguns layouts grficos/ GridLayout
import java.awt.%;
import javax.swi'g.%;
public class ExGri"=ayout extends *#rame
{
public ExGri"=ayout()
{
super(:Exemplo "e Gri"=ayout:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(new Gri"=ayout(0,0));
for(int i.;iAB;iCC)
{
*=a6el l new *=a6el(:C:Ci);
l.set?or"er(?or"er#actory.createLineBorder(Color.BLUE));
c.a""(l);
!
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new ExGri"=ayout();
!
!
$omp B $omp C $omp D
$omp E $omp M $omp N
$omp O $omp P
Maio/2009 http://www.lac.inpe.br/~rafael.santos 33
#utros layouts grficos

BoxLayout/ permite arran"ar componentes em uma Hnica


lin-a ou coluna&

CardLayout/ permite empil-ar con"untos de componentes na


direo Q&

GridBagLayout/ permite arran"o de componentes com


propores diferentes&

SpringLayout/ permite arran"ar componentes relativamente


uns aos outros&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 34
Layouts podem ser combinados0

Podemos adicionar uma instAncia de JPanel como um


componente&

'sta instAncia de JPanel pode ter seu pr)prio layout e ter


outros componentes&

FHltiplas com!inaes permitem alta fle%i!ilidade mas com


comple%idade de c)digo&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 35
Layouts podem ser combinados0
import java.awt.%;
import javax.swi'g.%;
public class Ex=ayout>isto extends *#rame
{
public Ex=ayout>isto()
{
super(:Exemplo "e =ayout >isto:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(new ?or"er=ayout());
c.a""(new *=a6el(:@orte:),?or"er=ayout.NORTH);
c.a""(new *=a6el(:Ce'tro:),?or"er=ayout.CENTER);
*&a'el pai'el new *&a'el(new #low=ayout());
pai'el.a""(new *=a6el(:C.:));
*=a6el c2 new *=a6el(:Compo'e'te 2:);
c2.set?or"er(?or"er#actory.createLineBorder(Color.RED));
pai'el.a""(c2);
pai'el.a""(new *=a6el(:C0:));
c.a""(pai'el,?or"er=ayout.SOUTH);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new Ex=ayout>isto();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 36
Layout nulo

Podemos simplesmente no usar layouts/


setLayout(null)&

,evemos posicionar cada componente manualmente# com


coordenadas em pi%els&

F8todos Hteis/

$omponentes/ getPreferredSize() e setBounds()

Painel/ getInsets()
Maio/2009 http://www.lac.inpe.br/~rafael.santos 37
Layout nulo
import java.awt.%;
import javax.swi'g.%;
public class Ex=ayout@ulo extends *#rame
{
public Ex=ayout@ulo()
{
super(:Exemplo "e =ayout @ulo:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(null);
*=a6el l. new *=a6el(:=a6el .:);
*=a6el l2 new *=a6el(:=a6el 2:);
*=a6el l0 new *=a6el(:=a6el 0:);
l..set?ac7grou'"(Color.WHITE); l..set8paDue(true);
l..set?ou'"s(-,-,.--,2-);
l2.set?ac7grou'"(Color.YELLOW); l2.set8paDue(true);
l2.set?ou'"s(2-,2-,.--,2-);
l0.set?ac7grou'"(Color.GREEN); l0.set8paDue(true);
l0.set?ou'"s(2-,2-,.--,2-);
c.a""(l.); c.a""(l2); c.a""(l0);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new Ex=ayout@ulo();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 38
Layout nulo
import java.awt.%;
import javax.swi'g.%;
public class Ex=ayout@ulo extends *#rame
{
public Ex=ayout@ulo()
{
super(:Exemplo "e =ayout @ulo:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(null);
*=a6el l. new *=a6el(:=a6el .:);
*=a6el l2 new *=a6el(:=a6el 2:);
*=a6el l0 new *=a6el(:=a6el 0:);
l..set?ac7grou'"(Color.WHITE); l..set8paDue(true);
l..set?ou'"s(-,-,.--,2-);
l2.set?ac7grou'"(Color.YELLOW); l2.set8paDue(true);
l2.set?ou'"s(2-,2-,.--,2-);
l0.set?ac7grou'"(Color.GREEN); l0.set8paDue(true);
l0.set?ou'"s(2-,2-,.--,2-);
c.a""(l.); c.a""(l2); c.a""(l0);
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
set+i,e(.2-,2-);
!

public static void mai'(+tri'g34 args)
{
new Ex=ayout@ulo();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 39
Layout nulo
import java.awt.%;
import javax.swi'g.%;
public class Ex=ayout@ulo extends *#rame
{
public Ex=ayout@ulo()
{
super(:Exemplo "e =ayout @ulo:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(null);
*=a6el l. new *=a6el(:=a6el .:);
*=a6el l2 new *=a6el(:=a6el 2:);
*=a6el l0 new *=a6el(:=a6el 0:);
l..set?ac7grou'"(Color.WHITE); l..set8paDue(true);
l..set?ou'"s(-,-,.--,2-);
l2.set?ac7grou'"(Color.YELLOW); l2.set8paDue(true);
l2.set?ou'"s(2-,2-,.--,2-);
l0.set?ac7grou'"(Color.GREEN); l0.set8paDue(true);
l0.set?ou'"s(2-,2-,.--,2-);
c.a""(l.); c.a""(l2); c.a""(l0);
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
E'sets i getE'sets();
set+i,e(.2-Ci.le(tCi.right,2-Ci.6ottomCi.top);
!
public static void mai'(+tri'g34 args)
{
new Ex=ayout@ulo();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 40
#utros componentes

(imos JLabels&

$ontroles simples como JButton# JComboBox#


JList# JMenu# JSlider# JSpinner#
JTextField# etc&

$ontroles comple%os como JColorChooser#


JFileChooser# JTable# JTree&

Containers top-level como JApplet# JDialog# JJrame&

utros containers como JPanel# JScrollPane#


JSplitPane# JTabbedPane# JInternalFrame&

+o d para ver e%emplos de uso de todos&&&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 41
!omponentes e Eventos

$omponentes so realmente Hteis para interao com


usurio&

Ruando alguma interao for feita com um componente#


devemos e%ecutar parte do c)digo&

Pro!lema com c)digo procedural/ interaes podem ocorrer


a *ual*uer momento3

Soluo/ uso de eventos&

$riamos os componentes# registramos eventos *ue podem ocorrer#


criamos m8todos para processar estes eventos&

'%istem vrios tipos de eventos&&&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 42
!omponentes e eventos/ JButton
import java.awt.%;
import javax.swi'g.%;
public class Ex*?utto'. extends *#rame
{
private *?utto' j.,j2;
private int co'ta"or -;
private *=a6el lCo'ta"or;

public Ex*?utto'.()
{
super(:Exemplo "e *?utto's e Eve'tos:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(new Gri"=ayout(.,0));
j. new *?utto'(:9"icio'a:);
j2 new *?utto'(:+u6trai:);
lCo'ta"or new *=a6el(::Cco'ta"or);
c.a""(j.); c.a""(j2); c.a""(lCo'ta"or);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!

public static void mai'(+tri'g34 args)
{
new Ex*?utto'.();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 43
!omponentes e eventos/ JButton
import java.awt.%;
import java.awt.eve't.%;
import javax.swi'g.%;
public class Ex*?utto'2 extends *#rame implements 9ctio'=iste'er
{
private *?utto' j.,j2;
private int co'ta"or -;
private *=a6el lCo'ta"or;
public Ex*?utto'2()
{
super(:Exemplo "e *?utto's e Eve'tos:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(new Gri"=ayout(.,0));
j. new *?utto'(:9"icio'a:);
j2 new *?utto'(:+u6trai:);
lCo'ta"or new *=a6el(::Cco'ta"or);
c.a""(j.); c.a""(j2); c.a""(lCo'ta"or);
j..a""9ctio'=iste'er(this); j2.a""9ctio'=iste'er(this);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
public void actio'&er(orme"(9ctio'Eve't e)
{
if (e.get+ource() j.) co'ta"orCC;
else if (e.get+ource() j2) co'ta"or$$;
lCo'ta"or.set)ext(::Cco'ta"or);
!
public static void mai'(+tri'g34 args) { new Ex*?utto'2(); !
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 44
!omponentes e eventos/ JButton e JTextArea
import java.awt.%;
import java.awt.eve't.%;
import javax.swi'g.%;
public class Ex)ext#iel" extends *#rame implements 9ctio'=iste'er
{
private *)ext#iel" valor;
private *?utto' calcula;
private *=a6el resulta"o;

public Ex)ext#iel"()
{
super(:Exemplo "e *)ext#iel"s e Eve'tos:);
Co'tai'er c getCo'te't&a'e();
c.set=ayout(new #low=ayout());
c.a""(new *=a6el(:#atorial "e :));
valor new *)ext#iel"(: .:);
valor.a""9ctio'=iste'er(this);
c.a""(valor);
calcula new *?utto'(::);
calcula.a""9ctio'=iste'er(this);
c.a""(calcula);
resulta"o new *=a6el(: .:);
c.a""(resulta"o);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 45
!omponentes e eventos/ JButton e JTextArea
public void actio'&er(orme"(9ctio'Eve't e)
{
int val E'teger.pareInt(valor.get)ext().trim());
double (at .;
for(int v.;vAval;vCC) (at % v;
resulta"o.set)ext(::C(at);
!
public static void mai'(+tri'g34 args)
{
new Ex)ext#iel"();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 46
!omponentes e eventos/ JRadioButton

Botes *ue podem ser com!inados em um


ButtonGroup&

Somente um !oto pode ser selecionado&


import java.awt.%;
import java.awt.eve't.%;
import javax.swi'g.%;
public class Ex*Fa"io?utto' extends *#rame implements 9ctio'=iste'er
{
private +tri'g34 image's {:eclipse-..p'g:,:eclipse-2.p'g:,:eclipse-0.p'g:,
:eclipse-2.p'g:,:eclipse-/.p'g:,:eclipse-1.p'g:,
:eclipse-G.p'g:,:eclipse-B.p'g:,:eclipse-H.p'g:,!;
private *=a6el imagem;
Maio/2009 http://www.lac.inpe.br/~rafael.santos 47
!omponentes e eventos/ JRadioButton
public Ex*Fa"io?utto'()
{
super(:Exemplo "e *Fa"io?utto's:);
II &ai'el com os 6otJes
*&a'el pai'el new *&a'el(new Gri"=ayout(0,0));
?utto'Group grupo new ?utto'Group();
*Fa"io?utto'34 6otJes new *Fa"io?utto'3H4;
for(int 6-;6AH;6CC)
{
6otJes364 new *Fa"io?utto'(image's364);
6otJes364.a""9ctio'=iste'er(this);
grupo.a""(6otJes364);
pai'el.a""(6otJes364);
!
II KE
Co'tai'er c getCo'te't&a'e();
c.a""(pai'el,?or"er=ayout.SOUTH);
imagem new *=a6el();
imagem.set&re(erre"+i,e(new Dime'sio'(.--,.--));
imagem.setLori,o'tal9lig'me't(+wi'gCo'sta'ts.CENTER);
c.a""(imagem,?or"er=ayout.CENTER);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 48
!omponentes e eventos/ JRadioButton
public void actio'&er(orme"(9ctio'Eve't e)
{
*Fa"io?utto' r6 (*Fa"io?utto')e.get+ource();
EmageEco' Mco'e new EmageEco'(r6.get9ctio'Comma'"());
imagem.setEco'(Mco'e);
!

public static void mai'(+tri'g34 args)
{
new Ex*Fa"io?utto'();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 49
!omponentes e eventos/ JSlider
import java.awt.%;
import java.util.Lashta6le;
import javax.swi'g.%;
import javax.swi'g.eve't.%;
public class Ex+li"ers extends *#rame implements Cha'ge=iste'er
{
private *+li"er 'aipe,(ace;
private *=a6el carta;

public Ex+li"ers()
{
super(:Exemplo "e *+li"ers:);
Co'tai'er c getCo'te't&a'e();
cria+li"er@aipes(); cria+li"er#aces();
*&a'el co'trole new *&a'el(new Gri"=ayout(2,.));
co'trole.a""('aipe); co'trole.a""((ace);
carta new *=a6el();
carta.set&re(erre"+i,e(new Dime'sio'(HHC2-,.02C2-));
carta.setLori,o'tal9lig'me't(+wi'gCo'sta'ts.CENTER);
c.a""(co'trole,?or"er=ayout.SOUTH);
c.a""(carta,?or"er=ayout.CENTER);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 50
!omponentes e eventos/ JSlider
private void cria+li"er@aipes()
{
'aipe new *+li"er(-,0,-);
Lashta6leAE'teger,*=a6elN la6els new Lashta6leAE'teger,*=a6elN();
la6els.put(new E'teger(-),new *=a6el(:&aus:));
la6els.put(new E'teger(.),new *=a6el(:8uros:));
la6els.put(new E'teger(2),new *=a6el(:Copas:));
la6els.put(new E'teger(0),new *=a6el(:Espa"as:));
'aipe.set=a6el)a6le(la6els);
'aipe.set&ai't=a6els(true); 'aipe.set&ai't)ic7s(true); 'aipe.set+'ap)o)ic7s(true);
'aipe.set?or"er(?or"er#actory.createTit!edBorder(:@aipe:));
'aipe.a""Cha'ge=iste'er(this);
!
private void cria+li"er#aces()
{
(ace new *+li"er(-,.2,-);
Lashta6leAE'teger,*=a6elN la6els new Lashta6leAE'teger,*=a6elN();
for(int l2;lA..;lCC) la6els.put(new E'teger(l$.),new *=a6el(::Cl));
la6els.put(new E'teger(-),new *=a6el(:9:));
la6els.put(new E'teger(.-),new *=a6el(:*:));
la6els.put(new E'teger(..),new *=a6el(:O:));
la6els.put(new E'teger(.2),new *=a6el(:P:));
(ace.set=a6el)a6le(la6els);
(ace.set&ai't=a6els(true); (ace.set&ai't)ic7s(true); (ace.set+'ap)o)ic7s(true);
(ace.set?or"er(?or"er#actory.createTit!edBorder(:#ace:));
(ace.a""Cha'ge=iste'er(this);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 51
!omponentes e eventos/ JSlider
public void stateCha'ge"(Cha'geEve't e)
{
+tri'g 'ome +tri'g."ormat(:Q"$Q-2".p'g:,
new 86ject34{'aipe.get5alue()C.,(ace.get5alue()C.!);
EmageEco' Mco'e new EmageEco'('ome);
carta.setEco'(Mco'e);
!

public static void mai'(+tri'g34 args)
{
new Ex+li"ers();
!
!
Jormato dos nomes dos ar*uivos das cartas 8 ST#B#C#DU4STT#TB#TC&&BCU&png
Maio/2009 http://www.lac.inpe.br/~rafael.santos 52
!omponentes e eventos/ JSpinner
import java.awt.%;
import javax.swi'g.%;
import javax.swi'g.eve't.%;
public class Ex+pi''ers extends *#rame implements Cha'ge=iste'er
{
private *+pi''er 'aipe,(ace;
private *=a6el carta;

public Ex+pi''ers()
{
super(:Exemplo "e *+pi''ers:);
Co'tai'er c getCo'te't&a'e();
cria+pi''er@aipes();
cria+pi''er#aces();
*&a'el co'trole new *&a'el(new Gri"=ayout(2,.));
co'trole.a""('aipe); co'trole.a""((ace);
carta new *=a6el();
carta.set&re(erre"+i,e(new Dime'sio'(HHC2-,.02C2-));
carta.setLori,o'tal9lig'me't(+wi'gCo'sta'ts.CENTER);
c.a""(co'trole,?or"er=ayout.SOUTH);
c.a""(carta,?or"er=ayout.CENTER);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 53
!omponentes e eventos/ JSpinner
private void cria+pi''er@aipes()
{
+tri'g34 'aipes {:&aus:,:8uros:,:Copas:,:Espa"as:!;
+pi''er=ist>o"el mo"elo new +pi''er=ist>o"el('aipes);
'aipe new *+pi''er(mo"elo);
'aipe.set?or"er(?or"er#actory.createTit!edBorder(:@aipe:));
'aipe.a""Cha'ge=iste'er(this);
!
private void cria+pi''er#aces()
{
+tri'g34 (aces {:9:,:2:,:0:,:2:,:/:,:1:,:G:,:B:,:H:,:.-:,:*:,:O:,:P:!;
+pi''er=ist>o"el mo"elo new +pi''er=ist>o"el((aces);
(ace new *+pi''er(mo"elo);
(ace.set?or"er(?or"er#actory.createTit!edBorder(:#ace:));
(ace.a""Cha'ge=iste'er(this);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 54
!omponentes e eventos/ JSpinner
public void stateCha'ge"(Cha'geEve't e)
{
int i@aipe $.;
char s@aipe 'aipe.get5alue().to+tri'g().char9t(-);
i@aipe :&8CE:.i'"ex8((s@aipe);
int i#ace $.;
char s#ace (ace.get5alue().to+tri'g().char9t(-);
i#ace :9202/1GBH.*OP:.i'"ex8((s#ace);
+tri'g 'ome +tri'g."ormat(:Q"$Q-2".p'g:,new 86ject34{i@aipeC.,i#aceC.!);
EmageEco' Mco'e new EmageEco'('ome);
carta.setEco'(Mco'e);
!

public static void mai'(+tri'g34 args)
{
new Ex+pi''ers();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 55
!omponentes e eventos/ JList
import java.awt.%;
import javax.swi'g.%;
import javax.swi'g.eve't.%;
public class Ex=ist extends *#rame implements =ist+electio'=iste'er
{
private +tri'g34 image's {:eclipse-..p'g:,:eclipse-2.p'g:,:eclipse-0.p'g:,
:eclipse-2.p'g:,:eclipse-/.p'g:,:eclipse-1.p'g:,
:eclipse-G.p'g:,:eclipse-B.p'g:,:eclipse-H.p'g:!;
private *=ist lista;
private *=a6el imagem;
public Ex=ist()
{
super(:Exemplo "e *=ists e Eve'tos:);
Co'tai'er c getCo'te't&a'e(); c.set=ayout(new Gri"=ayout(.,2));
lista new *=ist(image's);
lista.set+electio'>o"e(=ist+electio'>o"el.SINGLE_SELECTION);
lista.set=ayout8rie'tatio'(*=ist.#ERTICAL);
lista.set5isi6leFowCou't(2);
*+croll&a'e pai'el&ara=ista new *+croll&a'e(lista);
lista.a""=ist+electio'=iste'er(this);
imagem new *=a6el();
imagem.setLori,o'tal9lig'me't(+wi'gCo'sta'ts.CENTER);
c.a""(pai'el&ara=ista); c.a""(imagem);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 56
!omponentes e eventos/ JList
public void valueCha'ge"(=ist+electio'Eve't e)
{
if (e.get5alueEs9"justi'g()) return;
int Dual lista.get+electe"E'"ex();
EmageEco' Mco'e new EmageEco'(image's3Dual4);
imagem.setEco'(Mco'e);
!

public static void mai'(+tri'g34 args)
{
new Ex=ist();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 57
!omponentes e eventos/ JMenu
import java.awt.%;
import java.awt.eve't.%;
import javax.swi'g.%;
public class Ex#ileChooser extends *#rame implements 9ctio'=iste'er
{
private *>e'uEtem a6re&@G,a6re*&G,a6reGE#;
private *=a6el imagem;
private *+croll&a'e scrollEmagem;
public Ex#ileChooser()
{
super(:Exemplo "e *>e'us e *#ileChooser:);
Co'tai'er c getCo'te't&a'e();
*>e'u?ar me'u?ar new *>e'u?ar();
II Criamos o me'u :96re:...
*>e'u me'u96re new *>e'u(:96re:);
a6re&@G new *>e'uEtem(:96re &@G:); me'u96re.a""(a6re&@G); a6re&@G.a""9ctio'=iste'er(this);
a6re*&G new *>e'uEtem(:96re *&G:); me'u96re.a""(a6re*&G); a6re*&G.a""9ctio'=iste'er(this);
a6reGE# new *>e'uEtem(:96re GE#:); me'u96re.a""(a6reGE#); a6reGE#.a""9ctio'=iste'er(this);
me'u?ar.a""(me'u96re);
set*>e'u?ar(me'u?ar);
imagem new *=a6el(); imagem.setLori,o'tal9lig'me't(+wi'gCo'sta'ts.CENTER);
scrollEmagem new *+croll&a'e(imagem,*+croll&a'e.#ERTICAL_SCROLLBAR_ALWAYS,
*+croll&a'e.HORI$ONTAL_SCROLLBAR_ALWAYS);
scrollEmagem.set&re(erre"+i,e(new Dime'sio'(0--,0--));
c.a""(scrollEmagem);
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 58
!omponentes e eventos/ JMenu
public void actio'&er(orme"(9ctio'Eve't e)
{
*#ileChooser (c new *#ileChooser();
if (e.get+ource() a6re&@G) (c.set#ile#ilter(new #iltro&@G());
if (e.get+ource() a6re*&G) (c.set#ile#ilter(new #iltro*&G());
if (e.get+ource() a6reGE#) (c.set#ile#ilter(new #iltroGE#());
int retor'o (c.show8pe'Dialog(this);
if (retor'o *#ileChooser.A%%RO#E_O%TION)
{
EmageEco' Mco'e new EmageEco'((c.get+electe"#ile().to+tri'g());
imagem.setEco'(Mco'e);
scrollEmagem.set&re(erre"+i,e(new Dime'sio'(0--,0--));
scrollEmagem.revali"ate();
!
!

public static void mai'(+tri'g34 args)
{
new Ex#ileChooser();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 59
!omponentes e eventos/ JMenu
import java.io.#ile;
import javax.swi'g.(ilechooser.#ile#ilter;
public class #iltro*&G extends #ile#ilter
{
public boolean accept(#ile ()
{
if ((.isDirectory()) return true;
if ((.to+tri'g().toKpperCase().e'"sRith(:.*&G:)) return true;
if ((.to+tri'g().toKpperCase().e'"sRith(:.*&EG:)) return true;
return false;
!
public +tri'g getDescriptio'()
{
return :9rDuivos *&EG:;
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 60
!omponentes e eventos/ JMenu
Maio/2009 http://www.lac.inpe.br/~rafael.santos 61
JInternalFrame e 12

Podemos ter vrias frames internas em uma mesma aplicao/


Multiple Document Interface&
import java.awt.Emage;
import javax.swi'g.%;
public class EmagemE# extends *E'ter'al#rame
{
public EmagemE#(+tri'g 'ame,float escala,EmageEco' Mco'e)
{
II Fesi,a6le, closa6le, maximi,a6le e ico'i(ia6le.
super('ame,true,true,true,true);
II 5amos mu"ar a escala "a imagemS
float wi"th Mco'e.getEco'Ri"th();
float height Mco'e.getEco'Leight();
wi"th % escala; height % escala;
Mco'e new EmageEco'(Mco'e.getEmage().get+cale"E'sta'ce((int)wi"th,(int)height,
Emage.SCALE_S&OOTH));
II >ostra em um *=a6el.
getCo'te't&a'e().a""(new *+croll&a'e(new *=a6el(Mco'e)));
pac7();
set5isi6le(true);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 62
JInternalFrame e 12
import java.awt.%;
import java.awt.eve't.%;
import java.awt.image.?u((ere"Emage;
import java.io.E8Exceptio';
import java.'et.%;
import javax.imageio.EmageE8;
import javax.swi'g.%;
public class >ostra>ultiplasEmage's extends *#rame implements 9ctio'=iste'er
{
private *Des7top&a'e "es7top;
private *)ext#iel" url;
private *Com6o?ox escala;
private +tri'g34 escalas {:-.-.:,:-.-/:,:-..:,:-.2:,:-./:,:.:,:2:,:/:,:.-:,:2-:!;

Maio/2009 http://www.lac.inpe.br/~rafael.santos 63
JInternalFrame e 12
public >ostra>ultiplasEmage's()
{
"es7top new *Des7top&a'e();
*&a'el co'trole new *&a'el(new #low=ayout(#low=ayout.LE'T));
co'trole.a""(new *=a6el(:KF= "a EmagemT:));
url new *)ext#iel"(/-);
url.a""9ctio'=iste'er(this);

url.set)ext(:httpTIIwww.lac.i'pe.6rIUra(ael.sa'tosI*avaI*9EI"atasetsIpyrami"s.jpg:);
co'trole.a""(url);
co'trole.a""(new *=a6el(:EscalaT:));
escala new *Com6o?ox(escalas);
escala.set+electe"E'"ex(/);
co'trole.a""(escala);
getCo'te't&a'e().a""(co'trole,?or"er=ayout.NORTH);
getCo'te't&a'e().a""("es7top,?or"er=ayout.CENTER);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
set+i,e(B--,1--);
set5isi6le(true);
!
public static void mai'(+tri'g34 args)
{
new >ostra>ultiplasEmage's();
!

!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 64
JInternalFrame e 12
public void actio'&er(orme"(9ctio'Eve't e)
{
?u((ere"Emage imagem null; boolean carrega"a true;
try
{
imagem EmageE8.read(new KF=(url.get)ext()));
!
catch (>al(orme"KF=Exceptio' e.)
{
*8ptio'&a'e.(o)&ea*eDia!o*(this,:Erro 'a KF=T :Curl.get)ext(),
:Erro 'a KF=:,*8ptio'&a'e.ERROR_&ESSAGE); carrega"a false;
!
catch (E8Exceptio' e.)
{
*8ptio'&a'e.(o)&ea*eDia!o*(this,:Erro "e E8T :Ce..get>essage(),
:Erro "e E8:,*8ptio'&a'e.ERROR_&ESSAGE); carrega"a false;
!
if (carrega"a)
{
if (imagem null)
*8ptio'&a'e.(o)&ea*eDia!o*(this,:@<o po"e ler :Curl.get)ext(),
:@<o po"e ler:,*8ptio'&a'e.ERROR_&ESSAGE);
else
{
float usaEscala #loat.pare'!oat(escalas3escala.get+electe"E'"ex()4);
EmagemE# i new EmagemE#(url.get)ext(),usaEscala,new EmageEco'(imagem));
"es7top.a""(i);
!
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 65
JInternalFrame e 12
Maio/2009 http://www.lac.inpe.br/~rafael.santos 66
Applets

Aplicaes com interface grfica *ue so e%ecutadas em um


navegador&

Fais seguras <para o cliente= do *ue aplicaes&

Fenos fle%veis do *ue aplicaes <sandbox=&

7d8ia/ apresentao de dados *ue so o!tidos do servidor&

VKm m8todos *ue devem ser so!reescritos# em particular/

init()/ iniciali9a a applet&

paint(Graphics g): fa9 com *ue a applet se"a


pintada0desen-ada&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 67
Applets
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swi'g.*9pplet;
public class 9pplet. extends *9pplet
{
public void pai't(Graphics g)
{
Graphics2D g2" (Graphics2D)g;
g2".setColor(Color.BLUE);
g2"."raw+tri'g(:8lV, >u'"o:,/,./);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 68
Applets
import java.awt.%;
import javax.swi'g.*9pplet;
public class 9pplet2 extends *9pplet
{
public void pai't(Graphics g)
{
Graphics2D g2" (Graphics2D)g;
g2".setFe'"eri'gLi't(Fe'"eri'gLi'ts.+EY_ANTIALIASING,
Fe'"eri'gLi'ts.#ALUE_ANTIALIAS_ON);
g2".setColor(Color.BLUE);
g2".set#o't(new #o't(:+a's+eri(:,#o't.ITALIC,22));
g2"."raw+tri'g(:)exto:,/,2/);
g2".set#o't(new #o't(:+eri(:,#o't.ITALICW#o't.BOLD,01));
g2"."raw+tri'g(:)exto:,/,1/);
g2".set#o't(new #o't(:Dialog:,#o't.%LAIN,2B));
g2"."raw+tri'g(:)exto:,/,../);
g2".set#o't(new #o't(:DialogE'put:,#o't.%LAIN,2B));
g2"."raw+tri'g(:)exto:,/,.G/);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 69
Applets
import java.awt.%;
import java.util.Lashta6le;
import javax.swi'g.%;
import javax.swi'g.eve't.%;
public class 9pplet+li"ers extends *9pplet implements Cha'ge=iste'er
{
private *+li"er 'aipe,(ace;
private *=a6el carta;

public void i'it()
{
Co'tai'er c getCo'te't&a'e();
cria+li"er@aipes();
cria+li"er#aces();
*&a'el co'trole new *&a'el(new Gri"=ayout(2,.));
co'trole.a""('aipe); co'trole.a""((ace);
carta new *=a6el();
carta.set&re(erre"+i,e(new Dime'sio'(HHC2-,.02C2-));
carta.setLori,o'tal9lig'me't(+wi'gCo'sta'ts.CENTER);
c.a""(co'trole,?or"er=ayout.SOUTH);
c.a""(carta,?or"er=ayout.CENTER);
set+i,e(2--,0--);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 70
Applets
private void cria+li"er@aipes()
{
'aipe new *+li"er(-,0,-);
Lashta6leAE'teger,*=a6elN la6els new Lashta6leAE'teger,*=a6elN();
la6els.put(new E'teger(-),new *=a6el(:&aus:));
la6els.put(new E'teger(.),new *=a6el(:8uros:));
la6els.put(new E'teger(2),new *=a6el(:Copas:));
la6els.put(new E'teger(0),new *=a6el(:Espa"as:));
'aipe.set=a6el)a6le(la6els);
'aipe.set&ai't=a6els(true); 'aipe.set&ai't)ic7s(true); 'aipe.set+'ap)o)ic7s(true);
'aipe.set?or"er(?or"er#actory.createTit!edBorder(:@aipe:));
'aipe.a""Cha'ge=iste'er(this);
!
private void cria+li"er#aces()
{
(ace new *+li"er(-,.2,-);
Lashta6leAE'teger,*=a6elN la6els new Lashta6leAE'teger,*=a6elN();
for(int l2;lA..;lCC) la6els.put(new E'teger(l$.),new *=a6el(::Cl));
la6els.put(new E'teger(-),new *=a6el(:9:));
la6els.put(new E'teger(.-),new *=a6el(:*:));
la6els.put(new E'teger(..),new *=a6el(:O:));
la6els.put(new E'teger(.2),new *=a6el(:P:));
(ace.set=a6el)a6le(la6els);
(ace.set&ai't=a6els(true); (ace.set&ai't)ic7s(true); (ace.set+'ap)o)ic7s(true);
(ace.set?or"er(?or"er#actory.createTit!edBorder(:#ace:));
(ace.a""Cha'ge=iste'er(this);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 71
Applets
public void stateCha'ge"(Cha'geEve't e)
{
+tri'g 'ome +tri'g."ormat(:Q"$Q-2".p'g:,
new 86ject34{'aipe.get5alue()C.,(ace.get5alue()C.!);
EmageEco' Mco'e new EmageEco'('ome);
carta.setEco'(Mco'e);
!

!
nde est a imagemL ,everia estar em uma ;RW3
Image i1 =
new ImageIcon(getClass()get!esource(nome))getImage();
Maio/2009 http://www.lac.inpe.br/~rafael.santos 72

$riando +ovos $omponentes
Maio/2009 http://www.lac.inpe.br/~rafael.santos 73
!riando novos componentes

Pode ser necessrio criar novos componentes para e%i!io


ou entrada de informaes especiali9adas ou para e%i!ir
comportamento diferente dos componentes " e%istentes&

,uas a!ordagens/

$riar componentes *ue -erdam de outros# " e%istentes&

$riar novos componentes a partir de um componente gen8rico&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 74
!riando 'ovos !omponentes 3rficos

Passos ;sando 5erana <nem todos so o!rigat)rios=/

5erdar de classe *ue tem comportamento semel-ante&

+o construtor# c-amar construtor ancestral# iniciali9ar atri!utos


relevantes e modificar comportamento atrav8s de m8todos&

So!reescrever m8todos
get{Maximum,Minimum,Preferred}Size()&

So!reescrever paintComponent()&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 75
!riando 'ovos !omponentes 3rficos

'%emplo/ pea para Reversi&

Boto com aparKncia e comportamento diferente&

'%istem vrias maneiras de implementar&&&


package reversi;
import java.awt.Color;
import java.awt.Dime'sio';
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swi'g.*?utto';
public class &eca extends *?utto'
{
private static int taman(o 12;
private Esta"o esta"o;
public &eca()
{
super();
esta"o Esta"o.#A$IO;
!
package reversi;
public enum Esta"o { #A$IO, %RETO, BRANCO !
Maio/2009 http://www.lac.inpe.br/~rafael.santos 76
!riando 'ovos !omponentes 3rficos
public Dime'sio' get>aximum+i,e() { return get&re(erre"+i,e(); !
public Dime'sio' get>i'imum+i,e() { return get&re(erre"+i,e(); !
public Dime'sio' get&re(erre"+i,e() { return new Dime'sio'(taman(o,taman(o); !
protected void pai'tCompo'e't(Graphics g)
{
super.pai'tCompo'e't(g);
Graphics2D g2" (Graphics2D)g;
II @<o pree'chemos 6otJes va,ios.
if (esta"o X Esta"o.#A$IO)
{
if (esta"o Esta"o.BRANCO) g2".setColor(Color.WHITE);
else if (esta"o Esta"o.%RETO) g2".setColor(Color.BLAC+);
g2".(ill8val(1,1,getRi"th()$.2,getLeight()$.2);
!
II &i'tamos a 6or"a "a pe;a i'"epe'"e'te "o esta"o.
g2".setColor(Color.GRAY);
g2"."raw8val(1,1,getRi"th()$.2,getLeight()$.2);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 77
!riando 'ovos !omponentes 3rficos

Para mostrar a interface grfica precisamos de/

$lasse Peca# *ue representa !otes para o "ogo&

$lasse Tabuleiro# *ue 8 um con"unto P%P de peas&

$lasse Jogo# *ue 8 a aplicao *ue usa Tabuleiro&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 78
!riando 'ovos !omponentes 3rficos
package reversi;
import java.awt.Gri"=ayout;
import javax.swi'g.*&a'el;
public class )a6uleiro extends *&a'el
{
private &eca3434 ta6uleiro;

public )a6uleiro()
{
set=ayout(new Gri"=ayout(B,B));
ta6uleiro new &eca3B43B4;
for(int l-;lAB;lCC)
for(int c-;cAB;cCC)
{
ta6uleiro3c43l4 new &eca();
a""(ta6uleiro3c43l4);
!
ta6uleiro304304.setEsta"o(Esta"o.BRANCO);
ta6uleiro324324.setEsta"o(Esta"o.BRANCO);
ta6uleiro304324.setEsta"o(Esta"o.%RETO);
ta6uleiro324304.setEsta"o(Esta"o.%RETO);
!

!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 79
!riando 'ovos !omponentes 3rficos
package reversi;
import javax.swi'g.*#rame;
public class *ogo extends *#rame
{
public *ogo()
{
super(:Feversi:);
getCo'te't&a'e().a""(new )a6uleiro());
pac7();
set5isi6le(true);
setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
public static void mai'(+tri'g34 args)
{
new *ogo();
!
!
D pra melhorar a aparncia?
Maio/2009 http://www.lac.inpe.br/~rafael.santos 80
!riando 'ovos !omponentes 3rficos
package reversi;
import java.awt.%;
import java.awt.geom.&oi't2D;
import javax.swi'g.*?utto';
public class &eca>elhor extends *?utto'
{
private static int taman(o 12;
private Esta"o esta"o;
public &eca>elhor()
{
super();
set"ackground(new Color(#$%&$$%$));
esta"o Esta"o.#A$IO;
!

public void setEsta"o(Esta"o e) { esta"o e; !

public Dime'sio' get>aximum+i,e() { return get&re(erre"+i,e(); !
public Dime'sio' get>i'imum+i,e() { return get&re(erre"+i,e(); !
public Dime'sio' get&re(erre"+i,e() { return new Dime'sio'(taman(o,taman(o); !
Maio/2009 http://www.lac.inpe.br/~rafael.santos 81
!riando 'ovos !omponentes 3rficos
protected void pai'tCompo'e't(Graphics g)
{
super.pai'tCompo'e't(g);
Graphics2D g2" (Graphics2D)g;
g&dset!endering'int(!endering'intsKEY_ANTIALIASING%
!endering'intsVALUE_ANTIALIAS_ON);
II @<o pree'chemos 6otJes va,ios.
if (esta"o X Esta"o.#A$IO)
{
Color34 cores new Color324;
if (esta"o Esta"o.BRANCO)
{ cores3-4 Color.WHITE; cores3.4 new Color(22-,22-,22-); !
else if (esta"o Esta"o.%RETO)
{ cores3-4 new Color(.--,.--,.--); cores3.4 Color.BLAC+; !
!adial(radient)aint paint =
new !adial(radient)aint(new )oint&**ouble(tamanho+,%tamanho+,)%
&-tamanho+,%new float./0$f%1f1%cores);
g&dset)aint(paint);
g2".(ill8val(1,1,getRi"th()$.2,getLeight()$.2);
!
II &i'tamos a 6or"a "a pe;a i'"epe'"e'te "o esta"o.
g2".setColor(new Color(2-,./-,-));
g2".set+tro7e(new ?asic+tro7e(0());
g2"."raw8val(1,1,getRi"th()$.2,getLeight()$.2);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 82
!riando 'ovos !omponentes 3rficos

Basta usar PecaMelhor no lugar de Peca em


Tabuleiro&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 83
!riando 'ovos !omponentes 3rficos
...
public class &ecaEco'e extends *?utto'
{
private static int taman(o 12;
private Esta"o esta"o;
private Emage i.,i2;
public &ecaEco'e()
{
super();
setContent2rea3illed(false);
esta"o Esta"o.#A$IO;
i1 = new ImageIcon(getClass()get!esource(4+5prites+sbob6pg4))getImage();
i& = new ImageIcon(getClass()get!esource(4+5prites+hulk6pg4))getImage();
! ...
protected void pai'tCompo'e't(Graphics g)
{
super.pai'tCompo'e't(g);
Graphics2D g2" (Graphics2D)g;
II @<o pree'chemos 6otJes va,ios.
if (esta"o X Esta"o.#A$IO)
{
if (estado == 7stadoBRANCO) g&ddrawImage(i1%$%$%null);
else if (estado == 7stadoPRETO) g&ddrawImage(i&%$%$%null);
!
!...
Maio/2009 http://www.lac.inpe.br/~rafael.santos 84
!riando 'ovos !omponentes 3rficos
Maio/2009 http://www.lac.inpe.br/~rafael.santos 85
!riando novos componentes

5erdando de JComponent/

Fostra duas !arras de larguras proporcionais&


2
!"2
!
import java.awt.%;
import javax.swi'g.*Compo'e't;
public class ?arra&roporcio'al extends *Compo'e't
{
private int x.,x2;
public ?arra&roporcio'al(int x.,int x2)
{
this.x. x.; this.x2 x2;
!
protected void pai'tCompo'e't(Graphics g)
{
float w getRi"th()%x.I(x.Cx2);
g.setColor(Color.BLUE);
g.(illFect(-,-,(int)w,getLeight());
g.setColor(Color.RED);
g.(illFect((int)w,-,getRi"th(),getLeight());
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 86
!riando novos componentes
import javax.swi'g.*9pplet;
public class 9pplet?arra&roporcio'al extends *9pplet
{
public void i'it()
{
?arra&roporcio'al 6 new ?arra&roporcio'al(G/,2/);
getCo'te't&a'e().a""(6);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 87
!riando novos componentes
import java.awt.?or"er=ayout;
import javax.swi'g.*9pplet;
public class 9pplet?arra&roporcio'al2 extends *9pplet
{
public void i'it()
{
?arra&roporcio'al 6@ new ?arra&roporcio'al(G/,2/);
?arra&roporcio'al 6+ new ?arra&roporcio'al(HH,.);
?arra&roporcio'al 6E new ?arra&roporcio'al(HH,HB);
?arra&roporcio'al 6R new ?arra&roporcio'al(0,2);
?arra&roporcio'al 6C new ?arra&roporcio'al(.2-,..-);
getCo'te't&a'e().set=ayout(new ?or"er=ayout());
getCo'te't&a'e().a""(6@,?or"er=ayout.NORTH);
getCo'te't&a'e().a""(6+,?or"er=ayout.SOUTH);
getCo'te't&a'e().a""(6E,?or"er=ayout.EAST);
getCo'te't&a'e().a""(6R,?or"er=ayout.WEST);
getCo'te't&a'e().a""(6C,?or"er=ayout.CENTER);
!
!
Pro!lemas com dimensionamento de componentes3
,evemos garantir dimenses preferidas# mnimas e0ou
m%imas&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 88
!riando novos componentes

$omponentes podem processar seus pr)prios eventos&


import java.awt.%;
import java.awt.eve't.%;
import java.util.9rray=ist;
import javax.swi'g.*Compo'e't;
public class Compo'e'te&araFa6iscos extends *Compo'e't
implements >ouse=iste'er,>ouse>otio'=iste'er
{
private 9rray=istA&oi'tN po'tos;
private int si,e B; private int hal(si,e si,eI2;
private Color cor;

public Compo'e'te&araFa6iscos(Color cor)
{
this.cor cor;
po'tos new 9rray=istA&oi'tN(.-22);
a"">ouse=iste'er(this);
a"">ouse>otio'=iste'er(this);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 89
!riando novos componentes
protected void pai'tCompo'e't(Graphics g)
{
Graphics2D g2" (Graphics2D)g;
g2".setColor(Color.WHITE);
g2".(illFect(-,-,getRi"th(),getLeight());
g2".setFe'"eri'gLi't(Fe'"eri'gLi'ts.+EY_ANTIALIASING,
Fe'"eri'gLi'ts.#ALUE_ANTIALIAS_ON);
g2".setColor(cor);
for(&oi't pTpo'tos)
g2".(ill8val(p.x$hal(si,e,p.y$hal(si,e,si,e,si,e);
!

public void mouse&resse"(>ouseEve't e)
{
po'tos.a""(e.get&oi't()); repai't();
!
public void mouseDragge"(>ouseEve't e)
{
po'tos.a""(e.get&oi't()); repai't();
!
public void mouseFelease"(>ouseEve't e) { ! II @8&
public void mouseClic7e"(>ouseEve't e) { ! II @8&
public void mouseE'tere"(>ouseEve't e) { ! II @8&
public void mouseExite"(>ouseEve't e) { ! II @8&
public void mouse>ove"(>ouseEve't e) { ! II @8&
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 90
!riando novos componentes
import java.awt.%;
import javax.swi'g.%;
public class 9ppletFa6iscos extends *9pplet
{
public void i'it()
{
Compo'e'te&araFa6iscos c. new Compo'e'te&araFa6iscos(Color.RED);
c..set?or"er(?or"er#actory.createLineBorder(Color.RED));
Compo'e'te&araFa6iscos c2 new Compo'e'te&araFa6iscos(Color.BLUE);
c2.set?or"er(?or"er#actory.createLineBorder(Color.BLUE));
getCo'te't&a'e().set=ayout(new Gri"=ayout(.,2));
getCo'te't&a'e().a""(c.);
getCo'te't&a'e().a""(c2);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 91
!riando novos componentes

$omponentes podem produ9ir e consumir seus pr)prios


eventos&
import java.awt.Color;
import java.awt.Graphics;
import java.awt.eve't.9ctio'Eve't;
import java.awt.eve't.9ctio'=iste'er;
import javax.swi'g.*Compo'e't;
import javax.swi'g.)imer;
public class Compo'e'te=u,5ermelha extends *Compo'e't implements 9ctio'=iste'er
{
private int 'Mvel,passo;
private )imer timer;

public Compo'e'te=u,5ermelha(int passo)
{
this.passo passo;
'Mvel -;
timer new )imer(/-,this);
timer.setCoalesce(true);
timer.start();
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 92
!riando novos componentes
protected void pai'tCompo'e't(Graphics g)
{
g.setColor(Color.WHITE);
g.(illFect(-,-,getRi"th(),getLeight());
II Calculamos a cor "e acor"o com o passo.
g.setColor(new Color('MvelI.--,-,-));
g.(ill9rc(-,-,getRi"th(),getLeight(),-,01-);
!

public void actio'&er(orme"(9ctio'Eve't e)
{
if ('Mvel A 2//--) 'Mvel C passo;
repai't();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 93
!riando novos componentes
import java.awt.Gri"=ayout;
import javax.swi'g.*9pplet;
public class 9pplet=u,5ermelha extends *9pplet
{
public void i'it()
{
getCo'te't&a'e().set=ayout(new Gri"=ayout(2,2));
Compo'e'te=u,5ermelha c.,c2,c0,c2;
c. new Compo'e'te=u,5ermelha(.-); c2 new Compo'e'te=u,5ermelha(/-);
c0 new Compo'e'te=u,5ermelha(.--); c2 new Compo'e'te=u,5ermelha(2/-);
getCo'te't&a'e().a""(c.); getCo'te't&a'e().a""(c2);
getCo'te't&a'e().a""(c0); getCo'te't&a'e().a""(c2);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 94

'%emplo/ Van*ues
Maio/2009 http://www.lac.inpe.br/~rafael.santos 95
Tan4ues

Primeiros passos em uma simulao muito simples&

Tan4ues podem andar para a frente# modificar a velocidade#


girar nos sentidos -orrio e anti4-orrio&

"rena comporta vrios tan*ues e permite a manipulao dos


mesmos atrav8s do mouse&

"plicao cria instAncia da Arena&

Arena 8 um componente !astante especfico# Van*ue no&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 96
Tan4ues

$lasse Tanque/ ,eclaraes


package ta'Dues;
import java.awt.%;
import java.awt.geom.9((i'e)ra's(orm;
public class )a'Due
{
private double x,y;
private double Y'gulo;
private double veloci"a"e;
private Color cor;
private boolean estV9tivo;
public )a'Due(int x,int y,int a,Color c)
{
this.x x; this.y y; Y'gulo H-$a; cor c;
veloci"a"e -;
estV9tivo false;
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 97
Tan4ues

$lasse Tanque/ Fodificadores


public void aume'ta5eloci"a"e()
{
veloci"a"eCC;
!

public void giraLorVrio(int a)
{
Y'gulo C a;
!

public void gira9'tiLorVrio(int a)
{
Y'gulo $ a;
!

public void move()
{
x x C >ath.in(>ath.toRadian(Y'gulo))%veloci"a"e;
y y $ >ath.co(>ath.toRadian(Y'gulo))%veloci"a"e;
!
public void setEstV9tivo(boolean estV9tivo)
{
this.estV9tivo estV9tivo;
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 98
Tan4ues

$lasse Tanque/ ,esen-o <B=


public void "raw(Graphics2D g2")
{
II 9rma,e'amos o sistema "e coor"e'a"as origi'al.
9((i'e)ra's(orm a'tes g2".get)ra's(orm();
II Criamos um sistema "e coor"e'a"as para o ro6Z.
9((i'e)ra's(orm at new 9((i'e)ra's(orm();
at.tra'slate(x,y);
at.rotate(>ath.toRadian(Y'gulo));
II 9plicamos o sistema "e coor"e'a"as.
g2".tra's(orm(at);
II Dese'hamos o ta'Due 'a posi;<o -,-. &rimeiro o corpoT
g2".setColor(cor);
g2".(illFect($.-,$.2,2-,22);
Maio/2009 http://www.lac.inpe.br/~rafael.santos 99
Tan4ues

$lasse Tanque/ ,esen-o <C=


II 9gora as esteiras
for(int e$.2;eAB;eC2)
{
g2".setColor(Color.LIGHT_GRAY);
g2".(illFect($./,e,/,2);
g2".(illFect(.-,e,/,2);
g2".setColor(Color.BLAC+);
g2"."rawFect($./,e,/,2);
g2"."rawFect(.-,e,/,2);
!
II #i'alme'te o ca'h<o.
g2".setColor(Color.LIGHT_GRAY);
g2".(illFect($0,$2/,1,2/);
g2".setColor(cor);
g2"."rawFect($0,$2/,1,2/);
Maio/2009 http://www.lac.inpe.br/~rafael.santos 100
Tan4ues

$lasse Tanque/ ,esen-o <D=


II +e o ta'Due estiver ativo, "ese'hamos uma margem 'ele.
if (estV9tivo)
{
g2".setColor(new Color(.2-,.2-,.2-));
+tro7e li'ha g2".get+tro7e();
g2".set+tro7e(new ?asic+tro7e(.(,?asic+tro7e.CA%_ROUND,
?asic+tro7e.,OIN_ROUND,-,
new float34{B!,-));
g2"."rawFect($22,$02,2B,//);
g2".set+tro7e(li'ha);
!
II 9plicamos o sistema "e coor"e'a"as origi'al.
g2".set)ra's(orm(a'tes);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 101
Tan4ues

$lasse Tanque/ utros


public +hape getFectE'volve'te()
{
9((i'e)ra's(orm at new 9((i'e)ra's(orm();
at.tra'slate(x,y);
at.rotate(>ath.toRadian(Y'gulo));
Fecta'gle rect new Fecta'gle($22,$02,2B,//);
return at.create)ra's(orme"+hape(rect);
!

!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 102
Tan4ues

$lasse Arena/ ,eclaraes


package ta'Dues;
import java.awt.%;
import java.awt.eve't.%;
import java.util.Lash+et;
import javax.swi'g.%;
public class 9re'a extends *Compo'e't implements >ouse=iste'er, 9ctio'=iste'er
{
private int w,h;
private Lash+etA)a'DueN ta'Dues;
private )imer timer;

public 9re'a(int w,int h)
{
this.w w; this.h h;
ta'Dues new Lash+etA)a'DueN();
a"">ouse=iste'er(this);
timer new )imer(/--,this);
timer.start();
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 103
Tan4ues

$lasse Arena/ Fodificadores e m8todos ?mgicos@


public void a"icio'a)a'Due()a'Due t)
{
ta'Dues.a""(t);
!

public Dime'sio' get>aximum+i,e()
{
return get&re(erre"+i,e();
!
public Dime'sio' get>i'imum+i,e()
{
return get&re(erre"+i,e();
!
public Dime'sio' get&re(erre"+i,e()
{
return new Dime'sio'(w,h);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 104
Tan4ues

$lasse Arena/ ,esen-o


protected void pai'tCompo'e't(Graphics g)
{
super.pai'tCompo'e't(g);
Graphics2D g2" (Graphics2D)g;
g2".setFe'"eri'gLi't(Fe'"eri'gLi'ts.+EY_ANTIALIASING,
Fe'"eri'gLi'ts.#ALUE_ANTIALIAS_ON);
g2".setColor(new Color(22/,22/,2//));
g2".(illFect(-,-,w,h);
g2".setColor(new Color(22-,22-,22-));
for(int [w-;[wAw;[wC2-) g2"."raw=i'e([w,-,[w,h);
for(int [h-;[hAh;[hC2-) g2"."raw=i'e(-,[h,w,[h);
II Dese'hamos to"os os ta'Dues
for()a'Due tTta'Dues) t."raw(g2");
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 105
Tan4ues

$lasse Arena/ 'ventos <B=


public void mouseClic7e"(>ouseEve't e)
{
for()a'Due tTta'Dues) t.setEstV9tivo(false);
for()a'Due tTta'Dues)
{
boolean clica"o t.getFectE'volve'te().co'tai's(e.get\(),e.get]());
if (clica"o)
{
t.setEstV9tivo(true);
switch(e.get?utto'())
{
case >ouseEve't.BUTTON-T t.gira9'tiLorVrio(0); break;
case >ouseEve't.BUTTON.T t.aume'ta5eloci"a"e(); break;
case >ouseEve't.BUTTON/T t.giraLorVrio(0); break;
!
break;
!
!
repai't();
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 106
Tan4ues

$lasse Arena/ 'ventos <C=


public void mouseE'tere"(>ouseEve't e) { !
public void mouseExite"(>ouseEve't e) { !
public void mouse&resse"(>ouseEve't e) { !
public void mouseFelease"(>ouseEve't e) { !
public void actio'&er(orme"(9ctio'Eve't e)
{
for()a'Due tTta'Dues) t.move();
repai't();
!

!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 107
Tan4ues

$lasse App
package ta'Dues;
import java.awt.Color;
import javax.swi'g.*#rame;
public class 9pp
{
public static void mai'(+tri'g34 args)
{
9re'a are'a new 9re'a(1--,2--);
are'a.a"icio'a)a'Due(new )a'Due(.--,2--, -,Color.BLUE));
are'a.a"icio'a)a'Due(new )a'Due(2--,2--, 2/,Color.RED));
are'a.a"icio'a)a'Due(new )a'Due(2G-,01-, H-,Color.GREEN));
are'a.a"icio'a)a'Due(new )a'Due(2/-, /-,./G,Color.YELLOW));

*#rame ( new *#rame(:)a'Dues:);
(.getCo'te't&a'e().a""(are'a);
(.pac7();
(.set5isi6le(true);
(.setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 108
Tan4ues
Maio/2009 http://www.lac.inpe.br/~rafael.santos 109
Tan4ues

$omo est# no 8 interessante# mas&&&

I simples criar um am!iente onde podemos interagir com


vrios o!"etos&

$omo fa9er o!"etos interagir com outrosL

$oliso/ detectvel com m8todos *ue verificam interseco entre


retAngulos envolventes&

Wimites da arena/ verificvel de forma simples&

Sugestes de pro"etos
Maio/2009 http://www.lac.inpe.br/~rafael.santos 110

'%emplo/ $elofane
Maio/2009 http://www.lac.inpe.br/~rafael.santos 111
!elofane

Primeiros passos em um editor grfico interativo&

!"etos podem ser desen-ados# coloridos e modificados&

Regras para desen-ar o!"etos esto em suas classes# *ue


-erdam da classe a!strata ObjetoGeometrico&

A classe AreaDeDesenho mostra desen-os e permite


interao&

A classe Celofane 8 uma aplicao *ue usa


AreaDeDesenho&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 112
!elofane

$lasse a!strata ObjetoGeometrico


package celo(a'e;
import java.awt.Color;
import java.awt.Graphics2D;
public abstract class 86jetoGeometrico
{
protected int x,y;
protected Color cor;
public int get\() { return x; !
public int get]() { return y; !
public void set\(int x) { this.x x; ! II po"erMamos ter co'"i;Jes...
public void set](int y) { this.y y; !
public void setCor(Color c) { cor c; !
public Color getCor() { return cor; !
public abstract void "ese'ha(Graphics2D g2",boolean selecio'a"o);
public abstract boolean co't^m(int px,int py);
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 113
!elofane

$lasse ObjetoQuadrado #!$


package celo(a'e;
import java.awt.Color;
import java.awt.Graphics2D;
public class 86jetoOua"ra"o extends 86jetoGeometrico
{
private int la"o;
public 86jetoOua"ra"o(int x,int y,int t)
{
set\(x); set](y);
la"o t;
setCor(Color.BLAC+);
!
public boolean co't^m(int px, int py)
{
if ((px N x$la"oI2) __ (px A xCla"oI2) __
(py N y$la"oI2) __ (py A yCla"oI2)) return true;
else return false;
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 114
!elofane

$lasse ObjetoQuadrado #2$


public void "ese'ha(Graphics2D g2",boolean selecio'a"o)
{
if (selecio'a"o)
{
g2".setColor(Color.WHITE);
g2".(illFect(x$la"oI2,y$la"oI2,la"o,la"o);
g2".setColor(cor);
g2"."rawFect(x$la"oI2,y$la"oI2,la"o,la"o);
!
else
{
g2".setColor(cor);
g2".(illFect(x$la"oI2,y$la"oI2,la"o,la"o);
!
!

!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 115
!elofane

$lasse ObjetoCirculo #!$


package celo(a'e;
import java.awt.Color;
import java.awt.Graphics2D;
public class 86jetoCirculo extends 86jetoGeometrico
{
private int raio;
public 86jetoCirculo(int x,int y,int r)
{
set\(x); set](y);
raio r;
setCor(Color.BLAC+);
!
public boolean co't^m(int px, int py)
{
if ((px N x$raio) __ (px A xCraio) __
(py N y$raio) __ (py A yCraio)) return true;
else return false;
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 116
!elofane

$lasse ObjetoCirculo #2$


public void "ese'ha(Graphics2D g2",boolean selecio'a"o)
{
if (selecio'a"o)
{
g2".setColor(Color.WHITE);
g2".(ill8val(x$raio,y$raio,2%raio,2%raio);
g2".setColor(cor);
g2"."raw8val(x$raio,y$raio,2%raio,2%raio);
!
else
{
g2".setColor(cor);
g2".(ill8val(x$raio,y$raio,2%raio,2%raio);
!
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 117
!elofane

$lasse ObjetoTriangulo #!$


package celo(a'e;
import java.awt.%;
public class 86jeto)ria'gulo extends 86jetoGeometrico
{
private int 6ase;
private &olygo' (orma;
public 86jeto)ria'gulo(int x,int y,int 6)
{
set\(x); set](y);
6ase 6;
calcula#orma();
setCor(Color.BLAC+);
!
public void set\(int x)
{
super.set\(x); calcula#orma();
!
public void set](int y)
{
super.set](y); calcula#orma();
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 118
!elofane

$lasse ObjetoTriangulo #2$


private void calcula#orma()
{
int34 xp new int304;
int34 yp new int304;
xp3-4 x; yp3-4 y$6aseI2;
xp3.4 x$6aseI2; yp3.4 yC6aseI2;
xp324 xC6aseI2; yp324 yC6aseI2;
(orma new &olygo'(xp,yp,0);
!
public boolean co't^m(int px, int py)
{
if ((px N x$6ase) __ (px A xC6ase) __
(py N y$6ase) __ (py A yC6ase)) return true;
else return false;
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 119
!elofane

$lasse ObjetoTriangulo #%$


public void "ese'ha(Graphics2D g2",boolean selecio'a"o)
{
if (selecio'a"o)
{
g2".setColor(Color.WHITE);
g2".(ill((orma);
g2".setColor(cor);
g2"."raw((orma);
!
else
{
g2".setColor(cor);
g2".(ill((orma);
!
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 120
!elofane

$lasse AreaDeDesenho #!$


package celo(a'e;
import java.awt.%;
import java.awt.eve't.%;
import java.util.9rray=ist;
import javax.swi'g.%;
public class 9reaDeDese'ho extends *Compo'e't
implements >ouse=iste'er, >ouse>otio'=iste'er,`
9ctio'=iste'er
{
private int w,h;
private int x,y; II posi;Jes atuais "o mouse
private int selecio'a"o;
private *&opup>e'u popup>e'u;
private *>e'uEtem Dua"ra"o,cMrculo,triY'gulo;
private 9rray=istA86jetoGeometricoN o6jetos;
Maio/2009 http://www.lac.inpe.br/~rafael.santos 121
!elofane

$lasse AreaDeDesenho #2$


public 9reaDeDese'ho(int w,int h)
{
this.w w; this.h h;
selecio'a"o $.;
o6jetos new 9rray=istA86jetoGeometricoN();
II Criamos o me'u "e o6jetos
popup>e'u new *&opup>e'u();
Dua"ra"o new *>e'uEtem(:Oua"ra"o:);
Dua"ra"o.a""9ctio'=iste'er(this);
popup>e'u.a""(Dua"ra"o);
cMrculo new *>e'uEtem(:CMrculo:);
cMrculo.a""9ctio'=iste'er(this);
popup>e'u.a""(cMrculo);
triY'gulo new *>e'uEtem(:)riY'gulo:);
triY'gulo.a""9ctio'=iste'er(this);
popup>e'u.a""(triY'gulo);
a"">ouse=iste'er(this);
a"">ouse>otio'=iste'er(this);
!
public Dime'sio' get>aximum+i,e() { return get&re(erre"+i,e(); !
public Dime'sio' get>i'imum+i,e() { return get&re(erre"+i,e(); !
public Dime'sio' get&re(erre"+i,e() { return new Dime'sio'(w,h); !
Maio/2009 http://www.lac.inpe.br/~rafael.santos 122
!elofane

$lasse AreaDeDesenho #%$


protected void pai'tCompo'e't(Graphics g)
{
Graphics2D g2" (Graphics2D)g;
g2".setColor(Color.WHITE);
g2".(illFect(-,-,w,h);
for(int o-;oAo6jetos.si,e();oCC)
{
if (o selecio'a"o) o6jetos.get(o)."ese'ha(g2",true);
else o6jetos.get(o)."ese'ha(g2",false);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 123
!elofane

$lasse AreaDeDesenho #&$


public void mouseClic7e"(>ouseEve't e)
{
if (e.get?utto'() >ouseEve't.BUTTON-)
{
II &rocuramos algum o6jeto so6 a posi;<o "o mouse.
selecio'a"o $.;
for(int o-;oAo6jetos.si,e();oCC)
if (o6jetos.get(o).co't^m(e.get\(),e.get]())) selecio'a"o o;
!
else if (e.get?utto'() >ouseEve't.BUTTON/)
{
x e.get\(); y e.get]();
if (selecio'a"o N -)
{
if (o6jetos.get(selecio'a"o).co't^m(x,y)) II Estamos so6re um o6jeto selecio'a"oS
{
II >u"amos a cor "este o6jeto.
Color 'ovaCor *ColorChooser.(o)Dia!o*(this,:Escolha uma cor:,
o6jetos.get(selecio'a"o).getCor());
o6jetos.get(selecio'a"o).setCor('ovaCor);
selecio'a"o $.;
!
else popup>e'u.show(e.getCompo'e't(),x,y); II Clicamos (ora "o selecio'a"o
!
else popup>e'u.show(e.getCompo'e't(),x,y); II @<o temos 'a"a selecio'a"o
!
repai't();
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 124
!elofane

$lasse AreaDeDesenho #'$


public void mouseE'tere"(>ouseEve't e) { !
public void mouseExite"(>ouseEve't e) { !
public void mouse&resse"(>ouseEve't e) { !
public void mouseFelease"(>ouseEve't e)
{
if (popup>e'u.is5isi6le()) popup>e'u.set5isi6le(false);
!
public void mouseDragge"(>ouseEve't e)
{
x e.get\(); y e.get]();
if (selecio'a"o N -)
{
o6jetos.get(selecio'a"o).set\(x);
o6jetos.get(selecio'a"o).set](y);
!
repai't();
!
public void mouse>ove"(>ouseEve't e) { !
Maio/2009 http://www.lac.inpe.br/~rafael.santos 125
!elofane

$lasse AreaDeDesenho #($


public void actio'&er(orme"(9ctio'Eve't e)
{
if (e.get+ource() instanceof *>e'uEtem)
{
*>e'uEtem item (*>e'uEtem)e.get+ource();
if (item Dua"ra"o) o6jetos.a""(new 86jetoOua"ra"o(x,y,B-));
if (item cMrculo) o6jetos.a""(new 86jetoCirculo(x,y,2-));
if (item triY'gulo) o6jetos.a""(new 86jeto)ria'gulo(x,y,B-));
repai't();
!
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 126
!elofane

$lasse Celofane
package celo(a'e;
import javax.swi'g.*#rame;
public class Celo(a'e
{
public static void mai'(+tri'g34 args)
{
9reaDeDese'ho Vrea new 9reaDeDese'ho(B--,1--);
*#rame ( new *#rame(:Celo(a'e:);
(.getCo'te't&a'e().a""(Vrea);
(.pac7();
(.set5isi6le(true);
(.setDe(aultClose8peratio'(*#rame.EXIT_ON_CLOSE);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 127
!elofane
Maio/2009 http://www.lac.inpe.br/~rafael.santos 128
!elofane
Maio/2009 http://www.lac.inpe.br/~rafael.santos 129
!elofane

$omo est# no 8 interessante# mas&&&

I simples criar um am!iente com mais interatividade <mesmo


*ue usando somente mouse3=

Sugestes de pro"etos
Maio/2009 http://www.lac.inpe.br/~rafael.santos 130

'%emplo/ A*urio
Maio/2009 http://www.lac.inpe.br/~rafael.santos 131
"4urio

'%emplo simples de applet com animao e sprites&

$lasse Peixe cont8m imagem e coordenadas e m8todos


para modificar as coordenadas&

$lasse ComponenteAquario cont8m um componente


para desen-ar um fundo# desen-ar pei%es e moviment4los&

$lasse Aquario 8 uma applet *ue usa este componente&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 132
"4urio
package aDuario;
import java.awt.Dime'sio';
import java.awt.Graphics2D;
import javax.swi'g.EmageEco';
public class &eixe
{
private EmageEco' (ish;
private int x,y; II posi;<o
private int w(,h(; II tama'ho peixe
private int wa,ha; II tama'ho aDuVrio
private float spee";
public &eixe(+tri'g (ile'ame,Dime'sio' aD,float s)
{
(ish new EmageEco'((ile'ame);
w( (ish.getEco'Ri"th(); h( (ish.getEco'Leight();
wa aD.wi"th; ha aD.height;
spee" s;
x (int)(>ath.random()%wa);
y (int)(>ath.random()%(ha$h());
!

$lasse Peixe
(e"a o Slide OB3
Maio/2009 http://www.lac.inpe.br/~rafael.santos 133
"4urio
public void move()
{
x $ spee";
if (x A $w()
{
x wa;
y (int)(>ath.random()%(ha$h());
!
!
protected void pai't(Graphics2D g2")
{
g2"."rawEmage((ish.getEmage(),x,y,null);
!
!

$lasse Peixe
Maio/2009 http://www.lac.inpe.br/~rafael.santos 134
"4urio

$lasse ComponenteAquario
package aDuario;
import java.awt.%;
import java.awt.eve't.%;
import javax.swi'g.%;
public class Compo'e'te9Duario extends *Compo'e't implements 9ctio'=iste'er
{
private &eixe vermelho;
private &eixe amarelo;
private EmageEco' 6ac7grou'";
private )imer tt;
public Compo'e'te9Duario()
{
6ac7grou'" new EmageEco'(:aDuarium[6g.jpg:);
Dime'sio' area new Dime'sio'(6ac7grou'".getEco'Ri"th(),
6ac7grou'".getEco'Leight());
vermelho new &eixe(:re"[(ish.p'g:,area,2);
amarelo new &eixe(:yellow[(ish.p'g:,area,/./();
tt new )imer(2-,this);
tt.setCoalesce(true);
tt.start();
!
(e"a o Slide OB3
Maio/2009 http://www.lac.inpe.br/~rafael.santos 135
"4urio

$lasse ComponenteAquario
protected void pai'tCompo'e't(Graphics g)
{
Graphics2D g2" (Graphics2D)g;
g2"."rawEmage(6ac7grou'".getEmage(),-,-,null);
vermelho.pai't(g2");
amarelo.pai't(g2");
!
public void actio'&er(orme"(9ctio'Eve't e)
{
vermelho.move(); amarelo.move(); repai't();
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 136
"4urio

$lasse Aquario
package aDuario;
import javax.swi'g.*9pplet;
public class 9Duario extends *9pplet
{
private Compo'e'te9Duario c;
public void i'it()
{
c new Compo'e'te9Duario();
a""(c);
resi,e(G2-,/2-);
!
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 137
"4urio

Pro!lemas com a classe ComponenteAquario/


,esen-o de todo o componente pode ser custoso3

Soluo/ desen-ar somente as reas modificadas&

+a classe Peixe/

+a classe ComponenteAquario/
public Fecta'gle getE'volve'te()
{
return new Fecta'gle(x,y,w(,h();
!
public void actio'&er(orme"(9ctio'Eve't e)
{
vermelho.move(); amarelo.move();
repai't(vermelho.getE'volve'te());
repai't(amarelo.getE'volve'te());
!
Maio/2009 http://www.lac.inpe.br/~rafael.santos 138

Jinali9ando&&&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 139
5imos

Algumas noes de programao com interfaces grficas em


Java&

$omo usar alguns componentes comuns&

$omo usar eventos em suas aplicaes&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 140
'o vimos

1uita coisa3

Jormali9ao do modelo 15!&

'%emplos de componentes para visuali9ao e interao


comple%as&

Aplicaes com estes componentes

Alguns esto espal-ados por -ttp/00111&lac&inpe&!r02rafael&santos

$omponentes !aseados em ilt!y "ic! Clients&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 141
E)emplos de componentes ,para P-
Maio/2009 http://www.lac.inpe.br/~rafael.santos 142
E)emplos de componentes ,para P-
Maio/2009 http://www.lac.inpe.br/~rafael.santos 143
%efer&ncias

Java Vutorial/
-ttp/00"ava&sun&com0docs0!ooXs0tutorial0inde%&-tml

#ava S$ Des%top &rticles/


-ttp/00"ava&sun&com0"avase0tec-nologies0desXtop0articles&"sp

Faterial em -ttp/00111&lac&inpe&!r02rafael&santos
Maio/2009 http://www.lac.inpe.br/~rafael.santos 144
%efer&ncias

ilt!y "ic! Clients: $-et 5aase# Romain


GuY: Prentice45all0Sun# CTTO# NTPpp&

7nterfaces ricas em S1ing# t!reads# animao


de interfaces# tempori9ao# processamento
de imagens <para tela=&

Computer Grap!ics 'sing #ava (D and


)D: 5ong Q-ang# Z& ,aniel Wiang:
Prentice45all# CTTO# NDCpp&

Grficos# JavaC,# renderi9ao# JavaD,&


Maio/2009 http://www.lac.inpe.br/~rafael.santos 145
%efer&ncias

Introdu*+o , -rograma*+o .rientada a


.b/etos 'sando #ava: Rafael Santos:
$ampus0SB$# CTTD# DMCpp&

$onceitos !sicos/ programao# orientao


a o!"etos# modelagem# l)gica&

#ava0 Como -rogramar: 5& F& ,eitel# P& J&


,eitel: Prentice45all# CTTM# BBMCpp&

Fuita informao so!re Java e so!re AP7s


principais&
Maio/2009 http://www.lac.inpe.br/~rafael.santos 146
%efer&ncias

Developing Games in #ava: ,avid


BracXeen: +e1 Riders# CTTE# [[Npp&

1!reads# C, e animao# interatividade#


udio# D,# 7A# otimi9ao&

'%emplos/ scroller&

2iller Game -rogramming in #ava: Andre1


,avison: \ReillY# CTTM# [OTpp&

Animao# imagens# sons# sprites# JavaD,#


sprites D,# sistemas de partculas# etc&

'%emplos/ 1orms# side4scroller# isom8trico#


la!irinto D,# JPS&

fivedots&coe&psu&ac&t-02ad0"g0
Maio/2009 http://www.lac.inpe.br/~rafael.santos 147

!rigado3
PerguntasL