Professional Documents
Culture Documents
Applets
Programando
Applets
Rafael Santos
Rafael Santos -
www.lac.inpe.br/rafael.santos
1 / 128
Programando
Applets
Tpicos
1 2 3 4 5 6 7
Introduo Conceitos Bsicos
Applets
Eventos
Java2D
Entrada e Sada Extras
Rafael Santos -
www.lac.inpe.br/rafael.santos
2 / 128
Programando Introduo
Applets
Sobre o Curso
Objetivos
Entender o que uma
applet.
applets.
Aprender a programar
applets
simples.
Aprender um pouco sobre programao orientada a eventos. Aprender um pouco de Java2D. Aprender a trabalhar com componentes de interfaces grcas.
Rafael Santos -
www.lac.inpe.br/rafael.santos
3 / 128
Programando Introduo
Applets
Sobre o Curso
Pr-requisitos
No obrigatrios, mas ajuda bastante... Programao orientada a objetos e sintaxe de Java. Programao com elementos de interfaces grcas (componentes). Programao orientada a eventos. Programao de grcos com
Java2D.
Rafael Santos -
www.lac.inpe.br/rafael.santos
4 / 128
Programando Introduo
Applets
Sobre o Curso
Contedo e material
Exposio, sem laboratrio. No veremos segurana (
applets
assinadas, etc.).
No veremos aplicaes complexas, uso de som, tcnicas avanadas. Somente trechos signicativos do cdigo-fonte. Cdigo-fonte e material de apresentao sero colocados no site
www.lac.inpe.br/rafael.santos.
Rafael Santos -
www.lac.inpe.br/rafael.santos
5 / 128
Programando Introduo
Applets Applets
O que so
Applets...
Pequenas aplicaes copiadas de um servidor e executadas em um navegador. A partir de 1995, causaram grande interesse por Java.
Rafael Santos -
www.lac.inpe.br/rafael.santos
6 / 128
Programando Introduo
Applets Applets
O que so
Applets...
Interesse tem decado:
Servidores mais ecientes, interfaces em HTML. Estabelecimento de Java como linguagem de programao. Problemas de compatibilidade entre mquinas virtuais.
Ainda vale a pena aprender:
Fim da incompatibilidade, facilidade de deployment. Criao de pequenas aplicaes. Tarefas como visualizao, demonstraes, etc. Existem outras abordagens, mas applets so em Java!
Rafael Santos -
www.lac.inpe.br/rafael.santos
7 / 128
Programando Introduo
Applets Applets
O que so
applets
?
deployment
de pequenas
Usurio no precisa instalar nada no disco (exceto a VM). Verses novas automaticamente carregadas. Mais segurana do que aplicaes inteiras.
OK, existem algumas desvantagens...
applets
assinadas).
Rafael Santos -
www.lac.inpe.br/rafael.santos
8 / 128
Programando
Applets
applet)
Pedaos da aplicao podem estar distribudos em vrias classes. Usamos instncias de classes em outras classes. Uma classe pode conter campos (que representam valores pertinentes quela classe). Uma classe pode conter mtodos (que descrevem que processamento deve ser feito naquela classe). Uma classe pode conter construtores, mtodos especiais que so executados quando criamos instncias das classes.
Rafael Santos -
www.lac.inpe.br/rafael.santos
9 / 128
Programando
Applets
Pblicos: mtodos de outras classes podem acessar, no uma boa idia para campos. Privados: somente mtodos da mesma classe podem acessar, faz mais sentido para campos. Protegidos: somente mtodos da mesma classe e de classes herdeiras podem acessar1 , melhor ainda.
Comum: mtodos pblicos, campos privados ou protegidos: encapsulamento.
www.lac.inpe.br/rafael.santos
10 / 128
Programando
Applets
www.lac.inpe.br/rafael.santos
11 / 128
Programando
Applets
Herana
Usamos uma classe j existente (ancestral) para derivar uma nova classe. Nova classe
herda
protegidos da classe ancestral. Nova classe (herdeira) pode sobrepor mtodos e campos. Mtodos na classe herdeira podem executar mtodos na ancestral atravs de
super.
Rafael Santos -
www.lac.inpe.br/rafael.santos
12 / 128
Programando
Applets
Herana: exemplo
public class CirculoPreenchido extends Circulo { protected Color corP; public CirculoPreenchido(Color c,Color p,int x,int y,int r) { super(c,x,y,r); corP = p; } public void draw(Graphics2D g) { g.setColor(corP); Ellipse2D.Float circ = new Ellipse2D.Float(x-raio,y-raio,raio*2,raio*2); g.fill(circ); super.draw(g); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
13 / 128
Programando
Applets
Interfaces
Diferente do conceito de interfaces grcas! Tipos de classes onde mtodos so declarados mas no implementados. Servem como
contratos
estas interfaces. Classes que implementam as interfaces devem implementar os mtodos declarados.
Rafael Santos -
www.lac.inpe.br/rafael.santos
14 / 128
Programando
Applets
Applets
Introduo
Applets
Applets
herdam da classe
JApplet.
Mtodo init: executado quando a applet carregada pela primeira vez. Mtodo start: executado quando o navegador carrega ou volta pgina com a applet. Mtodo stop: executado quando o navegador deixa a pgina com a applet. Mtodo destroy: executado quando o navegador fechado.
Rafael Santos -
www.lac.inpe.br/rafael.santos
15 / 128
Programando
Applets
Applets
Introduo
Applets
Mtodos mgicos, executados automaticamente pelo navegador.
Component/Container, podemos paint. Herdam tambm de Component/Container, podemos sobrepor mtodo paint. Outro mtodo interessante: resize garante tamanho
Herdam tambm de sobrepor mtodo pedido (mas no no navegador!).
Rafael Santos -
www.lac.inpe.br/rafael.santos
16 / 128
Programando
Applets
Applets
Introduo
Applet
mnima
Rafael Santos -
www.lac.inpe.br/rafael.santos
17 / 128
Programando
Applets
Applets
Introduo
Applet
mais interessante
package applets; import import import import java.awt.Color; java.awt.Graphics; java.awt.Graphics2D; javax.swing.JApplet;
public class Applet1 extends JApplet { public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setColor(Color.BLUE); g2d.drawString("Ol, Mundo",5,15); } }
www.lac.inpe.br/rafael.santos
Rafael Santos -
18 / 128
Programando
Applets
Applets
Introduo
Applet
package applets; import java.awt.*; import javax.swing.JApplet; public class Applet2 extends JApplet { private int largura,altura; public void init() { largura = getWidth(); altura = getHeight(); } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setColor(Color.BLUE); g2d.drawLine(0,0,largura,altura); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
19 / 128
Programando
Applets
Applets
Introduo
Applets
at agora...
applet. applet.
Sobreposio de mtodo
init
Sobreposio de mtodo
paint
Isso simples mas pouco eciente! Como desenhar uma interface com usurio? Como
reagir
Rafael Santos -
www.lac.inpe.br/rafael.santos
20 / 128
Programando
Applets Layouts
Applets
Layouts
Como desenhar uma interface com usurio?
Uma
applet
applet.
Layouts. de layouts em
Rafael Santos -
www.lac.inpe.br/rafael.santos
21 / 128
Programando
Applets Layouts
Applets
BorderLayout
O
layout
mais comum, o
default.
Rafael Santos -
www.lac.inpe.br/rafael.santos
22 / 128
Programando
Applets Layouts
Applets
BorderLayout
public class ExemploBorderLayout extends JApplet { public void init() { setLayout(new BorderLayout()); add(new JButton("Norte"),BorderLayout.NORTH); add(new JButton("Sul"),BorderLayout.SOUTH); add(new JButton("Leste"),BorderLayout.EAST); add(new JButton("Oeste"),BorderLayout.WEST); add(new JButton("Centro"),BorderLayout.CENTER); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
23 / 128
Programando
Applets Layouts
Applets
GridLayout
Vrias reas iguais, grade regular.
Rafael Santos -
www.lac.inpe.br/rafael.santos
24 / 128
Programando
Applets Layouts
Applets
GridLayout
public class ExemploGridLayout extends JApplet { public void init() { setLayout(new GridLayout(5,3)); for(int l=0;l<5;l++) for(int c=0;c<3;c++) add(new JButton("L"+(l+1)+" C"+(c+1))); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
25 / 128
Programando
Applets Layouts
Applets
Sem
layouts
Podemos usar
null
para
setLayout.
setBounds
dos componentes.
Desaconselhado:
pode causar diferenas! Ser necessrio calcular o tamanho da manualmente. Trabalho pode ser muito manual.
Look-and-feel
applet
Rafael Santos -
www.lac.inpe.br/rafael.santos
26 / 128
Programando
Applets Layouts
Applets
Sem
layouts
public class ExemploNullLayout extends JApplet { public void init() { setLayout(null); JButton b1 = new JButton("Curto"); JButton b2 = new JButton("Comprido"); JButton b3 = new JButton("Enorme"); b1.setBounds(0,0,90,40); b2.setBounds(90,0,400,40); b3.setBounds(0,50,550,80); add(b1); add(b2); add(b3); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
27 / 128
Programando
Applets Layouts
Applets
Sem
layouts
Rafael Santos -
www.lac.inpe.br/rafael.santos
28 / 128
Programando
Applets Layouts
Applets
Layouts
JPanel
layout.
Rafael Santos -
www.lac.inpe.br/rafael.santos
29 / 128
Programando
Applets Layouts
Applets
Layouts
public class ExemploJPanel extends JApplet { public void init() { setLayout(new BorderLayout()); JPanel painel = new JPanel(new GridLayout(5,2)); for(int i=0;i<10;i++) painel.add(new JButton(""+(char)('a'+i))); add(new JLabel("Menu"),BorderLayout.NORTH); add(new JLabel("Status"),BorderLayout.SOUTH); add(painel,BorderLayout.WEST); add(new JTextArea(10,30),BorderLayout.CENTER); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
30 / 128
Programando
Applets Layouts
Applets
Outros
layouts
permite a organizao de pginas de
CardLayout FlowLayout
GridBagLayout
absoluto.
SpringLayout
relativamente a outros.
Rafael Santos -
www.lac.inpe.br/rafael.santos
31 / 128
Programando
Applets
Applets
Componentes Bsicos
Componentes bsicos
Muitos componentes j prontos para uso direto. Todos congurveis/customizveis quanto aparncia e funcionalidade. No veremos todos. Primeiros exemplos mostram somente aparncia; funcionalidade somente com eventos.
Rafael Santos -
www.lac.inpe.br/rafael.santos
32 / 128
Programando
Applets
Applets
Componentes Bsicos
Botes
Servem para seleo de opes simples (sim/no) e executar aes. Botes Comuns: instncias de texto e/ou cone. Botes de Rdio: instncias de agrupados em
JButton,
podem conter
ButtonGroups,
JRadioButton,
Checkboxes:
instncias de
JCheckBox,
permitem escolher
ou no uma opo.
Rafael Santos -
www.lac.inpe.br/rafael.santos
33 / 128
Programando
Applets
Applets
Componentes Bsicos
Botes
public class ExemploBotoes extends JApplet { public void init() { setLayout(new GridLayout(5,1)); JRadioButton peq = new JRadioButton("Pequeno",false); JRadioButton med = new JRadioButton("Mdio",true); JRadioButton gde = new JRadioButton("Grande",false); ButtonGroup grupo = new ButtonGroup(); grupo.add(peq); grupo.add(med); grupo.add(gde); JCheckBox preenchido = new JCheckBox("Preenchido",true); JButton ok = new JButton("OK"); add(peq); add(med); add(gde); add(preenchido); add(ok); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
34 / 128
Programando
Applets
Applets
Componentes Bsicos
Listas,
sliders
spinners
Combo Boxes:
instncias de
JComboBox,
listas com
somente uma opo visvel, pode ser editvel. Listas: instncias de ou mais colunas.
JList,
Sliders:
instncias de
JSlider,
escolha de valores
ordenados.
Spinners:
Listas e
instncias de
JSpinner,
escolha de valores
ordenados.
Combo Boxes
Rafael Santos -
www.lac.inpe.br/rafael.santos
35 / 128
Programando
Applets
Applets
Componentes Bsicos
Listas
public class ExemploListas extends JApplet { public void init() { setLayout(new GridLayout(1,3)); String[] opes = {"Vermelho","Verde","Azul","Amarelo"}; JComboBox combo1 = new JComboBox(opes); combo1.setEditable(false); JComboBox combo2 = new JComboBox(opes); combo2.setEditable(true); JList list1 = new JList(opes); add(combo1); add(combo2); add(new JScrollPane(list1)); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
36 / 128
Programando
Applets
Applets
Componentes Bsicos
Sliders
public class ExemploSliders extends JApplet { public void init() { setLayout(new GridLayout(2,1)); JSlider slider1 = new JSlider(0,10,3); slider1.setMajorTickSpacing(5); slider1.setMinorTickSpacing(1); slider1.setPaintLabels(true); slider1.setPaintTicks(true); JSlider slider2 = new JSlider(0,10,3); Hashtable<Integer,JLabel> labels = new Hashtable<Integer,JLabel>(); labels.put(new Integer(0),new JLabel("Zero")); labels.put(new Integer(3),new JLabel("Trs")); labels.put(new Integer(5),new JLabel("Cinco")); labels.put(new Integer(10),new JLabel("Dez")); slider2.setLabelTable(labels); slider2.setPaintLabels(true); slider2.setPaintTicks(true); add(slider1); add(slider2); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
37 / 128
Programando
Applets
Applets
Componentes Bsicos
Spinners
public class ExemploSpinners extends JApplet { public void init() { setLayout(new FlowLayout()); Integer[] dias = new Integer[31]; for(int i=0;i<dias.length;i++) dias[i] = new Integer(i+1); SpinnerListModel modeloDia = new SpinnerListModel(dias); JSpinner dia = new JSpinner(modeloDia); String[] meses = {"Jan","Fev","Mar","Abr","Mai","Jun", "Jul","Ago","Set","Out","Nov","Dez"}; SpinnerListModel modeloMs = new SpinnerListModel(meses); JSpinner ms = new JSpinner(modeloMs); Integer[] anos = new Integer[105]; for(int i=0;i<anos.length;i++) anos[i] = new Integer(i+1900); SpinnerListModel modeloAno = new SpinnerListModel(anos); JSpinner ano = new JSpinner(modeloAno); ano.setValue(new Integer(1960)); add(dia); add(ms); add(ano); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
38 / 128
Programando
Applets
Applets
Componentes Bsicos
JTextField,
somente
JPasswordField,
vrias linhas.
JTextArea,
Labels:
instncias de
JLabel,
texto no modicvel.
Rafael Santos -
www.lac.inpe.br/rafael.santos
39 / 128
Programando
Applets
Applets
Componentes Bsicos
Rafael Santos -
www.lac.inpe.br/rafael.santos
40 / 128
Programando
Applets
Applets
Componentes Bsicos
Rafael Santos -
www.lac.inpe.br/rafael.santos
41 / 128
Programando
Applets
Applets
Componentes Bsicos
Escreva uma classe que herde de JComponent. Implemente o construtor da classe para passar informaes para suas instncias. Sobreescreva o mtodo paintComponent para desenhar o componente.
Sobreescrever outros mtodos pode ser interessante, dependendo da aplicao.
Rafael Santos -
www.lac.inpe.br/rafael.santos
42 / 128
Programando
Applets
Applets
Componentes Bsicos
paint
da
applet.
applet,
Rafael Santos -
www.lac.inpe.br/rafael.santos
43 / 128
Programando
Applets
Applets
Componentes Bsicos
X1+X2 X1 X2
Rafael Santos -
www.lac.inpe.br/rafael.santos
44 / 128
Programando
Applets
Applets
Componentes Bsicos
Rafael Santos -
www.lac.inpe.br/rafael.santos
45 / 128
Programando
Applets
Applets
Componentes Bsicos
Labels
Rafael Santos -
www.lac.inpe.br/rafael.santos
46 / 128
Programando
Applets
Applets
Componentes Bsicos
Rafael Santos -
www.lac.inpe.br/rafael.santos
47 / 128
Programando
Applets
Applets
Componentes Bsicos
Rafael Santos -
www.lac.inpe.br/rafael.santos
48 / 128
Programando Eventos
Applets
Applets
at agora...
layouts
e
Implementar interface correspondente a um listener. Criar componentes e registrar neles listeners para a prpria classe. Implementar mtodos requeridos pela interface.
Os mtodos requeridos sero executados automaticamente quando o evento ocorrer.
Rafael Santos -
www.lac.inpe.br/rafael.santos
49 / 128
Programando Eventos
Applets
Eventos
Diversos tipos de eventos: ao, ajuste, mudana, seleo de opes, clique e movimento de mouse, etc. Alguns tipos de eventos no so aplicveis a modicao de tamanho de janelas, minimizao/maximizao, etc. Cada tipo de componente pode escutar um ou mais tipos de eventos. Primeiro exemplo bsico: um boto que ao ser clicado modica uma cor em um
applets:
label
na
applet.
Rafael Santos -
www.lac.inpe.br/rafael.santos
50 / 128
Programando Eventos
Applets
www.lac.inpe.br/rafael.santos
51 / 128
Programando Eventos
Applets
Rafael Santos -
www.lac.inpe.br/rafael.santos
52 / 128
Programando Eventos
Applets
checkboxes
Rafael Santos -
www.lac.inpe.br/rafael.santos
53 / 128
Programando Eventos
Applets
checkboxes
public void init() { setLayout(new GridLayout(6,1)); peq = new JRadioButton("Pequeno",false); peq.addItemListener(this); med = new JRadioButton("Mdio",true); med.addItemListener(this); gde = new JRadioButton("Grande",false); gde.addItemListener(this); ButtonGroup grupo = new ButtonGroup(); grupo.add(peq); grupo.add(med); grupo.add(gde); preenchido = new JCheckBox("Preenchido",true); preenchido.addActionListener(this); ok = new JButton("OK"); ok.addActionListener(this); status = new JLabel(""); add(peq); add(med); add(gde); add(preenchido); add(ok); add(status); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
54 / 128
Programando Eventos
Applets
checkboxes
public void itemStateChanged(ItemEvent e) { if (peq.isSelected()) status.setText("Pequeno"); if (med.isSelected()) status.setText("Mdio"); if (gde.isSelected()) status.setText("Grande"); } public void actionPerformed(ActionEvent e) { if (e.getSource() == ok) status.setText("Boto OK"); if (e.getSource() == preenchido) status.setText("Preenchido?"+preenchido.isSelected()); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
55 / 128
Programando Eventos
Applets
Rafael Santos -
www.lac.inpe.br/rafael.santos
56 / 128
Programando Eventos
Applets
www.lac.inpe.br/rafael.santos
57 / 128
Programando Eventos
Applets
Rafael Santos -
www.lac.inpe.br/rafael.santos
58 / 128
Programando Eventos
Applets
Eventos de seleo em
ChangeListener
para
sliders
JSliders.
public class ExemploEventoSlider extends JApplet implements ChangeListener { private JSlider slider1,slider2;
Rafael Santos -
www.lac.inpe.br/rafael.santos
59 / 128
Programando Eventos
Applets
Eventos de seleo em
sliders
public void init() { setLayout(new GridLayout(2,1)); slider1 = new JSlider(0,10,3); slider1.setMajorTickSpacing(5); slider1.setMinorTickSpacing(1); slider1.setPaintLabels(true); slider1.setPaintTicks(true); slider1.addChangeListener(this); slider2 = new JSlider(0,10,7); Hashtable<Integer,JLabel> labels = new Hashtable<Integer,JLabel>(); labels.put(new Integer(0),new JLabel("Zero")); labels.put(new Integer(10),new JLabel("Dez")); slider2.setLabelTable(labels); slider2.setPaintLabels(true); slider2.setPaintTicks(true); slider2.addChangeListener(this); add(slider1); add(slider2); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
60 / 128
Programando Eventos
Applets
Eventos de seleo em
sliders
public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if (source.getValueIsAdjusting()) return; if (e.getSource() == slider1) slider2.setValue(10-slider1.getValue()); if (e.getSource() == slider2) slider1.setValue(10-slider2.getValue()); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
61 / 128
Programando Eventos
Applets
Eventos de seleo em
ChangeListener
para
spinners
JSpinners.
public class ExemploEventoSpinner extends JApplet implements ChangeListener { private JSpinner dia,ms,ano; private String[] meses = {"Jan","Fev","Mar","Abr","Mai","Jun", "Jul","Ago","Set","Out","Nov","Dez"};
Rafael Santos -
www.lac.inpe.br/rafael.santos
62 / 128
Programando Eventos
Applets
Eventos de seleo em
spinners
public void init() { setLayout(new FlowLayout()); Integer[] dias = new Integer[31]; for(int i=0;i<dias.length;i++) dias[i] = new Integer(i+1); SpinnerListModel modeloDia = new SpinnerListModel(dias); dia = new JSpinner(modeloDia); dia.addChangeListener(this); add(dia); SpinnerListModel modeloMs = new SpinnerListModel(meses); ms = new JSpinner(modeloMs); ms.addChangeListener(this); add(ms); Integer[] anos = new Integer[105]; for(int i=0;i<anos.length;i++) anos[i] = new Integer(i+1900); SpinnerListModel modeloAno = new SpinnerListModel(anos); ano = new JSpinner(modeloAno); ano.setValue(new Integer(1960)); ano.addChangeListener(this); add(ano); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
63 / 128
Programando Eventos
Applets
Eventos de seleo em
spinners
public void stateChanged(ChangeEvent e) { int dd = (Integer)(dia.getValue()); String tempm = (String)ms.getValue(); int mm = 0; for(mm=0;mm<12;mm++) if (tempm.equals(meses[mm])) break; int aa = (Integer)ano.getValue(); Calendar c = Calendar.getInstance(); c.clear(); c.setLenient(false); c.set(Calendar.DAY_OF_MONTH,dd); c.set(Calendar.MONTH,mm); c.set(Calendar.YEAR,aa); try { c.getTime(); } catch (Exception exc) { getContentPane().setBackground(Color.RED); repaint(); } } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
64 / 128
Programando Eventos
Applets
texto (acionados
public class ExemploEventoAcao extends JApplet implements ActionListener { private JTextField entrada; private JLabel sada; private JButton alterar,limpar; public void init() { setLayout(new GridLayout(1,4)); entrada = new JTextField(15); entrada.addActionListener(this); sada = new JLabel(); alterar = new JButton("Alterar"); alterar.addActionListener(this); limpar = new JButton("Limpar"); limpar.addActionListener(this); add(entrada); add(sada); add(alterar); add(limpar); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
65 / 128
Programando Eventos
Applets
Rafael Santos -
www.lac.inpe.br/rafael.santos
66 / 128
Programando Eventos
Applets
MouseMotionListener MouseWheelListener
Rafael Santos -
www.lac.inpe.br/rafael.santos
67 / 128
Programando Eventos
Applets
applets:
JComponent e implemente MouseListener e/ou MouseMotionListener e/ou MouseWheelListener de acordo com a necessidade.
Criar uma classe que herde de Escrever cdigo para os mtodos necessrios (nem todos precisam executar cdigo!)
listener
applet,
registrar o
Rafael Santos -
www.lac.inpe.br/rafael.santos
68 / 128
Programando Eventos
Applets
applet
para rabiscos.
applet
somente exibe
Guardamos posies dos pontos em uma lista quando o mouse pressionado ou arrastado (mtodos
mousePressed
mouseDragged).
paintComponent.
Rafael Santos -
www.lac.inpe.br/rafael.santos
69 / 128
Programando Eventos
Applets
www.lac.inpe.br/rafael.santos
70 / 128
Programando Eventos
Applets
Rafael Santos -
www.lac.inpe.br/rafael.santos
71 / 128
Programando Eventos
Applets
Rafael Santos -
www.lac.inpe.br/rafael.santos
72 / 128
Programando Eventos
Applets Timers
Threads
Introduo
Como fazer com que algo ocorra independente de aes do usurio?
Threads Timers:
applet.
Rafael Santos -
www.lac.inpe.br/rafael.santos
73 / 128
Programando Eventos
Applets Timers
Threads
Threads
Threads
applets,
componentes a interface
Runnable
e criar uma
Thread
public class ComponenteRunnable extends JComponent implements Runnable { private int x = 0; private Thread tt;
Rafael Santos -
www.lac.inpe.br/rafael.santos
74 / 128
Programando Eventos
Applets Timers
Threads
Threads
public ComponenteRunnable() { tt = new Thread(this); tt.start(); } protected void paintComponent(Graphics g) { g.setColor(Color.WHITE); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(Color.RED); g.drawLine(x,0,x,getHeight()); } public void run() { Thread t = Thread.currentThread(); while(t==tt) { x++; if (x > getWidth()) x = 0; repaint(); } } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
75 / 128
Programando Eventos
Applets Timers
Threads
Threads
public class AppletComComponenteRunnable extends JApplet { public void init() { ComponenteRunnable c = new ComponenteRunnable(); add(c); } }
Devemos considerar mtodos
start
stop
da
applet!
Rafael Santos -
www.lac.inpe.br/rafael.santos
76 / 128
Programando Eventos
Applets Timers
Threads
www.lac.inpe.br/rafael.santos
77 / 128
Programando Eventos
Applets Timers
Threads
www.lac.inpe.br/rafael.santos
78 / 128
Programando Eventos
Applets Timers
Threads
Rafael Santos -
www.lac.inpe.br/rafael.santos
79 / 128
Programando Eventos
Applets Timers
Threads
Timers
Timers
vez que o valor do temporizador for alcanado. Criamos uma classe que implementa Criamos uma instncia de registramos com a classe. Cada vez que o temporizador for disparado, o mtodo
ActionListener. javax.swing.Timer e a
actionPerformed
ser executado.
public class ComponenteComTimer extends JComponent implements ActionListener { private Color c; private Timer timer;
Rafael Santos -
www.lac.inpe.br/rafael.santos
80 / 128
Programando Eventos
Applets Timers
Threads
Timers
public ComponenteComTimer(int delay) { timer = new Timer(delay,this); timer.setCoalesce(true); timer.start(); } protected void paintComponent(Graphics g) { g.setColor(Color.WHITE); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(c); g.fillArc(0,0,getWidth(),getHeight(),0,360); } public void actionPerformed(ActionEvent e) { int r = (int)(Math.random()*256); int g = (int)(Math.random()*256); int b = (int)(Math.random()*256); c = new Color(r,g,b); repaint(); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
81 / 128
Programando Eventos
Applets Timers
Threads
Timers
public class AppletComComponenteComTimer extends JApplet { public void init() { setLayout(new GridLayout(2,2)); ComponenteComTimer c1,c2,c3,c4; c1 = new ComponenteComTimer(10); c2 = new ComponenteComTimer(50); c3 = new ComponenteComTimer(250); c4 = new ComponenteComTimer(1000); add(c1); add(c2); add(c3); add(c4); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
82 / 128
Programando
Java2D
Applets
Introduo
Introduo
Sabemos como montar o
layout
de uma
applet.
applets.
Applets
apresentao importante!
Podemos modicar aparncia de alguns componentes. Como fazer desenhos mais complexos em componentes de exibio? Java2D. Foco ser em desenhar componentes especcos.
Rafael Santos -
www.lac.inpe.br/rafael.santos
83 / 128
Programando
Java2D
Applets
Graphics2D
Graphics2D
JComponent pode sobreescrever paintComponent. Mtodo paintComponent recebe como argumento uma instncia de Graphics que o contexto grco onde
Cada classe que herda de mtodo desenharemos. Podemos fazer um
cast
de
Graphics
para
Graphics2D
ComponenteSimples
Rafael Santos -
www.lac.inpe.br/rafael.santos
84 / 128
Programando
Java2D
Applets
Graphics2D
Cores
Mudamos cores em um contexto grco com mtodo
setColor.
Argumento deve ser uma instncia de Exemplos:
Color.
g2d.setColor(Color.BLACK) (BLACK, BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW). g2d.setColor(new Color(10,80,200)). g2d.setColor(new Color(10,80,200)). g2d.setColor(new Color(10,80,200,120)). g2d.setColor(new Color(0xff00ff)).
Rafael Santos -
www.lac.inpe.br/rafael.santos
85 / 128
Programando
Java2D
Applets
Graphics2D
Rafael Santos -
www.lac.inpe.br/rafael.santos
86 / 128
Programando
Java2D
Applets
Graphics2D
Rafael Santos -
www.lac.inpe.br/rafael.santos
87 / 128
Programando
Java2D
Applets
Graphics2D
Rafael Santos -
www.lac.inpe.br/rafael.santos
88 / 128
Programando
Java2D
Applets
Graphics2D
break;
break;
break;
break;
www.lac.inpe.br/rafael.santos
89 / 128
Programando
Java2D
Applets
Graphics2D
Rafael Santos -
www.lac.inpe.br/rafael.santos
90 / 128
Programando
Java2D
Applets
Graphics2D
Texto
Usamos o mtodo Podemos criar
tamanhos diferentes. Veremos somente as fontes lgicas: Serif, SansSerif, Monospaced, Dialog, DialogInput.
Rafael Santos -
www.lac.inpe.br/rafael.santos
91 / 128
Programando
Java2D
Applets
Graphics2D
Texto
public class AppletComTexto extends JApplet { public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.BLUE); g2d.setFont(new Font("SansSerif",Font.ITALIC,24)); g2d.drawString("Texto",5,25); g2d.setFont(new Font("Serif",Font.ITALIC|Font.BOLD,36)); g2d.drawString("Texto",5,65); g2d.setFont(new Font("Dialog",Font.PLAIN,48)); g2d.drawString("Texto",5,115); g2d.setFont(new Font("DialogInput",Font.PLAIN,48)); g2d.drawString("Texto",5,175); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
92 / 128
Programando
Java2D
Applets
Graphics2D
Imagens e
Sprites
Podemos usar
ImageIcon
drawImage
da classe
Graphics2D
pode ser
Instncia de Image, obtida com ImageIcon.getImage(). X e Y para desenhar a imagem (origem canto superior esquerdo). Instncia de ImageObserver: pode ser null.
Rafael Santos -
www.lac.inpe.br/rafael.santos
93 / 128
Programando
Java2D
Applets
Graphics2D
Imagens e
Sprites
public class ComponentePeixe { private ImageIcon fish; private int x,y; // posio private int wf,hf; // tamanho peixe private int wa,ha; // tamanho aqurio private float speed; public ComponentePeixe(String filename,Dimension aq,float s) { fish = new ImageIcon(filename); wf = fish.getIconWidth(); hf = fish.getIconHeight(); wa = aq.width; ha = aq.height; speed = s; x = (int)(Math.random()*wa); y = (int)(Math.random()*(ha-hf)); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
94 / 128
Programando
Java2D
Applets
Graphics2D
Imagens e
Sprites
public void move() { x -= speed; if (x < -wf) { x = wa; y = (int)(Math.random()*(ha-hf)); } } protected void paint(Graphics2D g2d) { g2d.drawImage(fish.getImage(),x,y,null); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
95 / 128
Programando
Java2D
Applets
Graphics2D
Imagens e
Sprites
public class ComponenteAquario extends JComponent implements Runnable { private ComponentePeixe vermelho; private ComponentePeixe amarelo; private ImageIcon background; private Thread tt; public ComponenteAquario() { background = new ImageIcon("aquarium_bg.jpg"); Dimension area = new Dimension(background.getIconWidth(), background.getIconHeight()); vermelho = new ComponentePeixe("red_fish.png",area,2); amarelo = new ComponentePeixe("yellow_fish.png",area,5.5f); tt = new Thread(this); tt.start(); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
96 / 128
Programando
Java2D
Applets
Graphics2D
Imagens e
Sprites
protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.drawImage(background.getImage(),0,0,null); vermelho.paint(g2d); amarelo.paint(g2d); } public void run() { Thread t = Thread.currentThread(); while(t==tt) { vermelho.move(); amarelo.move(); repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { } } } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
97 / 128
Programando
Java2D
Applets
Graphics2D
Imagens e
Sprites
public class Aquario extends JApplet { private ComponenteAquario c; public void init() { c = new ComponenteAquario(); add(c); resize(720,540); } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
98 / 128
Programando
Java2D
Applets
Graphics2D
Imagens e
Sprites
Rafael Santos -
www.lac.inpe.br/rafael.santos
99 / 128
Programando
Applets
applet tem algumas restries de segurana: Uma applet no pode ler ou escrever arquivos
no cliente. Uma
localizados
applet applet
o servidor de onde foi carregada. Uma no pode iniciar novos programas no cliente.
appletviewer
applets
executadas com
so consideradas seguras!
Rafael Santos -
www.lac.inpe.br/rafael.santos
100 / 128
Programando Arquivos
Applets
Entrada e Sada
Lendo dados em
1
applets
applet,
precisamos:
Ter certeza de que o arquivo visvel na Internet e que vem do mesmo servidor da
applet.
2 3
URL
openStream().
InputStream
InputStream construir uma instncia de InputStreamReader. A partir da InputStreamReader criar uma instncia BufferedReader.
A partir da instncia de Ler strings do servidor.
de
Rafael Santos -
www.lac.inpe.br/rafael.santos
101 / 128
Programando Arquivos
Applets
Entrada e Sada
Lendo dados em
applets
public class AppletIO extends JApplet { private JLabel read1,read2; public void init() { setLayout(new GridLayout(2,1)); String s1 = readLineFrom("http://localhost:8080/rafael-jug"); JLabel l1 = new JLabel(s1); add(l1); String s2 = readLineFrom("http://www.cnn.com"); JLabel l2 = new JLabel(s2); add(l2); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
102 / 128
Programando Arquivos
Applets
Entrada e Sada
Lendo dados em
applets
private String readLineFrom(String url) { String texto = null; try { URL u = new URL(url); BufferedReader reader = new BufferedReader(new InputStreamReader(u.openStream())); texto = reader.readLine(); } catch (MalformedURLException e) { texto = "Erro na URL."; } catch (AccessControlException e) { texto = "Acesso invlido."; } catch (IOException e) { texto = "Erro de I/O."; } if (texto == null) texto = "ERRO!!!"; return texto; } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
103 / 128
Programando Arquivos
Applets
Entrada e Sada
Lendo dados em
applets
Rafael Santos -
www.lac.inpe.br/rafael.santos
104 / 128
Programando
Applets
classloader.
Exemplo, Class.forName("oracle.jdbc.driver.OracleDriver");.
applet.
Rafael Santos -
www.lac.inpe.br/rafael.santos
105 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Eclipse
Ferramenta sugerida para desenvolvimento. Gratuita, disponvel para vrias plataformas, extensvel.
www.eclipse.org.
Mostro aqui apenas um tutorial bsico do Eclipse. Tutoriais mais avanados existem na Internet.
Rafael Santos -
www.lac.inpe.br/rafael.santos
106 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Eclipse: Selecionando
Workspace
Rafael Santos -
www.lac.inpe.br/rafael.santos
107 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Eclipse: Selecionar
Workbench
Rafael Santos -
www.lac.inpe.br/rafael.santos
108 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Rafael Santos -
www.lac.inpe.br/rafael.santos
109 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Escolher
Rafael Santos -
www.lac.inpe.br/rafael.santos
110 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Rafael Santos -
www.lac.inpe.br/rafael.santos
111 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Clicar em
Finish.
Rafael Santos -
www.lac.inpe.br/rafael.santos
112 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Rafael Santos -
www.lac.inpe.br/rafael.santos
113 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Applet
Rafael Santos -
www.lac.inpe.br/rafael.santos
114 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Rafael Santos -
www.lac.inpe.br/rafael.santos
115 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Rafael Santos -
www.lac.inpe.br/rafael.santos
116 / 128
Programando Extras
Applets Applets
com Eclipse
Desenvolvendo
Eclipse: Executando a
No menu, selecionar Run Run As Java Applet.
Applet
Rafael Santos -
www.lac.inpe.br/rafael.santos
117 / 128
Programando Extras
Applets
Deployment
Deployment
Vamos ver como fazer o
applet
em um arquivo
completo de uma
Arquivos
jar:
Assumimos que as classes no esto em pacotes (isto , no tem declarao package). Assumimos que os arquivos .class e os resources (imagens) esto em um mesmo diretrio.
Rafael Santos -
www.lac.inpe.br/rafael.santos
118 / 128
Programando Extras
Applets
Deployment
Deployment
Faremos ligeiras modicaes nas classes. Imagens no podem ser carregadas com
ImageIcon(nomeDaImagem):
uma URL.
new
applets,
peixes tero
Rafael Santos -
www.lac.inpe.br/rafael.santos
119 / 128
Programando Extras
Applets
Deployment
Deployment
: aqurio modicado
public class ComponentePeixe { private ImageIcon fish; private int x,y; // posio private int wf,hf; // tamanho peixe private int wa,ha; // tamanho aqurio private float speed; public ComponentePeixe(String filename,Dimension aq,float s) { URL iconURL = getClass().getResource(filename); fish = new ImageIcon(iconURL); wf = fish.getIconWidth(); hf = fish.getIconHeight(); wa = aq.width; ha = aq.height; speed = s; x = (int)(Math.random()*wa); y = (int)(Math.random()*(ha-hf)); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
120 / 128
Programando Extras
Applets
Deployment
Deployment
: aqurio modicado
public class ComponenteAquario extends JComponent implements Runnable { private ComponentePeixe vermelho; private ComponentePeixe amarelo; private ImageIcon background; private Thread tt;
Rafael Santos -
www.lac.inpe.br/rafael.santos
121 / 128
Programando Extras
Applets
Deployment
Deployment
: aqurio modicado
public ComponenteAquario(float vv,float va) { URL imageURL = getClass().getResource("aquarium_bg.jpg"); background = new ImageIcon(imageURL); Dimension area = new Dimension(background.getIconWidth(), background.getIconHeight()); vermelho = new ComponentePeixe("red_fish.png",area,vv); amarelo = new ComponentePeixe("yellow_fish.png",area,va); tt = new Thread(this); tt.start(); } protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.drawImage(background.getImage(),0,0,null); vermelho.paint(g2d); amarelo.paint(g2d); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
122 / 128
Programando Extras
Applets
Deployment
Deployment
: aqurio modicado
public void run() { Thread t = Thread.currentThread(); while(t==tt) { vermelho.move(); amarelo.move(); repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { } } } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
123 / 128
Programando Extras
Applets
Deployment
Deployment
: aqurio modicado
public class Aquario extends JApplet { private ComponenteAquario c; public void init() { float vv = getValor("velVermelho"); float va = getValor("velAmarelo"); c = new ComponenteAquario(vv,va); add(c); resize(720,540); }
Rafael Santos -
www.lac.inpe.br/rafael.santos
124 / 128
Programando Extras
Applets
Deployment
Deployment
: aqurio modicado
private float getValor(String parmetro) { float valor = 1; String val = getParameter(parmetro); if (val != null) try { valor = Float.parseFloat(val); } catch (NumberFormatException e) { } return valor; } }
Rafael Santos -
www.lac.inpe.br/rafael.santos
125 / 128
Programando Extras
Applets
Deployment
Deployment
resources
(imagens)
jar cvf aquario.jar Aquario.class ComponenteAquario.class ComponentePeixe.class aquarium_bg.jpg red_fish.png yellow_fish.png adding: adding: adding: adding: adding: adding: Aquario.class(in = 439) (out= 307)(deflated 30%) ComponenteAquario.class(in = 1673) (out= 986)(deflated 41%) ComponentePeixe.class(in = 1304) (out= 757)(deflated 41%) aquarium_bg.jpg(in = 80273) (out= 79502)(deflated 0%) red_fish.png(in = 3412) (out= 3368)(deflated 1%) yellow_fish.png(in = 4047) (out= 4017)(deflated 0%)
Rafael Santos -
www.lac.inpe.br/rafael.santos
126 / 128
Programando Extras
Applets
Deployment
Deployment
<html> <head><title>Aqurio Virtual</title></head> <body bgcolor="#a0e8ff"> <center> <h3>Aqurio Virtual em Java</h3> <APPLET CODE="Aquario.class" ARCHIVE="aquario.jar" WIDTH=720 HEIGHT=540> <PARAM NAME=velAmarelo VALUE=2.5> <PARAM NAME=velVermelho VALUE=6.5> Se voc est lendo isso porque seu navegador no reconhece <i>applets</i>! </APPLET> </center> </body> <html>
Rafael Santos -
www.lac.inpe.br/rafael.santos
127 / 128
Programando Extras
Applets
Deployment
Deployment
Rafael Santos -
www.lac.inpe.br/rafael.santos
128 / 128