0% acharam este documento útil (0 voto)
11 visualizações106 páginas

Introdução à Programação em Java

Linguagem Java

Enviado por

Flávio Freitas
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
11 visualizações106 páginas

Introdução à Programação em Java

Linguagem Java

Enviado por

Flávio Freitas
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Linguagem Java

Introdução à Programação usando “Netbeans”

Flávio Augusto de Freitas


Copyright © 2020 Flávio Augusto de Freitas

P UBLICADO POR F LÁVIO AUGUSTO DE F REITAS

GITHUB . COM / ZZ 4 FFF

Licensed under the Creative Commons Attribution-NonCommercial 3.0 Unported License (the
“License”). You may not use this file except in compliance with the License. You may obtain a
copy of the License at [Link] Unless required
by applicable law or agreed to in writing, software distributed under the License is distributed on an
“AS IS ” BASIS , WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.

Primeira impressão?, Ainda não


Sumário

I Introdução

1 Prefácio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2 Quem é o autor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

II Visão geral

3 Visão geral sobre a linguagem Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.1 Introdução 15

3.1.1 Terminologia Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.1.2 Principais características do JAVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

III Configuração

4 Instalando o Java Development Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5 Instalando e Configurando o Netbeans . . . . . . . . . . . . . . . . . . . . . . . . 23


IV Introdução

6 Começando a programar em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 27


6.1 Conceitos de programação orientada a objeto 27
6.1.1 O que é um objeto? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.1.2 Objetos pai e filho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.3 Comunicação e coordenação de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.4 Resumo de objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.5 O objeto Person . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.6 Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.7 Comportamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.8 Estado e sequência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2 Princípios de OOP 29
6.2.1 Encapsulamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2.2 Herança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2.3 Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6.3 Introdução à linguagem Java 30
6.3.1 Palavras reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.3.2 Estrutura de uma classe Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.3.3 Empacotando classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.3.4 Instruções de importação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.3.5 Declaração de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6.3.6 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6.3.7 Exemplo: definição de classe para Person . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.3.8 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.3.9 Métodos estáticos e de instância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

V Java Através de Exemplos

7 Hello World! E por que não? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41


7.1 Configurando o Projeto 41
7.2 Adicionando Código ao Arquivo de Origem Gerado 44
7.3 Compilando e Executando o Programa 45
7.4 Construindo e Implantando a Aplicação 46
7.5 Conclusão 47

8 Cálculos simples envolvendo dois números . . . . . . . . . . . . . . . . . . . . 49


8.1 Configurando o Projeto 49
8.2 Adicionando Código ao Arquivo de Origem Gerado 52
8.3 Compilando e Executando o Programa 53
8.4 Construindo e Implantando a Aplicação 54
8.5 Conclusão 54
9 Trabalhando com Collections no Java . . . . . . . . . . . . . . . . . . . . . . . . . 55
9.1 ArrayList 56
9.2 List e ArrayList 58
9.3 Set e HashSet 60

10 Trabalhando com JFrame e MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65


10.1 Iniciando com MySQL 65
10.2 Banco de Dados e JDBC 71
10.3 Criando uma Janela de Login em ProjetoBD 75
10.4 Criando uma Tabela de Alunos 84
10.5 Construindo a Tela Principal 84
10.5.1 Chamando a Tela Principal a partir da janela de Login . . . . . . . . . . . . . . . . . . 86
10.6 Editando os Dados na Tabela Alunos - CRUD 87
10.6.1 Construindo a Tela de Alunos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
10.6.2 Antes de começar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
10.7 Listagem completa da classe frmAlunos 92

VI Conclusão
11 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1 O que você aprendeu 103
11.2 Melhorias 103

Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Livros 105
Artigos 105
I
Introdução

1 Prefácio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2 Quem é o autor . . . . . . . . . . . . . . . . . . . . . 11
1. Prefácio

Este livro não tem a pretensão de ensinar programação em Java para pessoas que não tenham
conhecimentos básicos de programação e orientação à objetos. Assim, seguiremos utilizando a
plataforma de desenvolvimento Java SE Development Kit (JDK), programação em linguagem
Java, ainda que de um modo bem básico, afim de aclimatar você com esta linguagem e as demais
que advirão.
As experiências como alunos e professores mostrou aos autores desta apostila os principais
pontos de dificuldades no aprendizado. Isso motivou uma abordagem um pouco diferente para esta
apostila em relação ao que é comum na maioria dos livros sobre o assunto.
A cada seção, apresentaremos diversos programas que servirão de motivação para os principais
conceitos da linguagem Java. Os programas complementarão o aprendizado, pois ajudam a fixar
os conceitos vistos no livro e estimulam o estudante para conceitos avançados que fogem do escopo
deste livro.
Este livro foi composto usando a linguagem de typesetting LATEX 2ε usando a paleta de cores
oficial da Oracle conforme javalicensinglogo.
2. Quem é o autor

Eu, professor Flávio Augusto de Freitas integro os quadros do Instituto Federal de Educação,
Ciência e Tecnologia do Sudeste de Minas Gerais - Campus Rio Pomba desde o ano de 1996.
Possuo graduação em Formação Prof. Disc. Especial. 2º Grau - Esquema I - CEFET-PR
Unidade de Curitiba (1996) e graduação em Tecnologia em Processamento de Dados pelo Centro
de Ensino Superior de Juiz de Fora (1994).
Sou Especialista em Matemática pela Unigranrio - RJ (1999). Atualmente sou professor de
EBTT - IF Sudeste de Minas Gerais de Rio Pomba e professor da graduação no curso de Ciência
da Computação.
Tenho experiência na área de Ciência da Computação, com ênfase em Engenharia de Software,
atuando principalmente nos seguintes temas: Android, Java e Matemática.
II
Visão geral

3 Visão geral sobre a linguagem Java . . 15


3.1 Introdução
3. Visão geral sobre a linguagem Java

3.1 Introdução
O JAVA foi desenvolvido pela Sun Microsystems Inc em 1991, posteriormente adquirido pela
Oracle Corporation. Foi desenvolvido por James Gosling e Patrick Naughton. É uma linguagem
de programação simples. Escrever, compilar e depurar um programa é fácil em java. Ajuda a criar
programas modulares e códigos reutilizáveis.

3.1.1 Terminologia Java


Antes de começarmos a aprender Java, vamos nos familiarizar com termos java comuns.

Java Virtual Machine (JVM)


Isso geralmente é chamado de JVM. Antes, discutimos sobre a JVM, vamos ver as fases da
execução do programa. As fases são as seguintes: escrevemos o programa, compilamos o programa
e, finalmente, executamos o programa.
1. A redação do programa é, obviamente, feita por um programador java como você e eu.
2. A compilação do programa é feita pelo compilador javac, o javac é o compilador java
principal incluído no Java Development Kit (JDK). Leva o programa java como entrada e
gera o bytecode java como saída.
3. Na terceira fase, a JVM executa o bytecode gerado pelo compilador. Isso é chamado de
fase de execução do programa.
Portanto, agora que entendemos que a função principal da JVM é executar o bytecode
produzido pelo compilador. Cada sistema operacional possui JVM diferente, no entanto, a
saída que eles produzem após a execução do bytecode é a mesma em todos os sistemas
operacionais. É por isso que chamamos java como linguagem independente de plataforma.

bytecode
Como discutido acima, o compilador javac do JDK compila o código-fonte java no bytecode
para que ele possa ser executado pela JVM. O bytecode é salvo em um arquivo .class pelo
compilador.
16 Capítulo 3. Visão geral sobre a linguagem Java

Java Development Kit (JDK)

Ao explicar a JVM e o bytecode, usamos o termo JDK. Vamos discutir sobre isso. Como o
nome sugere, este é um kit completo de desenvolvimento java que inclui JRE (Java Runtime
Environment), compiladores e várias ferramentas como JavaDoc, depurador Java etc.

Para criar, compilar e executar o programa Java, você precisará do JDK instalado no seu
computador.

Java Runtime Environment (JRE)

O JRE faz parte do JDK, o que significa que o JDK inclui o JRE. Quando o JRE está instalado
no seu sistema, você pode executar um programa java, mas não poderá compilá-lo. O JRE inclui
JVM, plugins de navegador e suporte a applets. Quando você só precisa executar um programa
java no seu computador, precisa apenas do JRE.

Estes são os termos java básicos que confundem iniciantes em java. Para obter o glossário java
completo, consulte o link [Link]
[Link].

3.1.2 Principais características do JAVA

Java é uma linguagem independente de plataforma

O compilador (javac) converte o código-fonte (arquivo .java) no código de bytes (arquivo


.class). Como mencionado acima, a JVM executa o bytecode produzido pelo compilador. Esse
código de byte pode ser executado em qualquer plataforma, como Windows, Linux, Mac OS
etc. O que significa que um programa compilado no Windows pode ser executado no Linux e
vice-versa. Cada sistema operacional possui JVM diferente, no entanto, a saída que eles produzem
após a execução do bytecode é a mesma em todos os sistemas operacionais. É por isso que
chamamos java como linguagem independente de plataforma.

Figura 3.1: JVM


3.1 Introdução 17

Descrição da figura: A imagem descreve o processo de execução de um programa Java,


desde o código fonte até a execução em diferentes sistemas operacionais. Vamos descrevê-la
passo a passo:
1. Código Fonte (Arquivo Java): O processo começa com o código fonte escrito em
Java, que é armazenado em um arquivo com extensão .java.
2. Compilador (javac): O código fonte é então compilado pelo compilador Java,
conhecido como javac. Este compilador converte o código fonte em um formato
intermediário chamado bytecode.
3. Bytecode (Arquivo .class): O resultado da compilação é um arquivo .class, que
contém o bytecode. Este bytecode é uma forma de código que não é específico para
nenhuma máquina, mas pode ser executado por qualquer máquina que tenha uma Java
Virtual Machine (JVM) instalada.
4. JVM (Java Virtual Machine): O bytecode é então executado pela JVM. A JVM é
responsável por interpretar o bytecode e convertê-lo em instruções específicas para o
sistema operacional em que está sendo executado.
5. Interpretadores para Diferentes Sistemas Operacionais: A JVM possui interpreta-
dores específicos para diferentes sistemas operacionais. Na imagem, são mencionados
três interpretadores:
• Interpreter for Mac: Para sistemas operacionais macOS.
• Interpreter for Windows: Para sistemas operacionais Windows.
• Interpreter for Linux: Para sistemas operacionais Linux.
Essa descrição ilustra como o código Java é compilado e executado de maneira indepen-
dente da plataforma, graças à JVM e seus interpretadores específicos para cada sistema
operacional.

Java é uma linguagem orientada a objetos


A programação orientada a objetos é uma maneira de organizar programas como coleção de objetos,
cada um dos quais representa uma instância de uma classe.
Os 4 principais conceitos da programação orientada a objetos são:
• Abstração
• Encapsulamento
• Herança
• Polimorfismo

Simples
Java é considerada uma linguagem simples, porque não possui recursos complexos, como sobre-
carga do operador, herança múltipla, ponteiros e alocação de memória explícita.

Linguagem robusta
Robusto significa confiável. A linguagem de programação Java é desenvolvida de maneira a
enfatizar a verificação antecipada de possíveis erros, por isso o compilador java é capaz de detectar
erros que não são fáceis de detectar em outras linguagens de programação. Os principais recursos
do java que o tornam robusto são coleta de lixo, tratamento de exceções e alocação de memória.

Seguro
Não temos ponteiros e não podemos acessar matrizes fora dos limites (você obtém ArrayIndexOu-
tOfBoundsException se tentar fazê-lo) em java. É por isso que várias falhas de segurança, como
corrupção de pilha ou excesso de buffer, são impossíveis de serem exploradas em Java.
18 Capítulo 3. Visão geral sobre a linguagem Java

Java é distribuído
Usando a linguagem de programação java, podemos criar aplicativos distribuídos. RMI (Remove
Method Invocation) e EJB (Enterprise Java Beans) são usados para criar aplicativos distribuídos em
java. De outro modo: Os programas java podem ser distribuídos em mais de um sistema conectado
entre si usando a conexão à Internet. Objetos em uma JVM (Java Virtual Machine) podem executar
procedimentos em uma JVM remota.
Multithreading
Java suporta multithreading. Multithreading é um recurso Java que permite a execução simultâ-
nea de duas ou mais partes de um programa para máxima utilização da CPU.
Portátil
Como discutido acima, o código java que está escrito em uma máquina pode ser executado em
outra máquina. O código de bytes independente da plataforma pode ser transportado para qualquer
plataforma de execução que torne o código java portátil.
III
Configuração

4 Instalando o Java Development Kit . . . 21

5 Instalando e Configurando o Netbeans 23


4. Instalando o Java Development Kit

Vá até a página [Link]


[Link]#GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE e instale o Java SE no Mac
OS. Outras plataformas também estão disponíveis, como Microsoft Windows ([Link]
[Link]/en/java/javase/14/install/[Link]#GUID-8677A
77F-231A-40F7-98B9-1FD0B48C346A__INSTALLINGTHEJDKANDJREONMICROSOFTWI-E04E8B17)
ou Linux ([Link]
[Link]#GUID-8677A77F-231A-40F7-98B9-1FD0B48C346A__INSTALLINGTHEJDKANDJR
EONLINUX-E04E90B9).
5. Instalando e Configurando o Netbeans

Vá até a página [Link] e instale o Apache


NetBeans 11 LTS (NB 11.0) ou outra versão, desde que seja LTS, pois é a mais estável.
IV
Introdução

6 Começando a programar em Java . . 27


6.1 Conceitos de programação orientada a objeto
6.2 Princípios de OOP
6.3 Introdução à linguagem Java
6. Começando a programar em Java

Java é uma linguagem de programação orientada a objetos desenvolvida na década de 90 por


uma equipe de programadores chefiada por James Gosling, na empresa Sun Microsystems. Em
2008 o Java foi adquirido pela empresa Oracle Corporation. Diferente das linguagens de
programação modernas, que são compiladas para código nativo, a linguagem Java é compilada
para um bytecode que é interpretado por uma máquina virtual (Java Virtual Machine, mais conhe-
cida pela sua abreviação JVM). A linguagem de programação Java é a linguagem convencional
da Plataforma Java, mas não é a sua única linguagem. J2ME para programas e jogos de
computador, celular, calculadoras, ou até mesmo o rádio do carro. Há muitas fontes para iniciar
com a programação em Java, como naughton1996dominando.
No momento você não precisa se preocupar em aprender profundamente a linguagem Java,
mas ela, com alguma modificação, é muito usada na programação Android Mobile usando a
IDE Android Studio. Neste livro você seguirá diversos exemplos de criação de programas em
linguagem Java usando a IDE NetBeans e conhecerá o básico necessário para avançarmos na
programação mobile.

6.1 Conceitos de programação orientada a objeto


A linguagem Java é (principalmente) orientada a objetos. Se você não usou uma linguagem
orientada a objetos antes, os conceitos de OOP podem parecer estranhos à primeira vista. Esta
seção é uma rápida introdução aos conceitos de linguagem OOP, usando programação estruturada
como um ponto de contraste.

6.1.1 O que é um objeto?


Linguagens de programação estruturas, como C e COBOL, seguem um paradigma de programação
diferente daquelas orientadas a objetos. O paradigma de programação estruturada é altamente
orientado a dados: você possui estruturas de dados e instruções do programa atuam nesses da-
dos. Linguagens orientadas a objetos, como a linguagem Java, combinam instruções de dados e
programas em objetos.
28 Capítulo 6. Começando a programar em Java

Um objeto é uma entidade autocontida que contém atributos e comportamento, e nada mais.
Em vez de ter uma estrutura de dados com campos (atributos) e transmite essa estrutura em toda a
lógica do programa que atua nela (comportamento), em uma linguagem orientada a objetos, dados
e lógica de programa são combinados. Essa combinação pode ocorrer em níveis completamente
diferentes, de objetos com baixa granularidade, como Number, a objetos com alta granularidade,
como um serviço FundsTransfer em um aplicativo financeiro amplo.

6.1.2 Objetos pai e filho


Um objeto pai é aquele que serve como base estrutural para derivação de objetos-filho mais
complexos. Um objeto-filho assemelha-se ao seu pai, mas é mais especializado. Com o paradigma
orientado a objetos, é possível reutilizar os atributos comuns e o comportamento do objeto pai,
incluindo nesses objetos-filho atributos e comportamentos diferentes. (Você aprende mais sobre
herança na próxima seção deste tutorial.)

6.1.3 Comunicação e coordenação de objetos


Os objetos se comunicam enviando mensagens (chamadas de métodos na linguagem Java). Além
disso, em um aplicativo orientado a objetos, o código do programa coordena as atividades entre
objetos para executar tarefas dentro do contexto do domínio de aplicativo específico.

6.1.4 Resumo de objeto


Um objeto bem escrito:
• Tem limites nítidos
• Executa um conjunto finito de atividades
• Conhece apenas sobre seus dados e quaisquer outros objetos necessários para realizar suas
atividades
Em essência, um objeto é uma entidade discreta que possui apenas as dependências necessárias
em outros objetos para executar suas tarefas.
Agora, você vê como um objeto se parece.

6.1.5 O objeto Person


