• Nenhum resultado encontrado

LINGUAGEM DE PROGRAMAÇÃO II VOLUME 01

N/A
N/A
Protected

Academic year: 2019

Share "LINGUAGEM DE PROGRAMAÇÃO II VOLUME 01"

Copied!
126
0
0

Texto

(1)

INFORMÁTICA

(2)
(3)

Governador | Eduardo Campos

Vice-Governador | João Soares Lyra Neto

Secretário de Educação | Anderson Stevens Leônidas Gomes

Secretário Executivo de Educação Profissional | Paulo Dutra

Gerente Geral da Educação Profissional | Luciane Pulça

Gestor de Educação a Distância | Marcos Paulo de Assis Castro

Coordenador do Curso | Almir Pires

Professor Conteudista | Márcio Augusto Silva Bueno

Equipe Central de Educação a Distância

Andréia Guerra | Augusto Andrade | Eber Gomes | George Bento | Jannine Moreno | Marcos Vinícius Clemente | Maria de Lourdes Cordeiro Marques | Maria Helena Cavalcanti | Mauro de Pinho Vieira | Pedro Luna

(4)
(5)

SUMÁRIO

PROGRAMA DA DISCIPLINA ... 8

CONTEÚDO PROGRAMÁTICO ... 9

PALAVRA DO PROFESSOR-AUTOR ... 10

1.COLEÇÕES E ARQUIVOS ... 13

Introdução ... 13

Framework de Coleções... 14

1.2.1 Interfaces ... 15

1.2.2 Interface Collection ... 17

1.2.3 Interface Set ... 20

1.2.4 Interface List ... 20

1.2.5 Interface Queue ... 21

1.2.6 Interface Map ... 22

1.2.7 Implementações ... 23

1.2.8 Implementações de Set ... 24

1.2.9 Implementações de List ... 25

1.2.10 Implementações de Queue ... 25

1.2.11 Implementações de Map ... 26

1.2.12 Algoritmos ... 26

1.2.13 Exemplo ... 27

1.3 Arquivos ... 29

1.3.1 Fluxos de Entrada e Saída ... 30

1.3.2 Manipulação de Arquivos de Caracteres ... 30

(6)

1.3.4 Utilizando Scanner ... 35

1.3.5 Utilizando DataStreams ... 36

1.3.6 Utilizando ObjectStreams ... 38

2.BANCO DE DADOS ... 44

2.1 Introdução ... 44

2.2 JDBC ... 45

2.3 Java DB e Netbeans... 46

2.4 Conexão via Código ... 58

2.4.1 Carregar o Driver ... 59

2.4.2 Conectar com o Banco de Dados ... 67

2.4.3 Criando um Statement ... 68

2.4.4 Utilizando um Statement ... 69

2.4.5 Criando um PreparedStatement ... 76

2.4.6 Utilizando um PreparedStatement ... 77

3.INTERFACE GRÁFICA I ... 81

3.1 Introdução ... 81

3.2 Swing ... 81

3.3 Criando uma Aplicação Swing no Netbeans ... 82

3.4 Principais Componentes Gráficos ... 93

3.4.1 Painel (JPanel) ... 94

3.4.2 Rótulo (JLabel) ... 100

3.4.3 Campo de Texto (JTextField) ... 102

3.4.4 Botão (JButton) ... 105

(7)

3.4.6 Caixa de Combinação (JComboBox), Botão de opção (JRadioButton), Lista (JList), Caixa de Seleção (JCheckBox) e Grupo de Botões (ButtonGroup) ... 112 3.4.7 Funcionalidade do Formulário Secundário ... 118

(8)

PROGRAMA DA DISCIPLINA

Ementa

Desenvolvimento aplicações para Desktop com interface gráfica. Desenvolvimento de aplicações WEB. Coleções. Manipulação de Arquivos e Diretórios. Conexão com Banco de Dados, recuperação e manipulação de dados. Linguagem orientada a Objeto e Aplicação de Técnicas de Programação Orientada a Objeto.

Objetivo Geral

Capacitar o aluno no desenvolvimento de aplicações utilizando os conceitos de orientação a objetos.

Capacitar o futuro profissional a planejar e criar aplicativos desktop ou Web integrados ou não a bancos de dados.

Objetívos Específicos

1. Capacitação para o desenvolvimento de programas orientados a objetos capazes de resolver problemas do mundo real

2. Capacitação no desenvolvimento de aplicações de alta qualidade utilizando os conceitos de modularidade, reusabilidade e extensibilidade

(9)

CONTEÚDO PROGRAMÁTICO

Volume 1

Unidade 1

- Coleções e Arquivos

Unidade 2

- Banco de Dados

Unidade 3

(10)

PALAVRA DO PROFESSOR-AUTOR

Caro estudante!

Desejo um ótimo estudo nesta disciplina e espero que ela lhe estimule a desenvolver muitos programas úteis para você, para a empresa em que você trabalhar e por que não também para todo mundo através da fácil divulgação de programas através da Internet.

O desenvolvimento de aplicações para desktop utilizando interface gráfica ou para web é o principal foco deste material, portanto, você sairá do desenvolvimento console e aprenderá esta nova forma de escrever aplicações.

Além de aprender o básico, você irá também ver também aproveitar muitos recursos disponíveis no Java e no Netbeans para facilitar o desenvolvimento destas aplicações desktop e web.

(11)

Lembre-se que a única forma de aprender uma linguagem de programação é através da realização dos diversos exercícios propostos, e principalmente que este é apenas o início do seu estudo de desenvolvimento de programas, nunca ache que você já aprendeu tudo e corra sempre atrás de novos conhecimentos.

Um grande abraço!

(12)

APRESENTAÇÃO DA DISCIPLINA

Esta disciplina aproveita toda a base adquirida nas disciplinas de Lógica de Programação e Linguagem de Programação I e acrescenta os conceitos de interfaces gráficas, aplicações para web, utilização de coleções e arquivos em Java.

Será utilizada a linguagem de programação JAVA que é utilizada em diversas plataformas (desktop, web e móvel), disponível gratuitamente para qualquer desenvolvedor e possuir uma ampla fonte de referência (tanto através de documentação oficial da Oracle e livros, quanto em uma infinidade de sites na web).

É bom lembrar, que como qualquer disciplina que envolve o desenvolvimento de programas, o passo mais importante para o aprendizado é a realização de muitos exercícios.

Você irá relembrar diversos conceitos vistos em Lógica de Programação e Linguagem de Programção I e aplicá-los dentro de um contexto maior, ao desenvolver uma aplicação desktop com interface gráfica e outra aplicação web.

(13)

1.

COLEÇÕES E ARQUIVOS

Objetivos

Conhecer e saber utilizar as coleções de Java. Apender como se trabalhar com arquivos em Java.

Introdução

Em qualquer programa que você for fazer, verá que é necessário armazenar vários dados. Uma forma usual de armazenar os dados é utilizando arrays (vetores ou matrizes) que você aprendeu quando estava programando em C.

Porém, a utilização de arrays é tem certas limitações, pois o tamanho deles são imutáveis. Para facilitar o armazenamento de um conjunto de dados, a plataforma Java disponibiliza várias classes, como: ArrayList, LinkedList, etc.

Nas últimas versões do Java, entretanto, está disponível um framework de coleções que oferece uma maneira bem interessante de armazenar e recuperar dados.

(14)

Portanto, nesta aula você entenderá mais sobre o framework de coleções e arquivos em Java.

Framework de Coleções

