Vous êtes sur la page 1sur 113

DESENVOLVIMENTO DE APLICAÇÕES

JAVA UTILIZANDO A IDE NETBEANS


Alexander Haroldo da Rocha
Renato de Jesus Manzoni
TÓPICOS ABORDADOS
| Revisão dos pilares da programação orientada à objeto;
| Noções primárias de Engenharia de Software;
| Classpath e .Jar (Java ARquive);
| javax.swing.*;;
Pacote javax.swing.
| Conexão com banco de dados via JDBC;
| Tratamento de Exceções com try-catch-finally;
| Utilizando o debug do NetBeans;
| Desenhando primitivas geométricas sobrescrevendo o método
paintComponent();

BIBLIOGRAFIA
| Deitel, H. M; Deitel, P. J. Java, como programar, 6ª ed.
| Horstmann, Cay S. e Cornell, Gary. Core Java 2 – Recursos
Avançados, vol 2, MakRon Books, 2001
| Seu maior ajudante: www.google.com
CONHECENDO A IDE NETBEANS
Descobrindo
D b i d o ambiente
bi t e aprendendo
d d as suas
facilidades
CONHECENDO A IDE NETBEANS
| O NetBeans é uma IDE Java desenvolvida pela
empresa Sun Microsystems.
bi t d
| É um ambiente de d l i
desenvolvimentot iintegrado
t d
gratuito e de código aberto para desenvolvedores
de software.
software A IDE é executada em muitas
plataformas, como Windows, Linux, Solaris e
MacOS.

Dica de Programação
- Conheça
C h e use ttodas
d as ffacilidades
ilid d que a IDE
tem a oferecer: Hiperlinks, AutoComplet, Solução
automática de erros
erros, etc
etc.
REVISÃO DE ORIENTAÇÃO À OBJETO
Revisando
R i d os principais
i i i conceitosit de
d orientação
i t ã a
objeto, aplicando essas definições na linguagem Java
POO – REVISÃO DOS CONCEITOS
| Motivação:
| Abstrair os conceitos do mundo real
| Identificar estes conceitos como objetos

| Pilares da Programação Orientada a


Objeto:
| Abstração.
| Encapsulamento;
| Herança;
| Polimorfismo;
POO – REVISÃO DOS CONCEITOS
| Definindo uma Classe:
y Abstração:

public class Pessoa {


Atributos da Classe
String nome;
int idade;
boolean sexo;

public Pessoa() { Construtor: toda vez que se


cria
i um objeto,
bj t o construtor
t t é
} chamado.
}
POO – REVISÃO DOS CONCEITOS
| Encapsulamento:
y Proteger os atributos da classe.
| Os Métodos encapsulam os atributos da classe
classe.
y Omitir detalhes de implementação.
| O método oferece um serviço,
ç sem informar como irá fazê-lo.

public class Pessoa {


...
void setNome(String nome) { this.nome = nome; }
void setSexo(boolean sexo) { this.sexo = sexo; }
void setIdade(int idade) {
if( idade > 0 ) this.idade = idade;
} Garante a integridade
} do atributo idade
POO – REVISÃO DOS CONCEITOS
public
bli class
l P
Pessoa {
...
String getNome() { return nome; }
boolean getSexo() { return sexo; }
int g
getIdade()
() { return idade;; }

float getSalario(...) {
...
return salario;
p ç
Oculta detalhes de implementação
}
}
POO – REVISÃO DOS CONCEITOS
| Herança:
y Classes (sub-classe) que herdam atributos e métodos
de outra classe (super-classe):
(super classe):

public class Professor extends Pessoa {


p
String cursoSuperior;
int anoFormação;
}

public class Funcionario extends Pessoa {


int experienciaProfissional;
String departamento;
}
POO – REVISÃO DOS CONCEITOS
| Polimorfismo: Métodos
Mét d possuem o mesmo nome,
porém número diferentes de
y Sobrecarga de Métodos: parâmetros.