Eu começo com um exemplo que baseia-se em um cenário de desenvolvimento de aplicativo
comum: um indivíduo sendo representado por um objeto Person.
Voltando à definição de um objeto, você sabe que um objeto tem dois elementos primários:
atributos e comportamento. Eu mostro como eles se aplicam a Person.

6.1.6 Atributos
Quais atributos uma pessoa pode ter? Alguns atributos comuns incluem:
• Name
• Age
• Height
• Weight
• Eye color
• Gender
Você provavelmente pensará em outros (e pode sempre incluir mais atributos posteriormente),
mas esta lista é um bom começo.

6.1.7 Comportamento
Uma pessoa real pode fazer todo o tipo de ação, mas comportamentos de objetos geralmente estão
relacionados a algum tipo de contexto de aplicativo. Em um contexto de aplicativo de negócios,
6.2 Princípios de OOP 29

por exemplo, você pode querer perguntar ao seu objeto Person: “Qual é sua idade?” Em resposta,
Person informaria o valor de seu atributo Age.
Lógica mais complexa pode estar oculta dentro do objeto Person —, por exemplo calcular um
Índice de Massa Corpórea (IMC) de uma pessoa para um aplicativo de saúde, — mas, por enquanto,
suponha que Person tenha o comportamento de responder a estas questões:
• Qual é seu nome?
• Qual é sua idade?
• Qual é sua altura?
• Qual é seu peso?
• Qual é a cor de seus olhos?
• Qual é seu sexo?

6.1.8 Estado e sequência


Estado é um conceito importante em OOP. Um estado de objeto é representado a qualquer momento
pelo valor de seus atributos.
No caso de Person, seu estado é definido por atributos como nome, idade, altura e peso. Se
você quisesse apresentar uma lista de vários desses atributos, poderia fazer isso usando uma classe
String, da qual eu falarei mais posteriormente no tutorial.
Usando os conceitos de estado e sequência juntos, é possível dizer para Person, “Diga-me
quem você é fornecendo-me uma listagem (ou String) de seus atributos.”

6.2 Princípios de OOP


Se você veio de um plano de fundo de programação estruturada, a proposição de valor de OOP
pode ainda não estar muito clara. Afinal, os atributos de uma pessoa e qualquer lógica para
recuperar (e converter) esses valores podem ser escritos em C ou COBOL. Esta seção esclarece os
benefícios do paradigma de OOP explicando seus princípios de definição: encapsulamento, herança
e polimorfismo.

6.2.1 Encapsulamento
Lembre-se de que um objeto é, acima de tudo, discreto ou autocontido. Essa característica é o
princípio do encapsulamento em funcionamento. Ocultação é outro termo que às vezes é usado
para expressar a natureza autocontida e protegida de objetos.
Independentemente da terminologia, o que é importante é que o objeto mantém um limite entre
seu estado e o comportamento e o mundo externo. Como objetos no mundo real, objetos usados na
programação de computador possuem vários tipos de relacionamentos com diferentes categorias de
objetos nos aplicativos que os usam.
Na plataforma Java, é possível usar modificadores de acesso (que eu apresento posteriormente
no tutorial) para variar a natureza dos relacionamentos de objetos de público para privado. O acesso
público é muito aberto, considerando que acesso privado significa que os atributos de objetos estão
acessíveis apenas dentro do próprio objeto.
O limite público/privado impinge o princípio de encapsulamento orientado a objetos. Na
plataforma Java, é possível variar a intensidade desse limite em uma base de objeto por objeto,
dependendo de um sistema de confiança. O encapsulamento é um recurso poderoso da linguagem
Java.

6.2.2 Herança
Na programação estruturada, é comum copiar uma estrutura, nomeá-la e incluir ou modificar os
atributos que torna a nova entidade (como um registro Account) diferente de sua fonte original.
30 Capítulo 6. Começando a programar em Java

Com o tempo, essa abordagem gera uma grande questão de código duplicado, o que pode criar
problemas de manutenção.
O OOP apresenta o conceito de herança, pelo qual classes especializadas — sem código
adicional — podem “copiar” os atributos e o comportamento de classes de origem na qual elas se
especializam. Se alguns desses atributos ou comportamentos precisarem mudar, você os substitui.
O único código-fonte a ser mudado é o código necessário para criar classes especializadas. Como
vimos na seção “Conceitos de programação orientada a objeto”, o objeto de origem é chamado de
pai e a nova especialização é chamada de filho.

Herança em funcionamento
Suponha que você esteja programando um aplicativo de recursos humanos e queira usar a classe
Person como base (chamada de superclasse) para uma nova classe chamada Employee. Sendo filha
de Person, Employee teria todos os atributos de uma classe Person, junto com aqueles adicionais,
como:
• Número de identificação de contribuinte
• Número de matrícula
• Salário
A herança facilita a criação da nova classe Employee sem a necessidade de copiar todo o código
Person manualmente.
Você verá muitos exemplos de herança na programação Java posteriormente.

6.2.3 Polimorfismo
O polimorfismo é um conceito mais difícil de compreender do que o encapsulamento e a herança.
Em essência, isso significa que objetos que pertencem à mesma ramificação de uma herança,
quando enviam a mesma mensagem (ou seja, quando efetuam a mesma ação), podem manifestar
esse comportamento de forma diferente.
Para entender como o polimorfismo se aplica a um contexto de aplicativo de negócios, retorne
ao exemplo de Person. Lembre-se de dizer a Person para formatar seus atributos em uma String?
O polimorfismo torna possível que Person represente seus atributos em uma variedade de formas,
dependendo do tipo que Person é.
O polimorfismo é um dos conceitos mais complexos que você encontrará no OOP na plataforma
Java e está além do escopo de um tutorial introdutório.

6.3 Introdução à linguagem Java


A linguagem Java: não puramente orientada a objetos
Com a linguagem Java, é possível criar objetos de primeira classe, mas nem tudo na linguagem é um
objeto. Duas qualidades diferenciam a linguagem Java das linguagens puramente orientadas a objetos, como
Smalltalk. Primeiro, a linguagem Java é uma mistura de objetos e tipos primitivos. Segundo, com Java, é
possível escrever código que expõe os trabalhos internos de um objeto a qualquer outro objeto que o usa.
A linguagem Java fornece a você as ferramentas necessárias para seguir os princípios de som do OOP e
produzir código orientado a objetos de som. Como Java não é puramente orientada a objetos, é necessário
ter alguma disciplina sobre como escrever o código A linguagem não o força a fazer a tarefa corretamente,
portanto, você deve fazê-la por si mesmo. (A última seção deste tutorial, “Escrevendo um bom código Java,”
fornece dicas.)
Seria impossível apresentar toda a sintaxe da linguagem Java em um único tutorial. O lembrete
da Parte 1 foca nos fundamentos da linguagem, deixando você com conhecimento suficiente e
prática para escrever programas simples. OOP trata exclusivamente de objetos, portanto, esta
seção começa com dois tópicos especialmente relacionados a como a linguagem Java os manipula:
palavras reservadas e a estrutura de um objeto Java.
6.3 Introdução à linguagem Java 31

6.3.1 Palavras reservadas


Como qualquer linguagem de programação, a linguagem Java designa determinadas palavras que o
compilador reconhece como especiais. Por essa razão, você não pode usá-las para nomear suas
construções Java. A lista de palavras reservadas é surpreendentemente curta:
• abstract
• assert
• boolean
• break
• byte
• case
• catch
• char
• class
• const
• continue
• default
• do
• double
• else
• enum
• extends
• false
• final
• finally
• float
• goto
• if
• implements
• import
• instanceof
• int
• interface
• long
• native
• new
• null
• package
• private
• protected
• public
• return
• short
• static
• strictfp
• super
• switch
• synchronized
• this
• throw
32 Capítulo 6. Começando a programar em Java

• throws
• transient
• true
• try
• void
• volatile
• while
Observe que true, false e null são tecnicamente palavras não reservadas. Embora sejam
literais, eu as inclui nesta lista porque você não pode usá-las para nomear construções Java.
Uma vantagem da programação com um IDE é que ela pode usar a coloração de sintaxe para
palavras reservadas, como eu mostro posteriormente neste tutorial.

6.3.2 Estrutura de uma classe Java


Uma classe é um blueprint para uma entidade discreta (objeto) que contém atributos e comporta-
mentos. A classe define a estrutura básica do objeto e, no tempo de execução, seu aplicativo cria
uma instância do objeto. Um objeto tem um limite e um estado nítidos e pode fazer ações quando
corretamente solicitado. Cada linguagem orientada a objetos possui regras sobre como definir uma
classe.
Na linguagem Java, classes são definidas conforme mostrado na Listagem 6.1:
Definição de classe
Listagem 6.1: Definindo uma classe
1 package packageName ;
2 import ClassNameToImport ; accessSpecifier class ClassName {
3 accessSpecifier dataType variableName [= initialValue ];
4 accessSpecifier ClassName ([ argumentList ]) {
5 constructorStatement ( s )
6 }
7 accessSpecifier returnType methodName ([ argumentList ]) {
8 methodStatement ( s )
9 }
10 // This is a comment
11 /* This is a comment too */
12 /* This is a
13 multiline
14 comment */
15 }

Definição de classe contém vários tipos de construções, que eu diferenciei com a formatação de
fonte. As construções mostradas em negrito (que você localizará na lista de Palavras reservadas)
são literais; em qualquer definição de objeto, elas devem ser exatamente o que estão na listagem.
Os nomes fornecidos para outras construções descrevem os conceitos que eles representam. Eu
expliquei todas as construções detalhadamente no restante desta seção.
Observação: Na Definição de classe e em alguns outros exemplos de códigos nesta seção,
colchetes indicam que as construções dentro deles não são requeridas. Os colchetes (diferente de {
e }) não fazem parte da sintaxe Java.
Comentários no código
Observe que Definição de classe também inclui algumas linhas de comentário:
1 // This is a comment
2 /* This is a comment too */
3 /* This is a
4 multiline
5 comment */

Com informações apenas sobre cada linguagem de programação, os programadores podem


incluir comentários para ajudar a documentar o código. A sintaxe Java permite comentários de
6.3 Introdução à linguagem Java 33

única linha e multilinhas. Um comentário de única linha deve estar contido em uma linha, embora
seja possível usar comentários de única linha adjacentes para formar um bloco. Um comentário de
multilinhas começa com /*, deve terminar com */ e pode abranger qualquer número de linhas.
Você obtém mais informações sobre comentários quando chega à seção “Escrevendo um bom
código Java” deste tutorial.

6.3.3 Empacotando classes


Com a linguagem Java, é possível escolher os nomes de suas classes, como Account, Person ou
LizardMan. Às vezes, é possível terminar usando o mesmo nome para expressar dois conceitos
um pouco diferentes. Esta situação é chamada de colisão de nomes e ocorre com frequência. A
linguagem Java usa pacotes para resolver esses conflitos.
Um pacote Java é um mecanismo que fornece um namespace — de uma área dentro da
qual nomes são exclusivos, mas fora dela eles podem não ser. Para identificar uma construção
exclusivamente, é necessário qualificá-la incluindo seu namespace.
Pacotes também fornecem a você uma boa forma de criar aplicativos mais complexos com
unidades de funcionalidade discretas.

Definição de pacote
Para definir um pacote, você usa a palavra-chave package seguida de um nome de pacote legal,
terminando com um ponto e vírgula. Geralmente os nomes de pacotes são separados por pontos e
seguem este esquema padrão de fato:
1 package orgType . orgName . appName . compName ;

Esta definição de pacote é dividida como a seguir:


• orgType é o tipo de organização, como com, org ou net.
• orgName é o nome do domínio da organização, como makotojava, oracle ou ibm.
• appName é o nome do aplicativo, abreviado.
• compName é o nome do componente.
A linguagem Java não força você a seguir esta convenção de pacote. De fato, não é necessário
especificar um pacote, nesse caso, todas as suas classes deverão ter nomes exclusivos e residirão no
pacote padrão. Como melhor prática, eu recomendo que você defina todas as suas classes Java em
pacotes nomeados conforme descrito aqui. Você segue essa convenção em todo este tutorial.

6.3.4 Instruções de importação


Próxima à definição de classe (referindo-se novamente à Definição de classe) está a instrução de
importação. Uma instrução de importação informa ao compilador Java onde localizar classes às
quais você fez referência dentro de seu código. Qualquer classe não trivial usa outras classes para
alguma funcionalidade e a instrução de importação é como você informa ao compilador Java sobre
elas.
Uma instrução de importação geralmente assemelha-se ao seguinte:
1 import ClassNameToImport ;

Você especifica a palavra-chave import, seguida pela classe que deseja importar, seguida por
um ponto e vírgula. O nome da classe deve ser completo, o que significa que ele deve incluir seu
pacote.
Para importar todas as classes dentro de um pacote, é possível inserir .* após o nome do pacote.
Por exemplo, essa instrução importa cada classe no pacote [Link]:
1 import com . makotojava .*;

A importação de um pacote integral pode tornar seu código menos legível, portanto, eu
recomendo importar apenas as classes necessárias, usando seus nomes completos.
34 Capítulo 6. Começando a programar em Java

6.3.5 Declaração de classe


Para definir um objeto na linguagem Java, você deve declarar uma classe. Novamente, pense em
uma classe como um modelo para um objeto, como um cortador de cookie.
Definição de classe inclui esta declaração de classe:
1 accessSpecifier class ClassName {
2 accessSpecifier dataType variableName [= initialValue ];
3 accessSpecifier ClassName ([ argumentList ]) {
4 constructorStatement ( s )
5 }
6 accessSpecifier returnType methodName ([ argumentList ]) {
7 methodStatement ( s )
8 }
9 }

Um accessSpecifier da classe pode ter diversos valores, mas ele geralmente é public. Você
logo consulta outros valores de accessSpecifier.

Convenções de nomenclatura de classe


É possível nomear classes basicamento como você realmente deseja, mas a convenção é usar camel
case: comece com uma letra maiúscula, altere para letras maiúsculas concatenada e torne todas as
outras letras minúsculas. Nomes de classes devem conter apenas letras e números. A aderência
a estas diretrizes garante que seu código seja mais acessível a outros desenvolvedores que estão
seguindo as mesmas convenções.
Classes podem ter dois tipos de membros: variáveis e métodos.

6.3.6 Variáveis
Os valores de variáveis de uma classe específica distinguem cada instância daquela classe e definem
seu estado. Esses valores geralmente são referidos como variáveis de instância. Uma variável
possui:
• Um accessSpecifier
• Um dataType
• Um variableName
• Opcionalmente, um initialValue
Variáveis públicas
Nunca é uma boa ideia usar variáveis públicas, mas em casos extremamente raros, elas podem ser
necessárias, portanto, existe a opção. A plataforma Java não limita seus casos de uso, portanto cabe a você
ser disciplinado sobre o uso de boas convenções de codificação, mesmo quando instigado a fazer de outra
forma.
Os valores possíveis de accessSpecifier são:
• public: qualquer objeto em qualquer pacote pode ver a variável. (Não use de forma alguma
este valor; consulte a barra lateral Variáveis públicas.)
• protected: qualquer objeto definido no mesmo pacote ou uma subclasse (definida em
qualquer pacote) pode ver a variável.
• Nenhum especificador (também chamado de acesso amigável ou pacote privado): apenas
objetos cujas classes são definidas no mesmo pacote podem ver a variável.
• private: apenas a classe contendo a variável pode vê-la.
Um dataType de variável depende do que a variável é, — ela pode ser um tipo primitivo ou
outro tipo de classe (novamente, mais sobre isso posteriormente).
O variableName está ativo para você, mas, por convenção, nomes de variáveis usam a conven-
ção de camel case que eu descrevi em Convenções de nomenclatura de classe (página 34), exceto
pelo fato de começarem com uma letra minúscula. (Este estilo é às vezes chamado de Camel Case
iniciado por letra minúscula.)
6.3 Introdução à linguagem Java 35

Não se preocupe com o initialValue por enquanto; apenas saiba que é possível inicializar
uma variável de instância ao declará-la. (Caso contrário, o compilador gerará um padrão para você
que será configurado quando a classe for instanciada.)

6.3.7 Exemplo: definição de classe para Person


Antes de falarmos de métodos, veja um exemplo que resume o que você aprendeu até aqui. Listagem
6.3.7 é uma definição de classe para Person.

Definição básica de classe para Person


1 package com . makotojava . intro ;
2
3 public class Person {
4 private String name ;
5 private int age ;
6 private int height ;
7 private int weight ;
8 private String eyeColor ;
9 private String gender ;
10 }

A definição básica de classe para Person não é útil neste ponto, pois define apenas seus atributos
(e os atributos privados que estão nela).
Para que seja mais interessante, a classe Person precisa de comportamento – e isso significa
métodos.

6.3.8 Métodos
Os métodos de uma classe definem seu comportamento.
Métodos se enquadram em duas categorias principais: construtores ou todos os outros métodos,
dos quais existem muitos tipos. Um método construtor é usado apenas para criar uma instância de
uma classe. Outros tipos de métodos podem ser usados virtualmente para qualquer comportamento
do aplicativo.
A definição de classe na Definição de classe mostra a forma de definir a estrutura de um método,
que inclui elementos como:
• accessSpecifier
• returnType
• methodName
• argumentList
A combinação desses elementos estruturais em uma definição de método é chamada de assina-
tura de método.
Depois, você consulta mais detalhadamente os dois tipos de métodos, começando com constru-
tores.