É uma arquitetura unificada para representar e manipular coleções. Todas as coleções contém:

Interfaces: São níveis mais altos de coleções que não possuem implementação, mas que servem como modelos para as coleções concretas.

Implementações: São as classes concretas que implementam as interfaces existentes.

Algoritmos: São métodos que realizam tarefas úteis em coleções, como busca e ordenação em qualquer objeto que implementa uma interface de coleções. Portanto, estes algoritmos são polimórficos, pois podem trabalhar com qualquer tipo de coleção. Assim, uma única implementação funciona com qualquer c

(15)

1.2.1 Interfaces

A Figura 1.1 mostra a hierarquia de interfaces existentes no

framework de

coleções:

Figura 1.1: Hierarquia de Interfaces de Coleções

Fonte: Conteudista

Como você pode ver existem duas hierarquias distintas: Collections e Map. A hierarquia de Map não faz parte de Collections, pois Map não é uma coleção verdadeira. Na hierarquia de Collections você pode ver que Set é um tipo de coleção e SortedSet é um tipo de Set.

(16)

Set: representa um conjunto de elementos onde a ordem não é importante e não permite valores duplicados.

List: representa uma lista de valores, onde a ordem é importante e permite valores duplicados.

Queueu: representa uma fila, normalmente utilizando a ordem FIFO (primeiro a entrar é o primeiro a sair) como em uma fila de banco ou supermercado.

Map: representa um dicionário, onde valores são armazenados em pares (chave e valor). Você armazena um par de chave e valor, onde não existem chaves duplicadas e as operações são feitas utilizando a chave da informação.

Saiba Mais:

Você pode visualizar os métodos disponíveis nestas interfaces na API do

(17)

http://download.oracle.com/javase/6/docs/api/java/util/Map.h tml

Todos as coleções do Java são genéricas, isto é, podem ser utilizadas por qualquer tipo de objeto, para informar o tipo de uma coleção, a notação é diferente da utilizada para declarar array. Veja abaixo a declaração da variável colecao do tipo coleção de Strings:

Collection<String> c;

Então, como você pode ver, você coloca o tipo entre os operadores de menor e maior que. Isto é chamado de generics em Java. Vale

ressaltar que o tipo precisa ser um tipo objeto, você não pode criar uma coleção de tipo primitivo.

1.2.2 Interface Collection

A interface Collection possui os métodos comuns a todas as coleções do Java. Os seus métodos são:

intsize(); retorna a quantidade de elementos da coleção

booleanisEmpty(); verifica se a coleção está vazia

booleancontains(Object elemento); verifica se o elemento

pertence a coleção

(18)

boolean remove(Object elemento); remove um elemento

da coleção

Iterator<E>iterator(); devolve um iterator que serve para

iterar (percorrer) a coleção

booleancontainsAll(Collection<?> c); verifica se uma

coleção c é um subconjunto da coleção atual

booleanaddAll(Collection<? extends E> c); adiciona todos

os elementos de uma coleção c à coleção atual

booleanremoveAll(Collection<?> c); remove da coleção

atual todos os elementos da coleção c

booleanretainAll(Collection<?> c); remove da coleção atual

todos os elementos que não estão na coleção c

voidclear(); remove todos os elementos da coleção atual

Object[] toArray(); cria um array do tipo Object com todos

os elementos da coleção atual

<T> T[] toArray(T[] a); cria um array do tipo T com todos os

(19)

Portanto, se você tiver uma variável do tipo Collection, então você pode utilizar qualquer um dos métodos acima.

Existem duas formas de se percorrer uma coleção: utilizando for-each ou Iterators. O for-each possui a seguinte sintaxe:

for (TiponomeVar : colecao) {

// códigoutilizandonomeVar

}

O for-each oferece uma maneira bem simples de acessar todos os elementos da coleção, porém observe que você não tem acesso a um índice, como num for normal. Assim, você também não pode fazer operações como remover ou substituir este elemento da coleção através da utilização do for-each.

A outra forma é com Iterators, que é um objeto que é devolvido quando se utiliza o método iterator da coleção e serve para percorrer a coleção. Os métodos disponíveis na interface Iterator, considerando o tipo genérico E, são:

booleanhasNext();  verifica se ainda existe mais elementos

na coleção

E next();  retorna o próximo elemento da coleção

(20)

1.2.3 Interface Set

A interface Set tem basicamente os mesmos métodos disponíveis na interface Collection.

1.2.4 Interface List

Além dos métodos disponíveis na interface Collection, também existem os seguintes métodos:

voidadd(intindice, E elemento);  insere um elemento no índice especificado

E get(intindice);  recupera o elemento que está no índice especificado

intindexOf(Object o);  recupera o primeiro índice em que se encontra o objeto o

intlastIndexOf(Object o);  recupera o último índice em que se encontra o objeto o

ListIterator<E>listIterator();  retorna um iterator específico para lista

ListIterator<E>listIterator(intindice);  retorna um iterator específico para lista, a partir do índice especificado

(21)

E set(intindice, E elemento);  substitui o elemento que está no índice especificado por este recebido como parâmetro

List<E>subList(intindiceDe, intindicePara);  retorna uma sub-lista da lista atual a partir do índice indiceDe (faz parte da nova lista) até o indicePara (não faz parte da nova lista)

1.2.5 Interface Queue

Além dos métodos disponíveis na interface Collection, também existem os seguintes métodos:

E element();  recupera a cabeça da lista, sem removê-la

booleanoffer(E e);  insere o elemento na lista sem violar a sua capacidade, retornando verdadeiro ou falso se conseguiu ou não inserir o elemento

E peek();  tem a mesma funcionalidade de element(), porém quando a lista está vazia retorna nulo, ao invés de gerar uma exceção como no caso do método element()

E poll();  recupera e remove a cabeça da lista, e no caso da lista vazia um null é retornado

(22)

1.2.6 Interface Map

Os métodos da interface Map, considerando tipo da chave K e o tipo do valor V, são:

V put(K chave, V valor); insere no mapa a associação entre

chave e valor e retorna o valor antigo, se já havia uma

associação com esta chave, ou null se for uma nova

associação

V get(Objectchave); retorna o valor associado à chave

passada como parâmetro, ou null caso a chave não exista

V remove(Objectchave); remove a associação entre chave e

valor e devolve o valor desta associação

booleancontainsKey(Objectchave); retorna verdadeiro se o

mapa contém esta chave

booleancontainsValue(Objectvalor); retorna verdadeiro se

o mapa contém um ou mais chaves associadas a este valor

intsize(); retorna o número de mapeamentos dentro do

mapa

booleanisEmpty(); verifica se o mapa está vazio

(23)

voidclear(); remove todos os mapeamentos deste mapa

public Set<K>keySet(); retorna um conjunto com todas as

chaves presentes neste mapa

publicCollection<V>values(); retorna uma coleção com

todos os valores presentes neste mapa

Set<Map.Entry<K,V>>entrySet();  retorna um conjunto

contendo os pares de chaves e valores contidos neste mapa

Não existe como iterar diretamente um Map, para isto é necessário iterar as coleções disponíveis no Map utilizando os métodos: keySet(), values ou entrySet.

1.2.7 Implementações

Existem várias categorias das implementações prontas no framework de coleções:

De propósito geral: as mais comuns utilizadas.

De propósito específico: as planejadas para serem utilizadas

em casos especiais.

Concorrentes: preparadas para serem utilizadas com

(24)

Wrapper: utilizadas para adicionar ou restringir

funcionalidades às outras implementações (normalmente às

de propósito geral).

