INFORMÁTICA
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
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
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
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
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
CONTEÚDO PROGRAMÁTICO
Volume 1
Unidade 1
- Coleções e Arquivos
Unidade 2
- Banco de Dados
Unidade 3
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.
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!
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.
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.
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
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.
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
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
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
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
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
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
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
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
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
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
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ê.
1.2.13 Exemplo
Figura 1.2:Código exemplo de coleções
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.
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)
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;
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
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
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"));
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")));
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.
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
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
É 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.
Figura 1.8: Código da Classe Pessoa
Fonte: Conteudista
Figura 1.9:Código utilizando ObjectOutputStream
Fonte: Conteudista
Figura 1.10: Código utilizando ObjectInputStream
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.
RESUMO
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).
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.
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.
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
Figura 2.2: Criar um banco de dados Java DB
Figura 2.3: Caixa de diálogo Criar banco de dados Java DB
Fonte: Captura de tela do Netbeans
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
Figura 2.5: Banco de dados BancoTeste01 conectado
Fonte: Captura de tela do Netbeans
Figura 2.6: Sub-tópico: BancoTeste01 APP Tabelas
Fonte: Captura de tela do Netbeans
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
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
Figura 2.10: Opção Executar comando...
Fonte: Captura de tela do Netbeans
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).
à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
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.
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.
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.
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
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
Figura 2.17: Caixa de diálogo Procurar JAR/Pasta
Fonte: Captura de tela do Netbeans
Figura 2.18: Opção Adicionar biblioteca ao projeto
Fonte: Captura de tela do Netbeans
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 –
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:
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);
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
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;
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.
Figura 2.22: Código completo de uma utilização do JDBC
Fonte: Conteudista
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
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() + "', "
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.
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 (?, ?,
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).
Figura 2.24: Código utilizando Prepared Statement
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.
Resumo
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
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
Figura 3.1:Caixa de diálogo Novo projeto (parte 1)
Fonte: Captura de tela do Netbeans
Figura 3.2: Caixa de diálogo Novo projeto (parte 2)
Fonte: Captura de tela do Netbeans
Figura 3.3: Opção para criar um Novo Formulário JFrame
Fonte: Captura de tela do Netbeans
Figura 3.4: Caixa de diálogo Novo Formulário JFrame
Fonte: Captura de tela do Netbeans
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.
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
Figura 3.7: Janela Inspetor do Netbeans Fonte: Captura de tela do Netbeans
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
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
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
Figura 3.11: Janela em branco do FormularioPrincipal Fonte: Captura de tela do Netbeans
3.4Principais Componentes Gráficos
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.
Figura 3.12: Dois JPanel posicionados no formulário Fonte: Captura de tela do Netbeans
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.
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
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
Figura 3.16: Formulário com todos os JPanel
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.
Figura 3.17: Formulário com todos os JLabel
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.
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.
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.
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
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.
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 ActionactionPerformed (vide figura 3.20.
Figura 3.20: Seleção do evento actionPerformed
Fonte: Captura de tela do Netbeans
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
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
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
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
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.
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.
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()”;.
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.
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
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 é
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
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 <<
Figura 3.32: Código do botão >>
Fonte: Conteudista
Figura 3.33: Código do botão <
Fonte: Conteudista
Figura 3.34: Código do botão >
Fonte: Conteudista
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
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.
RESUMO
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.