Métodos construtores
Você usa construtores para especificar como instanciar uma classe. Definição de classe mostra a
sintaxe de declaração do construtor de forma abstrata; novamente:
1 accessSpecifier ClassName ([ argumentList ]) {
2 constructorStatement ( s )
3 }

Construtores são opcionais


Se você não fornecer um construtor, o compilador fornecerá um para você, chamado de construtor
padrão (ou sem argumento). No entanto, se você fornecer um construtor que não seja um construtor sem
argumento (ou no-arg), o compilador não gerará automaticamente um para você.
36 Capítulo 6. Começando a programar em Java

Um accessSpecifier do construtor é igual ao das variáveis. O nome do construtor deve


corresponder ao nome da classe. Portanto, se você chamar sua classe de Person, o nome do
construtor também deverá ser Person.
Para qualquer construtor que não seja o construtor padrão, você transmite argumentList, que
é um ou mais dos seguintes:
1 argumentType argumentName

Argumentos em um argumentList são separados por vírgulas e nenhum dos dois argumentos
pode ter o mesmo nome. argumentType é um tipo primitivo ou outro tipo de classe (igual com
tipos de variáveis).
Definição de classe com um construtor
Agora, você vê o que acontece quando inclui a capacidade para criar um objeto Person de duas
formas: usando um construtor no-arg e inicializando uma lista parcial de atributos.
A Listagem 6.2 mostra como criar construtores e também como usar argumentList:
Listagem 6.2: Person: definição de classe com um construtor
1 package com . makotojava . intro ;
2 public class Person {
3 private String name ;
4 private int age ;
5 private int height ;
6 private int weight ;
7 private String eyeColor ;
8
9 private String gender ;
10 public Person () {
11 // Nothing to do ...
12 }
13
14 public Person ( String name , int age , int height , int weight String eyeColor , String
gender ) {
15 this . name = name ;
16 this . age = age ;
17 this . height = height ;
18 this . weight = weight ;
19 this . eyeColor = eyeColor ;
20 this . gender = gender ;
21 }
22 }

Observe o uso da palavra-chave this ao fazer designações de variáveis na Person: definição


de classe com um construtor. A palavra-chave this é uma abreviação Java para “this object”, e
você deve usá-la ao fazer referência para duas variáveis com o mesmo nome. Neste caso, age é um
parâmetro de construtor e uma variável de classe, portanto, a palava-chave this ajuda o compilador
a desambiguar a referência.
O objeto Person está ficando mais interessante, mas precisa de mais comportamento. E, para
isso, você precisa de mais métodos.
Outros métodos
Um construtor é um tipo particular de método com uma função específica. Similarmente, muitos
outros tipos de métodos executam funções específicas em programas Java. A exploração de outros
tipos de métodos começa nesta seção e continua pelo tutorial.
De volta à Definição de classe (página 32), eu mostrei como declarar um método:
1 accessSpecifier returnType methodName ([ argumentList ]) {
2 methodStatement ( s )
3 }

Outros métodos assemelham-se muito aos construtores, com algumas exceções. Primeiro, é
possível nomear outros métodos como deseja (embora, claro, determinadas regras se apliquem). Eu
recomendo as seguintes convenções:
6.3 Introdução à linguagem Java 37

• Comece com uma letra minúscula.


• Evite números, a menos que eles sejam absolutamente necessários.
• Use apenas caracteres alfabéticos.
Segundo, diferente dos construtores, outros métodos possuem um tipo de retorno opcional.
Outros métodos de Person
Munido destas informações básicas, é possível ver na Listagem 6.3 o que ocorre quando você inclui
alguns métodos a mais em Person. (Para resumir, eu omiti os construtores.)
Listagem 6.3: Person com alguns novos métodos
1 package com . makotojava . intro ;
2
3 public class Person {
4 private String name ;
5 private int age ;
6 private int height ;
7 private int weight ;
8 private String eyeColor ;
9 private String gender ;
10
11 public String getName () { return name ; }
12 public void setName ( String value ) { name = value ; }
13 // Other getter / setter combinations ...
14 }

Observe o comentário na Person com alguns novos métodos sobre “combinações de getter/-
setter.” Você trabalhará mais com getters e setters posteriormente no tutorial. Por enquanto,
tudo o que você precisa saber é que um getter é um método para recuperar o valor de um atributo e
um setter é um método para modificar esse valor. A Listagem 6.3 mostra apenas uma combinação
de getter/setter (para o atributo Name), mas é possível definir mais de uma forma semelhante.
Observe na Person com alguns novos métodos que se um método não retornar um valor, você
deverá informar ao compilador especificando o tipo de retorno void em sua assinatura.

6.3.9 Métodos estáticos e de instância


Geralmente, dois tipos de métodos (sem construtor) são usados: métodos de instância e métodos
estáticos. Métodos de instância dependem do estado de uma instância de objeto específica para
seus comportamentos. Métodos estáticos também são às vezes chamados de métodos de classes,
pois seus comportamentos não dependem de qualquer estado do objeto. O comportamento de um
método estático ocorre no nível de classe.
Métodos estáticos são amplamente usados para utilidade; você pode pensar neles como sendo
métodos globais (à la C) enquanto mantém o código para o método com a classe que o define.
Por exemplo, neste tutorial, você usa a classe JDK Logger para informações de saída para
o console. Para criar uma instância da classe Logger, você não instancia uma classe Logger; ao
contrário, você chama um método estático chamado getLogger().
A sintaxe para chamar um método estático em uma classe é diferente da sintaxe usada para
chamar um método em um objeto. Você também usa o nome da classe que contém o método
estático, conforme mostrado nesta chamada:
1 Logger l = Logger . getLogger ( " NewLogger " ) ;

Neste exemplo, Logger é o nome da classe e getLogger(...) é o nome do método. Assim,


para chamar um método estático, não é necessário uma instância de objeto, apenas o nome da
classe.
V
Java Através de Exemplos

7 Hello World! E por que não? . . . . . . . . . . 41


7.1 Configurando o Projeto
7.2 Adicionando Código ao Arquivo de Origem Ge-
rado
7.3 Compilando e Executando o Programa
7.4 Construindo e Implantando a Aplicação
7.5 Conclusão

8 Cálculos simples envolvendo dois números


49
8.1 Configurando o Projeto
8.2 Adicionando Código ao Arquivo de Origem Ge-
rado
8.3 Compilando e Executando o Programa
8.4 Construindo e Implantando a Aplicação
8.5 Conclusão

9 Trabalhando com Collections no Java 55


9.1 ArrayList
9.2 List e ArrayList
9.3 Set e HashSet

10 Trabalhando com JFrame e MySQL . . . 65


10.1 Iniciando com MySQL
10.2 Banco de Dados e JDBC
10.3 Criando uma Janela de Login em ProjetoBD
10.4 Criando uma Tabela de Alunos
10.5 Construindo a Tela Principal
10.6 Editando os Dados na Tabela Alunos - CRUD
10.7 Listagem completa da classe frmAlunos
7. Hello World! E por que não?

7.1 Configurando o Projeto

Para criar um projeto do IDE:

Inicie o NetBeans IDE. No IDE, escolha Arquivo Novo Projeto... , como mostrado na figura
abaixo.

Figura 7.1: Netbeans IDE com o item de menu Arquivo Novo Projeto... selecionado.
42 Capítulo 7. Hello World! E por que não?

Descrição da imagem: A imagem representa um menu de um ambiente de desenvolvimento


de software, provavelmente uma IDE (Integrated Development Environment) como o IntelliJ
IDEA ou Eclipse, que é usado para programar em Java. Vamos descrevê-la em detalhes:
1. Menu Principal: O menu principal está organizado em categorias, cada uma com
opções específicas relacionadas ao gerenciamento de projetos e arquivos.
• Categorias e Opções:
– File (Arquivo): Esta categoria contém opções relacionadas à manipulação
de arquivos e projetos, como:
– New Project... (Novo Projeto...): Para criar um novo projeto.
– Open Project... (Abrir Projeto...): Para abrir um projeto existente.
– Open Recent Project (Abrir Projeto Recente): Para acessar projetos que
foram abertos recentemente.
– Close Project (Fechar Projeto): Para fechar o projeto atual.
– Close Other Projects (Fechar Outros Projetos): Para fechar todos os
projetos, exceto o atual.
– Close All Projects (Fechar Todos os Projetos): Para fechar todos os
projetos abertos.
– Open File... (Abrir Arquivo...): Para abrir um arquivo específico.
– Open Recent File (Abrir Arquivo Recente): Para acessar arquivos que
foram abertos recentemente.
– Project Groups... (Grupos de Projetos...): Para organizar projetos em
grupos.
– Project Properties (Propriedades do Projeto): Para acessar as proprieda-
des e configurações do projeto.
– Import Project (Importar Projeto): Para importar um projeto de outra
fonte.
– Export Project (Exportar Projeto): Para exportar o projeto atual.
Essa descrição ajuda a entender como o menu está organizado e quais são as principais
funcionalidades disponíveis para o usuário no ambiente de desenvolvimento.

Na janela do assistente (Figura 7.2) New Project na página Choose Project, em Categories,
expanda a categoria Java with Ant e em Projects selecione Java Application, como mostrado
na figura abaixo. Em seguida, clique no botão Next .
7.1 Configurando o Projeto 43

Figura 7.2: Assistente de Novo Projeto: Selecionar Projeto

Em Steps, na página Name and Location do assistente, adote o procedimento a seguir (como
mostrado na Figura 7.3):
• No campo Project Name (Nome do projeto), digite HelloWorldApp.
• Deixe desmarcada a caixa de seleção Use Dedicated Folder for Storing Libraries (Utilizar
Pasta Dedicada para Armazenar Bibliotecas).
• No campo Create Main Class (Criar Classe Principal), digite [Link].
Clique no botão Finish .

Figura 7.3: Assistente de Novo Projeto: Nome e Local Clique em Finalizar.


44 Capítulo 7. Hello World! E por que não?

O projeto é criado e aberto no IDE. Agora você deve ver os seguintes componentes:
A janela Projetos, que contém uma view em árvore dos componentes do projeto, incluindo
arquivos de código-fonte, bibliotecas de que seu código depende, e assim por diante.
A janela Editor de Código-fonte com um arquivo chamado HelloWorldApp é aberta.
A janela Navegador, que você pode utilizar para navegar rapidamente entre elementos dentro
da classe selecionada.

Figura 7.4: Netbeans IDE com o projeto HelloWorldApp aberto.

7.2 Adicionando Código ao Arquivo de Origem Gerado


Como a caixa de seleção Criar Classe Principal foi marcada no assistente de Novo Projeto, o IDE
criou uma classe principal de esqueleto.
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package helloworldapp ;
7
8 /* *
9 *
10 * @author dcc
11 */
12 public class HelloWorldApp {
13
14 /* *
15 * @param args the command line arguments
16 */
17 public static void main ( String [] args ) {
18 // TODO code application logic here
19 }
20
21 }

Você pode adicionar a mensagem “Hello World!” ao código de esqueleto substituindo a linha:
7.3 Compilando e Executando o Programa 45

1 // TODO code application logic here

pela linha:
1 System . out . println ( " Hello World ! " ) ;

Salve a alteração escolhendo Arquivo Salvar .


O arquivo deve ter uma aparência semelhante à seguinte amostra de código.
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package helloworldapp ;
7
8 /* *
9 *
10 * @author dcc
11 */
12 public class HelloWorldApp {
13
14 /* *
15 * @param args the command line arguments
16 */
17 public static void main ( String [] args ) {
18 System . out . println ( " Hello World ! " ) ;
19 }
20
21 }

7.3 Compilando e Executando o Programa


Devido à funcionalidade Compilar ao Salvar do IDE, não é necessário compilar manualmente o
projeto para que seja executado no IDE. Quando um arquivo de código-fonte Java é salvo, ele é
compilado automaticamente pelo IDE.
A funcionalidade Compilar ao Salvar pode ser desativado na janela Propriedades do Projeto.
Clique com o botão direito do mouse no projeto e selecione Propriedades. Na janela Propriedades,
escolha a guia Compilação. A caixa de seleção Compilar ao Salvar está na parte superior. Observe
que, na janela Propriedades do Projeto, é possível configurar várias definições para o projeto:
bibliotecas do projeto, encapsulamento, construção, execução, etc.
Para executar o programa:
Escolha Executar Executar Projeto .

Figura 7.5: Netbeans IDE com o item de menu Executar Executar Projeto selecionado.
46 Capítulo 7. Hello World! E por que não?

A figura abaixo mostra o que você deve ver agora.

Figura 7.6: Janela de saída mostrando o resultado da exeução do programa.

O programa imprime Hello World! para a Janela de Saída (juntamente com outra saída do
script de construção).
Parabéns! Seu programa funciona!
Se houver erros de compilação, eles são marcados com glifos vermelhos nas margens esquerda
e direita do Editor de Código-fonte. Os glifos da margem esquerda indicam os erros das linhas
correspondentes. Os glifos da margem direita mostram todas as áreas do arquivo que apresentam
erros, incluindo os erros das linhas que não estão visíveis. É possível passar o mouse sobre a marca
do erro para ver a descrição deste erro. É possível clicar em um glifo da margem direita para ir para
a linha que apresenta o erro.

7.4 Construindo e Implantando a Aplicação


Depois de escrever e executar o teste da aplicação, você pode utilizar o comando Limpar e Construir
para construir a aplicação para implantação. Quando o comando Limpar e Construir é utilizado, o
IDE executa um script de construção que realiza as seguintes tarefas:
1. Deleta os arquivos compilados anteriormente e outras saídas de construção.
2. Recompila a aplicação e constrói um arquivo JAR que contém arquivos compilados.
Para construir sua aplicação:
Escolha Executar Limpar e Construir Projeto .

Figura 7.7: Netbeans IDE com o item de menu Executar Limpar e Construir Projeto selecionado.

É possível exibir as saídas de construção abrindo a janela Arquivos e expandindo o nó Hel-


loWorldApp. O arquivo bytecode compilado [Link] está no subnó build/classes/hel-
7.5 Conclusão 47

loworldapp. O arquivo JAR implantável que contém o [Link] está no nó dist.


Imagem mostrando os Arquivos com nós para a janela HelloWorldApp expandida para mostrar
o conteúdo dos subnós build e dist.

Figura 7.8: Estrutura dos arquivos do projeto em disco.

Agora você sabe como executar algumas das tarefas de programação mais comuns no IDE.

7.5 Conclusão
Nesta seção você aprendeu como criar um projeto Java simples, alterar o código da aplicação, salvar
um projeto e compilá-lo.
8. Cálculos simples envolvendo dois números

8.1 Configurando o Projeto


Para criar um projeto do IDE:
Inicie o NetBeans IDE. No IDE, escolha Arquivo Novo Projeto... , como mostrado na figura
abaixo.

Figura 8.1: Netbeans IDE com o item de menu Arquivo Novo Projeto... selecionado.

No assistente Novo Projeto, expanda a categoria Java with Ant e selecione Java Application,
como mostrado na figura abaixo. Em seguida, clique em Next .
50 Capítulo 8. Cálculos simples envolvendo dois números

Figura 8.2: Assistente de Novo Projeto: Selecionar Projeto

Na página Nome e Localização do assistente, adote o procedimento a seguir (como mostrado


na figura abaixo):

• No campo Nome do Projeto, digite SomaDoisNumeros.


• Deixe desmarcada a caixa de seleção Utilizar Pasta Dedicada para Armazenar Bibliotecas.
• No campo Criar Classe Principal, digite [Link].
8.1 Configurando o Projeto 51

Figura 8.3: Assistente de Novo Projeto: Nome e Local Clique em Finalizar.

O projeto é criado e aberto no IDE. Agora você deve ver os seguintes componentes:
A janela Projetos, que contém uma view em árvore dos componentes do projeto, incluindo
arquivos de código-fonte, bibliotecas de que seu código depende, e assim por diante.
A janela Editor de Código-fonte com um arquivo chamado SomaDoisNumeros é aberta.
A janela Navegador, que você pode utilizar para navegar rapidamente entre elementos dentro
da classe selecionada.

Figura 8.4: Netbeans IDE com o projeto SomaDoisNumeros aberto.


52 Capítulo 8. Cálculos simples envolvendo dois números

8.2 Adicionando Código ao Arquivo de Origem Gerado


Como a caixa de seleção Criar Classe Principal foi marcada no assistente de Novo Projeto, o IDE
criou uma classe principal de esqueleto.
Listagem 8.1: Classe SomaDoisNumeros criada
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package somadoisnumeros ;
7
8 /* *
9 *
10 * @author dcc
11 */
12 public class SomaDoisNumeros {
13
14 /* *
15 * @param args the command line arguments
16 */
17 public static void main ( String [] args ) {
18 // TODO code application logic here
19 }
20
21 }