Abstrata: que servirá como base para implementações

personalizadas.

As implementações de propósito geral são:

Set:HashSet, TreeSet, LinkedHashSet.

List:ArrayList, LinkedList.

Map: HashMap, TreeMap, LinkedHashMap.

Dentre estas implementações a primeira de cada lista são as mais utilizadas pelos programadores. Vale salientar que TreeSet e TreeMap são implementações ordenadas e que LinkedSet também é uma Queue.

1.2.8 Implementações de Set

(25)

Existe uma implementação híbrida que é a LinkedHashSet que gera algum tipo de ordenação, mas não é tão custosa quanto a TreeSet. Porém, em geral você utilizará muito mais HashSet.

1.2.9 Implementações de List

As implementações mais utilizadas são ArrayList e LinkedList. Como o próprio nome já diz, ArrayList implementa a lista utilizando array e LinkedList utilizando encadeamento.

Na maioria das vezes você irá utilizar ArrayList, pois o acesso direto aos elementos gera uma melhor desempenho na sua aplicação. Porém, existem casos onde a utilização de LinkedList é melhor, como por exemplo, situações onde você esteja inserindo os valores no início na lista, ou removendo muitos elementos do meio da lista.

A vantagem da utlização de ArrayList para arrays é que o ArrayList pode crescer de capacidade com o passar do tempo, enquanto que o array sempre tem capacidade fixa.

1.2.10 Implementações de Queue

(26)

Normalmente você irá utilizar a LinkedList se quiser o

comportamento normal de uma fila ou PriorityQueue se precisar utilizar uma lista com prioridade.

1.2.11 Implementações de Map

As implementações de propósito geral de Map são HashMap, TreeMap e LinkedHashMap. Como você pode ver as implementações são do mesmo tipo que as implementações de Set, e todas as considerações feitas lá na seção 1.2.8 são válidas para Map.

1.2.12 Algoritmos

Existem algoritmos prontos para ordenar, embaralhar, manipular dados, fazer busca, procurar o menor e maior valor através da classe Collections.

Como exemplo, se você tem um ArrayList lista preenchido com Strings e deseja ordená-lo, basta utilizar Collections.sort(lista) que ele ordena o seu ArrayList para você.

(27)

1.2.13 Exemplo

(28)

Figura 1.2:Código exemplo de coleções

(29)

Saiba Mais

Vocês pode obter mais detalhes sobre coleções nos seguintes sites: http://download.oracle.com/javase/tutorial/collections/index. html http://www.hwn.com.br/pej/tij2pej/PEJ313.htm http://javafree.uol.com.br/artigo/847654/ http://sergiotaborda.wordpress.com/desenvolvimento-desoftware/java/colecoes-em-java/ 1.3 Arquivos

Você verá que os programas que desenvolverá, você sentirá uma necessidade de armazenar os dados para utilizá-los depois. Portanto, os seus dados precisar ser persistentes, isto é, eles precisam sobreviver entre execuções do seu programa.

Uma das maneiras de fazer os dados persistirem é armazená-los em arquivos. Portanto, você verá nesta lição como é fácil utilizar arquivos em Java.

(30)

IOException, ou subclasses dela como FileNotFoundException e EOFException.

1.3.1 Fluxos de Entrada e Saída

A noção de fluxo (stream) é uma abstração em Java que pode

representar arquivos em disco, dispositivos, outros programas, etc. Estes fluxos podem ser de LEITURA (entrada), GRAVAÇÃO (saída) ou LEITURA/GRAVAÇÃO (entrada e saída).

1.3.2 Manipulação de Arquivos de Caracteres

Para trabalhar com arquivos texto, lendo ou escrevendo caractere a caractere é possível utilizar as classes FileReader e FileWriter.

Os métodos normalmente utilizados são:

intread();  método para ler um caractere do arquivo (só para FileReader)

voidwrite(int c);  método para escrever um caractere no arquivo (só para FileWriter)

voidwrite(Stringstr);  método que escreve uma string no arquivo (só para FileWriter)

(31)

construtor com uma String como parâmetro  cria uma stream e associa com o arquivo em disco passado como parâmetro

Na figura 1.3 é possível visualizar um código utilizando a classe FileWriter. Neste exemplo, tudo que o usuário digitar no console será escrito no arquivo até que ele digite uma linha vazia (só apertar o ENTER).

Algumas considerações sobre o código da figura 1.3:

O arquivo deve SEMPRE ser fechado, por isso, o fechamento do arquivo está dentro da cláusula finally;

O método write utilizado é a versão que grava uma String no disco; É preciso incluir um ‘\n’ a cada frase digitada, senão todas as frases

estarão sempre na primeira linha do arquivo;

(32)

Figura 1.3:Código utilizando FileWriter

Fonte: Conteudista

O código da figura 1.4 abre um arquivo em disco e imprime todo o seu conteúdo na tela.

Algumas considerações sobre o código da figura 1.4:

O arquivo deve SEMPRE ser fechado, por isso, o fechamento

(33)

O método read lê caractere a caractere, porém ele devolve

um valor inteiro para que você possa fazer a comparação com

-1, que quer dizer que o arquivo chegou ao final;

Veja que dentro do while tem um comando de atribuição e

um operador de comparação. Se não fosse utilizar esta

construção, seria necessário fazer a leitura de um caractere

antes do while, e repetir esta mesma leitura no final do while,

como está sendo feito no código da figura 1.3;

O método main pode levantar uma exceção IOException, isso que dizer que neste primeiro exemplo, não estamos tratando nenhum exceção (veja que não tem nenhuma cláusula catch neste código).

Figura 1.4:Código utilizando FileReader

(34)

1.3.3 Manipulação de Arquivos Bufferizados

Para melhorar o desempenho de entrada e saída do Java, é necessário bufferizar o acesso a disco, isto é, ao invés de salvar no disco, caractere a caractere, cria-se um espaço de memória intermediário onde os caracteres vão sendo armazenados. Então, quando este espaço está cheio, ou o arquivo é fechado, ou quando você solicita (flush) é que os caracteres que estão no buffer são armazenados no disco. Desta forma, aumenta-se muito a eficiência no acesso a disco. As classes BufferedReader e BufferedWriter são utilizadas, porém na realidade elas encapsulam as streams não bufferizadas e o que você precisa fazer é passar para o construtor desta classe um objeto de FileReader e FileWriter, respectivamente.

Então, no código da figura 1.3 você precisaria fazer duas alterações:

1. Alterar o tipo da variável de FileWriter para BufferedWriter e; 2. Inicializar a variável arquivo com o seguinte código:

arquivo = new BufferedWriter(new

FileWriter("arquivo1.txt"));

(35)

1. Alterar o tipo da variável de FileReader para BufferedReader e; 2. Inicializar a variável arquivo com o seguinte código:

arquivo = new BufferedReader(new

FileReader("arquivo1.txt"));

No caso de utilizar BufferedReader é possível também utilizar o método readLine() que lê linha por linha do arquivo, porém aí você precisará também modificar o teste de parada do while.

1.3.4 Utilizando Scanner

A classe Scanner pode ser utilizada para ler dados do arquivo, da mesma maneira que você utiliza para ler dados do teclado. Para isto, basta criar um objeto Scanner e, ao invés de passar System.in, você passe um objeto do tipo BufferedReader:

arquivo = new Scanner (new BufferedReader(new FileReader("arquivo1.txt")));

(36)

Figura 1.5: Código utilizando Scanner

Fonte: Conteudista

