Minicurso Java NetBeans
Minicurso Java NetBeans
Minicurso Java NetBeans
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
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):
| 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);
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 ‘/’
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.
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.
dialogConexao setVisible(true);
dialogConexao.setVisible(true);
JFILECHOOSER
| Classe permite que se escolham arquivos ou
diretórios.
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);
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
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.
| 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.
| 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
Outras classes...
API
CLASSE GRAPHICS
¾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...
¾ Ainda
Ai d no mesmo evento,
t iinvoque o método
ét d
repaint do componente Jpaint.
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 fillRect(( int x, int yy, int width, int height
p g )
¾ 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
| 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.
¾ 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);
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.
g.setRenderingHint(RenderingHints.KEY_ANTIALIASIN
G,RenderingHints.VALUE ANTIALIAS ON);
G,RenderingHints.VALUE_ANTIALIAS_ON);
| No escopo
p do método, altere de Graphics
p para
p
Graphics2D