Altere o código para ficar igual à Listagem 8.2. Salve a alteração escolhendo Arquivo Salvar .
O arquivo deve ter uma aparência semelhante à seguinte amostra de código.
Listagem 8.2: Classe SomaDoisNumeros completa
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package somadoisnumeros ;
7
8 import javax . swing . JOptionPane ;
9
10 /* *
11 *
12 * @author dcc
13 */
14 public class SomaDoisNumeros {
15
16 /* *
17 * @param args the command line arguments
18 */
19 public static void main ( String [] args ) {
20 double soma ;
21 double num1 = 0.0;
22 double num2 = 0.0;
23
24 String st1 = JOptionPane . showInputDialog ( null , " Digite um numero : " ) ;
25
26 String st2 = JOptionPane . showInputDialog ( null , " Digite outro numero : " ) ;
27
28 num1 = Double . parseDouble ( st1 ) ;
29 num2 = Double . parseDouble ( st2 ) ;
30 soma = num1 + num2 ;
31
32 JOptionPane . showMessageDialog ( null , " A soma dos numeros e : " + soma ) ;
33 }
34
35 }
8.3 Compilando e Executando o Programa 53

8.3 Compilando e Executando o Programa

Devido à funcionalidade Compilar ao Salvar do IDE, não é necessário compilar manualmente o


projeto para que seja executado no IDE. Quando um arquivo de código-fonte Java é salvo, ele é
compilado automaticamente pelo IDE.

A funcionalidade Compilar ao Salvar pode ser desativado na janela Propriedades do Projeto.


Clique com o botão direito do mouse no projeto e selecione Propriedades. Na janela Propriedades,
escolha a guia Compilação. A caixa de seleção Compilar ao Salvar está na parte superior. Observe
que, na janela Propriedades do Projeto, é possível configurar várias definições para o projeto:
bibliotecas do projeto, encapsulamento, construção, execução, etc.

Para executar o programa:

Escolha Executar Executar Projeto , como na Figura 7.5.

As figuras abaixo mostram o que você deve ver agora.

Figura 8.5: Janela de entrada para o primeiro número a ser somado.

Assim que clicar em OK você verá:

Figura 8.6: Janela de entrada para o segundo número a ser somado.

Finalmente, assim que clicar em OK você verá:


54 Capítulo 8. Cálculos simples envolvendo dois números

Figura 8.7: Janela de entrada para o primeiro número a ser somado.

Esta janela exibe o resultado da soma dos valores fornecidos anteriormente (Figura 8.5 e 8.6),
exibindo a soma 3.5 + 4.6 = 8.1, neste exemplo.
Novo clique em OK e o programa encerra.
Parabéns! Seu programa funciona!
Você poderia simplificar o programa trocando as linhas 24 a 29 da Listagem 8.2 por:
1 num1 = Double . parseDouble ( JOptionPane . showInputDialog ( null , " Digite um numero : " ) ) ;
2 num2 = Double . parseDouble ( JOptionPane . showInputDialog ( null , " Digite outro numero : " ) ) ;

Se houver erros de compilação, eles são marcados com glifos vermelhos nas margens esquerda
e direita do Editor de Código-fonte. Os glifos da margem esquerda indicam os erros das linhas
correspondentes. Os glifos da margem direita mostram todas as áreas do arquivo que apresentam
erros, incluindo os erros das linhas que não estão visíveis. É possível passar o mouse sobre a marca
do erro para ver a descrição deste erro. É possível clicar em um glifo da margem direita para ir para
a linha que apresenta o erro.

8.4 Construindo e Implantando a Aplicação


Depois de escrever e executar o teste da aplicação, você pode utilizar o comando Limpar e
Construir para construir a aplicação para implantação. Quando o comando Limpar e Construir
é utilizado, o IDE executa um script de construção que realiza as seguintes tarefas:
1. Deleta os arquivos compilados anteriormente e outras saídas de construção.
2. Recompila a aplicação e constrói um arquivo JAR que contém arquivos compilados.
Para construir sua aplicação:
Escolha Executar Limpar e Construir Projeto como na Figura 7.7.
É possível exibir as saídas de construção abrindo a janela Arquivos e expandindo o nó Soma-
DoisNumeros. O arquivo bytecode compilado [Link] está no subnó build/-
classes/somadoisnumeros. O arquivo JAR implantável que contém o [Link]
está no nó dist.
Você pode expandir os nós para mostrar os Arquivos com nós para a janela SomaDoisNumeros
com o conteúdo dos subnós build e dist.

8.5 Conclusão
Nesta seção você usou o que viu na seção anterior, aprendeu a importar bibliotecas Java ja-
[Link], como ler números usando uma janela showInputDialog de entrada,
como converter números no formato texto para formato double usando parseDouble como calcular
uma soma simples e finalmente, como exibir o resultado da soma usando uma janela showMessa-
geDialog.
9. Trabalhando com Collections no Java

Em harvey2005java, uma coleção é uma estrutura de dados, na realidade um objeto, que pode
armazenar ou agrupar referências a outros objetos (um contêiner). As classes e interfaces da
estrutura de coleções são membros do pacote [Link] e a Figura 9.1 apresenta a hierarquia de
algumas destas interfaces oferecidas pelo Java.

Figura 9.1: Hierarquia das interfaces da estrutura de coleções.

Na lista de interfaces da estrutura de coleções destacam-se os conjuntos, listas, filas e mapas:


1. Conjunto (Set e SortedSet):
Uma coleção de elementos que modela a abstração matemática para conjuntos. Não mantém
indexação e nem contagem dos elementos pertencentes. Cada elemento pertence ou não per-
tence ao conjunto (não há elementos repetidos). Podem ser mantidos ordenados (SortedSet)
ou não.
2. Lista (List):
Uma coleção indexada de objetos às vezes chamada de sequência. Como nos vetores, índices
de List são baseados em zero, isto é, o índice do primeiro elemento é zero. Além dos
métodos herdados de Collection, List fornece métodos para manipular elementos baseado
na sua posição (ou índice) numérica na lista, remover determinado elemento, procurar as
ocorrências de um dado elemento e percorrer sequencialmente (ListIterator) todos os
elementos da lista. A interface List é implementada por várias classe, incluídas as classes
ArrayList (implementada como vetor), LinkedList e Vector.
56 Capítulo 9. Trabalhando com Collections no Java

3. Fila (Queue):
4. Uma coleção utilizada para manter uma “fila” de elementos. Existe uma ordem linear para as
filas que é a “ordem de chegada”. As filas devem ser utilizadas quando os itens deverão ser
processados de acordo com a ordem “PRIMEIRO-QUE-CHEGA, PRIMEIRO-ATENDIDO”.
Por esta razão as filas são chamadas de Listas FIFO, termo formado a partir de “First-In,
First-Out”.
5. Mapa (Map e SortedMap):
Uma mapa armazena pares, chave e valor, chamados de itens. As chaves não podem ser
duplicadas e são utilizadas para localizar um dado elementos associado. As chaves podem
ser mantidas ordenadas (SortedMap) ou não.
Para atender o propósito deste artigo será utilizada a classe ArrayList na implementação de
vetores dinâmicos (ou redimensionáveis). Veja a seguir a relação dos principais métodos da classe.
• boolean add(Object element): Adiciona o elemento especificado no final da lista.
• void add(int index, Object element): Insere o elemento especificado na posição
indicada da lista.
• void clear(): Remove todos os elementos da lista.
• boolean contains(Object element): Retorna verdadeiro se a lista contém o elemento
especificado e falso caso contrário.
• Object get(int index): Retorna o i-ésimo elemento da lista.
• int indexOf(Object element): Retorna a posição da primeira ocorrência do elemento
especificado na lista.
• boolean isEmpty(): Retorna verdadeiro se a lista estiver vazia e falso caso contrário.
• int lastIndexOf(Object element): Retorna a posição da última ocorrência do elemento
especificado na lista.
• Object remove(int index): Remove o i-ésimo elemento da lista.
• Object set(int index, Object element): Substitui o i-ésimo elemento da lista pelo
elemento especificado.
• int size(): Retorna o número de elementos da lista.

9.1 ArrayList
Na Listagem 9.1, foram implementados trechos de códigos que demonstram a utilização da classe
ArrayList para criar, manter e percorrer uma lista de contatos. As seguintes funcionalidades
foram implementadas: a) declarando e instanciando um objeto agenda; b) usando o método add()
para gravar 4 contatos na agenda; c) mostrando os “n” contatos da agenda (usando o índice);
d) removendo o i-ésimo elemento da agenda; e) mostrando os “n” contatos da agenda (usando
for-each); e, f) mostrando os “n” contatos da agenda (com iterator).
Listagem 9.1: Aplicação Java explorando os métodos da classe ArrayList
1 import java . util . ArrayList ;
2 import java . util . Iterator ;
3 import java . util . Scanner ;
4
5 public class Agenda1 {
6
7 public static void main ( String [] args ) {
8 Scanner ler = new Scanner ( System . in ) ;
9
10 // [ A ] declarando e instanciando uma agenda de contatos
11 ArrayList < String > agenda = new ArrayList () ;
12
13 // [ B ] usando o m é todo add () para gravar 4 contatos na agenda
14 agenda . add ( " Juca Bala ;11 1111 -1111 " ) ;
15 agenda . add ( " Marcos Paqueta ;22 2222 -2222 " ) ;
16 agenda . add ( " Maria Antonieta ;33 3333 -3333 " ) ;
9.1 ArrayList 57

17 agenda . add ( " Ant ô nio Conselheiro ;44 4444 -4444 " ) ;
18
19 int i ;
20
21 // [ C ] mostrando os " n " contatos da agenda ( usando o í ndice )
22 // n ú mero de elementos da agenda : m é todo size ()
23 System . out . printf ( " Percorrendo o ArrayList ( usando o í ndice ) \ n " ) ;
24 int n = agenda . size () ;
25 for ( i =0; i < n ; i ++) {
26 System . out . printf ( " Posi ç ã o %d - % s \ n " , i , agenda . get ( i ) ) ;
27 }
28
29 System . out . printf ( " \ nInforme a posi ç ã o a ser exclu í da :\ n " ) ;
30 i = ler . nextInt () ;
31
32 try {
33 // [ D ] remove o i - é simo contato da agenda
34 agenda . remove ( i ) ;
35 } catch ( IndexOutOfBoundsException e ) {
36 // exce ç ã o lan ç ada para indicar que um í ndice ( i )
37 // est á fora do intervalo v á lido ( de 0 at é agenda . size () -1)
38 System . out . printf ( " \ nErro : posi ç ã o inv á lida (% s ) . " ,
39 e . getMessage () ) ;
40 }
41
42 // [ E ] mostrando os " n " contatos da agenda ( usando for - each )
43 System . out . printf ( " \ nPercorrendo o ArrayList ( usando for - each ) \ n " ) ;
44 i = 0;
45 for ( String contato : agenda ) {
46 System . out . printf ( " Posi ç ã o %d - % s \ n " , i , contato ) ;
47 i ++;
48 }
49
50 // [ F ] mostrando os " n " contatos da agenda ( com iterator )
51 System . out . printf ( " \ nPercorrendo o ArrayList ( usando iterator ) \ n " ) ;
52 i = 0;
53 Iterator < String > iterator = agenda . iterator () ;
54 while ( iterator . hasNext () ) {
55 System . out . printf ( " Posi ç ã o %d - % s \ n " , i , iterator . next () ) ;
56 i ++;
57 }
58 }
59
60 }

Ao executar a aplicação o resultado apresentado na Figura 9.2 poderá ser exibido.


58 Capítulo 9. Trabalhando com Collections no Java

Figura 9.2: Executando a aplicação.

9.2 List e ArrayList


O List é uma interface e o ArrayList é a classe que a implementa. Veja um exemplo na Listagem
9.2.
Listagem 9.2: Criando um ArrayList a partir do List
1 import java . util . ArrayList ;
2 import java . util . LinkedList ;
3 import java . util . List ;
4
5 public class MyList {
6
7 /* *
8 * @param args
9 */
10 public static void main ( String [] args ) {
11
12 /*
13 * Declaremos nosso objeto sem nenhuma inst â ncia
14 *
15 * */
16 List carros ;
17
18 /*
19 * Criamos uma inst â ncia qualquer para o nosso objeto
20 * do tipo List , sendo que essa inst â ncia deve
21 * obrigatoriamente implementar a interface List .
22 * Veja as possibilidades
23 * */
24 carros = new ArrayList () ;
25 carros = new LinkedList () ;
26
27 // e assim por diante ...
28
29
30 }
31
32 }
9.2 List e ArrayList 59

Então você pode questionar: Porque não fazer um ArrayList carros = new ArrayList();
sem usar as interfaces? Por uma questão muito simples: você precisa garantir a flexibilidade da
sua aplicação, garantir que o mesmo objeto possa ser instanciado de maneiras distintas em pontos
distintos da aplicação. Como você tem uma interface List, você tem certeza dos métodos que
seu objeto tem, mesmo que ele seja instanciado por uma classe como ArrayList ou LinkedList.
Vamos melhorar um pouco mais nossa Listagem 1, adicionando o uso de Generics (Listagem 9.3).
Listagem 9.3: Usando Generics com ArrayList e List
1 import java . util . ArrayList ;
2 import java . util . List ;
3
4 public class MyList {
5
6 /* *
7 * @param args
8 */
9 public static void main ( String [] args ) {
10
11 /*
12 * Agora adicionamos um Generic " < Carro >" , assim s ó podemos
13 * adicionar objetos do tipo ’ Carro ’ nossa lista .
14 *
15 * */
16 List < Carro > carros ;
17
18 /*
19 * Criamos uma ArrayList apenas com carros
20 * */
21 carros = new ArrayList < Carro >() ;
22
23
24 /*
25 * Voc ê conseguir á criar sem problemas um ArrayList
26 * sem passar o tipo Generic , mas a IDE ir á dar um
27 * Warning dizendo que voc ê deveria passar um
28 * tipo Generic , para evitar erros em runtime .
29 * */
30 carros = new ArrayList () ;
31
32 /*
33 * O c ó digo abaixo n ã o ser á compilado , erro em tempo de
34 * design . Pois nosso objeto ’ carros ’ agora é muito
35 * exigente : S ó aceita implementa ç õ es de List que tenham
36 * objetos do tipo ’ Carro ’. Estamos tentando fazer
37 * um ’ cast ’ de Animal para Carro e
38 * isso n ã o poss í vel .
39 * */
40 carros = new ArrayList < Animal >() ;
41
42 }
43
44 }

Para finalizar o uso do List, vamos mostrar alguns métodos muito utilizados no dia a dia.
Observe a Listagem 9.4.
Listagem 9.4: Uso de métodos frequentes com List
1 import java . util . ArrayList ;
2 import java . util . List ;
3
4 public class MyList {
5
6 /* *
7 * @param args
8 */
9 public static void main ( String [] args ) {
10
11 List < Carro > carros = new ArrayList < Carro >() ;
60 Capítulo 9. Trabalhando com Collections no Java

12 List < Carro > carrosNovos = new ArrayList < Carro >() ;
13
14 Carro carro = new Carro () ;
15
16 // adiciona um carro a nossa lista
17 carros . add ( carro ) ;
18
19 // adiciona um carro a uma posi ç ã o exata da lista
20 carros . add (10 , carro ) ;
21
22 /*
23 * Imagine que desejamos adicionar uma lista de
24 * carros novos a nossa lista de carros ,
25 * podemos adicionar todos de uma s ó vez , usando o ’ addAll ’
26 * */
27 carros . addAll ( carrosNovos ) ;
28
29 /* Caso prefira , pode usar um for para adicionar
30 * os carrosNovos . Nosso la ç o FOR abaixo , tem a mesma
31 * fun ç ã o do addAll .
32 */
33 for ( int i = 0 ; i < carrosNovos . size () ; i ++) {
34 carros . add ( carrosNovos . get ( i ) ) ;
35 }
36
37 /*
38 * Verifica se o carro est á na lista de carros .
39 * Mas como essa verifica ç ã o é feita ?
40 * Atrav é s do m é todo ’ equals ’ do seu objeto carro .
41 * Sendo assim , na implementa ç ã o do
42 * seu bean ’ Carro ’, é muito importante que voc ê
43 * sobreescreva o m é todo ’ equals ’ dizendo
44 * como as compara ç õ es devem ser realizadas .
45 * */
46 carros . contains ( carro ) ;
47
48 // Remove todos os elementos da lista
49 carros . clear () ;
50
51 }
52
53 }

Esses métodos mencionados acima são os usados com muita frequência, mas nada impede que
você faça um estudo em cada método.

9.3 Set e HashSet


Assim como o List é uma interface e o ArrayList é sua implementação, o Set e HashSet seguem
a mesma analogia, onde o Set é a interface e o HashSet é sua implementação. Observe a Listagem
9.5.
Listagem 9.5: Usando Set
1 import java . util . HashSet ;
2 import java . util . LinkedHashSet ;
3 import java . util . Set ;
4
5 public class MySet {
6
7 /* *
8 * @param args
9 */
10 public static void main ( String [] args ) {
11
12 Set < Carro > carros ;
13
14 // Voc ê pode implementar com HashSet
15 carros = new HashSet < Carro >() ;
9.3 Set e HashSet 61

16
17
18 // Pode tamb é m optar pelo LinkedHashSet
19 carros = new LinkedHashSet < Carro >() ;
20
21 // e assim por diante
22
23
24 }
25
26 }