Porém, você pode também utilizar os métodos nextInt(), nextDouble(), etc, e assim já transformar o texto que está gravado dentro do arquivo em números.

1.3.5 Utilizando DataStreams

Até agora, você estava tratando arquivos textos, porém muitas vezes é melhor tratar os arquivos de forma binária, pois ocupa menos espaço e não perde-se tempo fazendo conversão de texto para binário e vice-versa.

(37)

Existem as classes DataOutputStream e DataInputStream que podem ler e escrever tipos de dados primitivos (int, double, char, etc.) e Strings em arquivos.

Veja os códigos da figura 1.6 e 1.7 como exemplo de utilização destas classes. Observe que agora é necessário utilizar as classes FileOutputStream, BufferedOutputStream, FileInputStream e BufferedInputStream.

Figura 1.6: Código utilizando DataOutputStream

(38)

Figura 1.7: Código utilizando DataInputStream

Fonte: Conteudista

Observe que é preciso saber como as informações foram gravadas no arquivo binário, pois se você primeiro salvar uma string e na hora de ler tentar recuperar um double, você obterá um double que não fará sentido (não haverá um erro de execução, pois isto é um erro de lógica).

1.3.6 Utilizando ObjectStreams

(39)

É importante salientar que apenas objetos de classes serializáveis em Java é que podem ser armazenadas e recuperadas utilizando estes tipos de streams. Você pode ver na API do Java se a classe desejada é serializável.

Estes tipos de Streams também possuem os mesmos métodos para salvar e ler os tipos primitivos, portanto com elas vocês podem tanto salvar objetos, quantos tipos primitivos.

(40)

Figura 1.8: Código da Classe Pessoa

Fonte: Conteudista

(41)

Figura 1.9:Código utilizando ObjectOutputStream

Fonte: Conteudista

Figura 1.10: Código utilizando ObjectInputStream

(42)

O método readObject() pode levantar também a exceção ClassNotFoundException, veja que o main da figura 1.10 agora também pode levantar esta exceção. Isto acontece, se você tentar ler do arquivo um objeto e não existir a classe Pessoa, neste exemplo.

Saiba Mais

Vocês pode obter mais detalhes sobre arquivos nos seguintes sites: http://download.oracle.com/javase/tutorial/essential/io/index. html

http://wiki.sj.ifsc.edu.br/wiki/index.php/Trabalhando_com_ar quivos_texto_em_Java

http://www.ic.uff.br/~vanessa/courses/2011.1/ed2/02-Arquivos.pdf

Atividades de aprendizagem:

1. Teste todos os códigos disponíveis neste capítulo e tente alterar um pouco para aprender mais sobre os conceitos.

(43)

RESUMO

(44)

2.

BANCO DE DADOS

Objetivos

Saber o que é JDBC.

Aprender a trabalhar com banco de dados no Java.

2.1 Introdução

Quando a quantidade de dados a ser manipulada dentro de um programa cresce muito, aumenta a complexidade para tratar estes dados.

Neste cenário, ao invés de armazenar dados em arquivos e começar a pensar em técnicas de otimização (para deixar o acesso mais rápido), técnicas de segurança (para não perder dados no caso de queda de energia, para não permitir acesso não autorizado aos dados), etc, é mais produtivo utilizar um sistema gerenciador de banco de dados (SGBD).

(45)

2.2 JDBC

O termo JDBC significa Java DatabaseConnectivity que é a forma que o Java oferece para se conectar com os SGBDs. Na realidade você tem um conjunto de classes disponíveis na API do Java para realizar esta tarefa.

Além das classes da API do Java, é necessário também se ter um driver JDBC específico para o banco de dados que você deseja se conectar. Os mais eficientes são os drivers nativos, pois não realizam nenhuma conversão adicional, e são os que você deve procurar quando você for desenvolver a sua aplicação.

Quando você escreve o código da sua aplicação para acessar o banco de dados, o JDBC converte os seus comandos para os comandos específicos do SGBD que você está utilizando. Uma ponto importante é que você não precisará alterar o seu código quando trocar de SGBD, basta trocar o driver JDBC e todo o seu código irá funcionar perfeitamente (mudando apenas a String de conexão).

Existem vários banco de dados disponíveis para uso gratuito: Microsoft SQL Server Express, OracleDatabase Express Edition, MySQL, PostgreSQL, Apache Derby, entre outros.

(46)

que você for desenvolver um sistema é recomendável que você utilize banco de dados mais robustos e eficientes.

Fique sabendo que o banco de dados Java DB é na realidade a versão do Apache Derby que a Oracle distribui.

2.3Java DB e Netbeans

Você pode gerenciar o Java DB de dentro do próprio Netbeans, e isto irá facilitar bastante a utilização de um banco de dados enquanto você está aprendendo.

É importante saber instalar, configurar e executar um banco de dados desvinculado do Netbeans quando você for distribuir a sua aplicação, porém este assunto está fora do escopo deste curso.

(47)

Figura 2.1: Aba Serviços do Netbeans exibindo o Java DB

Fonte: Captura de tela do Netbeans

Ao clicar com o botão direito do mouse sobre o tópico Java DB, aparece uma caixa de diálogo exibida na figura 2.2. Nesta primeira vez, você irá clicar em Criar banco de dados... e preencherá a tela de acordo com a figura 2.3, onde a senha utilizada foi “admin” sem as

(48)

Figura 2.2: Criar um banco de dados Java DB

(49)

Figura 2.3: Caixa de diálogo Criar banco de dados Java DB

Fonte: Captura de tela do Netbeans

(50)

Figura 2.4: Conectar-se ao banco de dados BancoTeste01

Fonte: Captura de tela do Netbeans

Veja na figura 2.5 que o ícone não está mais “quebrado”, indicando

(51)

Figura 2.5: Banco de dados BancoTeste01 conectado

Fonte: Captura de tela do Netbeans

(52)

Figura 2.6: Sub-tópico: BancoTeste01  APP  Tabelas

Fonte: Captura de tela do Netbeans

(53)

Figura 2.7: Opção de criar uma nova tabela

Fonte: Captura de tela do Netbeans

A utilização da caixa de diálogo Criar tabela (vide figura 2.8) é bem intuitiva, você preenche o nome da tabela e depois vai clicando no botão Adicionar coluna até ter criado todos os campos da tabela.

Figura 2.8: Caixa de diálogo Criar tabela

(54)

A caixa de diálogo Adicionar coluna pode ser vista na figura 2.9, nela você preenche os campos como o nome da coluna, o tipo, se é chave primária ou não, etc.

Figura 2.9: Caixa de diálogo Adicionar coluna

Fonte: Captura de tela do Netbeans

(55)

Figura 2.10: Opção Executar comando...

Fonte: Captura de tela do Netbeans

(56)

Figura 2.11: Digitação de código SQL

Fonte: Captura de tela do Netbeans

Veja do lado esquerdo da figura 2.11 que apareceu um novo esquema chamado ADMIN dentro do BancoTeste01, pois o código de criação de tabela não informou que a tabela Pessoa fosse criada no esquema APP (escrevendo que o nome da tabela era APP.PESSOAS). O esquema ADMIN também aparece em negrito, pois qualquer comando SQL executado irá procurar tabelas gravadas dentro deste esquema. Assume-se que as tabelas foram criadas dentro do esquema padrão (você pode definir o esquema padrão, clicando com o botão direito em cima do esquema e depois selecionando a opção Definir como esquema padrão).

(57)

às vezes acontece, pois o Java é case sensitive e a maioria dos SGBDs

são case insensitive.