public class Pessoa {


float getSalario(float impostoA) {
return (salario - impostaA);
}
float getSalario(float impostoA, float impostoB) {
return (salario - impostaA - impostoB);
}
POO – REVISÃO DOS CONCEITOS
| Sobrescrita de Métodos:

public class Professor extends Pessoa {


float getSalario(float impostoA) {
return
t ( l i - impostoA
(salario i t A + bonus);
b )
}
}

Métodos possuem o mesmo nome


e os mesmos parâmetros, porém o
corpo do método é diferente.
O QUE VOCÊ PRECISA SABER EM JAVA
| Toda classe em Java herda automaticamente da
classe Object.
I t i objetos:
| Instanciar bj t
Pessoa p = new Pessoa();
| S b usar os modificadores
Saber difi d d
de acesso:
y private: somente a classe que contém seus atributos e
métodos tem acesso a esses
esses.
y public: Classes que contém atributos e métodos public
permitem que outras classes tenham acesso a esses.
| Declarar classes abstratas. Isto permite que classes
não sejam instanciadas.
public abstract class Faculdade { ... }
O QUE VOCÊ PRECISA SABER EM JAVA
| Toda classe tem o método toString(). Esse método
retorna uma representação String do objeto.
y É importante sobrescrever este método.
método
public class Pessoa {
String toString()
{
return nome;
}
}
Ex:
Pessoa p = new Pessoa();
System out println(p);
System.out.println(p);
NOÇÕES DE ENGENHARIA DE
SOFTWARE
N õ bá
Noções básicas
i de
d construção
t ã de
d um software
ft
NOÇÕES DE ENGENHARIA DE SOFTWARE
| Separar o sistema em três camadas básicas:
interface, estrutura e persistência;
O i
| Organizar-se, i d padrões
seguindo dõ d de
desenvolvimento de software;
| Dividir o desenvolvimento do software em fases
fases,
cada fase tratando uma parte da aplicação. O fim
de uma fase constitui na entrada da outra fase;
| Conhecer noções básicas de atribuição de
p
responsabilidades;
| Condicionar ao reuso;

| Não misturar Interface com Estrutura e vice-versa;;


NOÇÕES DE ENGENHARIA DE SOFTWARE
Boa Prática de Programação
- Utilize padrões de escrita de código.

o Nome de variáveis e nome de métodos: primeira


minúscula e as primeiras da próxima palavra em
maiúscula: nomePessoa, inserirFimFila(...)
o Nome de métodos, como verbos no infinitivo:
carregarPessoa() imprimirSaldo()
carregarPessoa(),
o Nome de pacotes, classes e imagens começando com
letras maiúsculas;
o Comentários do tipo /* ... */ para principais e do tipo //
(linha) para comentários internos;
o Nunca usar _ ou qualquer outro caractere em nome de
atributos;
CLASSPATH E .JAR
| O CLASSPATH é uma iimportante
t t variável
iá l d
de
ambiente do Java. Essa variável é importante tanto
para compilar
p p quanto p
q para executar o seu pprograma,
g ,
já que especifica onde estão armazenados os
arquivos e bibliotecas necessários, tanto para a
compilação quanto para a execução.
compilação, execução

| JAR significa Java ARchive, e é simplesmente um


arquivo ZIP normal, com uma extensão diferente
apenas. Estes arquivos são usados para facilitar a
distribuição de pacotes e manter a simplicidade na
hora de configurar os ambientes de desenvolvimento,
uma vez que é possível colocar todos seus pacotes
dentro de um único arquivo JAR
CLASSES E MÉTODOS IMPORTANTES
| Métodos estáticos das classes Integer, Short, Float,
etc:
y Integer valueOf(String str | int i);
Integer.valueOf(String
y Integer.parseInt(String str);

| Métodos básicos em algumas classes do swing


y setVisible(true | false);
y setText(“string”);
setText( string );
y setEnable(true | false);

| y ;
Classes LinkedList<Class> e ArrayList<Class>;
| Conceitos de herança e abstrações de classe para
sua utilização em listas encadeadas;
PACOTE JAVAX.SWING.*;
P
Pacote
t swing
i ded interface
i t f gráfica
áfi dod java
j
JAVAX.SWING.*
| Pacote java para desenvolvimento de aplicações
com interface gráfica. Substituiu a awt como
padrão java, desde o Java 1.2 (Java 2)
| Cada componente terá vários eventos associados
a ele. Alguns eventos são: actionPerformed(...),
KeyPressed( ) MousePressed(
KeyPressed(...), MousePressed(...))
MouseDragged(...), ItemStateChange(...), etc.
| Basicamente temos Contêineres e Componentes.
Componentes
Os Conteiners encapsulam Components.
Boa Prática de Programação
- Procure não utilizar os nomes de atributos
sugeridos como default pelo NetBeans
NetBeans, como
jButton1. Mude para botaoCadastrar, por exemplo
JAVAX.SWING.JFRAME
| Frame utilizado para formulários ou telas principais
do sistema. O método setVisible(true) torna-o
visível e o método dispose() fecha o frame. Se for
o frame principal, feche com System.exit(0)
this setExtendedState(this MAXIMIZED BOTH);
this.setExtendedState(this.MAXIMIZED_BOTH);

Constantes usadas no método acima:


- NORMAL: Tela no estado normal

- ICONIFIED: Tela no estado minimizado

- MAXIMIZED_HORIZ: Expansão horizontal

- MAXIMIZED_VERT: Expansão vertical

- MAXIMIZED_BOTH: Tela maximizada


JLABEL
| Componente texto para formulários

JBUTTON
| Componente botão. Assim como qualquer outro
componente swing
swing, ele é bem genérico
genérico. Não é
utilizado apenas como botão simples, mas também
como botões de barra de ferramentas, ppanels, etc.

JCHECKBOX
| Caixa de seleção simples. O método isSelected()
retorna se está ou não setado.
JRADIOBUTTON E BUTTONGROUP
| Caixas de seleção para grupo de seleções
seleções.
| Cada radioButton é um campo de seleção. Crie um
buttonGroup para formar um grupo de seleção e
então associe cada radioButton ao grupo que
desejar, através do atributo buttonGroup.
JTEXTFIELD
| Campo de escrita simples
simples.
| Como não há limitação de número de caracteres,
deveremos utilizar um outro artifício para tal
tal.
| Através de uma classe chamada
FixedLengthDocument, feita especialmente para
esse caso, podemos setar o tamanho máximo do
campo.
jTextFieldNome.setDocument( new FixedLengthDocument(30) );

JPASSWORDFIELD
| O mesmo p para um JTextField,, porém,
p , existirá um
caractere indicativo de senha. (y)
JFORMATTEDTEXTFIELD
| Campo de escrita formatada
| Exemplos de aplicação: RG, CPF, Datas, etc

// Criando
C i d uma máscara
á d
de fformatação
t ã
MaskFormatter formatterData = new MaskFormatter(“##/##/####”);
// Instalando a máscara no jFormattedTextField
formatterData.install(jFTextFieldNasc);
// Setando um texto – 10/12/1990
jjFTextFieldNasc.setText(“10121990”);
( ) // Aceita com ou sem ‘/’

# - Dígito * - Qualquer tecla


H – Hexadecimal \ - Literal
U – Caractere em maiúsculo
L – Caractere em minúsculo
A – Caractere
C alfa-numérico
lf éi
? – Caractere qualquer
JTEXTPANE
| Área extensa para textos sem formatação

JTOGGLEBUTTON
| Componente botão do tipo pressionado e não
pressionado Segue as mesmas características e
pressionado.
generalidade do JButton

JPANEL
| Base que sustenta um pequeno conjunto de
componentes. Tem generalidades específicas que
veremos mais adiante.
EXERCÍCIO 1A
| Crie uma classe Pessoa com os seguintes campos:
nome (String limitada de tamanho 20), idade (short),
dataInscricao (String formatada), moraSozinho
(boolean) Por enquanto,
(boolean). enquanto não se preocupe com sets e
gets.
| Lembre
Lembre-sese das técnicas de Engenharia de Software:
Interface e Estrutura devem estar em pacotes
separados. Crie dois pacotes com esses nomes;
| Faça um formulário sobre um jPanel com borda
(TitledBorder), como mostra o arquivo ex1a.jar.
| Ao clicar no botão Cadastrar
Cadastrar, instancie um objeto da
classe pessoa e em Cancelar, feche o frame.
| Os Botões devem estar fora do painel!
p
JSCROLLBAR E JSCROLLPANE
| Barra de rolagem simples e em caixas
caixas.
Componentes, como tabela, são utilizados dentro
de um JScrollPane

JTABBEDPANE
| Caixa com abas. A estrutura de um TabbedPane é
simples, sendo que cada aba será adicionada
através de um Panel.
EXERCÍCIO 1B
| Faça um tabbedPane e coloque duas abas: o panel
com o pequeno formulário com o nome de Dados
Gerais e outro vazio com o nome de Dados
Pessoais (nome do atributo – Tab Title)
| O formulário da nova aba deverá conter campos
para CPF e RG, devidamente formatados, como
mostra o arquivo ex1b.jar.
| Os botões de Cadastrar e Cancelar devem estar
fora do painel de abas.
JCOMBOBOX
| Componente que armazena uma lista de
objetos, sendo que apenas um é visível.
Utili o método
| Utiliza ét d toString()
t St i () para mostrar
t a
informação visível.

¾ addItem(Object anObject) – Adiciona um objeto ao


comboBox.
¾ getSelectedItem( ) – Retorna o objeto selecionado.
¾ setSelectedItem(Object objeto | int indice) – Seta o
objeto como selecionado. Possui dois tipos de
parâmetros: o índice do objeto no comboBox ou
então o próprio objeto a ser selecionado.
selecionado
¾ removelAllItens() – Remove todos os ítens
JLIST
| Semelhante ao ComboBox, só que todos os
elementos do List são visíveis e a seleção é
feita por linha. É possível também a seleção
de várias linhas simultaneamente.

JSPINNER
| Componente
p q
que muda os valores através de
botões do tipo up-down. (Geralmente para inteiros)
¾ setValue(Object
( j value)) – Seta o valor do Spinner
¾ getValue( ) – Retorna o Objeto indicado no Spinner
¾ Utilize o evento StateChange g ppara tratar mudanças
ç
no Spinner. (Impedir valores negativos, por ex.)
EXERCÍCIO 2
| Utilize o arquivo ex2.jar como base.
| Troque o campo idade por um JSpinner. Limita o
S i
Spinner d modo
de d que não
ã sejaj possível
í l números
ú
negativos (evento Change – StateChange).
| Na aba Dados pessoais do JTabbedPane,
JTabbedPane crie os
campos para endereço (endereço e cidade) e
estado como sendo um jComboBox. (coloque uns 5
UF apenas). Crie apenas campo estado do tipo
String na classe Pessoa.java.
| Mude o construtor da classe Pessoa, de modo que
inclua o parâmetro estado (UF). No botão
C d t
Cadastrar, iinstancie
t i a classe
l P
Pessoa com o
atributo adicional do estado (UF).
JTABLE
| Componente tabelatabela.
| Dados relativos à tabela são armazenados no
objeto model (Modelo da tabela)
| Sempre que for trabalhar com os elementos da
tabela,, utilize o método g
getModel(( ) p
para retornar o
modelo da tabela.

// Retornando o modelo da tabela para trabalhar com ela


javax.swing.table.DefaultTableModel modelo =
(javax.swing.table.DefaultTableModel) jTable.getModel();

Agora com o modelo da tabela, é possível inserir


registros nela.
JTABLE
// Apaga tudo na tela
modelo.setRowCount(0);
// Adiciona uma linha à tabela
modelo.addRow(new Object[ ] { Object1, Object2, ... } );
// Remove uma linha da tabela
modelo.removeRow(indice)
d l R (i di )

/ Não precisam do modelo da tabela *//


/*
// Retorna o objeto na linha row e coluna column
modelo.getValueAt(row,column);
// Retorna o número de linhas selecionadas
modelo.getSelectedRowCount( );
// Retorna o índice da linha selecionada,
selecionada caso seja uma
ma
modelo. getSelectedRow( );
EXERCÍCIO 3
| Agora ao lado do painel com abas que está pronto
pronto,
coloque uma tabela com dois campos: nome e estado.
Ao clicar em cadastrar, é instanciado um objeto pessoa
e adicionado na tabela. Depois, apague todos os
campos do formulário (crie um método para isso!).
Apóie-se no arquivo ex3.jar.
| Implemente o método toString( ) da classe Pessoa,
d que ele
sendo l retornará
t á o nome dda pessoa, e ttodos
d os
gets( ) da classe (Encapsular campos do NetBeans.
| Coloque um botão Exibir Dados abaixo da tabela
tabela. Ao
clicar nele, a linha da tabela é buscada e os dados da
pessoa são mostrados. (Pode ser mostrado com o
método System.out.println(...). (java –jar ex3.jar)
JMENUBAR
| Menu para Frames principais.
| Utilize a toolbar Inspector do NetBeans. No
M B clique
MenuBar, li com o b tã di
botão it d
direito á
do mouse e vá
em Add.
| Add Jmenu adiciona um novo menu

| Add JMenuItem adiciona um ítem do menu

| Add Jmenu em um MenuItem adiciona um sub sub-


menu.
| Add JSeparator adiciona um separador (uma linha)
entre os itens do menu. Note que JSeparator é um
componente
p g
genérico,, usados em muitos outros
objetos, como na jToolBar (barra de ferramentas)
JTOOLBAR
| Barra de ferramentas. Para adicionar botões ou
separadores, escolha o componente que deseja e
arraste para a toolbar
toolbar.
| Para botões, você pode retirar o texto e colocar
uma figura
figura. Para isso
isso, clique no botão
botão, e altere o
atributo icon com a imagem desejada. Utiliza o
Classpath para não ter problemas com referência.
| Assim como no MenuBar é possível adicionar
separadores na toolbar.
| Selecione o atributo floatable se desejar uma
toolbar que pode ser deslocada de um lugar para o
outro.
t
JPOPUPMENU
| Menu Popup para componentes
| Utilize os mesmos princípios do JMenuBar para
i it
criar itens d JP M
de menu ao JPopupMenu.
| Para adicionar o menu Popup em algum
componente no atributo componentPopupMenu
componente,
indique o menu Popup que você deseja utilizar.
EXERCÍCIO 4
| Igualmente ao arquivo ex4.jar, faça um menuBar e
uma toolBar para a aplicação. Não esqueça de
fazer referência às figuras através do ClassPath
ClassPath.
Para isso, crie outro pacote com o nome de
Imagens.
g
| Faça um menu Popup para a tabela. Coloque como
itens do menu: Deletar Registro, jSeparator e
Fechar. Ao clicar em Deletar, remova a linha
selecionada na tabela.
JDIALOG
| Tela de diálogo rápido do usuário com o sistema.
Não é um tipo de frame que se usa para fazer
formulários
formulários.
| A característica mais marcante desta classe é o
atributo modal que indica que a tela estará sempre
a frente de todas as outras e que você não poderá
fazer mais nada enquanto não fechá-la. Exemplos
de dialogs são: dialogs para salvar/abrir arquivos,
avisos de erro ou informativos, dialogs de
impressão,
i ã etc.
t
JDIALOG
JDialogConexao dialogConexao;

dialogConexao = new JDialogConexao(this,true);


java.awt.Dimension d =
j
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
t T lkit tD f ltT lkit() tS Si ()
// Posiciona a dialog no centro
dialogConexao.setLocation(d.width/2 -
dialogConexao.getWidth()/2, d.height/2 -
dialogConexao.getHeight()/2);
dialogConexao getHeight()/2);

dialogConexao setVisible(true);
dialogConexao.setVisible(true);
JFILECHOOSER
| Classe permite que se escolham arquivos ou
diretórios.

JFileChooser jFileChooser = new JFileChooser();

// Seleciona somente arquivos


jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

if( jFileChooser.showDialog(jDialogBuscaBD, "Abrir") ==


JFileChooser.CANCEL_OPTION )
return;
t

String arquivo = jFileChooser.getSelectedFile().getPath();


JFILECHOOSER
| Pode-se também adicionar filtros ao fileChooser.
Veja os exemplos abaixo:

// Criando um novo filtro


filtroJPEG = new FileNameExtensionFilter("JPEG
( Files", "jpg",
jpg
"JPG", "jpeg","JPEG");

// Existirá um filtro do tipo ‘All


All Files
Files’ ?
fileChooser.setAcceptAllFileFilterUsed(false);

// Adiciona o filtro no fileChooser


fileChooser.addChoosableFileFilter(filtroJPEG);
UM POUCO DA CLASSE FILE
| A classe File é uma classe genérica para
tratamento de arquivos, do tipo verificar se ele
existe qual o seu caminho
existe, caminho, seus atributos
atributos, etc
etc.
| Para salvar ou abrir arquivos utiliza-se outras
classes: as Data ou File Input/OutputStreams para
arquivos binários e FileReader/Writer para arquivos
textos.
| Não entraremos em detalhes dessas classes, pelo
tempo que temos, porém, utilize a descrição destas
classes pelo NetBeans. Não é muito complicado!
JDESKTOPPANE E JINTERNALFRAME
| Muitos aplicativos utilizam uma interface de
múltiplos documentos (MDI).
B i t uma janela
| Basicamente, j l principal
i i l (j l i)
(janela-pai)
contém outras janelas (janelas-filha) para gerenciar
vários documentos abertos que estão sendo
processados em paralelo.
JIFTeste jInternalFrame = new JIFTeste();

j p (j
jDesktopPane.add(jInternalFrame););
jInternalFrame.setVisible(true);

JIFTeste
JIFT t jInternalFrame
jI t lF =
(JIFTeste)jDesktopPane.getSelectedFrame();
EXERCÍCIO 5
| Como o arquivo ex5.jar, coloque o painel de abas em
um InternalFrame e faça um desktopPane na janela
principal Faça as chamadas de eventos necessárias
principal. necessárias,
de modo que seja possível abrir o formulário pelo
menu e p pela toolbar.
| Não se esqueça de transferir todo o código relativo ao
formulário para o InternalFrame, juntamente com as
formatações dos TextFields no constrututor do frame,
métodos relacionados e o buttonGroup do sexo.
| Todo o código relativo à tabela deverá ser retirado,
removendo até mesmo a tabela e o menu Popup
relativo a ela
ela. Maximize o Frame Principal ao iniciar
iniciar.
JOPTIONPANE
| A classe JOptionPane oferece caixas de diálogo
predefinidas que permitem aos programas exibir
mensagens ao usuário.
| Abaixo segue alguns métodos desta classe:

// C
Caixa
i d de diál
diálogo de
d uma mensagem
showMessageDialog(null, "Mensagem", "Título", messageType);

// Caixa de diálogo de confirmação


showConfirmDialog(null, "Mensagem", "Título",
optionType messageType);
optionType,

// Caixa de diálogo de uma entrada


showInputDialog(null,
h I tDi l ( ll "Mensagem",
"M " "Título",
"Tít l " messageType);
T )
Constante (optionType) Descrição

YES_NO_OPTION Caixa de diálogo do tipo Sim ou Não

YES_NO_CANCEL_OPTION Caixa de diálogo do tipo Sim, Não ou Cancelar

OK_CANCEL_OPTION Caixa de diálogo do tipo OK ou Cancelar

Constante Ícone Descrição


(messageType)
Exibe um diálogo que indica um erro para o
ERROR_MESSAGE
usuário

Exibe um diálogo com uma mensagem com


INFORMATION MESSAGE
INFORMATION_MESSAGE
i f
informações
õ para o usuário
ái

Exibe um diálogo que adverte o usuário sobre um


WARNING_MESSAGE
problema em potencial

Exibe um diálogo que impõe uma pergunta ao


QUESTION_MESSAGE usuário. Geralmente exige uma resposta do tipo
Sim ou Não

Exibe um diálogo que simplesmente contém uma


PLAIN_MESSAGE Sem ícone
mensagem, sem nenhum ícone
JSLIDER
| Componente usado para barra de valores. Você
pode escolher o valor mínimo e máximo da barra,
que ela devolve a você o valor corrente
corrente.

JPROGRESSBAR
| Barra de progresso simples. Contém atributos para
valores mínimo e máximo da barra de progresso e
também um campo string que pode ser adicionado
opcionalmente para informar a porcentagem
corrente.
HTML EM COMPONENTES SWING
| A interface gráfica Swing aceita códigos HTML para
formatação de textos. É simples de usar e muito útil
em várias situações
situações.
| Para usar, apenas coloque o código HTML pelo
método setText(
setText(“...”);
); dos componentes.
componentes

String strHtml = "<html><center><b>


<html><center><b> Olá <br> <font
color=green> Mundo </font></b></center></html>";

JOptionPane.showMessageDialog(null,strHtml,
"Teste"
Teste ,JOptionPane.PLAIN_MESSAGE);
JOptionPane PLAIN MESSAGE);
ADICIONANDO UM RELÓGIO EM UM FRAME
| Crie um label no frame que desejar
desejar.
| Faça o seu frame implementar a classe ActionListener.
Compile. Veja que o NetBeans pedirá os pacotes
necessários e também implementar os métodos
abstratos. Nesse momento, ele criará um método:
actionPerformed(ActionEvent e)
| Crie um método dispararRelogio() e chame esse
método
ét d no construtor
t t dod frame
f e implemente
i l t a ffunção
ã
actionPerformed(...)
| Para isso
isso, lembre de criar um atributo no frame
frame, do tipo
javax.swing.Timer.
| Olhe o arquivo relogio
relogio.jar
jar para vê
vê-lo
lo funcionando
funcionando.
| Adicione seu relógio ao projeto
| public void dispararRelogio()
| {
| timer = new javax.swing.Timer(1000, this);
| timer.setInitialDelay(0);
| timer start();
timer.start();
| }

| public
bli void
id actionPerformed(ActionEvent
ti P f d(A ti E t e))
| {
| GregorianCalendar calendario = new GregorianCalendar();
| int h = calendario.get(GregorianCalendar.HOUR_OF_DAY);
| int m = calendario.get(GregorianCalendar.MINUTE);
| int s = calendario.get(GregorianCalendar.SECOND);
g ( g );
|
| String hora = ( (h < 10) ? "0" : "" ) + h + ":" +
| ( (m < 10) ? "0"
0 : "" ) + m + ":": +
| ( (s < 10) ? "0" : "" ) + s ;
|
| jLabelHora setText(hora);
jLabelHora.setText(hora);
| }
TRATAMENTO DE EXCEÇÕES COM
TRY-CATCH-FINALY
Tratando
T t d erros lógicos
ló i excepcionais,
i i de
d falhas
f lh ao
acesso de um BD até erros de divisão por zero.
CONHECENDO A ESTRUTURA DE UM TRY-
CATCH-FINALLY
try
{
// Código tentará
Cód go que te ser e
ta á se executado
ecutado
}
catch( Exception e )
{
// Se uma exceção for atingida, este código é
// executado
}
finally
{
// Finalmente, com ou sem exceção, este código é
// executado
}
VISÃO GERAL DAS EXCEÇÕES
CLASSE DE EXCEÇÕES
| Existem basicamente duas classes de exceções:
exceções verificadas e exceções não verificadas.
E õ não-verificadas
| Exceções ã ifi d não ã precisam
i ser
listadas na clausula throws. Em geral são as
exceções de execução (RuntimeException),
(RuntimeException) como
ponteiro nulo, erro de ‘casting’, erro de aritmética,
de limite de arrays, etc. Podem ser evitadas
facilmente através de uma boa programação.
| Exceções verificadas devem ser listadas na
cláusula throws, porque ela depende de vários
fatores que não são influenciados pela
programação mas sim pelo estado de execução do
programação,
programa, como em BD, abertura de imagens, etc.
THROW
| Um método pode ser declarado como throws.
| A grosso modo, significa que o método não vai
t t a exceção
tratar ã que segue throws.
th El será
Ela á
‘jogada’ para o método que chamou este método
em questão.
questão
| O sentido disso é muito simples: quando ocorre um
erro em uma inserção no bando de dados, não
será naquela camada que eu avisarei o usuário
deste erro. Então a exceção será lançada método a
método até chegar à camada de Interface, que
tratará a exceção e avisará o usuário com
mensagens de erro apropriadas.
apropriadas
EXEMPLO DE THROWS
public
bli void
id metodoA()
d A()
{
try
{
objeto.metodoB();
j ();
}
catch( Exception1 ex ) { /* Código para a exceção */ }
}

public
bli void
id metodoB()
d B() throws
h Exception1,
E i 1 E Exception2
i 2
{
// Codigo ...
}
MÉTODOS DOS OBJETOS DE EXCEÇÃO
| Existem alguns métodos que os objetos de
exceção oferecem para analisarmos os erros.

// Imprime a pilha de chamada de métodos


excecao.printStakeTrace()
i tSt k T ()

// Retorna uma string descrevendo o erro ocorrido


excecao.getMessage()
CONEXÃO COM BANCO DE DADOS
VIA JDBC
CONEXÃO COM O BANCO DE DADOS - JDBC
| A conexão com o banco de dados vai JDBC utiliza
um arquivo .jar que constitui o elo de ligação da
aplicação com o SGBD utilizado
utilizado. Ele deve ser
incluído nas Opções do Projeto.
| Na janela Runtime
Runtime, é possível fazer uma conexão
local com o banco de dados para fazer algumas
consultas ou atualizações.
| Utilize a classe de apoio Conexao.java, já pronta.

| Três métodos p p
principais q
que você deve conhecer
desta classe: conecta(), desconecta() e
getConection() .
PASSOS PARA FAZER UMA APLICAÇÃO
Ç COM
BANCO DE DADOS
1. Inicialmente e ironicamente não se preocupe com
o banco de dados da aplicação. Faça os
formulários e tudo o que necessita para a
aplicação.
2 Utilizando um SGBD
2. SGBD, faça um banco de dados
para a aplicação.
3. Inclua no projeto a classe Conexao.java e faça
uma outra abstrata, que vai ser sua camada de
persistência.
4. Nesta classe de persistência, implemente os
métodos insert, updade, etc, como estáticos.
5. Em Projeto/Propriedades – Libraries, inclua o
conector JBDC (add JAR/Folder)
PASSOS PARA FAZER UMA APLICAÇÃO
Ç COM
BANCO DE DADOS
1. Já foi feito!
2. Vamos fazer um BD para o último exercício.
V
Vamos i uma ttabela
criar b l PESSOA com os campos
rg (chave primária), nome, idade, cidade e estado,
sendo do tipo varchar(tamanho de restrição)
3. ---
4 Agora vamos ver como os comandos sql devem
4.
ser inseridos no código. Lembrando que devemos
p
passar a classe q j
que desejamos salvar e a
conexão atual usada.
IMPLEMENTANDO O MÉTODO SAVARREGISTRO
| Método savarRegistro(Pessoa p, Conexao conexao)
conexao.conecta();
Connection con = conexao.getConection();
conexao getConection();
String query = "INSERT INTO pessoa(rg, nome, idade,
cidade, estado) VALUES (?,?,?,?,?)";
PreparedStatement pSt = con.prepareStatement(query);
pSt.setString(1, p.getRg() );
pSt.setString(2, p.getNome() );
pSt.setInt(3, p.getIdade() );
pSt.setString(4, p.getCidade() );
pSt setString(5 p.getUF()
pSt.setString(5, p getUF() );

pSt.executeUpdate();
pSt.close();
conexao.desconecta();
IMPLEMENTANDO O MÉTODO ATUALIZAREGISTRO
| É semelhante ao método anterior, diferenciando
apenas no comando SQL a ser usado.

IMPLEMENTANDO O MÉTODO CARREGAREGISTRO


| A maneira de como proceder permanece quase a
P é o comando
mesma. Porém, d que executa
t a sqll é
outro: executeQuery(...). Este comando retorna os
resultados da consulta de um select em uma
estrutura denominada ResultSet.
IMPLEMENTANDO O MÉTODO CARREGAREGISTRO
conexao.conecta();
()
Connection con = conexao.getConection();
con createStatement();
Statement st = con.createStatement();
ResultSet rs;
String
gqquery
y = "SELECT nome,, idade,, estado FROM pessoa
p
WHERE rg = " + rg;
rs = st.executeQuery(query);
Pessoa p = null;
if( !rs.next() ) return p;
p = new Pessoa( rg,rs.getString( nome ), rs.getShort(
rg rs getString("nome") idade ),
rs getShort("idade")
rs.getString("estado") );
st.close();
conexao.desconecta();
IMPLEMENTANDO O MÉTODO CARREGAREGISTRO
| O método anterior carrega apenas um registro.
Porém, é necessário em formulários que
retornemos vários registros de uma só vez
vez.
| Para isso, ao invés de retornarmos uma Pessoa,
podemos retornar uma lista de pessoas.
pessoas A classe
ResultSet tem um método rs.next() que será um
interador e retornará falso quando acabarem os
registros.
do {
Pessoa p = new Pessoa( ... );
mPessoa.add(p);
(p); // mPessoa é um LinkedList
} while( rs.next() );
EXERCÍCIO
| Vamos aplicar os passos visto anteriormente e
implementar a classe ControladorDePersistencia
para tratar apenas inserções e carregamento no
Banco de Dados.
| Antes de começar,
ç vamos adaptarp o nosso
exercício já com GUI. Abra o projeto do último
exercício.
| Primeiro vamos modificar a classe Pessoa. Crie um
construtor simplificado para a classe com os
seguintes parâmetros: nome
nome, idade e estado
estado.
| Agora pense em como será seu banco de dados.

| Faça
F duas
d t b l
tabelas: uma ‘estado’
‘ t d ’ contendo
t d apenas
o nome do UF como chave primária;
EXERCÍCIO
| E a outra ‘pessoa’
pessoa , contendo o nome (key)
(key), idade e
estado (chave estrangeira)
| Adicione na tabela estado no BD os UF que estão
no seu comboBox (GUI do exercício anterior).
| Adicione a classe Conexao.java
j ao p
projeto,
j , declare
uma variavel deste tipo e instancie ela no
construtor do frame principal.
| Agora vamos implementar a classe de persistência.
Faça os dois métodos (salvar e carregar) como
vistos anteriormente
anteriormente, passando os parâmetros de
acordo com a estrutura do banco de dados.
| Para o método carregar
carregar, vamos passar o nome da
pessoa como parâmetro
EXERCÍCIO
| Agora passe para o construtor do InternalFrame o
objeto de conexão a ser usado, para que ele possa
ter uma visualização do objeto.
| Após feito isso, no botão cadastrar do formulário
MDI, vamos inserir uma p pessoa no BD e verificar
se ela realmente foi inserida utilizando um SGBD.
| Por último, vamos fazer uma busca simples. Utilize
o método JOptionPane.showInputDialog(...) para
receber o nome da pessoa e ao carregar, imprima
os dados na tela pelo System
System.out.println(...);
out println( );
UTILIZANDO O DEBUG DO
NETBEANS
Usando
U d o Debug
D b do d NetBeans
N tB para d
depurar código
ódi e
encontrar erros lógicos.
CONCEITOS ENVOLVIDOS
| BreakPoint: Primeiro passo para ‘debugar’.
Adiciona linhas de parada no código, para que
você possar ver o estado do programa
| Local Variables: Com essa janela pode-se ver o
valor das variaveis no instante da parada acionada
pelo breakpoint
| Watchs: Você pode selecionar quais variáveis
deseja olhar, ao invés de todas. Para isso,
selecione a variável que desejar e com o Popup,
escolha New Watch (Observador)...
| CallStack: Pilha de chamada de métodos.
EXERCÍCIO 6
| Abra o projeto Debug. Você pode ver que não há
nenhum erro de compilação. Rodando, você verá
uma mensagem de erro indicando que há uma
tentativa de acesso à um ponteiro nulo.
| Com a ajuda do debug do NetBeans
NetBeans, descubra o
que está errado e corrija.
DESENHANDO PRIMITIVAS
GEOMÉTRICAS SOBRESCREVENDO
O MÉTODO PAINTCOMPONENT()
Auxiliando
A ili d no desenvolvimento
d l i t de
d aplicações
li õ que
precisam desenhar primitivas geométricas, como
elipses, retângulos, retas e polígonos.
OBJETIVOS

| Compreender a classe Graphics.

| Entender o Sistemas de Coordenadas do


Java
| Desenhar primitivas geométricas
sobrescrevendo o método
p
paintComponet(...).
p ( )
| Utilizar recursos do mouse para desenhar
figuras
| Compreender a API Java2D

| Utilizar recursos avançados


ç para desenhar
p
figuras
API JAVA

| Java fornece uma API para desenhar formas


geométricas no espaço
g p ç euclidiano 2-D.

| Classes Importantes na manipulação de


objetos gráficos:

¾ Classe Color ¾ Classe Polygon


¾ Classe Font ¾ Classe BasicStroke
¾ Classe FontMetrics ¾ Classe GradientPaint
¾ Classe Graphics2D ¾ Classe TexturePaint

Outras classes...
API
CLASSE GRAPHICS

| Um objeto Graphics desenha pixels na tela


que p
q pode representar
p um texto ou um objeto
j
gráfico (linhas, elipses, retangulos, etc).

| Além do mais, fornece métodos para


manipular Cor, Font e outros atributos.

| Toda aplicação Java de desenho sobre a


tela,
l usa um objeto
bj Graphics
G hi para gerenciar
i
aplicações gráficas.
CLASSE GRAPHICS
| A Classe Graphics é uma classe abstrata, ou seja,
objetos Graphics não podem ser instanciados.

| Contribui para Portabilidade.


¾ Desenhos na tela são diferentes para as
plataformas que suportam Java.
¾ Quando Java é implementado para cada
p
plataforma,, uma subclasse de Graphics
p é
criada que implementa a capacidade de
desenhar.
DESENHANDO
| Todo componente Java, por exemplo, JPanel,
JButton, JFrame, possui seu próprio objeto
Graphics que é responsável por desenhar
somente neste componente.
| Para obter este objeto Graphics do componente,
componente
basta invocar o método getGraphics()

| Obtido o objeto Graphics, basta invocar os


métodos deste objeto para desenhar sobre o
componente
SISTEMAS DE COORDENADAS JAVA
| Para começar desenhar em Java, devemos entender o
sistema de coordenadas Java que é um esquema de
identificar cada ponto possível na tela
EXERCÍCIO 1
| Crie um novo projeto com o nome “Desenho”
| Adicione ao projeto a classe JFrame

| Adicione o componente JButton e o JPanel ao


JFrame,
¾ Lembre-se de alterar o nome das variáveis JButton e JPanel
seguindo as regras de Engenharia de Software!!!

| No método ActionPerformed() do JButton, faça o


seguinte:
public
bli void
id jButton1ActionPerformed(java.awt.event.ActionEvent
jB tt 1A ti P f d(j t t A ti E t evt)
t)
{
Graphics g = jPanel1.getGraphics();
g.drawLine(0,0,jPanel1.getWidth(), jPanel1.getHeight());
}
DESENHANDO CORRETAMENTE
| Todo componente Java possui o método
paintComponent. Este método é utlizado para fazer
os desenhos gráficos
gráficos.
| O método paintComponent possui como argumento o
objeto Graphics.
Graphics Este objeto é passado ao
paintComponent pelo sistema quando este
componente precisa ser repintado.
| Cabeçalho do Método:
public void paintComponent( Graphics g )

| O objeto Graphics g recebe uma referência a um


objeto
bj t dda classe
l d
derivada
i d d de Graphics
G hi dod sistema.
i t
DESENHANDO CORRETAMENTE
| O método paintComponent nada faz por default:

¾Opprogramador
g deve sobrescrever este método!
| Raramente o método paintComponent é chamado
diretamente ppelo pprogramador.
g Este método é
automaticamente chamado quando executa-se o
programa. Para chamar novamente o método, um
evento
t deve
d ocorrer, por exemplo,
l maximizar
i i e
minimizar a tela, redimensionar a tela, e outros...

| Quando há necessidade de chamar explicitamente o


método p
paintComponent,
p , faz-se uma chamada ao
método repaint.
EXERCÍCIO 2
| Utilizando o mesmo projeto do exercício anterior:
¾ Crie quatro atributos do tipo inteiro (int ) para a
l
classe F 1 y1,
Form, x1, 1 x2,
2 y2.
2
¾ Sobrescreva o método paintComponent:
new = JPanel(){
void paintComponent( Graphics g ){
super.paintComponent(g);
g.drawLine(x1,y1,x2, y2);
}
};

¾ Crie JLabels e JTextFields para atribuir os


valores aos atributos,
atributos x1,
x1 y1,
y1 x2,
x2 y2
y2.
CONTINUAÇÃO DO EXERCÍCIO 2

¾ No JButton do exercício anterior, altere o evento


ActionPerformed,, faça
ç as variáveis x1,, y1,
y , x2,, y2
y
receber os valores dos TextFilds respectivos.

¾ Ainda
Ai d no mesmo evento,
t iinvoque o método
ét d
repaint do componente Jpaint.

¾ Execute seu Programa!!!

Dúvidas???
APROFUNDANDO O CONHECIMENTO
| Classe Color: fornece métodos e constantes para
manipular cores em um programa em Java. A cor é
criada a partir do componente RGB
RGB.
| Existem constantes pré-definidas que retornam
uma cor
¾ Ex: Color c = Color.red;

| public void setColor( Color c )

¾ Depois de invocar este método, todos os objetos a


serem desenhados terão a cor atribuída
atribuída.
¾ Ex: g.setColor( new Color(0,0,255) ) ou
¾ E g.setColor(
Ex: tC l ( Color.blue
C l bl ));
COMPONENTE GUI JCOLORCHOOSER
| A componente GUI JColorChooser permite ao
usuário escolher a cor desejada por meio de uma
Dialog:
| Abaixo segue um exemplo de como utilizar o
recurso JColorChooser:

public void jButtonCorActionPerformed(java.awt.event.ActionEvent evt)


{
Color cor = jPanelDesenho.getBackground();
cor = JColorChooser.showDialog( this, “Escolha uma cor", color );
jPanelDesenho.setBackground(cor);
}
DESENHANDO LINHAS, RETÂNGULOS E ELIPES
| Mét d Graphics
Métodos G hi para desenho:
d h
¾ public void drawLine( int x1, int y1, int x2, int y2 )

¾ public void drawRect( int x, int y, int width, int height)

¾ public void fillRect(( int x, int yy, int width, int height
p g )

¾ public void drawOval( int x,


x int y,
y int width,
width int height )

¾ public
bli void
id fillOval(
fillO l( int
i t x, int
i t y, int
i t width,
idth int
i t height
h i ht )
LARGURA E ALTURA

¾ public void drawRoundRect( int x, int y, int width, int height,


int arcWidth, int arcHeight )
DESENHANDO STRINGS
| O método de Graphics responsável por desenhar
uma String na tela é:
¾ public
bli void
id drawString(
d St i ( String
St i str,
t int
i t x, int
i ty)

| O usuário, às vezes ,necessita de alterar a fonte,


tipo e tamanho da String. Para isto, utilizamos a
classe Font para fazer estas alterações.

| Exemplo de como alterar a fonte, tipo e o tamanho:


¾ Font f = new Font( Serif ”, Font.BOLD,12);
Font(“Serif Font BOLD 12);
¾ g.setFont(f);
EXERCÍCIO 3
| Faça uma rotina que permita ao usuário escolher a
cor de fundo do Jpanel.

| Faça o desenho de reta, retângulo, elipse,


retângulo preenchido,
preenchido elipse preenchida
preenchida, retângulo
com canto arredondado. A cor deve ser diferente
para cada figura.
| Faça o desenho de três strings, para cada string
utilize font,
font tipo e tamanho:
¾ “serif”,BOLD,12
¾ “Monospaced”
Monospaced ,ITALIC,24
ITALIC 24
¾ “SansSerif”,PAIN,14
TRATAMENTO DE EVENTO DO MOUSE
| Os eventos do mouse captura evento de qualquer
componente GUI.
| No nosso contexto, queremos desenhar figuras
geométricas dinamicamente utilizando os recursos
do mouse.

| Cada um dos métodos de tratamento de evento do


mouse recebe um objeto MouseEvent como
argumento.
| O MouseEvent contém as informações sobre o
evento que ocorreu, incluindo as coordenadas (x,
y)) da
d posição
i em que o evento ocorreu.
MÉTODOS DE EVENTO DO MOUSE
| mousePressed( MouseEvent event )
¾ Chamado quando se pressiona um botão do mouse com o cursor
sobre um componente.
componente

| mouseClicked( MouseEvent event )


¾ Chamado quando se pressiona e se liberasse um botão do
mouse sobre um componente, sem mover o cursor.

| mouseReleased ( MouseEvent event )


¾ Chamado quando se libera um botão do mouse depois de ser
pressionado. Esse evento sempre é precedido por um evento
mousePressed.
| mouseEntered( MouseEvent event )
¾ Chamado quando o cursor do mouse entra nos limites de um
componente.
MÉTODOS DE EVENTO DO MOUSE
| mouseExited( MouseEvent event )
¾ Chamado quando o cursor do mouse deixa os limites de um
componente.
componente

| mouseDragged( MouseEvent event )


¾ Chamado quando se pressiona o botão do mouse com o cursor
sobre um componente e se move o mouse. Esse evento é
sempre precedido por uma chamada para mousePressed.
mousePressed

| mouseMoved( MouseEvent event )


¾ Chamado quando se move o mouse com o cursor sobre um
componente.
DESENHANDO FIGURA DINAMICAMENTE
| Para fazer o desenhos de figuras, fazemos uso de
três eventos do mouse: mousePressed,
mouseReleased
mouseDragged e mouseReleased.

| Supondo
p o desenho de uma reta:
¾ mousePressed: x1= evt.getX();
y1= evt.getY();

¾ mouseDragged: x2 = evt.getX();
y2 = evt.getY();
repaint();

¾ mouseReleased: x2 = evt.getX();
y2 = evt.getY();
(finaliza o desenho da reta...)
EXERCÍCIO 4
| Faça uma rotina que implementa o desenho de
figuras por meio do mouse.
| Utilize as variáveis inteiras x1,y1,x2,y2 para o
desenho de retas, retângulos e elipses.
| Use o recurso do radioButton para escolher qual
figura desenhar.

¾ Lembre-se que x2, y2 da elipse e retângulo são diferentes da


reta.
reta

¾ Observe o problema de se desenhar elipses e retangulos!!!


UTILIZANDO A API DO JAVA
| Como vimos anteriormente, Java fornece uma API
para manipulação de desenhos geométricos.

| Um bom programador Java deve ao máximo utilizar


os recursos que a API do Java oferece.

| POO incentiva o reuso, ou seja, devemos


it as classes
aproveitar l que já estão
tã prontas
t
(consolidadas).

| As classes Arc2D, Ellipse2D, Line2D,


Rectangle2D e RoundRectangle2D definem uma
variedade de formas em Java2D.
COMPREENDENDO AS CLASSES
| Todas as classes de formas geométricas da API
JAVA são abstratas, assim como alguns de seus
métodos isto é,
métodos, é a classe não pode ser instanciadas
e seus métodos devem ser implementados.
Contudo,, para
p cada uma destas classes,, existem
subclasses que herdam delas e implementam os
seus métodos.
| Por
P exemplo: l
¾ Observem no NetBeans a classe Line2D.

¾ A subclasse
b l Float
Fl t e Double
D bl herdam
h d de Line2D
d Li 2D
e implementam os métodos abstratos.
¾ Estas subclasses definem a precisão das
coordenadas da reta.
COMPREENDENDO AS CLASSES
| As outras classes de forma geométrica também
definem subclasses Float e Double. Logo, para
instanciar um objeto
objeto, por exemplo
exemplo, da classe
Ellipse2D, fazemos da seguinte forma:

Ellipse2D elipse;
elipse = new Ellipse2D.Float(0,0,10,10);

| Utilizar estas classes permite ao programador


evitar de reescrever código. Já que, os métodos
destas classes estão bem implementados
OUTRAS VANTAGENS
| Existem métodos destas classes que podem ser
proveitoso para alguns casos, em nosso contexto,
faremos uso do seguinte método:

¾ public boolean contains( Point2D p )

¾ public boolean contains( double x,


x double y)

Este método devolve true se o ponto pertence ao


interior da figura.
EXERCÍCIO 5
| Crie outro projeto no NetBeans

| Faça uma rotina que verifica se o mouse está


sobre a figura.
g

| Utilize somente a figura da elipse para verificar se o


ponteiro do mouse está sobre ela.
UTILIZANDO ARRAYLIST
| Até o momento, todas as figuras desenhadas são
apagadas da tela quando desenha-se outra figura.

| Uma solução é armazenar as figuras já


desenhadas em uma estrutura de dados
dados.

| Especificamente queremos armazenar os objetos


Especificamente,
elipses, retângulos, retas, etc.

| A estrutura de dados pertinente ao caso é a


ArrayList.
y
COMO ARMAZENAMOS AS FIGURAS?

| A lista de figuras é um atributo da classe.

| Toda vez que o evento do mouseReleased


acontece, armazenamos a figura que terminamos
de desenhar na lista de figuras
figuras.

| A lista de figura contém objetos da classe Line2D,


Ellipse2D ou Rectangle2D.

| Estas classes tem em comum a implementação da


interface Shape, logo a minha lista de figuras vai
armazenas objetos que implementa a interface
Shape.
DETALHES DE IMPLEMENTAÇÃO

| Declara-se figuras como atributo da classe


ArrayList<Shape>
y p figuras;
g ;
... No construtor instancia-se o objeto:
figuras = new ArrayList<Shape>();

| No método MouseReleased, supondo o desenho


de uma reta :
Line2D linha = Line2D.Float(x1,y1,x2,y2)
Figuras.add(linha);
DESENHANDO A LISTA DE FIGURAS

| No método responsável para desenhar as figuras,


devemos em primeiro lugar imprimir a lista de
figuras.
| A grande Questão: Como identificamos que um
objeto da lista é uma reta
reta, retângulo ou elipse já
que a lista de figuras armazena todo tipo de figura?

| Resposta: Fazemos uso da palavra reservada do


Java: instanceof

| Devemos perguntar se o objeto i da lista é uma


instancia da reta
reta, retângulo ou elipse!
DETALHES DE COMO DESENHAR A LISTA
for( int i = 0 ; i < figuras
figuras.size()
size() ; i++ ){
if( figuras.get(i) instanceof Ellipse2D ){
Ellipse2D elipse = (Ellipse2D) figuras
figuras.get(i);
get(i);

g.fillOval((int)elipse.getX(),(int)elipse.getY(),(int)elipse.getWidth(),
(int)elipse.getHeight());
}
else if( figuras.get(i) instanceof Line2D ){
Line2D linha = (Line2D) figuras.get(i);

g.drawLine((int)linha.getX1(),(int)linha.getY1(),(int)linha.getX2(),
(int)linha getY2());
(int)linha.getY2());
}
}
EXERCÍCIO 6
| Utilizando o projeto do exercício 4, implementes as
figuras como objetos de Line2D, Ellipse2D e
Rectangle2D
Rectangle2D.

| Adicione o objeto à lista de figuras no método


mouseReleased.

| No método responsável por fazer o desenho,


percorra a lista de figuras e desenhe elas.
GRAPHICS2D
| Graphics2D herda da classe Graphics e
implementa outros métodos para um desenho mais
apurado
apurado.
| Dois métodos que destacamos da Graphics2D
são:
¾ public void setStroke( Stroke s )

| Este método controla o tipo de borda


borda, seu
argumento é uma classe que implementa a
interface Stroke,, a classe que
q implementa
p Stroke é
a BasicStroke.
g.setStroke( new BasicStroke(2) );
A borda da figura terá borda de largura 2
CONTINUAÇÃO...
g.setStroke(
tSt k ( new BasicStroke(4,
B i St k (4
BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND) );

A borda da figura terá borda de largura 4, os


extremos da reta serão arredondados, e
quando os extremos de duas retas se unem,
o vértice será arredondado.
| Este
E t método
ét d define
d fi o tipo
ti d de renderização
d i ã d da fifigura
: ¾ public void setRenderingHint(Key hintKey, Object hintValue);

| As figuras que desenhamos contém


serrilhados(aliasing) este serrilhado acontece
serrilhados(aliasing),
devido o monitor que contém número limitado de
pixels.
ANTIALIASING

| Para diminuir o serrilhado, devemos usar


AntiAliasing
gppara renderizar a figura:
g

g.setRenderingHint(RenderingHints.KEY_ANTIALIASIN
G,RenderingHints.VALUE ANTIALIAS ON);
G,RenderingHints.VALUE_ANTIALIAS_ON);

O primeiro argumento indica a chave da


renderização que será aplicada
aplicada, o segundo
indica o tipo de renderização.
EXERCÍCIO 7

| No método paintComponent, depois de chamar a


p classe,, escreva o seguinte
super g código:
g

Graphics2D g2d = (Graphics2D) g;


myPaint(g2d);
P i t( 2d)

| No escopo
p do método, altere de Graphics
p para
p
Graphics2D

| Aplique o tipo de borda e renderização.