Você já deve ter percebido que podemos implementar diferentes instâncias para uma mesma
interface Set, obviamente que cada uma tem sua peculiaridade e não é foco deste artigo mostrar as
peculiaridades de cada implementação.
Uma diferença muito comum entre o Set e o List é o retorno de determinados elementos em
uma posição exata da lista, pois com o List podemos simplesmente fazer um ’get(index)’ e você
terá o elemento X na posição INDEX. Na Listagem 9.6 iremos demonstrar como percorrer todos só
elementos usando o iterator.
Listagem 9.6: Usando iterator para capturar elementos no Set
1 import java . util . HashSet ;
2 import java . util . Iterator ;
3 import java . util . Set ;
4
5 public class MySet {
6
7 /* *
8 * @param args
9 */
10 public static void main ( String [] args ) {
11
12 Set < Carro > carros ;
13
14 // Voc ê pode implementar com HashSet
15 carros = new HashSet < Carro >() ;
16
17 /*
18 * Percorrer todo SET com iterator
19 * */
20 Iterator < Carro > carrosAsIterator = carros . iterator () ;
21 while ( carrosAsIterator . hasNext () ) {
22 Carro it = carrosAsIterator . next () ;
23 }
24 }
25 }

No exemplo acima, abstraíamos a maioria dos comentários que já fizemos nas listagens anterio-
res, assim tornamos o mesmo sucinto e prático. Veja na Listagem 9.7 um exemplo mais completo
de como trabalhar com Iterator.
Listagem 9.7: Trabalhando com Iterator
1 import java . util . ArrayList ;
2 import java . util . Iterator ;
3 import java . util . ListIterator ;
4
5 public class MySet2 {
6
7 public static void main ( String args []) {
8
9 ArrayList al = new ArrayList () ;
10
11 al . add ( " C " ) ;
12 al . add ( " A " ) ;
13 al . add ( " E " ) ;
14 al . add ( " B " ) ;
15 al . add ( " D " ) ;
62 Capítulo 9. Trabalhando com Collections no Java

16 al . add ( " F " ) ;


17
18 // Usamos o iterator para mostrar o conte ú do do ArrayList
19 System . out . print ( " Original contents of al : " ) ;
20 Iterator itr = al . iterator () ;
21 while ( itr . hasNext () ) {
22 Object element = itr . next () ;
23 System . out . print ( element + " " ) ;
24 }
25 System . out . println () ;
26
27 // Modify objects being iterated
28 ListIterator litr = al . listIterator () ;
29 while ( litr . hasNext () ) {
30 Object element = litr . next () ;
31 litr . set ( element + " + " ) ;
32 }
33 System . out . print ( " Modified contents of al : " ) ;
34 itr = al . iterator () ;
35 while ( itr . hasNext () ) {
36 Object element = itr . next () ;
37 System . out . print ( element + " " ) ;
38 }
39 System . out . println () ;
40
41 System . out . print ( " Modified list backwards : " ) ;
42 while ( litr . hasPrevious () ) {
43 Object element = litr . previous () ;
44 System . out . print ( element + " " ) ;
45 }
46 System . out . println () ;
47 }
48 }

Os exemplos mostrados acima são práticos o suficiente para que você leitor possa questionar
o uso de tais recursos em seu dia a dia. Algumas vezes utilizados de forma errada. É comum,
por exemplo, em projetos iniciantes notarmos a falta de interfaces e implementações corretas
de polimorfismo, por exemplo. Este artigo tem como principal objeto não só mostrar o uso dos
recursos, já conhecidos por muitos, mas também mostrar a forma correta e ideal de utilizá-los.
Então, caso você esteja utilizando outra forma que seja distinta da mostrada nas seções anteriores,
aconselhamos que a mesma seja analisada.
Dizemos ’analisada’, pois toda nova solução ou alteração deve ser analisada antes de alterada, e
não simplesmente trocada sem uma análise crítica.
Para finalizar veja na Listagem 9.8 uma forma alternativa de utilizar o iterator com um
’foreach’.
Listagem 9.8: Usando iterator com foreach
1 import java . util . HashSet ;
2 import java . util . Iterator ;
3 import java . util . Set ;
4
5 public class MySet {
6
7 /* *
8 * @param args
9 */
10 public static void main ( String [] args ) {
11
12 Set < Carro > carros ;
13
14 // Voc ê pode implementar com HashSet
15 carros = new HashSet < Carro >() ;
16
17 /*
18 * Percorrer todo SET com iterator usnado foreach
19 * */
9.3 Set e HashSet 63

20 for ( Iterator < Carro > iter = carros . iterator () ;


21 iter . hasNext () ;) {
22 Carro carroAtual = iter . next () ;
23 }
24 }
25 }

A forma demonstrada acima é uma alternativa ao while([Link]()) que utilizamos nas


listagens acima.
Com isso, o artigo aqui apresentado teve foco em maior parte do tempo na prática voltada aos
recursos que estudados, deixando um pouco a teoria de lado. Mas vale ressaltar que estudar os
recursos (suas classes, sendo mais específico) é muito importante para entender o funcionamento
como um todo, e não se ater somente ao descrito neste artigo.
10. Trabalhando com JFrame e MySQL

10.1 Iniciando com MySQL

Usaremos o banco de dados MySQL no projeto de nossa livraria, já que é um dos bancos de dados
relacionais mais utilizados no mercado, é gratuito e bastante simples de instalar.

Se você ainda não tem o MySQL instalado, pode fazer download pelo link:

[Link]

Figura 10.1

Ao final da página, você encontrará um campo para escolher seu sistema operacional. Selecione
e depois clique em download, na opção que preferir:
66 Capítulo 10. Trabalhando com JFrame e MySQL

Figura 10.2

No mesmo site, você encontra um tutorial de instalação de acordo com o seu sistema operacional.
Ou você pode acessar o tutorial diretamente em:

[Link]

Após baixar e instalar o MySQL, vamos nos logar no MySQL e criar a base de dados (database)
de nosso projeto.

No Mac OS clique no menu  Preferências do sistema... .

Figura 10.3: Menu  Preferências do sistema... do Mac OS.

Na janela que abre, clique em MySQL.


10.1 Iniciando com MySQL 67

Figura 10.4: Janela Preferências do sistema no Mac OS, mostrando o item MySQL na parte inferior esquerda.

Na janela que abre, clique em Start MySQL Server .

Figura 10.5: Inicializando o servidor MySQL no Mac OS.

Se o servidor inicializar as bolinhas vermelhas ficarão verdes.


Abra o seu navegador e acesse o phpMyAdmin.
68 Capítulo 10. Trabalhando com JFrame e MySQL

Figura 10.6: Digite na barra de endereços: [Link] onde USER-


NAME é o seu nome de usário no phpMyAdmin.

Nesta janela clique em Novo (menu lateral esquerdo) e crie um banco de dados com o nome
de BD. Em seguida clique no botão Criar .

Figura 10.7: Novo banco de dados BD sendo criado.

Como o nosso banco de dados é novo, não há nenhuma tabela nele, assim o phpMyAdmin
mostra a janela seguinte (Figura 10.8).

Figura 10.8: Nova tabela usuarios sendo criada.

Deixe a janela como está na Figura 10.8 e clique no botão Executar . O phpMyAdmin mostra
a Figura 10.9.
10.1 Iniciando com MySQL 69

Figura 10.9: Estrutura da tabela usuarios.

Deixe a janela como na Figura 10.9 e clique no botão Salvar .

O phpMyAdmin mostra que a tabela foi criada dentro do banco de dados BD (menu lateral
esquerdo) e exibe a estrutura da tabela à direita (Figura 10.10).

Figura 10.10: Estrutura da tabela usuarios sendo exibida.

Agora vamos inserir um usuário na tabela usuarios. No lado direito da janela do phpMyAd-
min, clique na aba Inserir (na parte de cima da janela). Entre com os valores na coluna Valor
como na Figura 10.11 e clique no botão Executar .

Figura 10.11: Usuário root com senha root sendo criado.

A aba SQL é selecionada automaticamente mostrando o SQL gerado pelo MySQL.


1 INSERT INTO ‘ usuarios ‘ ( ‘ usuario ‘ , ‘ senha ‘) VALUES ( ’ root ’ , ’ root ’) ;

Acabamos de inserir um usuário com nome de usuário root e senha root.

Execute o NetBeans e crie um novo projeto clicando no menu File New Project... . A janela
New Project aparece. Deixe-a como na Figura 10.12 e clique no botão Next .
70 Capítulo 10. Trabalhando com JFrame e MySQL

Figura 10.12

A janela New Java Application é mostrada. Deixe-a como na Figura 10.13 e clique no botão
Finish .

Figura 10.13

Pronto! Você acaba de criar o projeto ProjetoBD e a janela de códigos deve se parecer como a
Listagem 10.1.
Listagem 10.1: Classe ProjetoBD
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 /* *
9 *
10 * @author dcc
10.2 Banco de Dados e JDBC 71

11 */
12 public class ProjetoBD {
13
14 /* *
15 * @param args the command line arguments
16 */
17 public static void main ( String [] args ) {
18 // TODO code application logic here
19 }
20
21 }

Para acessarmos um banco de dados MySQL usando Java, precisamos usar um driver jdbc.

10.2 Banco de Dados e JDBC


Nosso objetivo é buscar informações de um banco de dados, como é natural nas aplicações do dia a
dia.
Se você não está acostumado com SQL, não se preocupe. Nosso foco aqui será a integração do
código Java com um banco de dados, e não o SQL em si. Em poucas palavras, o comando criou
uma tabela de usuários com as colunas usuario e senha, que é o que precisamos por agora.

O pacote [Link] e o JDBC


A biblioteca padrão do Java para persistência em banco de dados é conhecida como JDBC, de Java
Data Base Connective. O JDBC é, na verdade, um conjunto de interfaces bem elaborado que deve
ser implementado de forma diferente para cada banco de dados. Dessa forma, evitamos que cada
banco tenha seu próprio conjunto de classes e métodos. Qual a vantagem disso? Manutenibilidade
é uma das muitas. Migrar de um banco para outro é um processo fácil, já que todos implementam
as mesmas interfaces, portanto possuem métodos com a mesma assinatura.
Esse conjunto de classes é conhecido como driver; elas fazem a ponte entre a API de JDBC
e o banco de dados. O nome é análogo aos drivers utilizados na instalação de impressoras. Da
mesma forma que os drivers possibilitam a comunicação entre uma determinada impressora com
os diferentes sistemas operacionais existentes, os drivers que implementam as interfaces do JDBC
possibilitam a comunicação entre nosso código Java com os diferentes bancos de dados existentes.

Pacote [Link]
No momento de fazer os imports das classes, tome o cuidado de sempre escolher o pacote
[Link]. Nunca escolha opções de classes equivalentes do pacote [Link], ou qualquer outro
banco de dados que você estiver utilizando. Dessa forma, você não se acopla com a API do banco
de dados que está utilizando.

Abrindo conexão com MySQL em Java


A classe DriverManager é a responsável por gerenciar o processo de comunicação com os drivers
dos bancos de dados. Para abrir uma conexão, tudo que precisamos fazer é invocar seu método
getConnection passando como parâmetro uma String de conexão do JDBC, seu login e senha. Essa
String de conexão, para o MySQL, tem a seguinte estrutura:
jdbc:mysql://IP/DATABASE
O IP deve ser substituído pelo IP do servidor onde se encontra o banco de dados. Em nosso
caso, como será na mesma máquina, podemos deixar como localhost. A DATABASE deve ser
substituída pelo nome do base de dados que criamos para o projeto, BD. Portanto:
jdbc:mysql://localhost/BD
Para utilizar o DriverManager, precisaremos adicionar o driver do MySQL em nosso projeto.
Esse arquivo ([Link]) está disponível em [Link]
72 Capítulo 10. Trabalhando com JFrame e MySQL

com/downloads/connector/j/[Link] que você deve baixar. Descompacte o arquivo mysql-


[Link] e copie o arquivo [Link] para
dentro do seu projeto no NetBeans. Para isto, clique com o botão direito do mouse sobre
Libraries e escolha Add JAR/Folder... no menu que aparece, Figura 10.14.

Figura 10.14: Adicionando driver do MySQL no Build Path.

Na janela que aparece, encontre o arquivo e clique no botão Choose .

Figura 10.15: Selecionando uma biblioteca JAR a ser inserida no projeto.

Se você ainda não está familiarizado com o termo JAR, não se preocupe.

A árvore do projeto mostra que a biblioteca JAR foi inserida com sucesso.
10.2 Banco de Dados e JDBC 73

Figura 10.16: Árvore do projeto mostrando que a biblioteca JAR foi inserida corretamente.

Agora que temos o driver, vamos criar uma nova classe, que chamaremos de ConexaoMySQL
para colocar isso tudo em prática. Use a Figura 10.17 como guia. Clique com o botão direito do
mouse sobre ProjetoBD Source Packages projetobd e escolha New Java Class... no menu
que aparece.

Figura 10.17: Criando uma classe Java no projeto.

Na janela que aparece, deixe-a como na Figura 10.18, abaixo. Clique no botão Finish .
74 Capítulo 10. Trabalhando com JFrame e MySQL

Figura 10.18: Criação da classe Java ConexaoSQL.

Seu código deverá se parecer com:


Listagem 10.2: Classe ConexaoSQL
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 /* *
9 *
10 * @author dcc
11 */
12 public class ConexaoSQL {
13
14 }

Altere-o e deixe como na Listagem 10.3.


Listagem 10.3: Classe ConexaoSQL completa
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 import java . sql .*;
9 import javax . swing . JOptionPane ;
10
11 /* *
12 *
13 * @author dcc
14 */
15 public class ConexaoSQL {
16
17 Connection con ;
18 Statement stmt ;
19 ResultSet rs ;
20
21 String url ;
22 String user ;
23 String password ;
10.3 Criando uma Janela de Login em ProjetoBD 75

24 String driver ;
25
26 public ConexaoSQL () {
27 this . driver = " com . mysql . jdbc . Driver " ;
28 this . password = " password " ; // altere para a senha do seu phpMyAdmin
29 this . user = " root " ; // altere para o usu á rio do seu phpMyAdmin
30
31 // Use a linha abaixo se n ã o houver Warning de SSL
32 // this . url = " jdbc : mysql :// localhost :3306/ BD ";
33
34 // Ou use a linha abaixo se houver algum Warning de SSL
35 this . url = " jdbc : mysql :// localhost :3306/ BD ? autoReconnect = true & useSSL = false " ;
36 }
37
38 public boolean openConnectionMySql () {
39 try {
40 Class . forName ( driver ) ;
41 con = DriverManager . getConnection ( url , user , password ) ;
42 stmt = con . createStatement () ;
43 } catch ( ClassNotFoundException classException ) {
44 // Could not find the driver class . Likely an issue
45 // with finding the . jar file .
46 System . out . println ( " Could not find the JDBC driver class . " ) ;
47 System . out . print ( classException . getMessage () ) ;
48 System . out . println ( " Try again later ! " ) ;
49 // Exit . Cannot do anything further .
50 return false ;
51 } catch ( SQLTransientConnectionException connException ) {
52 // There was a potentially temporary network error
53 // Could automatically retry a number of times here , but
54 // instead just report error and exit .
55 System . out . print ( " Network connection issue : " ) ;
56 System . out . print ( connException . getMessage () ) ;
57 System . out . println ( " Try again later ! " ) ;
58 return false ;
59 } catch ( SQLInvalidAuthorizationSpecException authException ) {
60 // Either the username or password was wrong
61 System . out . print ( " Could not log into database : " ) ;
62 System . out . print ( authException . getMessage () ) ;
63 System . out . println ( " Check the login credentials and try again . " ) ;
64 return false ;
65 } catch ( SQLException exFonte ) {
66 JOptionPane . showMessageDialog ( null , " Deu erro na conex ã o com a fonte de dados : " +
exFonte ) ;
67 return false ;
68 }
69 return true ;
70 }
71 }

10.3 Criando uma Janela de Login em ProjetoBD

Agora vamos criar uma nova classe JFrame, que chamaremos de frmLogin para fazer login no
nosso banco de dados BD. Lembre que criamos um usuário chamado root com senha root.
Use a Figura 10.19 como guia. Clique com o botão direito do mouse sobre ProjetoBD Source
Packages projetobd e escolha New JFrame Form... no menu que aparece.
76 Capítulo 10. Trabalhando com JFrame e MySQL

Figura 10.19: Novo formulário JFrame.

Deixe a janela que aparece como na Figura 10.20 e clique no botão Finish .

Figura 10.20: Criação da janela de Login do projeto.

A janela Design do formulário é mostrada automaticamente. Arraste os componentes do


menu lateral direito para dentro do formulário. Você precisará de 2 Label, 1 TextField, 1
PasswordField e 2 Button. Tente deixar a tela organizada como na Figura 10.21.

Figura 10.21: Componentes arrastados da Palette e dispostos no formulário de Login da janela Design do NetBeans.
10.3 Criando uma Janela de Login em ProjetoBD 77

Clique no componente jLabel1 na tela do formulário e altere a propriedade text para Usuário:
e pressione . Toda vez que você escolhe um componente na tela do formulário as suas
propriedades aparecem no menu lateral direito, veja Figura 10.22.

Figura 10.22: Propriedade text do componente jLabel1 sendo alterada para Usuário:.