Figura 2.12: Código SQL da criação das tabelas Pessoas, Grupos e PertenceA

Fonte: Conteudista

(58)

Saiba Mais

Vocês pode obter mais detalhes sobre comandos SQL nas seguintes

referências: http://download.oracle.com/javase/tutorial/jdbc/overview/dat abase.html http://marciobueno.com/arquivos/ensino/bd2/BD2_01_SQL.p df http://www.kraemer.pro.br/bd2/sql.pdf http://imasters.com.br/artigo/246/sql_server/revisao_de_con ceitos/

2.4 Conexão via Código

Uma vez que o banco de dados está configurado e os dados inseridos, é necessário agora aprender como utilizar o banco de dados dentro de uma aplicação Java, e isto quer dizer, como escrever o código para interagir com o Java DB.

(59)

do nome Java DB e selecionar a opção Inicializar servidor. Se o servidor já estiver rodando, esta opção aparecerá desabilitada.

A plataforma Java oferece várias classes para o acesso ao banco de dados, cada uma com a sua responsabilidade, nas próximas seções você entenderá melhor cada uma destas classes.

2.4.1 Carregar o Driver

Para poder se conectar a um banco de dados é necessário primeiro carregar para a memória o driver JDBC que normalmente é um arquivo .jar que você baixa do site do fornecedor do SGBD.

(60)

Figura 2.13:Descobrindo o local do driver do Java DB

Fonte: Captura de tela do Netbeans

A caixa de diálogo Novo driver JDBC é aberta (vide figura 2.14) e assim você pode ver e copiar onde está o arquivo .jar contendo o driver. Inclusive nesta tela você também consegue ver qual é a classe do driver que será utilizada para carregar o driver para a memória.

(61)

Neste exemplo, o caminho completo do arquivo .jar é

“/Applications/NetBeans/glassfish-3.1-b29/javadb/lib/derbyclient.jar”

e será utilizada para configurar o Netbeans. O próximo passo é selecionar a opção Bibliotecas dentro do menu Ferramentas do Netbeans. A caixa de diálogo Gerenciador de bibliotecas (vide figura 2.15) foi aberta e você deve clicar no botão Nova biblioteca.

Figura 2.15: Caixa de diálogo Gerenciador de bibliotecas

(62)

Agora na caixa de diálogo você preenche o nome da biblioteca como JavaDB conforme a figura 2.16 e clica no botão OK.

Figura 2.16: Caixa de diálogo Nova bibilioteca

Fonte: Captura de tela do Netbeans

(63)

Figura 2.17: Caixa de diálogo Procurar JAR/Pasta

Fonte: Captura de tela do Netbeans

(64)

Figura 2.18: Opção Adicionar biblioteca ao projeto

Fonte: Captura de tela do Netbeans

(65)

Figura 2.19: Caixa de diálogo Adicionar biblioteca

Fonte: Captura de tela do Netbeans

Veja na figura 2.20 que as duas bibliotecas do projeto são: JavaDB –

(66)

vários projetos, é mais fácil configurar o Netbeans uma única vez, e não precisar ficar sempre procurando onde é que está o arquivo .jar que você quer referenciar.

Figura 2.20: Bibliotecas do projeto

Fonte: Captura de tela do Netbeans

Agora o seu projeto está configurado para escrever código que acesse o Java DB, mas para isto agora você precisa entender a sua sintaxe que é:

Class.forName(nomeDaClasseRepresentandoDriver);

Observação:

(67)

passe a reconhecer corretamente o arquivo .jar que você acabou de incluir.

Cada SGBD possui o seu driver e o nome da classe também varia, e você consegue esta informação na documentação do seu SGBD. No

caso do Java DB o nome da classe é

“org.apache.derby.jdbc.ClientDriver” (vide figura 2.14), portanto o

código para carregar este driver é:

Class.forName("org.apache.derby.jdbc.ClientDriv

er");

Como o método forName pode levantar uma exceção ClassNotFoundException é necessário colocar este comando dentro de um try/catch.

2.4.2 Conectar com o Banco de Dados

Agora, para se conectar com o banco de dados, você irá utilizar a classe DriverManager e utilizar o método getConnection de acordo com a sintaxe abaixo:

DriverManager.getConnection(stringConexao,

usuário, senha);

(68)

Connection conexao =

DriverManager.getConnection(

"jdbc:derby://localhost:1527/BancoTeste01",

"admin", "admin");

Observe que está sendo criada uma variável do tipo Connection para armazenar a conexão criada. Isto é importante, pois é com ela que você irá enviar comandos e receber as respostas do banco de dados. O método getConnection pode levantar a exceção SQLException, portanto você terá que adicionar mais uma cláusula catch no seu try/catch anterior.

Um outro detalhe é que estas classes estão no pacote java.sql, portanto precisam ser importadas (o Netbeans pode fazer isto automaticamente para você, basta clicar com o botão direito do mouse numa área branca perto do seu código e selecionar a opção Corrigir importações).

2.4.3 Criando um Statement

(69)

Importante

Você deve importar java.sql.Statement, e não Statement de outros pacotes, o Netbeans oferece como primeira opção java.beans.Statement, você não deve clicar no botão OK, primeiro você deve alterar para selecionar java.sql.Statement antes de confirmar a importação.

O método responsável pela criação de um Statement é createStatement(), então o seu código seria algo como:

Statementstatement = conexao.createStatement();

Lembre-se que este método pode levantar a exceção SQLException.

2.4.4 Utilizando um Statement

Os dois métodos principais de Statement são:

ResultSetexecuteQuery(comandoSQL) utilizado para comandos SELECT que retornam um único ResultSet;

(70)

Um ResultSet é a classe em Java que encapsula a tabela resultante de um comando SELECT e você irá utilizá-la para visualizar os dados retornados pelo seu SELECT.

(71)
(72)

Figura 2.22: Código completo de uma utilização do JDBC

Fonte: Conteudista

(73)

apontando para a última linha da tabela, então ele passa a apontar para a posição após a última linha e retorna false, assim você consegue controlar o laço while (vide linha 24 da figura 2.22).

Quando o ponteiro do ResultSet está posicionado sobre uma das linhas da tabela, você poderá acessar os campos desta linha, e para isto você precisa utilizar o método apropriado dependendo do tipo daquela coluna. No exemplo da tabela Pessoas, os campos id e idade são inteiros e nome é uma String, por isso foram utilizados os métodos getInt(nomeDaColuna) e getString(nomeDaColuna), respectivamente (vide linhas 25 a 27 da figura 2.22).

Na linha 28 da figura 2.22 você pode ver a criação do objeto Pessoa a partir das informações armazenadas no banco de dados. Veja que é um trabalho extra que você precisa fazer, pois o banco de dados que você está utilizando não armazena objetos, só armazena dados no formato de tabelas.

O código da figura 2.23 mostra para você o processo inverso, isto é, você tem os dados dentro de um objeto Pessoa, e deseja armazená-lo no banco de dados, para isto você irá utilizar o comando INSERT que deverá inserir os dados da Pessoa (veja as linhas 21 e 22). O comando SQL que será enviado ao banco de dados é:

"INSERT INTO PESSOAS (ID, NOME, IDADE) VALUES

(74)

Observe que String para o banco de dados deve estar dentro de apóstrofos ('), diferentemente do Java que utiliza aspas ("). Veja que o trecho de código abaixo incluir um apóstrofo antes e outro depois do nome da pessoa:

", '" + p.getNome() + "', "

(75)

Figura 2.23: Classe Pessoa

Fonte: Conteudista

Na linha 24 da figura 2.23 é realizado o teste para saber se a linha foi ou não inserida com sucesso. Como neste exemplo, o INSERT só irá inserir uma linha, o teste é feito para saber se ele conseguiu inserir esta linha e mostrar a mensagem de sucesso, e no caso de não conseguir o ELSE exibe a mensagem de falha na inserção.

(76)

Injection, por isso, na maioria das vezes utiliza-se o PreparedStatement no lugar do Statement.

2.4.5 Criando um PreparedStatement

Além da vantagem que você acabou de ver, o PreparedStatement também aumenta bastante a velocidade de processamento quando você deseja executar um mesmo comando várias vezes, pois o código SQL fica compilado do lado do servidor.

Uma outra característica interessante do PreparedStatment é que ele pode ter parâmetros.

O método responsável pela criação de um PreparedStatement é preparedStatement(), então o seu código seria algo como:

conexao.prepareStatement(comandoSQL);

O comandoSQL que você precisará passar poderá ter interrogações (?) para informar que são parâmetro que serão passados na hora de executar o comando. Por exemplo, o código de inserção utilizado se tornaria agora:

"INSERT

INTO PESSOAS (ID, NOME, IDADE) VALUES (?, ?,

(77)

2.4.6 Utilizando um PreparedStatement

Uma vez criado o PreparedStatment, você precisa preencher com as informações desejadas e executá-lo. Para preencher as informações você utiliza os métodos setTipo (setInt, setString, setDouble, etc.), informando o número do parâmetro e o seu valor. Veja exemplos nas linhas 22 a 24 da figura 2.24.

Depois de preenchidos todos os parâmetros é necessário executar a consulta (executeQuery) ou atualização (executeUpdate).

(78)

Figura 2.24: Código utilizando Prepared Statement

(79)

Saiba Mais

Vocês pode obter mais detalhes sobre JDBC nos seguintes sites: http://download.oracle.com/javase/tutorial/jdbc/index.html http://netbeans.org/kb/docs/ide/java-db_pt_BR.html

http://marciobueno.com/arquivos/ensino/poo/POO_17_JDBC .pdf

Atividades de aprendizagem:

1. Crie um banco de dados Java DB e a partir de algum modelo ER que você fez na disciplina de banco de dados, crie as tabelas e execute algumas consultas.

(80)

Resumo

(81)

3.

INTERFACE GRÁFICA I

Objetivos

Aprender os conceitos básicos de Swing. Saber utilizar os principais componentes.

3.1 Introdução

Até agora todos os seus programas foram feitos utilizando apenas interface com o usuário via console, o que torna a sua aplicação nada atraente, pois hoje em dia todo mundo só quer utilizar interfaces gráficas.

Para isto, você aprenderá nesta lição como criar interfaces gráficas utilizando o Netbeans de uma forma bem simples e fácil.

3.2Swing

O Swing é um toolkit contendo muitos componentes prontos para você utilizar e criar as suas interfaces gráficas.

Saiba Mais

(82)

http://download.oracle.com/javase/tutorial/ui/features/component

s.html

http://download.oracle.com/javase/tutorial/ui/features/compWin.h

tml

Na realidade o Swing possui é bem mais que um simples toolkit, ele oferece diversos recursos extras como: internacionalização de componentes e suporte a acessibilidade, entre outros.

O Swing é parte da JFC (Java Foundation Classes) que oferece muito mais recursos para você desenvolver a sua aplicação gráfica.

3.3 Criando uma Aplicação Swing no Netbeans

(83)

Figura 3.1:Caixa de diálogo Novo projeto (parte 1)

Fonte: Captura de tela do Netbeans

(84)

Figura 3.2: Caixa de diálogo Novo projeto (parte 2)

Fonte: Captura de tela do Netbeans

(85)

Figura 3.3: Opção para criar um Novo Formulário JFrame

Fonte: Captura de tela do Netbeans

(86)

Figura 3.4: Caixa de diálogo Novo Formulário JFrame

Fonte: Captura de tela do Netbeans

(87)

Figura 3.5: Tela principal do Netbeans com um novo formulário JFrame

Fonte: Captura de tela do Netbeans

Observe que apareceram novas janelas na tela principal do Netbeans: Navegador, Inspetor, Paleta e Propriedades (vide figura 3.5). Se por acaso alguma destas janelas não tenha aparecido, você pode habilitá-las a partir do menu Janela do Netbeans.

(88)

segundo à altura), você pode alterar este tamanho clicando e arrastando com o mouse a partir da borda do formulário.

Figura 3.6: Projeto gráfico do FormularioPrincipal

Fonte: Captura de tela do Netbeans

(89)

Figura 3.7: Janela Inspetor do Netbeans Fonte: Captura de tela do Netbeans

(90)

rolagem, indicando que tem muitos outros componentes disponíveis para você utilizar na sua aplicação.

Figura 3.8: Janela Paleta do Netbeans

Fonte: Captura de tela do Netbeans

(91)

JFrame, ele está selecionado e você pode ver que existe a propriedade title (que significa título) que está vazia, então você pode simplesmente clicar com o mouse ao lado do nome title e digitar:

“Formulário Principal” (sem as aspas) e apertar o ENTER para

confirmar.

Figura 3.9: Janela Propriedades do Netbeans

(92)

Para você visualizar este seu formulário basta clicar no botão Visualizar desenho (ver figura 3.10) e você verá uma Janela parecida com a exibida na figura 3.11. Observe que esta janela não é funcional, isto é, se ela tivesse botões, não adiantaria clicar, pois a ação associada não seria executada. Para testar a funcionalidade, você realmente precisa executar a aplicação.

Figura 3.10: Botão Visualizar desenho Fonte: Captura de tela do Netbeans

(93)

Figura 3.11: Janela em branco do FormularioPrincipal Fonte: Captura de tela do Netbeans

3.4Principais Componentes Gráficos

(94)

Todos estes componentes fazem parte do pacote javax.swing, porém o Netbeans, ao invés de importar os componentes, ele sempre referencia utilizando o nome dele completo.

3.4.1 Painel (JPanel)

É um container, isto é, uma área que pode receber outros componentes gráficos. Normalmente você utiliza um JPanel para agrupar conjunto de componentes relacionados.

No exemplo deste caderno o formulário possuirá 2 painéis: o primeiro contendo os dados de uma pessoa e o segundo que terá opções para fazer suposições sobre o ano de nascimento e o sexo da pessoa.

(95)

Figura 3.12: Dois JPanel posicionados no formulário Fonte: Captura de tela do Netbeans

(96)

que está em cima e vá aumentando para cima o JPanel que está em baixo, quando eles estiverem próximos e praticamente do mesmo tamanho você deve selecionar os dois (selecione o primeiro normalmente dando um clique do mouse, aperte a tecla CTRL (ou SHIFT se for no MAC) e clique no segundo JPanel). Clique com o botão direito do mouse em cima de qualquer um dos JPanel, selecione Mesmo tamanho e depois clique em Mesma largura. Agora você deverá estar com o formulário como visto na figura 3.13.

(97)

Fonte: Captura de tela do Netbeans

Agora você irá criar uma borda nestes JPanel para informar a função de cada um deles. Dê um clique no JPanel superior e depois clique nas reticências (...) que tem na opção border na janela Propriedades (veja a figura 3.14). Na caixa de diálogo que aparecer selecione Borda de

título e na opção Título digite: “Informações Pessoais”, para ficar

igual a imagem da figura 3.15.

Figura 3.14: Opção border de um JPanel

(98)

Figura 3.15: Caixa de diálogo JPanel border

Fonte: Captura de tela do Netbeans

Agora, faça o mesmo para o segundo JPanel e coloque o título como

“Palpites Calculados”. Além disto, também adicione mais dois JPanel

(99)

Figura 3.16: Formulário com todos os JPanel

(100)

O Netbeans também permite que você selecione um componente, clique com o botão direito do mouse e altere a opção Auto redimensionamento horizontal e vertical. Assim, se o usuário aumentar o tamanho da janela, o componente também é redimensionado automaticamente.

Saiba Mais

Para saber mais detalhes sobre redimensionamento automático e ancoragem de componentes veja o tutorial disponível em http://netbeans.org/kb/docs/java/quickstart-gui_pt_BR.html.

3.4.2 Rótulo (JLabel)

Rótulos são componentes que exibem, na maioria dos casos, textos informativos sobre os dados que devem ser digitados ou selecionados na interface gráfica e que o usuário normalmente não pode selecionar, nem clicar. Veja na figura 3.17 os rótulos que existiram no seu formulário.

(101)

Figura 3.17: Formulário com todos os JLabel

(102)

Para alterar o texto de um rótulo, basta você dar um clique com o mouse, esperar 1 segundo e dar outro clique, agora você pode digitar o texto a ser exibido e apertar o ENTER para confirmar. Outra opção é clicar no rótulo e alterar a propriedade text. Você ainda tem a opção pode selecionar o componente e apertar F2 ou clicar com o botão direito e selecionar Editar texto. São muitas formas de fazer a mesma tarefa, veja a que mais lhe agrada e utilize sempre ela de forma a aumentar a sua produtividade.

3.4.3 Campo de Texto (JTextField)

O campo de texto é uma área reservada para o usuário digitar informações que será utilizada de entrada para a sua aplicação.

(103)

Figura 3.18: Formulário com todos os JTextField

Fonte: Captura de tela do Netbeans

Veja que além da inclusão dos campos de texto, o tamanho dos formulários e painéis também foram alterados.

(104)

não estamos interessados em acessar o componente, então você pode deixar o nome padrão, porém os campos que você deseja acessar é melhor que tenha nomes mais significativos. Para isto, você renomeará os nomes das variáveis de todos os campos de texto para utilizarem os seguintes nomes: tfId, tfNome, tfIdade, tfAnoNasc e tfSexo. Note que tf é uma abreviação de Text Field.

(105)

3.4.4 Botão (JButton)

Botões são utilizados para gerar as ações nos formulários, neste exemplo, os botões servirão para realizar o cálculo do ano de nascimento da pessoa e do seu sexo. Para isto você deverá colocar os dois botões no formulário, alterar o seu texto, e mudar os nomes das variáveis para btCalcularAno e btCalcularSexo, conforme a figura 3.19.

Figura 3.19: Formulário com todos os JTextField

(106)

Veja que a medida que você vai criando a sua interface gráfica, começa a ficar mais intuitivo a utilização de novos componentes, pois a maioria possui as mesma propriedades e você já está mais ambientado com o editor gráfico do Netbeans.

3.4.5 Criação de Eventos para os Botões

Agora que a sua interface gráfica está completa, é hora de incluir o código que regerá a sua aplicação. Ao criar uma interface gráfica o controle de execução do seu programa não está mais com você, como quando você implementava aplicativos do tipo console. Agora o usuário é que digita as informações na ordem que ele desejar e também clica nos botões na ordem que bem entender.

Agora a sua aplicação será baseada em eventos, e executará de acordo com a vontade do usuário.

Você precisará escrever osseus códigos dependendo da ação que o usuário executar. Então, neste exemplo, os seus dois trechos de códigos estão associados aos cliques dos botões Calcular Ano e Calcular Sexo.

(107)

ano), pois não tem como saber se a pessoa já fez ou não aniversário este ano.

Para associar um código ao botão ser pressionado, você deve clicar com o botão direito no botão Calcular Ano e selecionar Eventos ActionactionPerformed (vide figura 3.20.

Figura 3.20: Seleção do evento actionPerformed

Fonte: Captura de tela do Netbeans

(108)

Calcular Ano (no caso deste exemplo, o cursor está na linha 228 do código da figura 3.21).

Figura 3.21: Código do Formulário Principal referente ao evento do botão Calcular Ano

Fonte: Captura de tela do Netbeans

(109)

Figura 3.22: Código completo do botão Calcular Ano Fonte: Conteudista

Para testar se o seu código está funcionando, execute a aplicação apertando no botão Executar projeto principal (que é um triângulo verde, como os botões de Play de um tocador de DVD) ou aperte a tecla F6. Como você não criou uma classe principal para este projeto, aparecerá uma caixa de diálogo como a que pode ser visualizada na figura 3.23, onde você deve selecionar a única classe disponível que é gui.FormularioPrincipal e apertar o botão OK.

Figura 3.23: Caixa de diálogo Executar projeto

(110)

Esta tela da figura 3.23 só é apresentada uma única vez, das próximas vezes que você executar a aplicação a classe gui.FormularioPrincipal será executada automaticamente. Se você criar uma outra classe principal no seu projeto e resolver alterar, basta clicar com o botão direito no nome do projeto na janela Projetos, selecionar a opção Propriedades, depois clicar na opção Executar e selecionar a classe principal que você deseja ficar sempre executando quando executar o seu projeto.

Na área principal do projeto, como pode ser visto na figura 3.24, você pode voltar para a área de edição gráfica do seu FormularioPrincipal, bastando para isto clicar no botão Projeto.

Figura 3.24: Opção Projeto do FormularioPrincipal

Fonte: Captura de tela do Netbeans

(111)

Figura 3.25: Código completo do botão Calcular Sexo

Fonte: Conteudista

Preste atenção neste código (figura 3.25) e tente entender a lógica utilizada. Só é realizada manipulação de String e para decidir se é do sexo Masculino ou Feminino, só é utilizada a última letra do primeiro nome.

Saiba Mais

(112)

http://www.metropoledigital.ufrn.br/aulas_avancado/web/dis ciplinas/desktop/index.html

3.4.6 Caixa de Combinação (JComboBox), Botão de opção (JRadioButton), Lista (JList), Caixa de Seleção (JCheckBox) e Grupo de Botões (ButtonGroup)

Agora que você já conheceu os componentes Swing e aprendeu a utilizar o básico, você verá como fazer uma interface com recursos mais avançados como o Formulário Secundário das figuras 3.26 e 3.27.

(113)

Figura 3.27: Interface Formulário Secundário com o JComboBox aberto

Fonte: Captura de tela do Netbeans

Crie um novo Formulário JFrame neste projeto, dê a ele o nome de FormularioSecundario, e preencha de acordo com o projeto visual da figura 3.26.

(114)

Os nomes das variáveis utilizados foram: cbPalavra, rbEsq, rbDir, lstEsq, lstDir, cbEsqOrd, cbDirOrd, btInserir, btEsqTudo, btEsq, btDir, brDirTudo, btEsqLimp e btDirLimp, respectivamente.

Foi inserido também um componente não visual Grupo de botões e o nome da variável foi alterado para bgEsqDir. A seleção deste grupo deve ser feita através da janela Inspetor, já que é um componente que não aparece no projeto gráfico do formulário.

As propriedades alteradas destes componentes foram:

cbPalavra: editable para true, model para “Alto, Banana, Caixa, Dado, Escola, Festa, Gaiola, Hoje, Igreja, Jacaré” (sem as aspas) e

selectedIndex para -1;

rbEsq: buttonGroup para bgEsqDir e selected para true; rbDir: buttonGroup para bgEsqDir;

lstEsq: model para um código personalizado com o seguinte código:

“new javax.swing.DefaultListModel()”;

lstDir: model para um código personalizado com o seguinte código:

“new javax.swing.DefaultListModel()”;.

(115)

possível clicar nas reticências (...) da propriedade model e você digita no editor as 10 palavras, uma em cada linha, sem a utilização de vírgulas. Ao indicar que esta caixa de combinação é editable, você quer permitir que o usuário possa também digitar as suas próprias palavras, e finalmente ao marcar que o índice selecionado (selectedIndex) é o -1, você está querendo que nenhuma das 10 palavras estejam selecionadas.

O selectedIndex é utilizado para marcar qual o objeto da lista está selecionado e funciona igual a um array, isto é, inicia do zero, então -1 significa que nenhum valor está selecionado. No código, você pode utilizar o método getSelectedIndex() e setSelectedIndex(novoValor) para acessar e alterar o índice selecionado.

Quando você insere botões de opção (JRadioButton), cada botão é independente do outro, isto quer dizer que quando você marca um o outro não é desmarcado automaticamente. Para que aconteça este relacionamento entre os botões de opção é necessário incluir o componente não visual Grupo de botões (ButtonGroup), e associar todos os botões de opção que fazem parte do mesmo grupo a este grupo de botões.

(116)

A propriedade selected define se o botão está ou não selecionado. No exemplo, o botão de opção Esquerda está selecionado como padrão, por isso esta propriedade está ativada. Para acessar esta propriedade no código você deve utilizar o isSelected() [para valores booleanos utiliza-se o “is” no lugar de “get”] e para alterar o método setSelected(novoValor).

Finalmente, as listas (JList) da esquerda e da direita com um código personalidado. Este é um dos pontos mais complicados para o iniciante, pois é preciso que você saiba que o Java separa o código de interface gráfica (JList) dos dados (Model, neste caso, DefaultListModel). Portanto, sempre que você quiser consultar e alterar os dados é necessário acessar o Model da sua lista.

Por padrão, o Netbeans cria um Model que só exibe os itens criados estaticamente, sem a possibilidade de incluir ou remover algum item enquanto o programa está executando. Por isso, você deve clicar nas reticências (...) na propriedade model, selecionar a opção Código

personalizado e incluir o código: “new

(117)

Figura 3.28: Código do Model de um JList personalizado

Fonte: Captura de tela do Netbeans

Observe a necessidade de informar o nome completo da classe javax.swing.DefaultListModel, pois o Netbeans automaticamente não faz nenhum import para os componentes gráficos utilizados.

A caixa de combinações (JComboBox) também possui um model, e se você quiser que ele seja alterado dinamicamente, então você deve seguir o mesmo passo a passo para se alterar o model de um JList,

porém o model de um JComboBox é

(118)

3.4.7 Funcionalidade do Formulário Secundário

Agora que o formulário secundário está criado, é necessário incluir as funcionalidades de todos os botões. Primeiramente, veja na figura 3.29 o código que realiza a ordenação de uma lista recebida como parâmetro, este código foi inserido logo antes do main e será utilizado em todos os outros códigos de botões. Este código pega todos os dados da lista (model) e armazena em um vetor, ordena o vetor, limpa a lista e insere os valores que estão no vetor de volta para a lista.

Figura 3.29: Código do método ordenar

Fonte: Conteudista

(119)

Figura 3.30: Código do botão Inserir

Fonte: Conteudista

Os botões << (vide figura 3.31) e >> (vide figura 3.32) tem códigos parecidos, a única coisa que muda é a direção de envio (esquerda para a direita ou direita para a esquerda). A lógica do código do botão << é a seguinte: recupera os models das duas listas, insere no model da lista da esquerda todos os valores existentes na lista da direita, limpa todos os elementos do model da lista da direita e, se necessário, ordena a lista da esquerda.

Figura 3.31: Código do botão <<

(120)

Figura 3.32: Código do botão >>

Fonte: Conteudista

(121)

Figura 3.33: Código do botão <

Fonte: Conteudista

Figura 3.34: Código do botão >

Fonte: Conteudista

(122)

Figura 3.35: Código dos botões ordenar (esquerda e direita)

Fonte: Conteudista

Finalmente, na figura 3.36 você pode ver o código que limpa todos os elementos de da lista esquerda e direita. Bem simples e direto.

Figura 3.36: Código dos botões limpar (esquerda e direita)

Fonte: Conteudista

Como você pode observar, sempre que trabalhar você for trabalhar com listas utiliza-se bastante a propriedade model da lista para realizar a funcionalidade desejada.

Saiba Mais

(123)

http://www.metropoledigital.ufrn.br/aulas_avancado/web/dis ciplinas/desktop/index.html

http://netbeans.org/kb/docs/java/quickstart-gui_pt_BR.html

http://netbeans.org/kb/docs/java/gui-functionality_pt_BR.html

http://netbeans.org/kb/trails/matisse_pt_BR.html

Atividades de aprendizagem:

1. Crie uma aplicação no Netbeans que realize conversões entre temperaturas (graus celsiuse fahrenheit), ângulo (radiano e graus) e velocidade (mph e km/h). Crie um único formulário, com painéis internos separando em três grupos distintos.

(124)

RESUMO

(125)

REFERÊNCIAS

[1] DEITEL, Harvey M.; DEITEL, Paul J.. Java, como programar. 8. ed. Prentice Hall Brasil, 2010.

[2] MECENAS, I. J.Java 6 - Fundamentos, Swing, Bluej E Jdbc. 3. ed. Starlin Alta Consult, 2008.

[3] HORSTMANN, Cay S.; CORNELL, Gary. Core Java, V.1 - Fundamentos. 8. ed.Prentice Hall Brasil, 2009.

(126)

Imagem

Figura 1.1: Hierarquia de Interfaces de Coleções
Figura 1.3: Código utilizando FileWriter
Figura 1.5: Código utilizando Scanner
Figura 1.9:Código utilizando ObjectOutputStream
+7

Referências

Documentos relacionados

Detectadas as baixas condições socioeconômicas e sanitárias do Município de Cuité, bem como a carência de informação por parte da população de como prevenir

•   O  material  a  seguir  consiste  de  adaptações  e  extensões  dos  originais  gentilmente  cedidos  pelo 

iv. Desenvolvimento de soluções de big data aplicadas à gestão preditiva dos fluxos de movimentação portuária de mercadorias e passageiros. d) Robótica oceânica: criação

Os interessados em adquirir quaisquer dos animais inscritos nos páreos de claiming deverão comparecer à sala da Diretoria Geral de Turfe, localizada no 4º andar da Arquibancada

Após a queima, para os corpos com a presença do sienito observou-se que os valores de densidade diminuíram (comparados às respectivas densidades a seco), já

libras ou pedagogia com especialização e proficiência em libras 40h 3 Imediato 0821FLET03 FLET Curso de Letras - Língua e Literatura Portuguesa. Estudos literários

O desenvolvimento desta pesquisa está alicerçado ao método Dialético Crítico fundamentado no Materialismo Histórico, que segundo Triviños (1987)permite que se aproxime de

Para preparar a pimenta branca, as espigas são colhidas quando os frutos apresentam a coloração amarelada ou vermelha. As espigas são colocadas em sacos de plástico trançado sem