Altere:
• a propriedade text de jLabel2 para Senha:;
• a propriedade text de jTextField1 para vazio;
• a propriedade text de jPasswordField1 para vazio;
• a propriedade text de jButton1 para OK;
• a propriedade text de jButton2 para Cancelar.
Na parte de cima da janela de design (Figura 10.21), clique no botão Source para exibir o
código do formulário. Altere o código que aparece e deixe-o igual à Listagem 10.4, acrescentando
as linhas 3, 11 e 12.
Listagem 10.4: Classe frmLogin
1 public class frmLogin extends javax . swing . JFrame {
2
3 ConexaoSQL objCon = new ConexaoSQL () ;
4
5 /* *
6 * Creates new form frmLogin
7 */
8 public frmLogin () {
9 initComponents () ;
10
11 setResizable ( false ) ;
12 setLocationRelativeTo ( null ) ;
13 }
14 .
15 .
16 .

Na parte de cima da janela de design (Figura 10.21), clique no botão Design para exibir o
formulário novamente. Dê dois cliques no botão OK e a janela de código se abrirá. Altere o código
como Listagem abaixo.
Listagem 10.5: Código do botão OK
1 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 try {
3 if (! objCon . openConnectionMySql () ) {
4 System . out . println ( " N ã o foi poss í vel conectar ao banco de dados ! " ) ;
5 System . exit (1) ;
6 }
7 objCon . stmt = objCon . con . createStatement () ;
78 Capítulo 10. Trabalhando com JFrame e MySQL

8 String SQL = " SELECT * FROM usuarios " ;


9 objCon . rs = objCon . stmt . executeQuery ( SQL ) ;
10 objCon . rs . first () ;
11 if ( jTextField1 . getText () . equals ( objCon . rs . getString ( " usuario " ) ) && jPasswordField1 .
getText () . equals ( objCon . rs . getString ( " senha " ) ) ) {
12 JOptionPane . showMessageDialog ( null , " Usu á rio Correto " ) ;
13 } else {
14 JOptionPane . showMessageDialog ( null , " Usu á rio Inv á lido " ) ;
15 }
16 } catch ( SQLException se ) {
17 se . printStackTrace () ;
18 }
19 }

Na parte de cima da janela de design (Figura 10.21), clique no botão Design para exibir o
formulário novamente. Dê dois cliques no botão Cancelar e a janela de código se abrirá. Altere o
código como Listagem abaixo.
Listagem 10.6: Código do botão OK
1 private void jButton2ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 System . out . println ( " Usu á rio saiu do sistema ! " ) ;
3 System . exit (0) ;
4 }

No menu lateral esquerdo que exibe a estrutura do projeto, dê dois cliques em ProjetoBD
Source Packages projetobd [Link] e na janela de código que aparece, altere o
código como na listagem seguinte.
Listagem 10.7: Classe ProjetoBD
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 /* *
9 *
10 * @author dcc
11 */
12 public class ProjetoBD {
13
14 /* *
15 * @param args the command line arguments
16 */
17 public static void main ( String [] args ) {
18 frmLogin formLogin = new frmLogin () ;
19 formLogin . setVisible ( true ) ; // mostrar á tela de login no in í cio
20 }
21
22 }

Agora é só executar nosso projeto. Escolha o menu Run Run Project . Se não houver erros, a
tela de login deverá aparecer.

Figura 10.23: Tela de login de ProjetoBD.


10.3 Criando uma Janela de Login em ProjetoBD 79

Teste alguns usuários e senhas e veja as mensagens do nosso projeto. Depois teste o usuário
root e senha root, como está no nosso banco de dados BD.
Tudo está funcionando, porém há um problema com nosso login. Se você der uma olhada na
Figura 10.9, verá que nossa tabela usuarios tem dois problemas. Primeiro o campo usuario não
é do tipo chave primária e, portanto, poderia ser repetido na tabela, o que não seria interessante.
Segundo, o campo senha não está criptografado, o que deixaria nosso banco de dados BD totalmente
exposto a hackers. Vamos corrigir isto.
Acesse o phpMyAdmin, e selecione a tabela usuarios do banco de dados BD. Nas abas da
parte superior da janela, clique na aba Estrutura. Na janela que aparece (Figura 10.24), no campo
usuario clique em ▼ Mais Primária .

Figura 10.24

Na janela de confirmação clique em OK . Note que o símbolo de uma chave amarela aparece
ao lado do campo usuario. Agora o campo usuario é do tipo chave primária e não poderá ser
repetido. Nosso primeiro problema está corrigido.
Aproveite e no campo senha clique em Alterar e na janela que aparece altere o tamanho de 30
para 60, depois clique no botão Salvar . A aba SQL é exibida automaticamente e mostra o comando
executado:
1 ALTER TABLE ‘ usuarios ‘ CHANGE ‘ senha ‘ ‘ senha ‘ VARCHAR (60) CHARACTER SET utf8mb4 COLLATE
utf8mb4_0900_ai_ci NOT NULL ;

Agora clique na aba Visualizar e veremos nosso usuário cadastrado, isto é, usuário root e
senha root, Figura 10.25.

Figura 10.25: phpMyAdmin mostrando o único registro na tabela usuarios.

Logo abaixo deste usuário, clique no link Editar. A aba Inserir é selecionada automaticamente,
mostrando os valores na tabela usuarios.
80 Capítulo 10. Trabalhando com JFrame e MySQL

Acesse o endereço de internet [Link] entre com a palavra root e


clique no botão Crypt para obter a hash MD5 63a9f0ea7bb98050796b649e85481845 (Figura
10.26).

Figura 10.26: Senha root convertida em hash MD5 usando o site [Link]

Copie este valor e substitua a senha root do usuário root na tabela usuarios do banco de
dados BD com a nova senha criptografada com hash MD5 obtida com o procedimento da Figura
10.26, deixando como na Figura 10.27 e clique no botão Executar .

Figura 10.27

A aba SQL é exibida automaticamente e mostra o comando executado:


1 UPDATE ‘ usuarios ‘ SET ‘ senha ‘ = ’ 63 a9f0ea7bb98050796b649e85481845 ’ WHERE ‘ usuarios ‘. ‘
usuario ‘ = ’ root ’;

Nosso segundo problema está corrigido.


Agora temos que alterar nosso projeto Java ProjetoBD, para suportar estas alterações. Abra o
NetBeans, selecione nosso projeto ProjetoBD. Usando a Figura 10.17 como guia, crie uma nova
classe com o nome md5. Altere o código para ficar como na Listagem 10.8.
Listagem 10.8: Classe md5
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 import java . security . MessageDigest ;
9 import java . math . BigInteger ;
10
11 /* *
12 *
13 * @author dcc
14 */
15 public class md5 {
16 public String StringToMD5 ( String str ) {
17 try {
18 MessageDigest messageDigest = MessageDigest . getInstance ( " MD5 " ) ;
19 byte [] strBytes = str . getBytes () ;
20
21 byte [] digested = messageDigest . digest ( strBytes ) ;
22 messageDigest . reset () ;
23 System . out . println (( new BigInteger (1 , digested ) ) . toString (16) ) ;
10.3 Criando uma Janela de Login em ProjetoBD 81

24 return ( new BigInteger (1 , digested ) ) . toString (16) ;


25
26 } catch ( Exception e ) {
27 System . out . println ( e . getMessage () ) ;
28 e . printStackTrace ( System . err ) ;
29 }
30 return " " ;
31 }
32 }

Se você executar o programa como está e na janela de login (Figura 10.23) entrar com usuário
root e senha root, verá que o usuário é inválido. Isto está correto. Precisamos alterar nossa janela
de login para usar o hash MD5 para criptografar a senha root para seu correspondente em MD5 e
aí sim, consultar o banco de dados usando SQL.
No menu lateral esquerdo do projeto, dê dois cliques em ProjetoBD Source Packages
projetobd frmLogin e altere o código para ficar como na Listagem 10.9, inserindo a linha 18 e
alterando a linha 119.
Listagem 10.9: Classe frmLogin com MD5
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 import java . sql .*;
9 import javax . swing . JOptionPane ;
10
11 /* *
12 *
13 * @author dcc
14 */
15 public class frmLogin extends javax . swing . JFrame {
16
17 ConexaoSQL objCon = new ConexaoSQL () ;
18 md5 objMD5 = new md5 () ;
19
20 /* *
21 * Creates new form frmLogin
22 */
23 public frmLogin () {
24 initComponents () ;
25
26 setResizable ( false ) ;
27 setLocationRelativeTo ( null ) ;
28 }
29
30 /* *
31 * This method is called from within the constructor to initialize the form .
32 * WARNING : Do NOT modify this code . The content of this method is always
33 * regenerated by the Form Editor .
34 */
35 @SuppressWarnings ( " unchecked " )
36 // < editor - fold defaultstate =" collapsed " desc =" Generated Code " >
37 private void initComponents () {
38
39 jLabel1 = new javax . swing . JLabel () ;
40 jLabel2 = new javax . swing . JLabel () ;
41 jTextField1 = new javax . swing . JTextField () ;
42 jPasswordField1 = new javax . swing . JPasswordField () ;
43 jButton1 = new javax . swing . JButton () ;
44 jButton2 = new javax . swing . JButton () ;
45
46 setDefaultCloseOperation ( javax . swing . WindowConstants . EXIT_ON_CLOSE ) ;
47
48 jLabel1 . setText ( " Usu á rio : " ) ;
49
82 Capítulo 10. Trabalhando com JFrame e MySQL

50 jLabel2 . setText ( " Senha : " ) ;


51
52 jButton1 . setText ( " OK " ) ;
53 jButton1 . addActionListener ( new java . awt . event . ActionListener () {
54 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
55 jButton1ActionPerformed ( evt ) ;
56 }
57 }) ;
58
59 jButton2 . setText ( " Cancelar " ) ;
60 jButton2 . addActionListener ( new java . awt . event . ActionListener () {
61 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
62 jButton2ActionPerformed ( evt ) ;
63 }
64 }) ;
65
66 javax . swing . GroupLayout layout = new javax . swing . GroupLayout ( getContentPane () ) ;
67 getContentPane () . setLayout ( layout ) ;
68 layout . setHorizontalGroup (
69 layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
70 . addGroup ( layout . createSequentialGroup ()
71 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
72 . addGroup ( layout . createSequentialGroup ()
73 . addGap (32 , 32 , 32)
74 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
75 . addComponent ( jLabel1 )
76 . addComponent ( jLabel2 ) )
77 . addGap (46 , 46 , 46)
78 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING ,
false )
79 . addComponent ( jTextField1 )
80 . addComponent ( jPasswordField1 , javax . swing . GroupLayout . DEFAULT_SIZE , 165 , Short .
MAX_VALUE ) ) )
81 . addGroup ( layout . createSequentialGroup ()
82 . addGap (109 , 109 , 109)
83 . addComponent ( jButton1 )
84 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED )
85 . addComponent ( jButton2 ) ) )
86 . addContainerGap (53 , Short . MAX_VALUE ) )
87 );
88 layout . setVerticalGroup (
89 layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
90 . addGroup ( layout . createSequentialGroup ()
91 . addGap (10 , 10 , 10)
92 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
93 . addComponent ( jLabel1 )
94 . addComponent ( jTextField1 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
95 . addGap (20 , 20 , 20)
96 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
97 . addComponent ( jLabel2 )
98 . addComponent ( jPasswordField1 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
99 . addGap (18 , 18 , 18)
100 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
101 . addComponent ( jButton1 )
102 . addComponent ( jButton2 ) )
103 . addContainerGap (14 , Short . MAX_VALUE ) )
104 );
105
106 pack () ;
107 } // </ editor - fold >
108
109 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
110 try {
111 if (! objCon . openConnectionMySql () ) {
112 System . out . println ( " N ã o foi poss í vel conectar ao banco de dados ! " ) ;
113 System . exit (1) ;
114 }
115 objCon . stmt = objCon . con . createStatement () ;
10.3 Criando uma Janela de Login em ProjetoBD 83

116 String SQL = " SELECT * FROM usuarios " ;


117 objCon . rs = objCon . stmt . executeQuery ( SQL ) ;
118 objCon . rs . first () ;
119 if ( jTextField1 . getText () . equals ( objCon . rs . getString ( " usuario " ) ) && objMD5 .
StringToMD5 ( jTextField1 . getText () ) . equals ( objCon . rs . getString ( " senha " ) ) ) {

120 JOptionPane . showMessageDialog ( null , " Usu á rio Correto " ) ;


121 } else {
122 JOptionPane . showMessageDialog ( null , " Usu á rio Inv á lido " ) ;
123 }
124 } catch ( SQLException se ) {
125 se . printStackTrace () ;
126 }
127 }
128
129 private void jButton2ActionPerformed ( java . awt . event . ActionEvent evt ) {
130 System . out . println ( " Usu á rio saiu do sistema ! " ) ;
131 System . exit (0) ;
132 }
133
134 /* *
135 * @param args the command line arguments
136 */
137 public static void main ( String args []) {
138 /* Set the Nimbus look and feel */
139 // < editor - fold defaultstate =" collapsed " desc =" Look and feel setting code ( optional )
">
140 /* If Nimbus ( introduced in Java SE 6) is not available , stay with the default look
and feel .
141 * For details see http :// download . oracle . com / javase / tutorial / uiswing / lookandfeel /
plaf . html
142 */
143 try {
144 for ( javax . swing . UIManager . LookAndFeelInfo info : javax . swing . UIManager .
getInstalledLookAndFeels () ) {
145 if ( " Nimbus " . equals ( info . getName () ) ) {
146 javax . swing . UIManager . setLookAndFeel ( info . getClassName () ) ;
147 break ;
148 }
149 }
150 } catch ( ClassNotFoundException ex ) {
151 java . util . logging . Logger . getLogger ( frmLogin . class . getName () ) . log ( java . util . logging
. Level . SEVERE , null , ex ) ;
152 } catch ( InstantiationException ex ) {
153 java . util . logging . Logger . getLogger ( frmLogin . class . getName () ) . log ( java . util . logging
. Level . SEVERE , null , ex ) ;
154 } catch ( IllegalAccessException ex ) {
155 java . util . logging . Logger . getLogger ( frmLogin . class . getName () ) . log ( java . util . logging
. Level . SEVERE , null , ex ) ;
156 } catch ( javax . swing . UnsupportedLookAndFeelException ex ) {
157 java . util . logging . Logger . getLogger ( frmLogin . class . getName () ) . log ( java . util . logging
. Level . SEVERE , null , ex ) ;
158 }
159 // </ editor - fold >
160
161 /* Create and display the form */
162 java . awt . EventQueue . invokeLater ( new Runnable () {
163 public void run () {
164 new frmLogin () . setVisible ( true ) ;
165 }
166 }) ;
167 }
168
169 // Variables declaration - do not modify
170 private javax . swing . JButton jButton1 ;
171 private javax . swing . JButton jButton2 ;
172 private javax . swing . JLabel jLabel1 ;
173 private javax . swing . JLabel jLabel2 ;
174 private javax . swing . JPasswordField jPasswordField1 ;
175 private javax . swing . JTextField jTextField1 ;
84 Capítulo 10. Trabalhando com JFrame e MySQL

176 // End of variables declaration


177 }

Se você executar o programa novamente agora e na janela de login (Figura 10.23) entrar com
usuário root e senha root, verá que o usuário é válido desta vez. Isto está correto, pois agora
nossa janela de login criptografa a propriedade text informada em jPasswordField1 usando
StringToMD5() da nossa classe md5 num hash MD5 antes de comparar com a senha salva na
tabela usuarios (lembre que havíamos alterado anteriormente a senha de root para o hash MD5
63a9f0ea7bb98050796b649e85481845).

10.4 Criando uma Tabela de Alunos

Acesse o phpMyAdmin e selecione o banco de dados BD. Clique na aba SQL e substitua o
código SQL (caso apareça) pelo código SQL abaixo:
1 CREATE TABLE ‘ alunos ‘ (
2 ‘ matricula ‘ int (11) NOT NULL ,
3 ‘ data_matricula ‘ timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
4 ‘ nome ‘ varchar (60) NOT NULL ,
5 ‘ data_de_nascimento ‘ date NOT NULL ,
6 ‘ telefone ‘ varchar (20) NOT NULL ,
7 ‘ celular ‘ varchar (20) NOT NULL ,
8 ‘ email ‘ varchar (60) NOT NULL
9 ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ;

Clique no botão Salvar e a nova tabela será inserida no nosso banco de dados BD.

10.5 Construindo a Tela Principal

Basedo na seção Criando uma Janela de Login em ProjetoBD na página 75, crie um novo formulário
JFrame e chame-o de [Link]. Coloque um componente Menu Bar no formulário
e deixe-o com o seguinte aspecto:

Figura 10.28: Menu principal


10.5 Construindo a Tela Principal 85

Figura 10.29: Menu Arquivos

Figura 10.30: Menu Ajuda

Dê dois cliques em Arquivo Alunos (Figura 10.29) do formulário da tela principal e coloque
o seguinte código:
Listagem 10.10: Lista de imports
1 private void jMenuItem1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 frmAlunos formAlunos = new frmAlunos () ;
3 formAlunos . setVisible ( true ) ;
4 }

Dê dois cliques em Arquivo Sair (Figura 10.29) do formulário da tela principal e coloque o
seguinte código:
Listagem 10.11: Lista de imports
1 private void jMenuItem2ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 System . exit (0) ;
3 }

Dê dois cliques em Ajuda Sobre (Figura 10.30) do formulário da tela principal e coloque o
seguinte código:
Listagem 10.12: Lista de imports
1 private void jMenuItem5ActionPerformed ( java . awt . event . ActionEvent evt ) {
86 Capítulo 10. Trabalhando com JFrame e MySQL

2 int dialogButton = JOptionPane . INFORMATION_MESSAGE ;


3 JOptionPane . showMessageDialog ( null , " CRUD em Java ODBC . " , " Sobre " , dialogButton ) ;
4 }

Não se esqueça de colocar a seguinte importação:


Listagem 10.13: Lista de imports
1 import javax . swing . JOptionPane ;

10.5.1 Chamando a Tela Principal a partir da janela de Login


Volte ao formulário de Login e dê dois cliques no botão OK . Altere o código para ficar como na
listagem abaixo:
Listagem 10.14: Novo código do botão OK da janela de Login
1 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 Connection conn = null ;
3 PreparedStatement pstm = null ;
4
5 // Classe que vai recuperar os dados do banco de dados
6 ResultSet rset = null ;
7
8 String query = " SELECT * FROM usuarios WHERE usuario = ? " ;
9
10 try {
11 // Cria uma conex ã o com o banco
12 conn = ConexaoSQL . createConnectionToMySQL () ;
13
14 // Cria um PreparedStatment , classe usada para executar a query
15 pstm = conn . prepareStatement ( query ) ;
16
17 pstm . setString (1 , jTextField1 . getText () ) ;
18
19 // Executa a sql para inser ç ã o dos dados
20 rset = pstm . executeQuery () ;
21
22 // Enquanto existir dados no banco de dados , fa ç a
23 while ( rset . next () ) {
24 if ( jTextField1 . getText () . equals ( rset . getString ( " usuario " ) ) && objMD5 . StringToMD5 (
jTextField1 . getText () ) . equals ( rset . getString ( " senha " ) ) ) {
25 // JOptionPane . showMessageDialog ( null , " Usu á rio Correto ") ;
26 this . setVisible ( false ) ;
27 frmTelaPrincipal formTelaPrincipal = new frmTelaPrincipal () ;
28 formTelaPrincipal . setVisible ( true ) ;
29 } else {
30 JOptionPane . showMessageDialog ( null , " Usu á rio Inv á lido " ) ;
31 }
32 }
33 pstm . close () ;
34
35 } catch ( SQLException se ) {
36 se . printStackTrace () ;
37 } catch ( Exception ex ) {
38 System . out . println ( ex . getMessage () ) ;
39 } finally {
40 // Fecha as conex õ es
41 try {
42 if ( pstm != null ) {
43 pstm . close () ;
44 }
45 if ( conn != null ) {
46 conn . close () ;
47 }
48 } catch ( Exception e ) {
49 e . printStackTrace () ;
50 }
51 }
52 }
10.6 Editando os Dados na Tabela Alunos - CRUD 87

10.6 Editando os Dados na Tabela Alunos - CRUD


10.6.1 Construindo a Tela de Alunos
Basedo na seção Criando uma Janela de Login em ProjetoBD na página 75, crie um novo formulário
JFrame e chame-o de [Link]. Coloque os componentes no formulário e deixe-o com o
seguinte aspecto:

Figura 10.31: Formulário de alunos.

No campo de matrícula, edite a propriedade toolTipText para Formato de matrícula: aaaa99


(Ex.: 202001).
O componente em cor vermelha é um Label. Na janela de propriedades, edite as propriedades
font escolhendo tamanho 8, itálico, foreground para [255,0,0] e text para Pressione F2 neste
campo para buscar uma matrícula informada.. Você pode se basear na figura abaixo:

Figura 10.32: Rótulo vermelho

10.6.2 Antes de começar


Na parte de importações do código, deixe como na listagem abaixo:
Listagem 10.15: Lista de imports
1 import java . sql . PreparedStatement ;
2 import java . sql . Connection ;
3 import java . sql . DriverManager ;
4 import java . sql . ResultSet ;
5 import java . sql . SQLException ;
6 import java . sql . SQLInvalidAuthorizationSpecException ;
7 import java . sql . SQLTransientConnectionException ;
8 import java . sql . Statement ;
9 import java . text . DateFormat ;
10 import javax . swing . JOptionPane ;
88 Capítulo 10. Trabalhando com JFrame e MySQL

Limpar campos
Crie a função clearFields() como abaixo:
Listagem 10.16: Código da função clearFields()
1 private void clearFields () {
2 jTextField1 . setText ( " " ) ;
3 jTextField2 . setText ( " " ) ;
4 jTextField3 . setText ( " " ) ;
5 jTextField4 . setText ( " " ) ;
6 jTextField5 . setText ( " " ) ;
7 jTextField6 . setText ( " " ) ;
8 }

No formulário, dê dois cliques no botão Limpar campos e coloque o seguinte código:


Listagem 10.17: Código do botão Limpar campos
1 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 clearFields () ;
3 }

Cadastrar (Create)
Dê dois cliques no botão Salvar e coloque o seguinte código:
Listagem 10.18: Código do botão Salvar
1 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 Connection conn = null ;
3 PreparedStatement pstm = null ;
4
5 // Classe que vai recuperar os dados do banco de dados
6 ResultSet rset = null ;
7
8 String query = " INSERT INTO alunos ( matricula , data_matricula , nome ,
data_de_nascimento , telefone , celular , email ) VALUES (? , ? , ? , ? , ? , ? , ?) " ;
9
10 try {
11 // Cria uma conex ã o com o banco
12 conn = ConexaoSQL . createConnectionToMySQL () ;
13
14 // Cria um PreparedStatment , classe usada para executar a query
15 pstm = conn . prepareStatement ( query ) ;
16
17 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
18 pstm . setDate (2 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; // data_matricula
19 pstm . setString (3 , jTextField2 . getText () ) ; // nome
20 pstm . setDate (4 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; // data_de_nascimento
21 pstm . setString (5 , jTextField4 . getText () ) ; // telefone
22 pstm . setString (6 , jTextField5 . getText () ) ; // celular
23 pstm . setString (7 , jTextField6 . getText () ) ; // email
24
25 // Executa a sql para inser ç ã o dos dados
26 pstm . executeUpdate () ;
27
28 pstm . close () ;
29
30 conn . close () ;
31
32 } catch ( SQLException se ) {
33 System . out . println ( se . getMessage () ) ;
34 } catch ( Exception ex ) {
35 System . out . println ( ex . getMessage () ) ;
36 } finally {
37 // Fecha as conex õ es
38 try {
39 if ( pstm != null ) {
40 pstm . close () ;
41 }
42 if ( conn != null ) {
43 conn . close () ;
10.6 Editando os Dados na Tabela Alunos - CRUD 89

44 }
45 } catch ( SQLException e ) {
46 System . out . println ( e . getMessage () ) ;
47 }
48 }
49 }

Excluir (Remove)
Dê dois cliques no botão Excluir e coloque o seguinte código:
Listagem 10.19: Código do botão Excluir
1 private void jButton3ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 if ( jTextField1 . getText () . length () == 0) {
3 System . out . println ( " Erro : Matr í cula n ã o informada ! " ) ;
4 } else {
5 int dialogButton = JOptionPane . YES_NO_OPTION ;
6 JOptionPane . showConfirmDialog ( null , " Remover aluno com matr í cula " + jTextField1 .
getText () . toString () + " ? " , " Warning " , dialogButton ) ;
7
8 if ( dialogButton == JOptionPane . YES_OPTION ) {
9 // System . out . println (" Remover aluno com matr í cula " + jTextField1 . getText () .
toString () + "?") ;
10 Connection conn = null ;
11 PreparedStatement pstm = null ;
12
13 // Classe que vai recuperar os dados do banco de dados
14 ResultSet rset ;
15
16 // Executa a query de sele ç ã o
17 String query = " DELETE FROM alunos WHERE matricula =?; " ;
18
19 try {
20 // Cria uma conex ã o com o banco
21 conn = ConexaoSQL . createConnectionToMySQL () ;
22
23 pstm = conn . prepareStatement ( query ) ;
24
25 System . out . println ( jTextField1 . getText () ) ;
26
27 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
28
29 System . out . println ( pstm . toString () ) ;
30
31 pstm . execute () ;
32
33 pstm . close () ;
34
35 conn . close () ;
36
37 } catch ( SQLException se ) {
38 System . out . println ( se . getMessage () ) ;
39 } catch ( Exception ex ) {
40 System . out . println ( ex . getMessage () ) ;
41 } finally {
42 // Fecha as conex õ es
43 try {
44 if ( pstm != null ) {
45 pstm . close () ;
46 }
47 if ( conn != null ) {
48 conn . close () ;
49 }
50 } catch ( SQLException e ) {
51 System . out . println ( e . getMessage () ) ;
52 }
53 }
54 }
55 }
56 }
90 Capítulo 10. Trabalhando com JFrame e MySQL

Esta função usa o código da Listagem 10.20 para trazer os dados de um aluno matriculado,
basta digitar a matrícula do aluno e pressionar a tecla F2 . Com um aluno sendo exibido, para
excluí-lo basta clicar no botão Excluir e ele será removido do banco de dados.

Atualizar (Update)
Para atualizar dados, dê um clique no campo de matrícula para selecioná-lo. Na janela de proprie-
dades (à direita no NetBeans), clique no botão Events , role as opções para baixo até encontrar a
opção keyPressed, Figura 10.33.

Figura 10.33: Evento keyPressed do jTextField1.

Note que na frente de keyPressed está escrito <none>, que significa que não há nenhum evento
keyPressed sendo monitorado. Vamos criar um evento de pressionar de teclas clicando duas vezes
sobre <none>. Na janela de código, digite o seguinte código:
Listagem 10.20: Código do evento keyPressed do campo de matrícula
1 private void jTextField1KeyPressed ( java . awt . event . KeyEvent evt ) {
2 if ( evt . getKeyCode () == 113) { // C ó digo da tecla F2
3 Connection conn = null ;
4 PreparedStatement pstm = null ;
5
6 // Classe que vai recuperar os dados do banco de dados
7 ResultSet rset ;
8
9 // Executa a query de sele ç ã o
10 String query = " SELECT * FROM alunos WHERE matricula =?; " ;
11
12 try {
13 // Cria uma conex ã o com o banco
14 conn = ConexaoSQL . createConnectionToMySQL () ;
15
16 pstm = conn . prepareStatement ( query ) ;
17
18 System . out . println ( jTextField1 . getText () ) ;
19
20 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
21
22 System . out . println ( pstm . toString () ) ;
23
24 pstm . executeQuery () ;
25
26 rset = pstm . getResultSet () ;
27
28 // Mostra o aluno na tela
29 if ( rset . next () ) {
30 jTextField2 . setText ( rset . getString ( " nome " ) ) ;
31 jTextField3 . setText ( rset . getString ( " data_de_nascimento " ) ) ;
32 jTextField4 . setText ( rset . getString ( " telefone " ) ) ;
33 jTextField5 . setText ( rset . getString ( " celular " ) ) ;
10.6 Editando os Dados na Tabela Alunos - CRUD 91

34 jTextField6 . setText ( rset . getString ( " email " ) ) ;


35 } else {
36 System . out . println ( " Nenhum registro retornado . " ) ;
37 clearFields () ;
38 }
39
40 pstm . close () ;
41
42 conn . close () ;
43
44 } catch ( SQLException se ) {
45 System . out . println ( se . getMessage () ) ;
46 } catch ( Exception ex ) {
47 System . out . println ( ex . getMessage () ) ;
48 } finally {
49 // Fecha as conex õ es
50 try {
51 if ( pstm != null ) {
52 pstm . close () ;
53 }
54 if ( conn != null ) {
55 conn . close () ;
56 }
57 } catch ( SQLException e ) {
58 System . out . println ( e . getMessage () ) ;
59 }
60 }
61 }
62 }

Assim que os dados forem mostrados é só alterá-los e clicar no botão Salvar para gravar as
alterações.

Listar (Display)
Listagem 10.21: Código do botão Listar
1 private void jButton4ActionPerformed ( java . awt . event . ActionEvent evt ) {
2 Connection conn = null ;
3 PreparedStatement pstm = null ;
4
5 // Classe que vai recuperar os dados do banco de dados
6 ResultSet rset = null ;
7
8 // Executa a query de sele ç ã o
9 String query = " SELECT * FROM alunos " ;
10
11 try {
12 // Cria uma conex ã o com o banco
13 conn = ConexaoSQL . createConnectionToMySQL () ;
14
15 pstm = conn . prepareStatement ( query ) ;
16 pstm . executeQuery ( query ) ;
17 rset = pstm . getResultSet () ;
18
19 // Lista os alunos no console
20 while ( rset . next () ) {
21 System . out . print ( rset . getString ( " matricula " ) + " , " ) ;
22 System . out . print ( rset . getString ( " nome " ) + " , " ) ;
23 System . out . println ( rset . getString ( " email " ) ) ;
24 }
25
26 } catch ( SQLException se ) {
27 System . out . println ( se . getMessage () ) ;
28 } catch ( Exception ex ) {
29 System . out . println ( ex . getMessage () ) ;
30 } finally {
31 // Fecha as conex õ es
32 try {
33 if ( pstm != null ) {
92 Capítulo 10. Trabalhando com JFrame e MySQL

34 pstm . close () ;
35 }
36 if ( conn != null ) {
37 conn . close () ;
38 }
39 } catch ( SQLException e ) {
40 System . out . println ( e . getMessage () ) ;
41 }
42 }
43 }

Por simplicidade, optou-se por uma listagem simples no console do NetBeans (Figura 10.34).

Figura 10.34: Listagem de alunos no console do NetBeans.

10.7 Listagem completa da classe frmAlunos


Listagem 10.22: Código completo do formulário de Alunos
1 /*
2 * To change this license header , choose License Headers in Project Properties .
3 * To change this template file , choose Tools | Templates
4 * and open the template in the editor .
5 */
6 package projetobd ;
7
8 import java . sql . PreparedStatement ;
9 import java . sql . Connection ;
10 import java . sql . DriverManager ;
11 import java . sql . ResultSet ;
12 import java . sql . SQLException ;
13 import java . sql . SQLInvalidAuthorizationSpecException ;
14 import java . sql . SQLTransientConnectionException ;
15 import java . sql . Statement ;
16 import java . text . DateFormat ;
17 import javax . swing . JOptionPane ;
18
19 /* *
20 *
21 * @author dcc
22 */
23 public class frmAlunos extends javax . swing . JFrame {
24
25 Connection con ;
26 Statement stmt ;
27 ResultSet rs ;
10.7 Listagem completa da classe frmAlunos 93

28
29 /* *
30 * Creates new form frmAlunos
31 */
32 public frmAlunos () {
33 initComponents () ;
34
35 setResizable ( false ) ;
36 setLocationRelativeTo ( null ) ;
37 }
38
39 /* *
40 * This method is called from within the constructor to initialize the form .
41 * WARNING : Do NOT modify this code . The content of this method is always
42 * regenerated by the Form Editor .
43 */
44 @SuppressWarnings ( " unchecked " )
45 // < editor - fold defaultstate =" collapsed " desc =" Generated Code " >
46 private void initComponents () {
47
48 jLabel1 = new javax . swing . JLabel () ;
49 jTextField1 = new javax . swing . JTextField () ;
50 jLabel2 = new javax . swing . JLabel () ;
51 jTextField2 = new javax . swing . JTextField () ;
52 jLabel3 = new javax . swing . JLabel () ;
53 jTextField3 = new javax . swing . JTextField () ;
54 jLabel4 = new javax . swing . JLabel () ;
55 jTextField4 = new javax . swing . JTextField () ;
56 jLabel5 = new javax . swing . JLabel () ;
57 jTextField5 = new javax . swing . JTextField () ;
58 jLabel6 = new javax . swing . JLabel () ;
59 jTextField6 = new javax . swing . JTextField () ;
60 jButton2 = new javax . swing . JButton () ;
61 jButton3 = new javax . swing . JButton () ;
62 jButton4 = new javax . swing . JButton () ;
63 jButton1 = new javax . swing . JButton () ;
64 jLabel7 = new javax . swing . JLabel () ;
65
66 setTitle ( " Aluno " ) ;
67
68 jLabel1 . setText ( " Matr í cula : " ) ;
69
70 jTextField1 . setToolTipText ( " Formato de matr í cula : aaaa99 ( Ex .: 202001) " ) ;
71 jTextField1 . addActionListener ( new java . awt . event . ActionListener () {
72 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
73 jTextField1ActionPerformed ( evt ) ;
74 }
75 }) ;
76 jTextField1 . addKeyListener ( new java . awt . event . KeyAdapter () {
77 public void keyPressed ( java . awt . event . KeyEvent evt ) {
78 jTextField1KeyPressed ( evt ) ;
79 }
80 }) ;
81
82 jLabel2 . setText ( " Nome : " ) ;
83
84 jLabel3 . setText ( " Data de nascimento : " ) ;
85
86 jTextField3 . setToolTipText ( " yyyy - mm - dd " ) ;
87
88 jLabel4 . setText ( " Telefone : " ) ;
89
90 jLabel5 . setText ( " Celular : " ) ;
91
92 jLabel6 . setText ( "E - mail : " ) ;
93
94 jButton2 . setText ( " Salvar " ) ;
95 jButton2 . addActionListener ( new java . awt . event . ActionListener () {
96 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
97 jButton2ActionPerformed ( evt ) ;
94 Capítulo 10. Trabalhando com JFrame e MySQL

98 }
99 }) ;
100
101 jButton3 . setText ( " Excluir " ) ;
102 jButton3 . addActionListener ( new java . awt . event . ActionListener () {
103 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
104 jButton3ActionPerformed ( evt ) ;
105 }
106 }) ;
107
108 jButton4 . setText ( " Listar " ) ;
109 jButton4 . addActionListener ( new java . awt . event . ActionListener () {
110 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
111 jButton4ActionPerformed ( evt ) ;
112 }
113 }) ;
114
115 jButton1 . setText ( " Limpar campos " ) ;
116 jButton1 . addActionListener ( new java . awt . event . ActionListener () {
117 public void actionPerformed ( java . awt . event . ActionEvent evt ) {
118 jButton1ActionPerformed ( evt ) ;
119 }
120 }) ;
121
122 jLabel7 . setFont ( new java . awt . Font ( " Lucida Grande " , 2 , 8) ) ; // NOI18N
123 jLabel7 . setForeground ( new java . awt . Color (255 , 0 , 0) ) ;
124 jLabel7 . setText ( " Pressione F2 neste campo para buscar uma matr í cula informada . " ) ;
125
126 javax . swing . GroupLayout layout = new javax . swing . GroupLayout ( getContentPane () ) ;
127 getContentPane () . setLayout ( layout ) ;
128 layout . setHorizontalGroup (
129 layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
130 . addGroup ( layout . createSequentialGroup ()
131 . addGap (14 , 14 , 14)
132 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . TRAILING )
133 . addGroup ( layout . createSequentialGroup ()
134 . addComponent ( jButton1 )
135 . addGap (18 , 18 , 18)
136 . addComponent ( jButton2 )
137 . addGap (18 , 18 , 18)
138 . addComponent ( jButton3 )
139 . addGap (18 , 18 , 18)
140 . addComponent ( jButton4 ) )
141 . addGroup ( layout . createSequentialGroup ()
142 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
143 . addComponent ( jLabel6 , javax . swing . GroupLayout . Alignment . TRAILING )
144 . addComponent ( jLabel1 , javax . swing . GroupLayout . Alignment . TRAILING )
145 . addComponent ( jLabel2 , javax . swing . GroupLayout . Alignment . TRAILING )
146 . addComponent ( jLabel3 , javax . swing . GroupLayout . Alignment . TRAILING )
147 . addComponent ( jLabel4 , javax . swing . GroupLayout . Alignment . TRAILING ) )
148 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED )
149 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING ,
false )
150 . addComponent ( jTextField6 )
151 . addGroup ( layout . createSequentialGroup ()
152 . addComponent ( jTextField1 , javax . swing . GroupLayout . PREFERRED_SIZE , 103 , javax . swing .
GroupLayout . PREFERRED_SIZE )
153 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED )
154 . addComponent ( jLabel7 ) )
155 . addComponent ( jTextField2 )
156 . addComponent ( jTextField3 , javax . swing . GroupLayout . PREFERRED_SIZE , 98 , javax . swing .
GroupLayout . PREFERRED_SIZE )
157 . addGroup ( layout . createSequentialGroup ()
158 . addComponent ( jTextField4 , javax . swing . GroupLayout . PREFERRED_SIZE , 184 , javax . swing .
GroupLayout . PREFERRED_SIZE )
159 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED , javax . swing .
GroupLayout . DEFAULT_SIZE , Short . MAX_VALUE )
160 . addComponent ( jLabel5 )
161 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED )
162 . addComponent ( jTextField5 , javax . swing . GroupLayout . PREFERRED_SIZE , 184 , javax . swing .
10.7 Listagem completa da classe frmAlunos 95

GroupLayout . PREFERRED_SIZE ) ) ) ) )
163 . addContainerGap ( javax . swing . GroupLayout . DEFAULT_SIZE , Short . MAX_VALUE ) )
164 );
165 layout . setVerticalGroup (
166 layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . LEADING )
167 . addGroup ( layout . createSequentialGroup ()
168 . addGap (11 , 11 , 11)
169 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
170 . addComponent ( jLabel1 )
171 . addComponent ( jTextField1 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE )
172 . addComponent ( jLabel7 ) )
173 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . UNRELATED )
174 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
175 . addComponent ( jLabel2 )
176 . addComponent ( jTextField2 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
177 . addGap (18 , 18 , 18)
178 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
179 . addComponent ( jLabel3 )
180 . addComponent ( jTextField3 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
181 . addGap (18 , 18 , 18)
182 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
183 . addComponent ( jLabel4 )
184 . addComponent ( jTextField4 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE )
185 . addComponent ( jLabel5 )
186 . addComponent ( jTextField5 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
187 . addGap (18 , 18 , 18)
188 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
189 . addComponent ( jLabel6 )
190 . addComponent ( jTextField6 , javax . swing . GroupLayout . PREFERRED_SIZE , javax . swing .
GroupLayout . DEFAULT_SIZE , javax . swing . GroupLayout . PREFERRED_SIZE ) )
191 . addPreferredGap ( javax . swing . LayoutStyle . ComponentPlacement . RELATED , 36 , Short .
MAX_VALUE )
192 . addGroup ( layout . createParallelGroup ( javax . swing . GroupLayout . Alignment . BASELINE )
193 . addComponent ( jButton2 )
194 . addComponent ( jButton3 )
195 . addComponent ( jButton4 )
196 . addComponent ( jButton1 ) )
197 . addContainerGap () )
198 );
199
200 pack () ;
201 } // </ editor - fold >
202
203 private void clearFields () {
204 jTextField1 . setText ( " " ) ;
205 jTextField2 . setText ( " " ) ;
206 jTextField3 . setText ( " " ) ;
207 jTextField4 . setText ( " " ) ;
208 jTextField5 . setText ( " " ) ;
209 jTextField6 . setText ( " " ) ;
210 }
211
212 private void jButton2ActionPerformed ( java . awt . event . ActionEvent evt ) {
213 Connection conn = null ;
214 PreparedStatement pstm = null ;
215
216 // Classe que vai recuperar os dados do banco de dados
217 ResultSet rset = null ;
218
219 String query = " INSERT INTO alunos ( matricula , data_matricula , nome ,
data_de_nascimento , telefone , celular , email ) VALUES (? , ? , ? , ? , ? , ? , ?) " ;
220
221 try {
222 // Cria uma conex ã o com o banco
223 conn = ConexaoSQL . createConnectionToMySQL () ;
96 Capítulo 10. Trabalhando com JFrame e MySQL

224
225 // Cria um PreparedStatment , classe usada para executar a query
226 pstm = conn . prepareStatement ( query ) ;
227
228 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
229 pstm . setDate (2 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; // data_matricula
230 pstm . setString (3 , jTextField2 . getText () ) ; // nome
231 pstm . setDate (4 , java . sql . Date . valueOf ( jTextField3 . getText () ) ) ; //
data_de_nascimento
232 pstm . setString (5 , jTextField4 . getText () ) ; // telefone
233 pstm . setString (6 , jTextField5 . getText () ) ; // celular
234 pstm . setString (7 , jTextField6 . getText () ) ; // email
235
236 // Executa a sql para inser ç ã o dos dados
237 pstm . executeUpdate () ;
238
239 pstm . close () ;
240
241 conn . close () ;
242
243 } catch ( SQLException se ) {
244 System . out . println ( se . getMessage () ) ;
245 } catch ( Exception ex ) {
246 System . out . println ( ex . getMessage () ) ;
247 } finally {
248 // Fecha as conex õ es
249 try {
250 if ( pstm != null ) {
251 pstm . close () ;
252 }
253 if ( conn != null ) {
254 conn . close () ;
255 }
256 } catch ( SQLException e ) {
257 System . out . println ( e . getMessage () ) ;
258 }
259 }
260 }
261
262 private void jTextField1ActionPerformed ( java . awt . event . ActionEvent evt ) {
263 // TODO add your handling code here :
264 }
265
266 private void jButton3ActionPerformed ( java . awt . event . ActionEvent evt ) {
267 if ( jTextField1 . getText () . length () == 0) {
268 System . out . println ( " Erro : Matr í cula n ã o informada ! " ) ;
269 } else {
270 int dialogButton = JOptionPane . YES_NO_OPTION ;
271 JOptionPane . showConfirmDialog ( null , " Remover aluno com matr í cula " + jTextField1 .
getText () . toString () + " ? " , " Warning " , dialogButton ) ;
272
273 if ( dialogButton == JOptionPane . YES_OPTION ) {
274 // System . out . println (" Remover aluno com matr í cula " + jTextField1 . getText () .
toString () + "?") ;
275 Connection conn = null ;
276 PreparedStatement pstm = null ;
277
278 // Classe que vai recuperar os dados do banco de dados
279 ResultSet rset ;
280
281 // Executa a query de sele ç ã o
282 String query = " DELETE FROM alunos WHERE matricula =?; " ;
283
284 try {
285 // Cria uma conex ã o com o banco
286 conn = ConexaoSQL . createConnectionToMySQL () ;
287
288 pstm = conn . prepareStatement ( query ) ;
289
290 System . out . println ( jTextField1 . getText () ) ;
10.7 Listagem completa da classe frmAlunos 97

291
292 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
293
294 System . out . println ( pstm . toString () ) ;
295
296 pstm . execute () ;
297
298 pstm . close () ;
299
300 conn . close () ;
301
302 } catch ( SQLException se ) {
303 System . out . println ( se . getMessage () ) ;
304 } catch ( Exception ex ) {
305 System . out . println ( ex . getMessage () ) ;
306 } finally {
307 // Fecha as conex õ es
308 try {
309 if ( pstm != null ) {
310 pstm . close () ;
311 }
312 if ( conn != null ) {
313 conn . close () ;
314 }
315 } catch ( SQLException e ) {
316 System . out . println ( e . getMessage () ) ;
317 }
318 }
319 }
320 }
321 }
322
323 private void jButton4ActionPerformed ( java . awt . event . ActionEvent evt ) {
324 Connection conn = null ;
325 PreparedStatement pstm = null ;
326
327 // Classe que vai recuperar os dados do banco de dados
328 ResultSet rset = null ;
329
330 // Executa a query de sele ç ã o
331 String query = " SELECT * FROM alunos " ;
332
333 try {
334 // Cria uma conex ã o com o banco
335 conn = ConexaoSQL . createConnectionToMySQL () ;
336
337 pstm = conn . prepareStatement ( query ) ;
338 pstm . executeQuery ( query ) ;
339 rset = pstm . getResultSet () ;
340
341 // Lista os alunos no console
342 while ( rset . next () ) {
343 System . out . print ( rset . getString ( " matricula " ) + " , " ) ;
344 System . out . print ( rset . getString ( " nome " ) + " , " ) ;
345 System . out . println ( rset . getString ( " email " ) ) ;
346 }
347
348 } catch ( SQLException se ) {
349 System . out . println ( se . getMessage () ) ;
350 } catch ( Exception ex ) {
351 System . out . println ( ex . getMessage () ) ;
352 } finally {
353 // Fecha as conex õ es
354 try {
355 if ( pstm != null ) {
356 pstm . close () ;
357 }
358 if ( conn != null ) {
359 conn . close () ;
360 }
98 Capítulo 10. Trabalhando com JFrame e MySQL

361 } catch ( SQLException e ) {


362 System . out . println ( e . getMessage () ) ;
363 }
364 }
365 }
366
367 private void jButton1ActionPerformed ( java . awt . event . ActionEvent evt ) {
368 clearFields () ;
369 }
370
371 private void jTextField1KeyPressed ( java . awt . event . KeyEvent evt ) {
372 if ( evt . getKeyCode () == 113) { // C ó digo da tecla F2
373 Connection conn = null ;
374 PreparedStatement pstm = null ;
375
376 // Classe que vai recuperar os dados do banco de dados
377 ResultSet rset ;
378
379 // Executa a query de sele ç ã o
380 String query = " SELECT * FROM alunos WHERE matricula =?; " ;
381
382 try {
383 // Cria uma conex ã o com o banco
384 conn = ConexaoSQL . createConnectionToMySQL () ;
385
386 pstm = conn . prepareStatement ( query ) ;
387
388 System . out . println ( jTextField1 . getText () ) ;
389
390 pstm . setLong (1 , Long . parseLong ( jTextField1 . getText () ) ) ; // matricula
391
392 System . out . println ( pstm . toString () ) ;
393
394 pstm . executeQuery () ;
395
396 rset = pstm . getResultSet () ;
397
398 // Mostra o aluno na tela
399 if ( rset . next () ) {
400 jTextField2 . setText ( rset . getString ( " nome " ) ) ;
401 jTextField3 . setText ( rset . getString ( " data_de_nascimento " ) ) ;
402 jTextField4 . setText ( rset . getString ( " telefone " ) ) ;
403 jTextField5 . setText ( rset . getString ( " celular " ) ) ;
404 jTextField6 . setText ( rset . getString ( " email " ) ) ;
405 } else {
406 System . out . println ( " Nenhum registro retornado . " ) ;
407 clearFields () ;
408 }
409
410 pstm . close () ;
411
412 conn . close () ;
413
414 } catch ( SQLException se ) {
415 System . out . println ( se . getMessage () ) ;
416 } catch ( Exception ex ) {
417 System . out . println ( ex . getMessage () ) ;
418 } finally {
419 // Fecha as conex õ es
420 try {
421 if ( pstm != null ) {
422 pstm . close () ;
423 }
424 if ( conn != null ) {
425 conn . close () ;
426 }
427 } catch ( SQLException e ) {
428 System . out . println ( e . getMessage () ) ;
429 }
430 }
10.7 Listagem completa da classe frmAlunos 99

431 }
432 }
433
434 /* *
435 * @param args the command line arguments
436 */
437 public static void main ( String args []) {
438 /* Set the Nimbus look and feel */
439 // < editor - fold defaultstate =" collapsed " desc =" Look and feel setting code ( optional )
">
440 /* If Nimbus ( introduced in Java SE 6) is not available , stay with the default look
and feel .
441 * For details see http :// download . oracle . com / javase / tutorial / uiswing / lookandfeel /
plaf . html
442 */
443 try {
444 for ( javax . swing . UIManager . LookAndFeelInfo info : javax . swing . UIManager .
getInstalledLookAndFeels () ) {
445 if ( " Nimbus " . equals ( info . getName () ) ) {
446 javax . swing . UIManager . setLookAndFeel ( info . getClassName () ) ;
447 break ;
448 }
449 }
450 } catch ( ClassNotFoundException ex ) {
451 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
452 } catch ( InstantiationException ex ) {
453 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
454 } catch ( IllegalAccessException ex ) {
455 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
456 } catch ( javax . swing . UnsupportedLookAndFeelException ex ) {
457 java . util . logging . Logger . getLogger ( frmAlunos . class . getName () ) . log ( java . util .
logging . Level . SEVERE , null , ex ) ;
458 }
459 // </ editor - fold >
460
461 /* Create and display the form */
462 java . awt . EventQueue . invokeLater ( new Runnable () {
463 public void run () {
464 new frmAlunos () . setVisible ( true ) ;
465 }
466 }) ;
467 }
468
469 // Variables declaration - do not modify
470 private javax . swing . JButton jButton1 ;
471 private javax . swing . JButton jButton2 ;
472 private javax . swing . JButton jButton3 ;
473 private javax . swing . JButton jButton4 ;
474 private javax . swing . JLabel jLabel1 ;
475 private javax . swing . JLabel jLabel2 ;
476 private javax . swing . JLabel jLabel3 ;
477 private javax . swing . JLabel jLabel4 ;
478 private javax . swing . JLabel jLabel5 ;
479 private javax . swing . JLabel jLabel6 ;
480 private javax . swing . JLabel jLabel7 ;
481 private javax . swing . JTextField jTextField1 ;
482 private javax . swing . JTextField jTextField2 ;
483 private javax . swing . JTextField jTextField3 ;
484 private javax . swing . JTextField jTextField4 ;
485 private javax . swing . JTextField jTextField5 ;
486 private javax . swing . JTextField jTextField6 ;
487 // End of variables declaration
488 }
VI
Conclusão

11 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1 O que você aprendeu
11.2 Melhorias

Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . 105
Livros
Artigos
11. Conclusão

11.1 O que você aprendeu


Você aprendeu a construir um banco de dados MySQL, conectar um banco de dados MySQL
usando JDBC, bem como usar criptografia de hash MD5. No NetBeans você viu como criar
uma tela de login para o seu banco de dados, criar menus, detectar o pressionamento de uma tecla
específica, criar eventos, criar formulários, usar comandos SQL, trabalhar com parâmetros em
consultas SQL no Java.

11.2 Melhorias
Este não é um programa muito bom, mas arranhou a superfície do que é programar em Java,
porém há muito a melhorar. Algumas coisas que você pode tentar fazer por conta própria são:
1. Na seção Listar (Display) (página 91), a lista poderia ser exibida em outro formulário e não
no console do NetBeans. A alteração ocorreria na Listagem 10.21 substituindo as linhas de
20 até 24 por uma chamada ao formulário que mostraria a listagem dos alunos.
2. A data de matrícula do aluno tem de ser fornecida no formato aaaa-mm-dd, formato norte-
americano. Uma sugestão seria fazer a localização para o Brasil, para que as datas fossem
fornecidas no formato dd-mm-aaaa.
Bibliografia

Livros
Artigos

Você também pode gostar