Programação Orientada A Objetos Com Java
Programação Orientada A Objetos Com Java
ORIENTADA A OBJETOS
COM
UNINOVE – uso exclusivo para aluno
sem mistérios
UNINOVE – uso exclusivo para aluno
PROGRAMAÇÃO
UNINOVE – uso exclusivo para aluno
ORIENTADA A OBJETOS
COM
sem mistérios
São Paulo
2016
© 2016 UNINOVE
Todos os direitos reservados. A reprodução desta publicação, no todo ou em
parte, constitui violação do copyright (Lei nº 9.610/98). Nenhuma parte desta
publicação pode ser reproduzida por qualquer meio, sem a prévia autorização
da UNINOVE.
Inclui bibliografia
ISBN: 978-85-89852-26-5 (impresso)
ISBN: 978-85-89852-27-2 (e-book)
CDU 004.439JAVA
----------------------------------------------------------------------------------------------------------------
Fabricantes
Java e NetBeans: desenvolvido pela Sun Microsystems, hoje de propriedade
da Oracle Corporation.
MySQL: desenvolvido pela MySQL AB, propriedade da Sun Microsystems,
hoje parte da Oracle Corporation.
Windows: desenvolvido pela Microsoft Corporation.
Oracle Brasil
Rua Dr. Jose Aureo Bustamante 455
Vila Cordeiro – CEP 04710-090 – São Paulo
Fone: +55 11 5189-1000
Site: http://www.oracle.com/br/index.html
Software
Windows XP Professional SP3/Vista SP1/Windows 7/8 Professional
NetBeans 6.8 ou posterior
Java Development Kit (JDK) versão 6 ou posterior
MySQL Community Server 5.1.53 ou posterior
Ø MySQL Workbench 5.2.30 ou posterior
Hardware
Processador: 2,6 GHz Intel Premium IV ou equivalente
Memória: 2 GB
Espaço em disco: 1 GB de espaço livre em disco
UNINOVE – uso exclusivo para aluno
Dedicatória
Agradecimentos
Prefácio................................................................................................................. 15
Sobre o autor........................................................................................................ 17
Apresentação........................................................................................................ 19
Introdução............................................................................................................ 21
2.7.1 Constantes................................................................................................... 67
2.7.2 Boas práticas para nomeação de variáveis e constantes em Java......... 67
2.8 Resumo........................................................................................................... 68
2.9 Exercícios....................................................................................................... 69
Referências.....................................................................................385
UNINOVE – uso exclusivo para aluno
Evandro Carlos Teruel - 15
Prefácio
Sobre o autor
UNINOVE – uso exclusivo para aluno
Apresentação
Introdução
linguagens do pacote Visual Studio são mais fáceis de aprender e utilizar, porém,
em contrapartida, são de uso pago e geram aplicações com interfaces bonitas, mas
normalmente pesadas para executar. Já a plataforma Java é de uso gratuito, mas
o tempo de aprendizagem é maior, assim como o nível de complexidade. Por ser
uma plataforma gratuita e de código aberto, ganhou a simpatia da comunidade
adepta dos softwares livres, que colaboraram para elevar a plataforma a um nível
onde se pode desenvolver praticamente qualquer tipo de software para qualquer
tipo de dispositivo existente. Para acomodar e classificar melhor os recursos, a
plataforma Java em si foi subdividida em plataformas menores voltadas para
domínios específicos, como Java SE, que concentra os recursos essenciais da
plataforma e é utilizada para desenvolvimento de aplicações para desktop; Java
ME, para dispositivos móveis e computação embarcada; Java EE, para web e
outras aplicações em que rodam em rede baseadas em servidores de aplicação;
e JavaFX para multimídia e interfaces gráficas robustas. Dentro de cada uma
destas subplataformas estão concentrados pacotes de classes, APIs, bibliotecas,
frameworks e recursos que precisariam de um ou mais livros cada um para
descrevê-los.
Para que você tenha uma ideia clara do que se tornou a plataforma Java, se
você fizesse 4 anos de faculdade apenas para aprender Java, provavelmente
não dominaria todos os seus recursos.
Não é pretensão do autor deste livro, com os conteúdos apresentados, fazer
com que você domine Java, mas sim apresentar os principais recursos do Java
SE (Standard Edition) a partir dos quais você terá condições de evoluir no
caminho da busca por conhecimentos mais completos da plataforma.
Você aprenderá nessa obra a criar um ambiente de desenvolvimento adequado
para Java; a utilizar as estruturas essenciais da programação estruturada como
22 - Programação Orientada a Objetos com Java – sem mistérios –
1. Preparando o ambiente
para programar em Java
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Na tela que aparece você terá que marcar a opção “Accept License Agreement”,
para aceitar os termos da licença de uso gratuito. Na mesma tela, na parte
de baixo, você escolhe a versão da JDK para seu sistema operacional. Para
Windows, você pode baixar uma das versões apresentadas a seguir:
https://NetBeans.org/downloads/
1.1.2 JavaFX
O JavaFX é a distribuição Java que permite criar aplicações multimídia com
interfaces gráficas bonitas para desktop, browser e telefones celulares. Quando
você instala a versão completa do NetBeans, como descrito no tópico anterior,
o Java FX já é instalado automaticamente.
NetBeans – https://NetBeans.org/downloads/
Eclipse – http://www.eclipse.org/
BlueJ – http://www.bluej.org/
JCreator – http://www.jcreator.com/
Gel – http://www.informaticon.com.br/downloads/gel.exe
Evandro Carlos Teruel - 27
Toda classe que você cria em um projeto é iniciada pela instrução public
class seguida pelo nome da classe. Todo o código-fonte da classe deve ficar
no interior das chaves.
javac Exemplo.java
java Exemplo
Caso haja alguma linha de código que chame métodos em outras classes,
pressione F7 para entrar nestes métodos e depurá-los.
Caso queira parar a depuração, basta clicar no menu “Depurar” e em “Finalizar
sessão do depurador”.
1.5 Resumo
Com Java é possível desenvolver qualquer tipo de aplicação, estruturada
ou orientada a objetos. Você pode desenvolver sistemas para desktop, sites,
jogos para celulares, programas para microcontroladores embutidos em
eletrodomésticos, carros etc.
Java, criada pela Sun Microsystem, hoje de propriedade da Oracle Corporation,
cresceu tanto que teve que ser dividida em plataformas (distribuições)
especializadas em domínios específicos. Assim, Java Standard Edition (SE)
é a plataforma fundamental, com a linguagem Java e os recursos necessários
para utilizar qualquer outra distribuição. Java Enterprise Edition (EE) é a
distribuição para desenvolvimento de aplicações que executam em rede, em
servidores de aplicações. Com Java EE você pode desenvolver sites ou outras
Evandro Carlos Teruel - 35
mais indicado para Java, por ter sido criado também pela Sun Microsystems,
criadora da linguagem. Apesar do Eclipse, criado pela IBM, ser o IDE mais
antigo e conhecido pela comunidade de desenvolvedores, o NetBeans é mais
fácil de utilizar e mais integrado com os recursos da plataforma Java.
1.6 Exercícios
1) Quais são as plataformas para desenvolvimento de aplicações com Java?
2. Programação Estruturada
em Java
import javax.swing.JOptionPane;
public class Exemplo {
public static void main(String[] args) {
String nome, mensagem;
double nota1, nota2, media;
nome = JOptionPane.showInputDialog("Digite o nome do aluno");
nota1 = Double.parseDouble(JOptionPane.showInputDialog("Digite a primeira nota"));
nota2 = Double.parseDouble(JOptionPane.showInputDialog("Digite a segunda nota"));
media = (nota1 + nota2) / 2;
Evandro Carlos Teruel - 39
if (media >= 6) {
mensagem = "aprovado";
} else {
mensagem = "reprovado";
}
System.out.print("O aluno " + nome + " foi " + mensagem + " com média " + media);
}
}
import javax.swing.JOptionPane;
public class Exemplo {
public static void main(String[] args) {
String nome, mensagem;
double nota1, nota2, media;
nome = JOptionPane.showInputDialog("Digite o nome do aluno");
nota1 = Double.parseDouble(JOptionPane.showInputDialog("Digite a primeira nota"));
nota2 = Double.parseDouble(JOptionPane.showInputDialog("Digite a segunda nota"));
40 - Programação Orientada a Objetos com Java – sem mistérios –
Analisando o tamanho dos programas você deve estar pensando que é bem
mais fácil programar de maneira estruturada. Se pensarmos na simples tarefa
que executamos, você tem razão. Agora pense no sistema de uma empresa
Evandro Carlos Teruel - 41
variável irá armazenar. Basta atribuir um valor à variável que ela assumirá o
tipo referente ao valor armazenado automaticamente. Veja o exemplo abaixo
de criação de variáveis em PHP:
$idade=40;
$nome="Evandro";
Note que a variável idade recebeu um valor numérico inteiro, logo, é implici-
tamente do tipo int. Já a variável nome recebeu uma cadeia de caracteres, logo,
é definida implicitamente como String.
Este não é o caso da linguagem Java. Nesta linguagem, considerada fortemente
tipada, você precisa obrigatoriamente indicar o tipo da variável antes de atribuir
um valor a ela. Por exemplo:
int idade=40;
String nome="Evandro";
int idade;
String nome;
idade=40;
nome="Evandro";
char classe='B';
char sexo='M';
byte a=240;
Não, não está correta. Apesar de você poder armazenar 256 valores inteiros
diferentes e exclusivos em uma variável do tipo byte, estes valores podem ser
negativos ou positivos. Logo, você pode armazenar valores de -128 até 127.
Se você contar quantos valores inteiros exclusivos existem entre -128 e 127
UNINOVE – uso exclusivo para aluno
(incluindo o zero), perceberá que existem 256 valores que equivalem ao total
permitido em uma variável do tipo byte. Sendo assim, no exemplo acima, a
variável poderia armazenar apenas valores de -128 até 127.
Vamos ver alguns exemplos corretos:
byte a=127;
byte b=-80;
byte c=110;
Em resumo, use variáveis do tipo byte apenas se for armazenar valores inteiros
na faixa de -128 até 127. Se precisar armazenar valores maiores, utilize o tipo
short.
short f=-20567;
short g=31789;
short h=32767;
short i=-32768;
Por não ser considerado o tipo padrão para números reais da linguagem Java,
já que o tipo padrão é double, valores atribuídos a uma variável do tipo float
devem terminar com a letra F.
double valorTotal=1765642.45;
double renda=10678.99;
boolean estudante=true;
boolean fumante=false;
2.3.2.1 Casting
Se a conversão for de um tipo de dado de maior precisão para um tipo de dado
de menor precisão, o processo de conversão é chamado casting.
Trabalharemos neste tópico conversões dos seguintes tipos de dados:
46 - Programação Orientada a Objetos com Java – sem mistérios –
byte
short
int
long
float
double
Casting ocorre sempre que se deseja converter de um tipo mais abaixo, na lista
de tipos apresentada, para um tipo mais acima.
Por exemplo, para converter um valor do tipo int para byte, utiliza-se:
int a=10;
byte b=(byte) a;
Veja que a variável int a recebeu o valor inteiro 10 e este valor foi convertido
UNINOVE – uso exclusivo para aluno
double b=10.0;
short c=(short) b;
double d=13.0;
float e=(float) d;
O valor 13 da variável double d foi convertido e armazenado na variável float e.
long f=1234;
int g=(int) f;
2.3.2.2 Promotion
Quando a conversão ocorre de um tipo de menor precisão para um tipo de
maior precisão, ou seja, de um tipo mais acima na lista de tipos apresentada,
para um tipo mais abaixo, a conversão será direta, sem precisar de casting.
Neste caso chamamos a operação de promotion.
Vejamos alguns exemplos:
Evandro Carlos Teruel - 47
int a = 1786;
long c = a;
byte v = 2;
double x=v;
short t = 290;
long u = t;
int k=1675;
float l=k;
Como você aprendeu no tópico anterior, os tipos primitivos são aqueles mais
simples, comuns à maioria das linguagens de programação, que não necessitam
de nenhum recurso especial para serem declarados. Você deve ter notado que
todos os tipos primitivos são escritos em letra minúscula.
Já os tipos de referência, são aqueles que necessitam de uma classe (ou arquivo
de programa) para serem declarados e manipulados. Muitas destas classes
já vêm instaladas com o Java (como a classe String.java e Date.java), mas
muitas precisarão ser criadas. Quando se usa os tipos de referência, dizemos
que o valor é armazenado no objeto da classe de referência. O objeto nada
mais é, neste caso, de forma simplificada, uma variável que permite acessar
as operações que podem ser aplicadas sobre o valor na classe de referência.
Você pode criar novos tipos de dados por referência, de acordo com suas
necessidades, o que torna a linguagem bastante dinâmica no que se refere a
manipulação de dados.
Os tipos de dados por referência mais comuns são Date e String.
ou
String nome;
nome = "Evandro";
ou
String nome;
nome = new String("Evandro");
Observe que b é uma variável que faz referência à classe Byte.java, ou seja,
UNINOVE – uso exclusivo para aluno
é uma variável do tipo Byte. Dizemos, neste caso, que b é um objeto do tipo
Byte. Deixaremos os detalhes em relação ao termo objeto para o próximo
Capítulo deste livro.
Da mesma forma, s é um objeto do tipo Short, i um objeto do tipo Integer, l
um objeto do tipo Long, e assim por diante.
Além das classes de referência para tipos de dados numéricos acima, caso
precise armazenar e manipular valores acima dos limites permitidos nos tipos
de dados numéricos primitivos, pode utilizar a classe BigDecimal.java, como
mostra o exemplo a seguir:
BigDecimal g = new BigDecimal ("98876716752638949.78");
Veja que aluno é uma variável que faz referência à classe Aluno.java, ou seja,
é uma variável do tipo Aluno. Neste caso, dizemos que aluno é um objeto da
classe Aluno.java. Esta classe contém recursos para manipular os dados do
aluno e executar operações sobre estes dados.
50 - Programação Orientada a Objetos com Java – sem mistérios –
Você pode criar classes para manipular outras categorias de informações e criar
objetos (variáveis) de referência a estas classes. Veremos isso nos próximos
Capítulos deste livro.
int a = 1;
int b = 3;
int c = a + b;
double salario=1876.56;
double percentualAumento=1876.56;
double salReajustado=salario + salario * percentualAumento / 100;
double nota1=9.5;
double nota2=6.0;
double media=(nota1+nota2)/2;
Veja que naturalmente seria realizada a divisão de nota2 por 2 para depois o
valor resultante ser somado ao conteúdo da variável nota1. Porém, o parêntese
altera esta ordem natural, fazendo com que primeiro o conteúdo da variável
nota1 seja somado ao conteúdo da variável nota2 para depois o valor resultante
ser dividido por 2.
int a=10;
52 - Programação Orientada a Objetos com Java – sem mistérios –
Você pode utilizar tanto o modo extendido quanto o modo reduzido que terá
o mesmo resultado.
Veja que o conteúdo da variável a é utilizado na operação e o resultado é
armazenado na própria variável a. Quando o valor resultante for maior do que
UNINOVE – uso exclusivo para aluno
int a=2;
int b=5;
int c=5;
Note que o resultado de uma operação relacional será sempre um valor boolean
(true ou false). Para indicar o que deve ocorrer se a avaliação da expressão for true
ou false utiliza-se o comando if que veremos no decorrer neste Capítulo.
Evandro Carlos Teruel - 53
boolean a=true;
boolean b=false;
a&&a true
|| OU a||b true
b||b false
Tabela 2.5: Operadores lógicos.
int a=2;
int b=5;
int c=3;
boolean resultado=(a+b*a)>(b-c) && (b+c)<=(a+c);
if (expressão) {
procedimento caso o resultado seja true
} else {
procedimento caso o resultado seja false
}
Por exemplo:
int a=2;
int b=6;
if (a>=b){
System.out.println("a contém um valor maior ou igual a b");
} else {
System.out.println("a não contém um valor maior ou igual a b");
}
Evandro Carlos Teruel - 55
Para comparar se dois valores numéricos são iguais, utiliza-se a estrutura a seguir:
if (a==b) {
procedimento caso o resultado seja true
} else {
procedimento caso o resultado seja false
}
a seguir:
if (a!=b) {
procedimento caso o resultado seja true
} else {
procedimento caso o resultado seja false
}
if (expressão 1) {
procedimento caso o resultado da expressão seja true
} else if (expressão 2) {
procedimento caso o resultado da primeira expressão tenha sido false e da expressão
atual tenha sido true.
} else if (expressão 3){
procedimento caso o resultado da primeira e da segunda expressões tenham sido false
e da expressão atual tenha sido true.
} else {
procedimento caso o resultado de todas as expressões anteriores tenha sido false
}
56 - Programação Orientada a Objetos com Java – sem mistérios –
Veja que muitas expressões podem ser avaliadas utilizando esta estrutura.
Por exemplo:
if (nome.equals("Pedro") {
procedimento caso o resultado seja true
} else {
procedimento caso o resultado seja false
}
if (nome.equalsIgnoreCase("pedro") {
procedimento caso o resultado seja true
} else {
procedimento caso o resultado seja false
}
switch(variável) {
case valor:
operação a ser realizada se a variável contiver o valor especificado no case
break;
case valor:
operação a ser realizada se a variável contiver o valor especificado no case
break;
UNINOVE – uso exclusivo para aluno
case valor:
operação a ser realizada se a variável contiver o valor especificado no case
break;
default:
operação a ser realizada se a variável contiver o valor especificado no case
}
Exemplo:
import javax.swing.JOptionPane;
public class Principal {
public static void main(String[] args) {
int a = Integer.parseInt(JOptionPane.showInputDialog("Digite um valor inteiro
para a variável a"));
switch (a) {
case 0:
System.out.print("A variável recebeu o valor 0");
break;
case 1:
System.out.print("A variável recebeu o valor 1");
break;
case 2:
System.out.print("A variável recebeu o valor 2");
break;
default:
System.out.print("A variável recebeu qualquer outro valor não testado
acima");
}
}
}
58 - Programação Orientada a Objetos com Java – sem mistérios –
import javax.swing.JOptionPane;
public class Principal {
public static void main(String[] args) {
String cidade;
cidade = JOptionPane.showInputDialog("Digite o nome da cidade:");
switch (cidade) {
case "São Paulo":
System.out.println("Cidade da garoa");
break;
case "Rio de Janeiro":
System.out.println("Cidade maravilhosa");
break;
default:
System.out.println("Cidade não reconhecida");
}
}
}
Note que se a cidade informada pelo usuário for “São Paulo”, será exibida
a mensagem “Cidade da garoa”. Se for “Rio de Janeiro”, será exibida a
mensagem “Cidade maravilhosa”. Se for qualquer outra cidade, será exibida
a mensagem “Cidade não reconhecida”.
Veja que a variável cont é inicializada com o valor 1 e testada a cada passagem
pelo laço verificando se contém um valor menor ou igual a 10. Em cada
passagem pelo laço, esta variável vai sendo incrementada em 1. Quando a
variável receber o valor 11, que torna o teste false, o laço é finalizado.
Exemplo de laço com decremento:
int cont=10;
for (; cont>=1; cont--){
System.out.print(cont);
}
int cont;
for (cont=10; cont>=1; cont--){
System.out.print(cont);
}
60 - Programação Orientada a Objetos com Java – sem mistérios –
int cont=1;
while (cont<=10){
System.out.print(cont);
cont++;
}
int cont=10;
while (cont>=1){
System.out.print(cont);
cont-=2;
}
Veja um exemplo:
int cont=1;
do {
System.out.print(cont);
cont++;
} while (cont<=10);
int cont=11;
do {
System.out.print(cont);
cont++;
} while (cont<=10);
Neste caso, a variável cont foi inicializada com o valor 11, o que faz com que
no primeiro teste o resultado seja false. Mesmo assim, a mensagem será exibida
uma vez.
nomes
UNINOVE – uso exclusivo para aluno
0 1 2
nomes[0]="Paulo";
nomes[1]="Pedro";
nomes[2]="Ana";
nomes
Paulo Pedro Ana
0 1 2
Por exemplo:
clientes[0]= "João";
clientes[1]= "Paulo";
idades[0] = 19;
idades[1] = 40;
idades[2] = 29;
idades[3] = 41;
salarios[0]=1678.67;
salarios[1]=1390.00;
salarios[2]=2765.34;
String clientes[]={"João","Paulo"};
int idades[]={19,40,29,41};
double salarios[]={1678.67,1390.00,2765.34};
clientes
João Paulo
0 1
idades
19 40 29 41
0 1 2 3
salarios
1678.67 1390.00 2765.34
0 1 2
nomes
0
1
0 1
UNINOVE – uso exclusivo para aluno
Observe que trata-se de uma array de duas dimensões, onde tanto as linhas
quanto as colunas possuem índices numéricos iniciados em 0.
Para armazenar valores nesta array utiliza-se as instruções:
nomes[0][0]= "Paulo";
nomes[0][1]= "Maria";
nomes[1][0]= "Ana";
nomes[1][1]= "Angela";
nomes
0 Paulo Maria
1 Ana Angela
0 1
Caso seja necessário visualizar o nome “Angela”, você pode digitar o comando
a seguir:
System.out.print (nomes[1][1]);
int indice=0;
while (indice<3){
nomes[indice] = JOptionPane.showInputDialog("Digite um nome:");
indice++;
}
OU
int i=0;
while (i<3){
System.out.println(nomes[i]);
i++;
}
66 - Programação Orientada a Objetos com Java – sem mistérios –
TipoDaVariável nomeDaVariável;
nomeDaVariável=valor;
TipoDaVariável pode ser char, byte, short, int, long, float, double, boolean,
String, Date etc. Veja alguns exemplos:
int codigo;
codigo=10;
String cidade;
cidade= "São Paulo";
char sexo;
sexo= 'F';
Evandro Carlos Teruel - 67
Veja que a variável idade recebeu o valor 39 e depois teve o valor modificado
para 80.
Outra maneira de trabalhar com variáveis simples é declarando a variável e
já atribuindo valor na mesma linha, em uma única instrução. Neste caso a
sintaxe será:
TipoDaVariável nomeDaVariável=valor;
UNINOVE – uso exclusivo para aluno
Veja o exemplo:
int codigo=1012;
String email= "[email protected]";
2.7.1 Constantes
A diferença entre uma variável e uma constante é que o valor armazenado em
uma variável pode mudar no decorrer da execução de um programa e o valor
armazenado em uma constante, não.
Em Java, para declarar uma constante utiliza-se a sintaxe seguinte:
A palavra reservada final identifica que trata-se de uma constante e não de uma
variável. Veja um exemplo:
Veja que PI é uma constante, o que significa que o valor armazenado não
poderá ser modificado na aplicação.
2.8 Resumo
Este Capítulo apresentou um conjunto de conceitos e estruturas utilizados em
Java que incluem:
– A diferença entre programação estruturada e orientada a objetos;
– Os tipos de dados para declarar variáveis (primitivos e por referência);
– As categorias de variáveis (simples, arrays e objetos);
– Operações (aritméticas, relacionais e lógicas);
– Declaração e atribuição de dados às variáveis simples;
– Declaração, atribuição de valores e manipulação de dados em arrays
unidimensionais e bidimensionais;
– Declaração e atribuição de valores à constantes;
– Estruturas de seleção (if..elseif..else e switch...case..default);
– Estruturas de repetição (for, while e do while).
A programação de computadores pode ser realizada de formas diferentes, de
acordo com um conjunto de princípios e recursos disponíveis na linguagem de
programação. Estas formas são conhecidas como paradigmas de programação.
Os dois principais paradigmas são Programação Estruturada e Programação
Orientada a Objetos. Na programação estruturada os comandos são executados
sequencialmente, normalmente em um único programa, que executa todas
as operações necessárias. Na programação orientada a objetos as operações
Evandro Carlos Teruel - 69
2.9 Exercícios
1) Dadas as variáveis abaixo, resolva as expressões mistas A e B indicando o
resultado de cada uma:
int a=2;
int b=3;
int c=5;
int d = 1;
70 - Programação Orientada a Objetos com Java – sem mistérios –
A) boolean e = (a+b*(c+d))<=(d*(b+c)/2)||(a+b-c)>(c+d);
int a = 2;
int b = 3;
int c = 5;
int d = 1;
if((b*c/d)==(d*b+c)&&(c*d+a)!=(c+d)||(a+b)<=(c-d)) {
System.out.print("A");
} else if ((a+b*d)>(b+c/2)||(a-c)>(c+d)) {
System.out.print("B");
} else if ((a*b/2)<(d*c+8)|| !((c+d*4)<=12)) {
System.out.print("C");
UNINOVE – uso exclusivo para aluno
} else {
System.out.print("D");
}
nomes
0 Paulo Maria Pedro Marcos
1 Ana Marcelo André Mauro
2 Janaina José Renato Célia
0 1 2 3
a=a-8;
b=b*5;
c=c+1;
d=d-1;
e=e/8;
10) Dada a variável b a seguir, converta seu valor para a variável c do tipo byte
e para a variável d do tipo short.
UNINOVE – uso exclusivo para aluno
double b=12;
11) Dada a variável g a seguir, converta seu valor para a variável h do tipo
float e i do tipo long.
int g=6;
idades
0 60 78
1 23 50
0 1
72 - Programação Orientada a Objetos com Java – sem mistérios –
Algoritmo fatorial
var a, n, cont: inteiro
início
nß5;
aß 1
contß1
enquanto (cont<=n) faça
a ß a* cont
cont ß cont +1
fim enquanto
imprima (a)
fim
UNINOVE – uso exclusivo para aluno
Algoritmo soma
var a, n, cont : inteiro
início
n ß 10
aß0
para cont=1 até n passo 1
a ß a + cont
fim_para
imprima(a)
fim
Algoritmo números
var n1,n2: inteiro
início
leia (n1,n2)
se n1>n2
então imprima ("o número", n1, "é maior que", n2)
senão se n1=n2
então imprima ("os números são iguais")
senão imprima ("o número", n2, "é maior que", n1)
fim_se
fim_se
fim
Evandro Carlos Teruel - 73
3. Orientação a objetos –
conceitos básicos
Classe: Funcionário
Atributos: matrícula, nome, cargo, salário.
Métodos: reajuste, desconto de imposto.
Classe: Produto
Atributos: código, nome, medida, cor, preço.
Métodos: reajuste, desconto.
3.1 Classes
Tirando a parte conceitual e abstrata, uma classe nada mais é do que um
arquivo de programa Java que precisa possuir uma estrutura que atenda aos
padrões da linguagem. Elas possuem identificação, a declaração dos atributos
UNINOVE – uso exclusivo para aluno
Veja que a palavra Funcionario não foi acentuada, pois não é uma boa
prática acentuar nomes de classes, já que a linguagem e seus padrões,
NOTA
apesar de aceitar acentos, foram criados em língua inglesa, que não uti-
liza acentuação.
3.1.3 Construtor
Construtor é uma estrutura, semelhante a um método ou função, que permite
UNINOVE – uso exclusivo para aluno
public Funcionario() {
Você deve observar que o construtor, obrigatoriamente, deve ter o mesmo nome
da classe. Pode haver diversos construtores em uma classe, desde que eles
recebam parâmetros diferentes. O uso de vários construtores em uma classe é
chamado de sobrecarga de construtor.
76 - Programação Orientada a Objetos com Java – sem mistérios –
3.1.4 Métodos
Métodos são semelhantes às funções utilizadas na programação estruturada,
porém, ao contrário das funções, estarão sempre associados aos objetos da
classe e executarão operações sobre os valores manipulados pela classe. São
UNINOVE – uso exclusivo para aluno
trechos de código em uma classe que podem ser chamados uma ou mais vezes
para realizar procedimentos específicos sobre os atributos da classe.
Os métodos são recursos excelentes para viabilizar o reaproveitamento de
código, uma vez que precisam ser digitados uma vez, mas podem ser chamados
quantas vezes forem necessárias.
Segundo Horstmann (2009. p. 63), “um método é uma sequência de instruções
que acessam os dados internos de um objeto”.
Em uma classe Java normalmente existem três categorias de métodos: os
métodos setter (que incluem valores nos atributos de um objeto); os métodos
getter (que obtêm valores armazenados nos atributos de um objeto); e métodos
de uso geral, que executam operações personalizadas e diversificadas sobre
os atributos da classe.
Onde:
– ModificadorVisibilidade: determina se o método terá acesso público,
privado, protegido ou padrão. Veremos detalhes sobre esses modificadores
no próximo capítulo.
– TipoRetorno: determina que tipo de valor o método irá retornar. Um método
pode retornar qualquer tipo de valor, seja simples, array, objeto etc. Caso
o método não retorne valor deve ser escrito void neste local.
Evandro Carlos Teruel - 77
Veja que este método recebe um nome (do tipo String), exibe este nome na
tela e não retorna nenhum valor (void).
Veja que este método recebe duas notas do tipo double e retorna o resultado
do cálculo da média entre elas, também do tipo double.
Este método não recebe nada como parâmetro, mas devolve o resultado de um
cálculo que é um valor do tipo double.
Veja que este método, chamado setNome, recebe um nome como parâmetro
e transfere este nome para o atributo nome da classe (this.nome). Há duas
variáveis nome diferentes: a variável local, que recebe o nome como parâmetro;
e o atributo nome, privado da classe, antecedido pela instrução this, que recebe
o nome que chegou como parâmetro.
Agora que o projeto está criado, vamos criar a classe Funcionario.java. Para
criar esta classe, siga os procedimentos a seguir:
UNINOVE – uso exclusivo para aluno
Não é uma boa prática acentuar nomes de classes e variáveis, por esse
NOTA motivo, o nome da classe Funcionario não deve ser acentuado.
16
17 public int getMatricula() {
18 return matricula;
19 }
20
21 public void setMatricula(int matricula) {
22 this.matricula = matricula;
23 }
24
25 public String getNome() {
26 return nome;
27 }
28
29 public void setNome(String nome) {
30 this.nome = nome;
UNINOVE – uso exclusivo para aluno
31 }
32
33 public String getCargo() {
34 return cargo;
35 }
36
37 public void setCargo(String cargo) {
38 this.cargo = cargo;
39 }
40
41 public double getSalario() {
42 return salario;
43 }
44
45 public void setSalario(double salario) {
46 this.salario = salario;
47 }
48
49 public void ajustarSalario(double percentual) {
50 this.salario = this.salario + this.salario * percentual / 100;
51 }
52 }
A linha 1 declara a classe com nome Funcionario. Veja que a chave aberta
nesta linha é fechada apenas na linha 52.
Da linha 2 a 5 são declarados os atributos da classe, ou seja, as informações que
se deseja manipular. Estes atributos não são nada mais que variáveis privadas
da classe, ou seja, variáveis que só podem ser acessadas do interior desta classe.
82 - Programação Orientada a Objetos com Java – sem mistérios –
Se você não adotar as boas práticas de nomeação, não ocorrerá erro, po-
rém, sua aplicação não será bem vista entre desenvolvedores profissio-
NOTA
nais. As boas práticas representam recomendações adotadas como padrão
atualmente e recomendadas pelos desenvolvedores da linguagem.
3.2 Pacotes
Pacotes são contêineres (ou pastas) que se cria em um projeto para agrupar
classes que possuem alguma característica comum ou afinidade.
Horstmann (2009, p. 339), afirma que “um pacote é um conjunto de classes
relacionadas”.
Por exemplo, em um projeto, pode-se criar um pacote para agrupar as classes
que implementam o módulo de controle de funcionários, um pacote para
agrupar classes que implementam o módulo de clientes, e assim por diante.
84 - Programação Orientada a Objetos com Java – sem mistérios –
package rh;
public classe Funcionário{
import javax.swing.JOptionPane;
public class Teste{
public static void main (String[] args){
JOptionPane.showMessageDialog(null, "Olá!");
}
}
import javax.swing.*;
Esta instrução permite utilizar na classe que você está escrevendo qualquer
classe que esteja no pacote javax.swing.
86 - Programação Orientada a Objetos com Java – sem mistérios –
3.3 Objetos
A classe Funcionario.java que você criou no tópico anterior, é uma classe
que permite manipular no projeto criado um novo tipo de dado, um tipo
Funcionario.
É isso mesmo, agora você pode criar variáveis do tipo Funcionario sempre que
desejar armazenar informações de funcionários e manipular estas informações.
String, por exemplo, é um tipo de dado porque há uma classe chamada String.
java. Da mesma forma, Funcionario é um tipo de dado porque existe a classe
Funcionario.java.
As variáveis que criamos das classes são chamadas objetos. Assim, uma
variável do tipo String é um objeto, assim como uma variável do tipo
Funcionario também é um objeto.
Objeto pode ser definido como uma variável de um tipo classe que permite
UNINOVE – uso exclusivo para aluno
}
}
Veja na Figura 3.3 que a instrução new Funcionário() chama o construtor vazio
da classe Funcionario.java.
func
matricula 0
nome Null
cargo Null
salario 0.0
setMatricula(int matricula): void
getMatricula(): int
setNome(String nome): void
getNome(): String
setCargo(String cargo): void
getCargo(): String
setSalario(double salario): void
getSalario(): double
ajustarSalario(double
percentual):void
Figura 3.4: Criação de um objeto vazio.
Como o objeto foi instanciado vazio por meio do construtor que não recebe
parâmetros, para armazenar (setar) valores no objeto deve-se chamar os
métodos setter da seguinte forma:
67543
Angela Cristina
Analista
24567.98
setMatricula(int matricula): void
getMatricula(): int
setNome(String nome): void
getNome(): String
setCargo(String cargo): void
getCargo(): String
setSalario(double salario): void
getSalario(): double
ajustarSalario(double percentual): void
Note que para obter o valor da matrícula armazenado no atributo matricula foi
utilizada a instrução func.getMatricula(). A instrução System.out.println exibe
UNINOVE – uso exclusivo para aluno
na tela o valor obtido do atributo. Para obter os valores contidos nos demais
atributos, foram chamados os métodos getter destes atributos. A Figura 3.6
ilustra o uso dos métodos getter.
67543
Angela Cristina
Analista
24567.98
setMatricula(int matricula): void
getMatricula(): int
setNome(String nome): void
getNome(): String
setCargo(String cargo): void
getCargo(): String
setSalario(double salario): void
getSalario(): double
ajustarSalario(double percentual): void
Uma vez que um objeto é instanciado, para acessar qualquer método contido
na classe referente ao objeto, deve-se digitar o nome do objeto, o ponto final
e o método que se deseja acessar. Pode-se concluir então, até aqui, que:
“O acesso aos métodos de uma classe ocorre por meio de um objeto instanciado
desta classe.”
Evandro Carlos Teruel - 91
func
matricula 1367
nome Paulo Henrique
cargo Gerente
salario 789.56
setMatricula(int matricula): void
getMatricula(): int
setNome(String nome): void
getNome(): String
setCargo(String cargo): void
getCargo(): String
setSalario(double salario): void
getSalario(): double
ajustarSalario(double
percentual):void
UNINOVE – uso exclusivo para aluno
Veja que foram instanciados (criados) três objetos: func1, func2, func3. Cada
objeto é uma instância da classe Funcionario.java. Em cada objeto, os atributos
matricula, nome, cargo e salario receberam valores diferentes. Se você desejar
UNINOVE – uso exclusivo para aluno
System.ou.println(func2.getNome());
System.ou.println(func1.getNome());
func.setNome("Angela Cristina");
func.setCargo("Analista");
func.setSalario(24567.98);
}
}
matricula 1367
nome Paulo Henrique
cargo Gerente
salario 789.56
Em seguida, estes valores foram alterados, por meio de chamadas aos métodos
setter, para:
UNINOVE – uso exclusivo para aluno
matricula 67543
nome Angela Cristina
cargo Analista
salario 24567.98
func
matricula 1367
nome Paulo Henrique
cargo Gerente
salario 868.516
setMatricula(int matricula): void
getMatricula(): int
setNome(String nome): void
getNome(): String
setCargo(String cargo): void
getCargo(): String
setSalario(double salario): void
getSalario(): double
ajustarSalario(double
percentual):void
Figura 3.9: Objeto após modificação de valores nos atributos.
Caso você deseje visualizar o novo valor contido no atributo salario, basta
digitar a instrução System.out.print(func.getSalario()); após a chamada ao
método na classe Teste.java.
96 - Programação Orientada a Objetos com Java – sem mistérios –
3.4 Encapsulamento
Quando você instancia um objeto de uma classe você encapsula os atributos
privados da classe no objeto, de forma que possam ser acessados somente por
métodos públicos. Dessa forma, podemos ver um objeto como uma cápsula.
Segundo Horstmann (2009, p. 112), “o encapsulamento é o processo de ocultar
dados contidos em um objeto e fornecer métodos para acessar estes dados”.
Um exemplo de uso do encapsulamento ocorre quando inserimos ou
consultamos valores nos atributos de um objeto. Para inserir valores nos
atributos privados é necessário chamar os métodos setter públicos e para
obter os dados presentes nos atributos, é necessário chamar os métodos
getter públicos. Nesse caso particular, os atributos não podem ser acessados
diretamente de fora da classe, pois são privados. Desta forma são necessários
métodos públicos para acessá-los.
UNINOVE – uso exclusivo para aluno
1 import java.util.Scanner;
2 public class Teste {
3 public static void main(String[] args) {
4 Scanner ler;
5 Funcionario func;
6 ler= new Scanner(System.in);
7 func = new Funcionario();
8 System.out.println("Informe a matrícula:");
9 func.setMatricula(ler.nextInt());
10 ler.nextLine();
11 System.out.println("Informe o nome:");
12 func.setNome(ler.nextLine());
13 System.out.println("Informe o cargo:");
UNINOVE – uso exclusivo para aluno
14 func.setCargo(ler.nextLine());
15 System.out.println("Informe o valor do salário:");
16 func.setSalario(ler.nextDouble());
17 System.out.print("\n");
18 System.out.println("Matrícula:" + func.getMatricula());
19 System.out.println("Nome:" + func.getNome());
20 System.out.println("Cargo:" + func.getCargo());
21 System.out.println("Salário:" + func.getSalario());
22 func.ajustarSalario(10);
23 System.out.println("Salário reajustado:" + func.getSalario());
24 System.out.print("\n");
25 }
26 }
foram feitas chamadas aos métodos getter. O sinal de mais (+) em cada linha
concatena um rótulo String ao conteúdo obtido do atributo do objeto.
A linha 22 chama o método ajustarSalario e passa o valor 10, que se refere
ao percentual no qual se quer aumentar o salário. Este método recebe o valor
como parâmetro e aumenta o salário trocando o valor do atributo salario pelo
valor reajustado.
A linha 23 obtém o salário reajustado por meio de uma chamada ao método
getSalario da classe Funcionario.java e exibe na tela.
Observe na classe apresentada que para cada informação que se deseja pedir
ao usuário, são usadas duas linhas, uma para exibir o pedido da informação,
e outra para receber a informação e armazenar no atributo do objeto func da
classe Funcionario.java. Veja por exemplo a entrada da matrícula (linhas 8 e 9):
UNINOVE – uso exclusivo para aluno
System.out.println("Informe a matrícula:");
func.setMatricula(ler.nextInt());
1 import javax.swing.JOptionPane;
2 public class Teste {
3 public static void main(String[] args) {
4 Funcionario func;
5 func = new Funcionario();
6 func.setMatricula(Integer.parseInt(JOptionPane.showInputDialog("Digite a
matrícula: ")));
7 func.setNome(JOptionPane.showInputDialog("Digite o nome: "));
8 func.setCargo(JOptionPane.showInputDialog("Digite o cargo: "));
9 func.setSalario(Double.parseDouble(JOptionPane.showInputDialog("Digite o
salário: ")));
10 JOptionPane.showMessageDialog(null,
"Matrícula:" + func.getMatricula() + "\n"
+ "Nome:" + func.getNome() + "\n"
+ "Cargo:" + func.getCargo() + "\n"
+ "Salário:" + func.getSalario() + "\n");
11 func.ajustarSalario(Integer.parseInt(JOptionPane.showInputDialog("Digite o
percentual de reajuste para o salário: ")));
12 JOptionPane.showMessageDialog(null, "Salário reajustado: " + func.
getSalario());
13 }
14 }
classe Funcionario.java. Note que o caracter “\n” serve para quebrar linha na
janela pop-up que exibe os dados.
A linha 11 pede o percentual de reajuste do salário do funcionário e passa como
parâmetro para o método ajustarSalario da classe Funcionario.java, que altera
o valor contido no atributo salario para o valor do salário reajustado. A linha
12 exibe o conteúdo do atributo salario (que contém o salário reajustado),
por meio de uma chamada ao método getSalario da classe Funcionario.java.
Observe que a entrada de dados ocorrerá por meio de janelas pop-up geradas
pelo método showInputDialog da classe JOptionPane. Estas janelas aparecerão
uma por uma, ao compilar e executar a classe utilizando a tecla F6. Veja na
Figura 3.11 como serão estas janelas:
UNINOVE – uso exclusivo para aluno
Após a exibição dos dados aparecerá a janela pop-up mostrada na Figura 3.13,
para a digitação do percentual de aumento do salário (linha 11).
– Conversão do valor digitado para a matrícula de String para int, por meio
do comando Integer.parseInt.
– Passagem do valor convertido para inteiro para o método setMatricula, para
ser incluído no atributo matricula do objeto func.
A linha apresentada pode ser desmembrada em três, uma para cada operação,
da seguinte forma:
func.setSalario(ler.nextDouble());
métodos que executam operações aritméticas. Será criada também uma classe
Teste.java, de onde estes métodos serão chamados.
Para digitar os códigos-fonte que serão apresentados, execute os procedimentos
a seguir:
– Crie um projeto chamado “ProjetoTeste”.
– Crie um pacote chamado app.
– Cria, dentro do pacote app, as classes Calculo.java e Teste.java.
package app;
public class Calculo {
public Calculo(){
}
public double media(double valor1, double valor2) {
return (valor1 + valor2) / 2;
}
public double media(double valor1, double valor2, double valor3) {
return (valor1 + valor2 + valor3) / 3;
}
public int soma(int valor1, int valor2) {
return (valor1 + valor2);
}
public double soma(int valor1, int valor2, double valor3) {
return (valor1 + valor2 + valor3);
UNINOVE – uso exclusivo para aluno
}
public double raizQuadrada(int valor) {
return (Math.sqrt(valor));
}
}
Note que há dois métodos chamados media, um que recebe dois valores double,
calcula a média entre estes valores e retorna o resultado como double e um
que recebe três valores double, calcula a média entre estes valores e retorna o
resultado como double.
Há também dois métodos chamados soma, um que recebe dois valores inteiros,
soma estes valores e retorna o resultado como int e um que recebe dois valores
inteiros e um valor double, soma estes valores e retorna o resultado como
double.
O método chamado raizQuadrada recebe um valor int, calcula a raiz quadrada
deste valor e retorna o resultado como double. Para calcular a raiz quadrada foi
utilizado o método sqrt da classe Math, instalada com o Java. A classe Math
permite realizar diversos tipos de operações matemáticas e trigonométricas.
Perceba que há mais de um método com o mesmo nome na classe, porém, estes
métodos de mesmo nome recebem parâmetros diferentes. Isto é chamado na
orientação a objetos de sobrecarga de métodos.
O diagrama de classes da UML para a classe acima é mostrado na Figura 3.16.
Evandro Carlos Teruel - 105
Calculo
+ media(double valor1, double valor2): double
+ media(double valor1, double valor2, double valor3) : double
+ soma(int valor1, int valor2): int
+ soma(int valor1, int valor2, double valor3): double
+ raizQuadrada(int valor): double
Figura 3.16: Diagrama de classes mostrando a classe Calculo.
Observe que a divisão destinada aos atributos está vazia, já que a classe não
possui atributos.
Para interagir com a classe Calculo.java, chamando seus métodos, digite na
classe principal, Teste.java, o seguinte código-fonte:
UNINOVE – uso exclusivo para aluno
package app;
public class Teste {
public static void main(String[] args) {
Calculo calc = new Calculo();
double med1 = calc.media(10.5, 13.6);
double med2 = calc.media(10.5, 13.6, 45.6);
int soma1 = calc.soma(14, 34);
double soma2 = calc.soma(14, 34, 56.7);
double r = calc.raizQuadrada(16);
System.out.println(med1);
System.out.println(med2);
System.out.println(soma1);
System.out.println(soma2);
System.out.println(r);
}
}
12.05
23.233333333333334
48
104.7
4.0
package app;
public class Teste {
public static void main(String[] args) {
Calculo calc = new Calculo();
UNINOVE – uso exclusivo para aluno
System.out.println(calc.media(10.5, 13.6));
System.out.println(calc.media(10.5, 13.6, 45.6));
System.out.println(calc.soma(14, 34));
System.out.println(calc.soma(14, 34, 56.7));
System.out.println(calc.raizQuadrada(16));
}
}
Note que, neste caso, são usadas operações aninhadas que chamam os métodos,
passam os parâmetros e já exibem os valores retornados, poupando a criação
de variáveis.
Como você deve ter percebido, pode criar uma classe apenas com métodos de
apoio para operações que irá utilizar na aplicação.
1 import javax.swing.JOptionPane;
2 public class Teste {
3 public static void main(String[] args) {
4 Funcionario funcionarios[];
5 funcionarios = new Funcionario[3];
6 Funcionario func;
7 for (int indice = 0; indice < funcionarios.length; indice++) {
8 func = new Funcionario();
9 func.setMatricula(Integer.parseInt(JOptionPane.showInputDialog("Digi
te a matrícula: ")));
10 func.setNome(JOptionPane.showInputDialog("Digite o nome: "));
11 func.setCargo(JOptionPane.showInputDialog("Digite o cargo: "));
12 func.setSalario(Double.parseDouble(JOptionPane.showInputDialog("Di
gite o salário: ")));
13 funcionarios[indice] = func;
14 }
15 for (int indice = 0; indice < funcionarios.length; indice++) {
16 func = funcionarios[indice];
17 JOptionPane.showMessageDialog(null,
"Matrícula:" + func.getMatricula() + "\n"
+ "Nome:" + func.getNome() + "\n"
+ "Cargo:" + func.getCargo() + "\n"
+ "Salário:" + func.getSalario() + "\n");
18 }
19 }
20 }
108 - Programação Orientada a Objetos com Java – sem mistérios –
Basicamente, o que esta classe faz é pedir dados de funcionários, colocar estes
dados em objetos da classe Funcionario.java e incluir cada um destes objetos
nas posições de uma array. Para isso, é utilizado um laço de repetição para
passar por cada posição da array (linhas de 7 à 14). Em seguida, o conteúdo
de cada objeto das posições da array tem seu conteúdo exibido. Para percorrer
a array, um laço de repetição é útilizado (linhas 15 à 18).
Para entender melhor todo o processo, segue uma explicação mais detalhada.
A linha 4 declara a array funcionarios e a linha 5 instancia a array com três
posições, sempre numeradas a partir de 0 (neste caso, de 0 à 2).
A linha 6 declara o objeto func da classe Funcionario.java.
A linha 5 inicia um laço de repetição que vai de 0 ao tamanho da array
funcionários -1, incrementando a variável indice em 1 a cada passagem pelo
interior do laço. Note que a variável indice é iniciada com valor 0. O laço de
UNINOVE – uso exclusivo para aluno
3.8 Resumo
Os conceitos fundamentais da orientação a objetos são classes, atributos,
métodos, construtores e objetos.
Uma classe é um arquivo de programa Java com algumas características especiais
para atender ao paradigma orientado a objetos. Assim, deve possuir uma declaração
e um construtor (explícito ou implícito). Além destas estruturas, pode possuir
declaração de atributos e/ou constantes e métodos. Classes com características
comuns normalmente são agrupadas em contêineres (espécie de pastas), chamados
pacotes. As bibliotecas de classes que fazem parte da linguagem Java normalmente
vêm agrupadas em pacotes, como java.swing, java.util etc. Para modelar (ou
desenhar) uma classe utiliza-se a notação do diagrama de classes da UML. Para
modelar um pacote, utiliza-se a notação do diagrama de pacotes.
As classes normalmente representam abstrações do mundo real para categorização
UNINOVE – uso exclusivo para aluno
atributo. Além dos métodos setter e getter, uma classe pode ter qualquer outro
método que pode atuar sobre os valores dos atributos ou não.
A técnica de ocultar de um objeto detalhes internos do funcionamento dos
métodos de uma classe, de forma que o conhecimento interno do corpo dos
métodos não seja necessário para chamá-los, é conhecida como encapsulamento.
Há classes que são criadas sem atributos, apenas com métodos, para executar
operações específicas na aplicação, que normalmente são chamadas diversas vezes.
Métodos em uma mesma classe podem ter o mesmo nome, desde que recebam
parâmetros diferentes. Neste caso, dizemos que há sobrecarga de métodos.
A entrada de dados do usuário em uma aplicação Java SE pode ser feita
via prompt de comando, utilizando a classe Scanner; via interface gráfica,
utilizando a classe JOptionPane; ou via formulário, utilizando outras classes
do pacote javax.swing.
UNINOVE – uso exclusivo para aluno
3.9 Exercícios
A seguir você encontrará exercícios práticos, onde terá que criar projetos no
NetBeans e digitar o código-fonte de classes, e também exercícios para fixar
os conceitos aprendidos neste Capítulo. Não deixe de fazer estes exercícios.
Aluno
- matricula:long
- nome:String
- disciplina:String
- numeroAulas:int
- numeroFaltas:int
- notaAv1:double
- notaAv2:double
- notaAv3:double
+ calcularMedia():double
+ calcularLimiteFaltas():double
+verificarSituacao(media:double, limiteFaltas:double):String
112 - Programação Orientada a Objetos com Java – sem mistérios –
Produto
- id:long
- nome:String
- marca:String
- preco:double
+ diminuirPreco(percentual:double):void
+ aumentarPreco(percentual:double):void
A) Classe.
B) Atributo.
C) Método.
D) Métodos setter.
E) Métodos getter.
F) Construtor.
G) Objeto.
H) Pacote.
114 - Programação Orientada a Objetos com Java – sem mistérios –
5) Que instrução na declaração do método indica que ele não retorna nada?
6) Quantos valores um método pode retornar de cada vez? Justifique sua resposta.
UNINOVE – uso exclusivo para aluno
Evandro Carlos Teruel - 115
4. Orientação a objetos –
conceitos avançados
4.1 Herança
Herança é um conceito proveniente da observação das relações humanas, onde
os filhos herdam características dos pais; e da modelagem de dados, onde
tabelas especializadas herdam atributos de tabelas generalizadas.
Você vai usar herança quando possuir um conjunto de atributos e/ou métodos
que é comum a um conjunto de classes e possuir alguns deles que são
específicos de cada classe. Nesse caso, você centraliza os que são comuns em
uma superclasse e os específicos coloca nas respectivas subclasses, de tal forma
que estas subclasses herdem os atributos e/ou métodos comuns da superclasse.
Segundo Horstmann (2009, p. 400),
a herança é um mecanismo para estender as classes exis-
tentes adicionando novos métodos e campos. A classe
mais geral chama-se superclasse e a classe mais espe-
cializada, que herda da superclasse chama-se subclasse.
Veja um exemplo de diagrama de classe representando uma relação de herança
entre as classes Conta, ContaCorrente e ContaPoupanca.
116 - Programação Orientada a Objetos com Java – sem mistérios –
UNINOVE – uso exclusivo para aluno
38
39 public void setNoConta(String noConta) {
40 this.noConta = noConta;
41 }
42
43 public String getNomeCliente() {
44 return nomeCliente;
45 }
46
47 public void setNomeCliente(String nomeCliente) {
48 this.nomeCliente = nomeCliente;
49 }
50
51 public double getSaldo() {
52 return saldo;
UNINOVE – uso exclusivo para aluno
53 }
54
55 public void setSaldo(double saldo) {
56 this.saldo = saldo;
57 }
58
59 }
7 this.limiteCheque = limiteCheque;
8 this.juroCheque = juroCheque;
9 }
10
11 public ContaCorrente() {
12 }
13
14 public double getLimiteCheque() {
15 return limiteCheque;
16 }
17
18 public void setLimiteCheque(double limiteCheque) {
19 this.limiteCheque = limiteCheque;
20 }
21
UNINOVE – uso exclusivo para aluno
1 import java.util.Date;
2
3 public class ContaPoupanca extends Conta {
4 private Date dataAniversario;
5
6 public ContaPoupanca(Date dataAniversario, String noBanco, String noAgencia,
String noConta, String nomeCliente, double saldo) {
7 super(noBanco, noAgencia, noConta, nomeCliente, saldo);
UNINOVE – uso exclusivo para aluno
8 this.dataAniversario = dataAniversario;
9 }
10
11 public ContaPoupanca() {
12 }
13
14 public Date getDataAniversario() {
15 return dataAniversario;
16 }
17
18 public void setDataAniversario(Date dataAniversario) {
19 this.dataAniversario = dataAniversario;
20 }
21 }
6 }
ctCor2
limiteCheque 10000.00
juroCheque 6.5
noBanco 035
noAgencia 143-2
noConta 01435-9
nomeCliente Evandro
saldo 32789.50
setLimiteCheque(double limiteCheque): void
getLimiteCheque(): double
setJuroCheque(double juroCheque): void
getJuroCheque(): double
setNoBanco(String noBanco): void
getNoBanco(): String
UNINOVE – uso exclusivo para aluno
1 import java.util.Date;
2 public class Principal {
3 public static void main(String[] args) {
4 ContaCorrente ctCor2;
5 ContaPoupanca ctPoup;
6 Date data;
7 data = new Date("07/10/2014");
8 ctCor2 = new ContaCorrente(10000.00, 6.5, "035", "143-2", "01435-9",
"Evandro", 32789.50);
9 ctPoup = new ContaPoupanca(data, "022", "347-2", "003491-1", "Ana Luiza",
18976.40);
10 System.out.println("Banco:" + ctCor2.getNoBanco() + "\n"
Evandro Carlos Teruel - 125
Observe na linha 7 que foi instanciado um objeto da classe Date onde foi
armazenada a data de “07/10/2014” neste objeto. Está será a data de aniversário
da conta poupança.
Na linha 8 foi instanciado um objeto da subclasse ContaCorrente.java, que
já estudamos anteriormente, e na linha 9 foi instanciado um objeto da classe
ContaPoupanca.java.
Na linha 10 o conteúdo dos atributos do objeto ctCor2 é obtido por meio de
chamadas aos métodos getter correspondentes e exibidos na tela. Já na linha
11, o conteúdo dos atributos do objeto ctPoup também é obtido por meio de
chamadas aos métodos getter e exibidos na tela.
Quando você compilar e executar o projeto por meio do pressionamento da
tecla F6, será apresentado na tela o seguinte resultado:
Banco:035
Agência:143-2
Conta:01435-9
Cliente:Evandro
Saldo:32789.5
Limite:10000.0
Juros do Cheque especial:6.5
Banco:022
Agência:347-2
Conta:003491-1
Cliente:Ana Luiza
Saldo:18976.4
Data de aniversário da conta:Thu Jul 10 00:00:00 BRT 2014
126 - Programação Orientada a Objetos com Java – sem mistérios –
Para alterar o conteúdo dos objetos podem ser feitas chamadas aos respectivos
métodos setter. Veja, por exemplo, como poderiam ser incluídos novos valores
no objeto ctCor2 após sua criação na classe Principal.java.
ctCor2.setNoBanco("546");
ctCor2.setNoConta("6758-9");
ctCor2.setNoAgencia("01564-2");
ctCor2.setNomeCliente("Marco Antônio");
ctCor2.setSaldo(23456.65);
ctCor2.setJuroCheque(5.9);
ctCor2.setLimiteCheque(1200.5);
Para inserir valores no objeto ctPoup você pode chamar os métodos setter
correspondentes de forma semelhante à inclusão que fizemos no objeto ctCor2.
herança
Subclasses são classes que herdam da superclasse. A herança é estabelecida
pela instrução extends na declaração das subclasses. As subclasses herdam das
superclasses atributos e métodos como se estivessem dentro das próprias subclasses.
No exemplo que estamos utilizando, ContaCorrente.java e ContaPoupanca.
java são tipos de Conta.java, logo, objetos do tipo ContaCorrente.java e
ContaPoupanca.java são também objetos do tipo Conta.java.
Veja o exemplo da instância de dois objetos ctCor3 e ctCor4:
14
15 public void setNome(String nome) {
16 this.nome = nome;
17 }
18
19 public double getValorBase() {
20 return valorBase;
21 }
22
23 public void setValorBase(double valorBase) {
24 this.valorBase = valorBase;
25 }
26
27 public double calcularPreco() {
28 return getValorBase();
29 }
30 }
7 this.peso = peso;
8 }
9
10 public double getPeso() {
11 return peso;
12 }
13
14 public void setPeso(double peso) {
15 this.peso = peso;
16 }
17
18 @Override
19 public double calcularPreco() {
20 return super.getValorBase() * this.peso;
21 }
UNINOVE – uso exclusivo para aluno
22 }
17 @Override
18 public double calcularPreco(){
19 return (super.getValorBase() * this.quantidade) – super.getValorBase() *
20/100;
20 }
21
22 }
Ao compilar e executar este projeto, o que pode ser feito pelo pressionamento
da tecla F6, será exibido na tela os seguintes valores:
Note que foram instanciados dois objetos p1 e p2 (linhas 3 e 4), ambos do tipo
Produto.java, porém, com chamadas ao construtor de subclasses diferentes. O
objeto p1 foi instanciado por meio de uma chamada ao construtor da subclasse
Alimento.java e o objeto p2 por meio uma chamada ao construtor da subclasse
Vestuario.java. Em ambas as instâncias, foram passados os mesmos valores
numéricos utilizados para calcular o preço do produto.
Na linha 5 é mostrado o nome do produto contido no atributo nome do objeto
p1 e o preço, calculado por meio de uma chamada ao método calcularPreco.
Evandro Carlos Teruel - 133
4.2 Interfaces
Uma interface, na orientação a objetos, é um tipo de classe que contém apenas
UNINOVE – uso exclusivo para aluno
Nas interfaces, os métodos não podem ter corpo, ou seja, devem ter apenas
uma assinatura (declaração).
Veja o exemplo da interface chamada Operacoes.java que possui a assinatura
do método calcularMedia.
O método não tem corpo entre chaves e termina com ponto e vírgula. Esta forma
de declaração é chamada de assinatura do método. A assinatura do método mostra
de onde o método pode ser acessado, o que o método retorna, o nome do método
e os parâmetros que eventualmente o método recebe, sem dizer o que o método
faz. Ela mostra apenas o que é necessário saber para acessar o método.
134 - Programação Orientada a Objetos com Java – sem mistérios –
Ao contrário das classes simples, uma interface nunca poderá ser instanciada,
por isso, não pode conter um construtor, já que o construtor é utilizado para
UNINOVE – uso exclusivo para aluno
Note que, para indicar que a classe implementa a interface, utilizou-se uma
linha tracejada com seta apontando para a interface. Acima do nome da interface
foi utilizado o estereótipo <<interface>>. Um estereótipo, neste caso, é uma
palavra que identifica uma categoria especial de classe.
As interfaces podem ser implementadas por diversas classes. Aliás, esta é uma
das grandes finalidades das interfaces, centralizar operações obrigando diversas
classes que necessitam destas operações a implementá-las. Por exemplo, você
pode centralizar a operação de login de um sistema em uma interface Login.
java e obrigar as classes Funcionario.java, Cliente.java e Fornecedor.java a
implementar a operação de login assinada na interface.
Uma classe pode implementar diversas interfaces. Por exemplo, se a classe
Professor.java deseja implementar as interfaces Operacoes.java e Aulas.java,
sua declaração deve ser:
Uma interface pode definir uma série de métodos, mas nunca conter
implementação deles. Ela só expõe o que seus métodos devem fazer, e
NOTA não como eles fazem. Como eles fazem será definido em uma imple-
mentação dessa interface.
4
5 public FuncionarioMensalista(String nome, double salario) {
6 this.nome = nome;
7 this.salario = salario;
8 }
9
10 public String getNome() {
11 return nome;
12 }
13
14 public void setNome(String nome) {
15 this.nome = nome;
16 }
17
18 public double getSalario() {
19 return salario;
20 }
21
22 public void setSalario(double salario) {
23 this.salario = salario;
24 }
25
26 @Override
27 public double calcularSalarioLiquido() {
28 return this.salario – this.salario*27.5/100;
29 }
30
31 }
Evandro Carlos Teruel - 139
33 this.diasTrabalhados = diasTrabalhados;
34 }
35
36 @Override
37 public double calcularSalarioLiquido() {
38 return valorDia*diasTrabalhados;
39 }
40
41 }
1 import javax.swing.JOptionPane;
2
3 public class Principal {
4
5 public static void main(String[] args) {
6 String nom;
7 double sal, valDia, valLiquido;
8 int diasTrab;
9 nom = JOptionPane.showInputDialog("Digite o nome do funcionário
mensalista");
10 sal = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor do
salário"));
11 FuncionarioMensalista fm = new FuncionarioMensalista(nom, sal);
12 valLiquido = fm.calcularSalarioLiquido();
13 System.out.println("Funcionário: " + fm.getNome() + "\nValor líquido a
receber: " + valLiquido);
14 nom = JOptionPane.showInputDialog("Digite o nome do funcionário
Diarista");
15 valDia = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor
do dia trabalhado"));
Evandro Carlos Teruel - 141
Note nas linhas 9 e 10 que são pedidos ao usuário o nome e o salário e estes
valores são armazenados, respectivamente, nas variáveis nom e sal. Na linha 11
é instanciado um objeto chamado fm do tipo FuncionarioMensalista.java, por
meio de uma chamada ao construtor desta classe. Veja que este objeto conterá
em seus atributos o nome e o salário do funcionário. Digamos que para nome
seja digitado “Maria” e para salário seja digitado 1000.00, este objeto terá o
UNINOVE – uso exclusivo para aluno
fm
nome Maria
salario 1000.00
setNome(String nome): void
getNome(): String
setSalario(double salario): void
getSalario(): double
calcularSalarioLiquido():double
Figura 4.11: Representação do formato do objeto fm.
do dia trabalhado e 10 para dias trabalhados no mês, este objeto terá o formato
mostrado na Figura 4.12.
fd
nome João
valorDia 100.00
diasTrabalhados 10
setNome(String nome): void
getNome(): String
setValorDia(double valorDia): void
getValorDia(): double
setDiasTrabalhados(int diasTrabalhados): void
getDiasTrabalhados(): int
calcularSalarioLiquido():double
UNINOVE – uso exclusivo para aluno
Funcionário: Maria
Valor líquido a receber: 725.0
Funcionário: João
Valor líquido a receber: 1000.0
3 }
Nas relações de herança uma subclasse não pode herdar de mais de uma
NOTA superclasse. Já nas relações com interfaces, uma classe pode implemen-
tar métodos de diversas interfaces, sendo obrigada a implementá-los.
Veja neste exemplo que há dois métodos abstratos (que contém apenas a
assinatura) e um método concreto (implementado).
Classes abstratas, assim como as interfaces, servem apenas como modelo para
classes concretas. Como são modelos de classes, não podem ser instanciadas
diretamente com a instrução new, mas podem ser herdadas por classes concretas
(subclasses). Uma classe pode herdar uma classe abstrata da mesma forma
que uma subclasse herda de uma superclasse nas relações de herança simples,
utilizando a instrução extends. Veja o exemplo a seguir:
@Override
public void desconectar() {
// a implementação do método deve ocorrer aqui
}
}
42
43 public double getSalario() {
44 return salario;
45 }
46
47 public void setSalario(double salario) {
48 this.salario = salario;
49 }
50
51 public double getDescontos() {
52 return descontos;
53 }
54
55 public void setDescontos(double descontos) {
56 this.descontos = descontos;
57 }
58
59 public double calcularSalarioLiquido() {
60 return salario – descontos;
61 }
62 }
12 case "B":
13 return "Contador";
14 default:
15 return "Auxiliar";
16 }
17 }
19 }
8 }
9
10 public String getAreaAtuacao() {
11 return areaAtuacao;
12 }
13
14 public void setAreaAtuacao(String areaAtuacao) {
15 this.areaAtuacao = areaAtuacao;
16 }
17
18 @Override
19 public String obterCargo() {
20 switch (super.getCategoria()) {
21 case "A":
22 return "Pesquisador";
UNINOVE – uso exclusivo para aluno
23 case "B":
24 return "Professor";
25 default:
26 return "Tutor";
27 }
28 }
29 }
Observe que esta classe herda a classe abstrata Funcionario.java (linha 1), o
que a obriga a criar um construtor (linhas de 5 a 8) e a implementar o método
obterCargo (linhas de 18 à 28).
Note que o método obterCargo, apesar de ter implementação semelhante nas
subclasses Administrativo.java e Academico.java, retornam valores diferentes,
por isso precisam ser implementados em cada uma das subclasses da classe
abstrata.
Note também que o construtor é necessário, pois ele precisa receber parâmetros
e passá-los para os atributos da classe abstrata Funcionario.java, o que é feito
pela instrução super (linha 6).
Para terminar a aplicação, escreva o código-fonte da classe Principal.java, por
onde instanciaremos os objetos das subclasse Administrativo.java e Acedemico.
java. O código-fonte da classe Principal.java é apresentado a seguir:
Após concluir a digitação das classes, compile e execute o projeto, por meio
da tecla F6. Aparecerá na tela o seguinte resultado:
6 public Cliente() {
7 }
8
9 public double obterRendaAjustada() {
10 return this.renda + obterValor();
11 }
12
13 public double obterValor() {
14 return 1000.00;
15 }
16 }
Observe que como os atributos id, nome e renda da classe Cliente.java são
públicos, não há necessidade de métodos setter para acessá-los. Bastou
instanciar o objeto cli da classe Cliente (linha 3) e acessar os atributos incluindo
valores neles (linhas 4 à 6).
Para exibir a renda (linha 7), bastou indicar o atributo do objeto onde estava
armazenado o valor da renda, sem a necessidade de obter o valor por meio de
um método getter. Onde teríamos que digitar cli.getRenda() se o atributo renda
fosse privado e tivesse um método getter para ele, bastou digitar cli.renda (linha
7). O acesso é direto, pois renda é um atributo público na classe Cliente.java.
Para exibir a renda ajustada, o método obterRendaAjustada da classe Cliente.java
foi chamado por meio do objeto cli (linha 8). Este método pôde ser chamado a
partir da classe Principal.java porque é público na classe Cliente.java.
Evandro Carlos Teruel - 155
1 import javax.swing.JOptionPane;
2
3 public class Calculo {
4 private final double IR=27.5;
5
6 public Calculo() {
7 }
8
9 private double obterPercentual(){
10 return Double.parseDouble (JOptionPane.showInputDialog ("Digite o valor do
percentual: "));
11 }
12
13 public double ajustarSalario(double salario){
14 return (salario + salario * obterPercentual()/100) - (salario * IR/100);
15 }
16 }
156 - Programação Orientada a Objetos com Java – sem mistérios –
Veja que na linha 4 foi criada a constante privada IR do tipo double contendo
o valor 27.5. Como sabe, não será possível, na aplicação, mudar o valor
armazenado, pois trata-se de uma constante. A palavra final é quem define que
se trata de uma constante.
Nas linhas de 9 à 11 foi criado o método privado obterPercentual. Por ser
privado, este método só poderá ser chamado de dentro desta classe. A chamada
a este método ocorre da linha 14, do interior do método ajustarSalario. O
método obterPercentual solicita um percentual, converte em double e retorna.
Veja que o método ajustarSalario é público, assim, poderá ser chamado a
partir de outras classes da aplicação. Este método recebe um valor de salário
do tipo double, aplica o percentual de aumento obtido na chamada ao método
obterPercentual, subtrai o desconto de imposto contido na constante IR e
retorna o resultado.
UNINOVE – uso exclusivo para aluno
1 import javax.swing.JOptionPane;
2 public class Teste {
3 public static void main(String[] args) {
4 double salario = Double.parseDouble (JOptionPane.showInputDialog
("Digite o valor do percentual: "));
5 Calculo c = new Calculo();
6 System.out.print ("Salário Líquido: " + c.ajustarSalario(salario));
7 }
8 }
String nome;
double salario;
Funcionário func;
func = new Funcionário(1367, "Paulo Henrique", "Gerente", 789.56);
func=null;
Quando o objeto func torna-se nulo, ele vira candidato a ser desalocado da
memória pelo Garbage Collector.
Tipos primitivos (char, byte, short, int, long, float, double e boolean)
NOTA alocados dentro de um método não são liberados da memória pelo
Garbage Collector.
4.6 Anotações
UNINOVE – uso exclusivo para aluno
4.7 Resumo
As relações de herança na programação orientada a objetos podem ocorrer de
várias maneiras e utilizando vários recursos, como herança simples, interfaces
e classes abstratas.
Você deve utilizar herança na sua forma pura e simples quando tem um
conjunto de atributos e/ou métodos comuns que deseja que várias subclasses
compartilhem. Para não repetir essa parte comum nas subclasses da relação de
herança, centralize-os na superclasse e herde-os nas subclasses. As subclasses
Evandro Carlos Teruel - 159
poderão ter, além dos recursos herdados, seus próprios recursos (atributos,
métodos etc.). Uma subclasse pode herdar de apenas uma superclasse. Não
há herança múltipla em Java antes da versão 8, porém, a versão 8 já permite
herança múltipla. As subclasses também podem ser superclasses de outras
subclasses, em cadeias de herança.
Você deve utilizar interfaces quando deseja obrigar que um conjunto de classes
implementem os mesmos métodos, porém, de maneiras diferentes. Estas classes
também poderão implementar seus próprios métodos específicos.
As interfaces estabelecem um contrato em que as classes que implementam as
interfaces devem aceitar, implementando os métodos assinados nas interfaces.
Os métodos nas interfaces são, por padrão, públicos e abstratos, não podendo
ser declarados de outra forma.
Você deve utilizar classes abstratas quando tem um conjunto de atributos e/ou
UNINOVE – uso exclusivo para aluno
métodos comuns que deseja que várias subclasses compartilhem (como nas
relações de herança), e também quer que estas subclasses sejam obrigadas
a implementar certos métodos de maneiras diferentes. As classes abstratas
representam uma mistura entre os recursos providos pelas relações de herança
simples e pelas interfaces. Classes abstratas podem ter variáveis, métodos
abstratos, métodos implementados, construtores, atributos e constantes.
Tanto as interfaces quanto as classes abstratas não podem ser instanciadas
diretamente. Você deve instanciar sempre as subclasses ligadas a elas.
Nas relações de herança simples, com interfaces e com classes abstratas,
normalmente você tem um mesmo método em várias subclasses implementado
de maneiras diferentes. Objetos dessas subclasses que chamam estes métodos
normalmente obtém resultados diferentes. Esta é uma das características que
permite obter o que chamamos na orientação a objetos de polimorfismo (objetos
do mesmo tipo, mas com formas/comportamentos diferentes).
Em uma aplicação, normalmente criamos diversas classes que se comunicam
normalmente por meio da criação de objetos umas das outras. A partir de um
objeto de uma classe, é possível acessar seus métodos, desde que o modificador
de visibilidade permita. Os modificadores de visibilidade definem de onde
métodos, variáveis e constantes (recursos) de uma classe podem ser acessados.
Se o recurso possuir o modificador public, o recurso poderá ser acessado de
qualquer classe da aplicação. Se possuir o modificador private, só poderá ser
acessado do interior da própria classe. Se possuir o modificador protected, só
poderá ser acessado a partir de classes que estão no mesmo pacote da classe que
contém o recurso ou de subclasses de uma classe em uma relação de herança.
Se não possuir modificador, poderá ser acessado somente de dentro da própria
classe e de classes que estejam no mesmo pacote da classe que contém o recurso.
160 - Programação Orientada a Objetos com Java – sem mistérios –
4.8 Exercícios
Você encontrará a seguir exercícios práticos, onde precisará criar projetos e
escrever o código-fonte de várias classes e exercícios para fixar os conceitos
teóricos do Capítulo. Não deixe de resolvê-los e esclarecer dúvidas com seu
professor, caso você seja um estudante de ensino técnico ou superior.
Crie uma classe principal, cadastre uma pessoa física e exiba o nome dela por
meio do método escreverNome.
Pessoa
<<interface>>
Validador nome : String
escreverNome()
validarDocumento() : Boolean
validarDocumento() : Boolean
Juridica Fisica
cnpj : String cpf : String
escreverNome() escreverNome()
validarDocumento() : Boolean validarDocumento() : Boolean
Filme
14) Quais instruções são utilizadas para indicar que uma classe herda outra e
que implementa os métodos abstratos de outra?
16) Uma classe pode implementar mais de uma interface? Justifique sua resposta.
17) Quando uma classe implementa uma interface, o que ela será obrigada a fazer?
18) O que é um método abstrato e em que tipos de classes eles podem aparecer?
5. Métodos estáticos e
tratamento de exceções
Para que isso não ocorra, as exceções precisam ser tratadas de forma que se
ocorrerem o programa possa contorná-las com o menor impacto possível.
No decorrer deste capítulo serão apresentados exemplos de tratamento das
principais exceções.
double b = Math.pow(10,3);
Esta operação calcula 103, logo, a variável b receberá o valor 1000.00. Note
que o método pow da classe Math.java é chamado diretamente por meio do
nome da classe. Veja como este método é escrito na classe Math.java:
Sempre que digitar o nome de uma classe que possui métodos e/ou constantes
acessíveis, estes métodos/constantes aparecerão em uma lista para que você
possa escolhê-los, ao invés de digitá-los. Este é um recurso do NetBeans para
facilitar a vida do desenvolvedor.
Outros exemplos que utilizamos anteriormente foram os métodos estáticos
da classe JOptionPane.java, que vem instalada no pacote javax.swing, que
estudaremos no Capítulo 6. Veja um exemplo de uso do método estático
showInputDialog desta classe:
import javax.swing.JOptionPane;
public class Principal {
public static void main(String[] args) {
String c = JOptionPane.showInputDialog( "Digite o nome da cidade");
}
}
166 - Programação Orientada a Objetos com Java – sem mistérios –
String sal="12678.56";
double d = Double.parseDouble(sal);
UNINOVE – uso exclusivo para aluno
int i=10;
String j= String.valueOf(i);
Veja que foi chamado o método estático valueOf da classe String.java. Observe
como este método está escrito na classe String.java:
classe chamada Principal.java no pacote padrão. Veja na Figura 5.2 como deve
estar seu projeto após realizar estes procedimentos.
1 package calc.mat;
2
3 public class Calculo {
4
5 public static double soma(double a, double b) {
6 return a + b;
7 }
8
9 public static double soma(double a, double b, double c) {
10 return a + b + c;
11 }
12
13 public static int soma(int a, int b) {
14 return a + b;
15 }
16
17 public static String obterInfo() {
18 return "Esta é uma classe teste";
19 }
20
21 public static double mult(int a, int b) {
22 return a * b;
23 }
24 }
Note que há vários métodos, todos estáticos, que executam tarefas específicas.
Note que vários destes métodos possuem o mesmo nome, mas recebem
parâmetros diferentes. O nome disto é sobrecarga de métodos, lembra? Já
discutimos isso em capítulos anteriores.
168 - Programação Orientada a Objetos com Java – sem mistérios –
1 import calc.mat.Calculo;
2
3 public class Principal {
4
UNINOVE – uso exclusivo para aluno
1 package calc.mat;
2
3 public class Soma {
4
5 public static double soma(double a, double b) {
6 return a + b;
7 }
8
9 public static double soma(double a, double b, double c) {
10 return a + b + c;
11 }
12
13 public static int soma(int a, int b) {
14 return a + b;
15 }
16 }
Evandro Carlos Teruel - 171
1 package calc.mat;
2
3 public class Multiplica {
4
5 public static double mult(int a, int b) {
6 return a * b;
7 }
8
9 public static double mult(double a, double b) {
10 return a * b;
11 }
12
13 public static int mult(int a, int b, int c) {
UNINOVE – uso exclusivo para aluno
14 return a * b;
15 }
16 }
Agora que você já digitou o código-fonte das duas classes, vamos gerar a
biblioteca. Para isso, terá que compilar a aplicação e gerar um arquivo de
distribuição que terá o mesmo nome do projeto, mas com a extensão .jar. Clique
no menu “Executar” e na opção “Limpar e Construir Projeto (Matematica)”.
Será gerado o arquivo Matematica.jar na subpasta dist, contida na pasta do
projeto. O caminho provavelmente será “\Matematica\dist\Matematica.jar”.
Nossa biblioteca é o arquivo Matematica.jar.
Para usar a biblioteca criada, vamos iniciar um novo projeto Java chamado
NovoProjeto. Nesse projeto, crie uma classe principal chamada Principal.java.
Clique na pasta “Biblioteca” do projeto com o botão direito do mouse e
selecione a opção “Adicionar Jar/Pasta”, como mostra a Figura 5.4.
Figura 5.4: Adicionando uma biblioteca JAR na pasta “Bibliotecas” do projeto Java
criado com o NetBeans.
172 - Programação Orientada a Objetos com Java – sem mistérios –
Figura 5.5: Exibição das bibliotecas de classes do projeto criado com o uso do NetBeans.
1 import calc.mat.Multiplica;
2 import calc.mat.Soma;
3
4 public class Principal {
5
6 public static void main(String[] args) {
7 double m = Multiplica.mult(10.5, 2.3);
8 double n = Soma.soma(2.1, 3.0, 4.3);
9 System.out.print("Resultado da multiplicação: " + m);
10 System.out.print("Resultado da soma: " + n);
11 }
12 }
Note nas linhas 7 e 8 que são chamados os métodos das classes que estão na
biblioteca do projeto, diretamente pelo nome da classe, afinal, os métodos são
estáticos.
Evandro Carlos Teruel - 173
try {
// linha(s) que podem causar a exceção
}
catch (Classe_que_vai_tratar_a_exceção objeto_da_classe)
{
//O que deve acontecer se a exceção ocorrer
}
Veja na mensagem que já aparece o nome da classe que deve ser utilizada no
catch para tratar a exceção, a classe ArithmeticException, e também a descrição
do erro “/by zero”.
Para evitarmos que a exceção cause o erro mostrado na Figura 5.6, altere o
UNINOVE – uso exclusivo para aluno
System.out.println(v.getMessage());
Outros dados do erro podem ser obtidos por meio deste objeto.
Vamos a outro exemplo prático.
Crie um novo projeto Java no NetBeans e digite o seguinte código-fonte na
classe Principal.java:
import javax.swing.JOptionPane;
public class Principal {
UNINOVE – uso exclusivo para aluno
import javax.swing.JOptionPane;
public class Principal {
public static void main(String[] args) {
try{
int idade = Integer.parseInt(JOptionPane.showInputDialog("Digite sua
idade"));
} catch(NumberFormatException e){
JOptionPane.showMessageDialog(null, "Digite apenas números no
campo idade");
}
}
}
Veja que a classe que deve ser utilizada no catch para o tratamento da exceção
UNINOVE – uso exclusivo para aluno
é a classe ArrayIndexOutOfBoundsException.
Para resolver este problema, você pode alterar a classe da seguinte forma:
Veja que a linha 3 pode gerar uma exceção de falta da classe Driver.class e
desviar para a linha 6, onde os dados do erro ficarão no objeto ex da classe
ClassNotFoundException, e será retornado para quem chamou o método o
valor 2.
A linha 4 pode gerar uma exceção por encontrar dados incorretos do banco
de dados. Os dados do erro ficarão no objeto x da classe SQLException e será
retornado o valor 3 para que chamou o método.
Evandro Carlos Teruel - 179
Note que o método acima retorna um valor inteiro para quem chamá-lo. Se as
linhas 3 e 4 forem executadas sem erro, será retornado o valor 1. Se a linha
2 gerar a exceção de ClassNotFoundException, será retornado o valor 2. Se
a linha 4 gerar uma exceção do tipo SQLException, será retornado o valor 3.
Com os valores retornados quem chamou o método saberá o que ocorreu na
sua execução. Os métodos de acesso a bancos de dados serão melhor estudados
no Capítulo 7 deste livro.
Caso você não tenha certeza de qual exceção será gerada, pode usar uma forma
UNINOVE – uso exclusivo para aluno
Note que qualquer tipo de exceção que ocorrer nas linhas do interior das chaves
do try irá desviar para o catch, que receberá em um objeto da classe Exception
informações da exceção e retornará o valor 2. Nesse caso, duas exceções
diferentes podem ocorrer, uma na linha 3 e outra na linha 4. O desvio para um
único catch não permite diferenciar o tratamento das duas, mas apresentar um
tratamento genérico. Este é o motivo pelo qual esta forma de tratamento de
exceções não é recomendada.
declara que pode lançar o erro, e se este ocorrer, o método que o chamou deve
tratar a exceção.
Se você colocar throws na declaração do método, você está dizendo algo como:
“Olha, tem certas operações que eu executo mas que não tenho a mínima ideia de
como resolver, resolva você”.
Por exemplo:
1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.SQLException;
4 public class Dao {
5 public int conectar(String driver, String url, String usuario, String senha)
throws ClassNotFoundException, SQLException{
6 Class.forName(driver);
7 Connection conn = DriverManager.getConnection (url, usuario, senha);
8 return 1;
9 }
10 }
1 import java.sql.SQLException;
2 public class Principal {
3 public static void main(String[] args) {
4 Dao d = new Dao();
5 try {
6 int r = d.conectar();
7 } catch (ClassNotFoundException ex) {
8 System.out.print("A classe do driver de acesso ao banco de dados não está
dispponível");
9 } catch (SQLException ex) {
10 System.out.print("Há um erro nos dados de conexão com o banco de dados");
11 }
UNINOVE – uso exclusivo para aluno
12 }
13 }
As formas mais comuns de lidar com exceções foram apresentadas neste capítulo,
mas há muito mais sobre exceções. Você pode conferir no link: <http://blog.
caelum.com.br/lidando-com-exceptions/> um bom artigo intitulado “Lidando
com Exceptions”. Se deseja informações mais técnicas, acesse o link:
<http://www.caelum.com.br/apostila-java-orientacao-objetos/excecoes-e-con
trole-de-erros/#11-11-exercicios-excecoes>.
182 - Programação Orientada a Objetos com Java – sem mistérios –
5.3 Resumo
Este capítulo tratou de dois assuntos: uso de métodos estáticos e tratamento
de exceções.
Métodos estáticos podem ser chamados diretamente por meio do nome
da classe, sem precisar instanciar objeto. Aqueles métodos de apoio que
utilizamos com frequência em diversas classes e/ou aplicações, normalmente
declaramos como estáticos em uma classe e incluímos na biblioteca do projeto.
O Java traz um conjunto de classes com métodos estáticos para facilitar o
trabalho do programador, como a classe Math, para operações matemáticas e
trigonométricas; e a classe JOptionPane, para gerar caixas de diálogo etc. Uma
classe pode ter métodos estáticos e não estáticos. Para declarar um método
como estático, utiliza-se a instrução static na declaração do método. Utilize
métodos estáticos para criar bibliotecas e reutilizá-las em vários projetos.
UNINOVE – uso exclusivo para aluno
Uma exceção em Java ocorre por meio da entrada não esperada de dados do
usuário, por parâmetros incorretos para um método, pela falta de um recurso
requerido etc. Tratar a exceção permite minimizar o problema, evitando a
interrupção da execução do programa e a exibição daquelas mensagens de
erro que assustam o usuário.
O tratamento de exceções em Java pode ocorrer por meio de duas estruturas
fundamentais: try...catch e throws.
Utilize throws em um método quando você não quer ou não sabe como tratar
a exceção e deseja deixar o tratamento para quem chamar o método. Nesse
caso, dizemos que o throws lança a exceção para ser tratada por quem chamou
o método.
Utilize try...catch para tratar a exceção de fato, quando você sabe qual é a
exceção e como ela deve ser tratada. O try tenta executar uma linha ou bloco
de linhas. Se ocorrer algum problema, automaticamente é feito um desvio para
o catch, que executa a ação necessária relacionada a resolução do problema.
5.4 Exercícios
1) Analise o código abaixo e preencha corretamente a lacuna:
Este código gerará uma exceção do tipo NullPointerException. Como você não
deseja tratar a exceção, mas sim deixar que ela seja tratada por quem chamar
o método, reescreva o código de forma a permitir isso.
import javax.swing.JOptionPane;
public class Teste {
public static void main(String[] args) {
int a[] = new int[3];
for (int cont = 0; cont <= a.length; cont++) {
a[cont] = Integer.parseInt(JOptionPane.showInputDialog("Digite um
valor inteiro"));
}
}
}
184 - Programação Orientada a Objetos com Java – sem mistérios –
import javax.swing.JOptionPane;
public class Teste {
public static void main(String[] args) {
int a, b, c;
a = Integer.parseInt(JOptionPane.showInputDialog("Digite um valor
inteiro"));
b = Integer.parseInt(JOptionPane.showInputDialog("Digite outro
UNINOVE – uso exclusivo para aluno
valor inteiro"));
c = a / b;
}
}
A) Trate a exceção que será gerada se for digitado na primeira caixa de diálogo
o valor abaixo:
B) Trate a exceção que será gerada se for digitado na segunda caixa de diálogo
o valor abaixo:
Evandro Carlos Teruel - 185
7) Crie uma classe em um projeto Java com um método estático para calcular
a média entre três notas, descartando a menor delas, calculando a média das
duas maiores e retornando o resultado. Construa o arquivo .JAR do projeto.
Crie um novo projeto e adicione o arquivo .JAR à biblioteca. Crie uma classe
UNINOVE – uso exclusivo para aluno
principal nesse projeto, leia três notas e utilize o método estático da classe que
está na biblioteca do projeto para calcular a média.
Evandro Carlos Teruel - 187
6. Criação de
interface gráfica
1 import javax.swing.JButton;
UNINOVE – uso exclusivo para aluno
2 import javax.swing.JFrame;
3 import javax.swing.JLabel;
4 import javax.swing.JTextField;
5
6 public class TelaCliente extends JFrame{
7 private JLabel lblNome, lblRenda;
8 private JTextField txtNome, txtRenda;
9 private JButton btnSalvar, btnSair;
10
11 public TelaCliente() {
12 // definindo propriedades do formulário
13 setLayout(null);
14 setDefaultCloseOperation(EXIT_ON_CLOSE);
15 setSize(600, 200);
16 setLocation(200, 300);
17 setTitle("Controle de Clientes");
18
19 //Definindo propriedades dos campos do formulário
20 lblNome = new JLabel("Nome:");
21 lblNome.setSize(50,30);
22 lblNome.setLocation(30,10);
23 add(lblNome);
24
25 txtNome = new JTextField();
26 txtNome.setSize(480,30);
27 txtNome.setLocation(80,10);
28 add(txtNome);
29
30 lblRenda = new JLabel("Renda:");
31 lblRenda.setSize(50,30);
Evandro Carlos Teruel - 191
32 lblRenda.setLocation(30,45);
33 add(lblRenda);
34
35 txtRenda = new JTextField();
36 txtRenda.setSize(100,30);
37 txtRenda.setLocation(80,45);
38 add(txtRenda);
39
40 btnSalvar = new JButton("Salvar");
41 btnSalvar.setSize(80,30);
42 btnSalvar.setLocation(30,90);
43 add(btnSalvar);
44
45 btnSair = new JButton("Sair");
46 btnSair.setSize(80,30);
UNINOVE – uso exclusivo para aluno
47 btnSair.setLocation(120,90);
48 add(btnSair);
49 }
50 }
setSize(600, 200);
setLocation(200, 300);
UNINOVE – uso exclusivo para aluno
As linhas a seguir criam o campo vazio para a digitação do nome, por meio de
um objeto txtNome da classe JTextField (linhas 25 à 28). Veja na Figura 6.5
como este campo aparecerá na janela.
As linhas a seguir criam o rótulo “Renda:” por meio de um objeto lblRenda da classe
JLabel (linhas 30 à 33). Veja na Figura 6.6 como este rótulo aparecerá na janela.
As linhas a seguir criam o campo vazio para a digitação da renda por meio de
um objeto txtRenda da classe JTextField (linhas 35 à 38). Veja na Figura 6.7
como este campo aparecerá na janela.
Quando você chama um método a partir de um objeto, este método pode ser
da classe que instanciou o objeto ou de qualquer uma de suas subclasses,
quando esta classe herda outras classes. Veja por exemplo a seguinte chamada
ao método setSize:
NOTA que faz parte de uma cadeia de herança, o método pode ser de qualquer
uma das classes da cadeia de herança.
Você deve ter observado que utilizamos duas classes para criar a aplicação:
TelaCliente.java e Principal.java.
Poderíamos ter conseguido o mesmo resultado apenas com a classe Principal.
UNINOVE – uso exclusivo para aluno
java. Para isso, o código-fonte desta classe deveria ficar da seguinte forma:
1 import javax.swing.JButton;
2 import javax.swing.JFrame;
3 import static javax.swing.JFrame.EXIT_ON_CLOSE;
4 import javax.swing.JLabel;
5 import javax.swing.JTextField;
6
7 public class Principal extends JFrame {
8
9 private JLabel lblNome, lblRenda;
10 private JTextField txtNome, txtRenda;
11 private JButton btnSalvar, btnSair;
12
13 public Principal() {
14 // definindo propriedades do formulário
15 setLayout(null);
16 setDefaultCloseOperation(EXIT_ON_CLOSE);
17 setSize(600, 200);
18 setLocation(200, 300);
19 setTitle("Controle de Clientes");
20
21 //Definindo propriedades dos campos do formulário
22 lblNome = new JLabel("Nome:");
23 lblNome.setSize(50, 30);
24 lblNome.setLocation(30, 10);
25 add(lblNome);
26
27 txtNome = new JTextField();
198 - Programação Orientada a Objetos com Java – sem mistérios –
28 txtNome.setSize(480, 30);
29 txtNome.setLocation(80, 10);
30 add(txtNome);
31
32 lblRenda = new JLabel("Renda:");
33 lblRenda.setSize(50, 30);
34 lblRenda.setLocation(30, 45);
35 add(lblRenda);
36
37 txtRenda = new JTextField();
38 txtRenda.setSize(100, 30);
39 txtRenda.setLocation(80, 45);
40 add(txtRenda);
41
42 btnSalvar = new JButton("Salvar");
UNINOVE – uso exclusivo para aluno
43 btnSalvar.setSize(80, 30);
44 btnSalvar.setLocation(30, 90);
45 add(btnSalvar);
46
47 btnSair = new JButton("Sair");
48 btnSair.setSize(80, 30);
49 btnSair.setLocation(120, 90);
50 add(btnSair);
51 }
52
53 public static void main(String[] args) {
54 Principal tela = new Principal();
55 tela.setVisible(true);
56 }
57 }
se tem sobre a criação da tela, este método requer cálculos para posicionar
corretamente os componentes, o que demanda um pouco mais de tempo.
Além do posicionamento estático, podemos utilizar gerenciadores de layout
que fazem todo trabalho de cálculo para alinhamento, posicionamento
e dimensionamento dos componentes. Os gerenciadores de layout são a
seguintes classes do pacote java.awt: FlowLayout, GridLayout, BorderLayout
e GridBagLayout.
Estes gerenciadores de layout serão apresentados a seguir neste capítulo.
6.2.1 FlowLayout
Este gerenciador de layout é o mais simples de todos e possui as seguintes
características:
– Faz o alinhamento padrão ao centro e acima, com deslocamento em
linhas (flow = fluxo). Quando você adiciona o primeiro elemento, ele
é posicionado ao centro e na parte de cima do contêiner. Quando você
adiciona novos elementos, eles vão sendo posicionados em linha, à
direita do anterior. Se acabar a área disponível na linha, o elemento cai
automaticamente para a próxima linha. Apesar dos elementos aparecerem
por padrão ao centro, eles podem ser posicionados à esquerda ou à
direita.
– Tem a capacidade de manter o tamanho original dos componentes
durante o redimensionamento (mantém o prefered size dos componentes).
Se você redimensiona a janela, o tamanho dos componentes não é
modificado, mantendo os valores originais.
200 - Programação Orientada a Objetos com Java – sem mistérios –
1 import java.awt.FlowLayout;
2 import javax.swing.*;
3 public class Principal extends JFrame {
4 private JLabel lblNome, lblRenda;
5 private JTextField txtNome, txtRenda;
6 private JButton btnSalvar, btnSair;
7
8 public Principal() {
9 // Propriedades da janela
10 setTitle("Exemplo de Flow layout");
11 setLayout(new FlowLayout());
12 setDefaultCloseOperation(EXIT_ON_CLOSE);
13 setSize(600, 200);
14 setLocation(200, 300);
15
16 // definição dos componentes da janela
17 lblNome = new JLabel("Nome:");
18 add(lblNome);
19 txtNome = new JTextField(45);
20 add(txtNome);
21 lblRenda = new JLabel("Renda:");
22 add(lblRenda);
23 txtRenda = new JTextField(15);
24 add(txtRenda);
25 btnSalvar = new JButton("Salvar");
26 add(btnSalvar);
27 btnSair = new JButton("Sair");
Evandro Carlos Teruel - 201
28 add(btnSair);
29 }
30
31 public static void main(String args[]) {
32 Principal tela = new Principal();
33 tela.setVisible(true);
34 }
35 }
setLayout(new FlowLayout(FlowLayout.LEFT));
UNINOVE – uso exclusivo para aluno
6.2.2 BorderLayout
O gerenciador de layout BorderLayout divide o contêiner em cinco áreas: norte,
sul, leste, oeste e centro. Além de não manter o tamanho original dos componentes
durante o redimensionamento (já que eles são aumentados de acordo com a tela),
o contêiner pode receber somente um componente por área. A Figura 6.14 mostra
como o gerenciador de layout BorderLayout divide a janela.
1 import java.awt.BorderLayout;
2 import javax.swing.*;
3 import static javax.swing.JFrame.EXIT_ON_CLOSE;
4
5 public class Tela extends JFrame {
6
7 private JButton btnCentro, btnLeste, btnOeste, btnNorte, btnSul;
8
9 public Tela() {
10 setTitle("Exemplo com Border Layout");
11 setLayout(new BorderLayout());
12 setDefaultCloseOperation(EXIT_ON_CLOSE);
13 setSize(700, 200);
14 setLocation(300, 200);
15 btnCentro = new JButton("Centro");
16 add(btnCentro, BorderLayout.CENTER);
17 btnLeste = new JButton("Leste");
18 add(btnLeste, BorderLayout.EAST);
19 btnSul = new JButton("Sul");
20 add(btnSul, BorderLayout.SOUTH);
21 btnNorte = new JButton("Norte");
22 add(btnNorte, BorderLayout.NORTH);
23 btnOeste = new JButton("Oeste");
24 add(btnOeste, BorderLayout.WEST);
25 }
26
27 public static void main(String args[]) {
28 Tela tela = new Tela();
29 tela.setVisible(true);
30 }
31 }
204 - Programação Orientada a Objetos com Java – sem mistérios –
Veja que foi colocado um botão em cada região do layout – já que só é permitido
um elemento por área – e eles ocuparam todo o espaço daquela área. Se você
aumentar ou diminuir a janela, o tamanho dos botões aumenta ou diminui
proporcionalmente.
Este tipo de layout é utilizado para que cada região da janela receba
novos contêineres (normalmente JPanel) e estes contêineres menores
NOTA agrupem elementos como botões, rótulos, campos texto etc. Veremos
como fazer isso mais adiante neste capítulo.
Evandro Carlos Teruel - 205
6.2.3 GridLayout
O gerenciador de layout GridLayout divide o contêiner em linhas e colunas
como uma tabela com células (grid). Se você aumentar ou diminuir a janela,
o tamanho dos componentes acompanharão proporcionalmente as novas
dimensões da janela, ou seja, se você aumentar a janela, o tamanho dos
componentes aumenta, se diminuir, o tamanho dos componentes diminui. Em
cada célula do grid, ou seja, em cada posição do layout, você pode colocar
apenas um elemento.
17 setSize(600, 200);
18 setLocation(300, 200);
19 lblNome = new JLabel("Nome:");
20 add(lblNome);
21 txtNome = new JTextField();
22 add(txtNome);
23 lblRenda = new JLabel("Renda:");
24 add(lblRenda);
25 txtRenda = new JTextField();
26 add(txtRenda);
27 btnSalvar = new JButton("Salvar");
28 add(btnSalvar);
29 btnSair = new JButton("Sair");
30 add(btnSair);
31 }
UNINOVE – uso exclusivo para aluno
32
33 public static void main(String args[]) {
34 Tela tela = new Tela();
35 tela.setVisible(true);
36 }
37 }
Note que a linha 34 instancia um objeto da própria classe Tela.java por meio
do comando new, que chama o construtor da classe (linhas de 13 à 31). Nessa
operação, todo o conteúdo do construtor é executado, gerando a tela. A linha
35 exibe a janela.
Evandro Carlos Teruel - 207
6.2.4 GridBagLayout
O gerenciador de layout GridBagLayout é o mais flexível de todos, porém, é
o mais complexo, pois cada elemento deve conter uma posição inicial, uma
posição final, um tamanho, uma escala, um alinhamento e um preenchimento.
Ele divide o contêiner em linhas e colunas como uma tabela com células (grid).
Dependendo do alinhamento dentro de uma célula, pode ou não manter o
tamanho original dos componentes. Em cada célula, pode ser colocado apenas
um componente e cada célula pode ser expandida para ocupar o espaço de
uma ou mais células adjacentes usando regras específicas de alinhamento e
posicionamento.
Quando se utiliza o gerenciador de layout GridBagLayout, um objeto da classe
GridBagConstraints é normalmente utilizado para determinar o posicionamento
do elemento na grid.
1 import java.awt.*;
2 import javax.swing.*;
3 import static javax.swing.JFrame.EXIT_ON_CLOSE;
4
5 public class Tela extends JFrame {
6
7 private JButton btn1, btn2, btn3, btn4;
8
9 public Tela() {
10 setTitle("Exemplo com GridBagLayout");
11 setDefaultCloseOperation(EXIT_ON_CLOSE);
12 setSize(500, 200);
13 setLayout(new GridBagLayout());
14 GridBagConstraints gridCons = new GridBagConstraints();
15
16 btn1 = new JButton("Um");
17 btn2 = new JButton("Dois");
18 btn3 = new JButton("Três");
Evandro Carlos Teruel - 209
35 add(btn4, gridCons);
36 }
37
38 public static void main(String args[]) {
39 Tela tela = new Tela();
40 tela.setVisible(true);
41 }
42 }
gridCons.fill = GridBagConstraints.BOTH;
0 1 2 3 4 5
0 Nome:
1 Renda:
2 Salvar Sair
Figura 6.22: Exemplo de layout GridBagLayout.
Note que:
UNINOVE – uso exclusivo para aluno
1 import java.awt.*;
2 import javax.swing.*;
3 import static javax.swing.JFrame.EXIT_ON_CLOSE;
4
5 public class Tela extends JFrame {
6
7 private JLabel lblNome, lblRenda;
8 private JTextField txtNome, txtRenda;
9 private JButton btnSalvar, btnSair;
10
11 public Tela() {
12 setTitle("Exemplo com GridBagLayout");
13 setDefaultCloseOperation(EXIT_ON_CLOSE);
UNINOVE – uso exclusivo para aluno
14 setSize(700, 200);
15 setLayout(new GridBagLayout());
16 GridBagConstraints gridCons = new GridBagConstraints();
17
18 lblNome = new JLabel("Nome:");
19 txtNome = new JTextField(45);
20 lblRenda = new JLabel("Renda:");
21 txtRenda = new JTextField(15);
22 btnSalvar = new JButton("Salvar");
23 btnSair = new JButton("Sair");
24
25 gridCons.gridx = 0;
26 gridCons.gridy = 0;
27 gridCons.gridwidth = 2;
28 add(lblNome, gridCons);
29
30 gridCons.gridx = 2;
31 gridCons.gridy = 0;
32 gridCons.gridwidth = 4;
33 add(txtNome, gridCons);
34
35 gridCons.gridx = 0;
36 gridCons.gridy = 1;
37 gridCons.gridwidth = 2;
38 gridCons.insets = new Insets(15, 0, 8, 0);
39 add(lblRenda, gridCons);
40
41 gridCons.gridx = 2;
42 gridCons.gridy = 1;
214 - Programação Orientada a Objetos com Java – sem mistérios –
43 gridCons.gridwidth = 2;
44 gridCons.anchor = GridBagConstraints.WEST;
45 add(txtRenda, gridCons);
46
47 gridCons.gridx = 1;
48 gridCons.gridy = 2;
49 gridCons.gridwidth = 2;
50 gridCons.insets = new Insets(5, 5, 5, 5);
51 gridCons.anchor = GridBagConstraints.CENTER;
52 add(btnSalvar, gridCons);
53
54 gridCons.gridx = 3;
55 gridCons.gridy = 2;
56 gridCons.gridwidth = 2;
57 gridCons.anchor = GridBagConstraints.CENTER;
UNINOVE – uso exclusivo para aluno
58 add(btnSair, gridCons);
59 }
60
61 public static void main(String args[]) {
62 Tela tela = new Tela();
63 tela.setVisible(true);
64 }
65 }
Neste exemplo será comentado apenas o que é novo em relação aos exemplos
anteriores. Veja que o rótulo lblNome, criado na linha 18, será posicionado na
coluna 0 e linha 0 e terá duas colunas de largura.
Já o campo txtNome, criado na linha 19, será posicionado na coluna 2 e linha
0 e terá 4 colunas de largura.
O rótulo lblRenda, criado na linha 20, será posicionado na coluna 0 e linha 1
e terá duas colunas de largura. Note que este rótulo terá 15 pixels de margem
superior e 8 pixel de margem inferior. Isso foi definido pela propriedade insets
(linha 38) com objetivo de desgrudar o conteúdo desta linha das demais.
O campo txtRenda, criado na linha 21, será posicionado na coluna 2 e linha 1 e
terá 2 colunas de largura. Como o tamanho deste campo não chega a preencher
as duas colunas, ele foi alinhado à esquerda pela propriedade anchor da linha 44.
O botão btnSalvar, criado na linha 22, será posicionado na coluna 1 e linha 2
e terá 2 colunas de largura. Este botão terá uma margem de 5 pixel em todos
os seus lados (linha 50) e será centralizado (linha 51).
O botão btnSair, criado na linha 23, será posicionado na coluna 3 e linha 2 e
terá 2 colunas de largura. Este botão será centralizado (linha 57).
Evandro Carlos Teruel - 215
Figura 6.25: Exemplo de Layout que utiliza Grid BagLayout com mesclagem de células.
15
16 // Propriedades da janela (JFrame)
17 setTitle("Layout composto");
18 setDefaultCloseOperation(EXIT_ON_CLOSE);
19 setLocation(200, 130);
20 setSize(640, 480);
21 setLayout(new BorderLayout());
22
23 // Criação dos elementos
24 btnNovo = new JButton("Novo");
25 btnSalvar = new JButton("Salvar");
26 btnLimpar = new JButton("Limpar");
27 btnSair = new JButton("Sair");
28 lblMensagem = new JLabel("Mensagem: ");
29 lblHora = new JLabel("Data e Hora: " + new Date().toString());
30 txtAreaTexto = new JTextArea("Digite seu texto aqui: ", 20, 40);
31 pnlScrTexto = new JScrollPane(txtAreaTexto,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
32
33 // Criação do painel para colocar os botões e adição dos botões a
este painel
34 pnlBotoes = new JPanel(new FlowLayout());
35 pnlBotoes.add(btnNovo);
36 pnlBotoes.add(btnSalvar);
37 pnlBotoes.add(btnLimpar);
38 pnlBotoes.add(btnSair);
39
40 // Criação do painel para a barra de status e adição dos botões a
este painel
218 - Programação Orientada a Objetos com Java – sem mistérios –
56 }
adicionados a ele.
Na linha 46 o painel pnlBotoes é adicionado à janela ao norte, já que a janela
usa o gerenciador de layout BorderLayout.
Na linha 47 o painel pnlSrcTexto, que contém a caixa de texto com barras de
rolagem, é inserido na janela ao centro.
Na linha 48 o painel pnlBarraStatus é adicionado à janela ao sul.
Após compilar e executar o projeto pressionando a tecla F6 será exibida a
janela mostrada na Figura 6.27.
pnlBotoes.setCursor(hand);
Cursor text = new Cursor(Cursor.TEXT_CURSOR);
txtAreaTexto.setCursor(text);
Cursor cross = new Cursor(Cursor.CROSSHAIR_CURSOR);
pnlBarraStatus.setCursor(cross);
objeto da classe Font são passados como parâmetro para o construtor o tipo
da fonte, o efeito desejado e o tamanho da fonte.
txtAreaTexto.setForeground(Color.blue);
UNINOVE – uso exclusivo para aluno
Ou ainda:
txtAreaTexto.setForeground(new Color(255,0,126));
pnlBotoes.setBackground(new Color(0,255,0));
Ou ainda:
Ou ainda:
txtAreaTexto.setForeground(Color.green);
222 - Programação Orientada a Objetos com Java – sem mistérios –
Ou ainda:
Note que a aplicação no elemento da borda definida ocorre por meio do método
setBorder da classe do elemento em que se quer aplicar a borda. Para que estas
instruções funcionem terá que importar as classes Border e LineBorder, por
meio das instruções:
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
setSize(800, 700);
setLocation(300, 200);
Por:
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension d = tk.getScreenSize();
int largura = d.width/2;
Evandro Carlos Teruel - 223
Note que o tamanho da tela é obtido por meio de uma chamada ao método
getScreenSize da classe Toolkit e armazenado em um objeto d da classe
Dimension. Por meio desse objeto é possível obter a largura (width) e a altura
(height) da tela. A divisão por 2 é utilizada para achar o ponto central da tela
(eixos x e y). A janela terá a largura e a altura da medida deste ponto central,
o que é definido na passagem do parâmetro para o método setSize. O ponto de
posição inicial da janela será a medida do ponto central dividida por dois, o
que é definido no parâmetro passado ao método setLocation.
setSize(800, 700);
setLocation(300, 200);
btnSalvar.setSize(100, 30);
btnSalvar.setLocation(10, 20);
Neste tópico, vamos utilizar outros componentes que nos permitirá criar
interfaces mais ricas, com menus (classe JMenuBar), caixas de diálogo (classe
JOptionPane), combos (classe JComboBox), listas (classe JList) e tabelas
(classe JTable).
1 import javax.swing.*;
2 import static javax.swing.JFrame.EXIT_ON_CLOSE;
3
4 public class TelaMenu extends JFrame {
Evandro Carlos Teruel - 225
5
6 private JMenuItem mnuItmAbrir, mnuItmNovo, mnuItmSalvar, mnuItmSair,
mnuItmCopiar, mnuItmColar, mnuItmRecortar;
7 private JMenu mnuArquivo, mnuEditar;
8 private JMenuBar mnuBar;
9
10 public TelaMenu() {
11 setTitle("Exemplo de menu");
12 setDefaultCloseOperation(EXIT_ON_CLOSE);
13 setSize(400, 200);
14 setLocation(300, 200);
15 // instanciando os objetos referentes aos elementos do menu
16 mnuItmAbrir = new JMenuItem("Abrir");
17 mnuItmNovo = new JMenuItem("Novo");
18 mnuItmSalvar = new JMenuItem("Salvar");
19 mnuItmSair = new JMenuItem("Sair");
UNINOVE – uso exclusivo para aluno
Note que apenas dois parâmetros são passados para o método showMessageDialog:
null e a mensagem “Erro na aplicação”.
Veja a tela que será gerada na Figura 6.30.
UNINOVE – uso exclusivo para aluno
Como visto nos capítulos anteriores, para receber o valor digitado em uma
variável de tipo numérico primitivo você deve converter o valor digitado de
String para o tipo numérico desejado.
Veja os exemplos a seguir:
1 import javax.swing.*;
2 import java.awt.*;
UNINOVE – uso exclusivo para aluno
Observe que os botões de cada linha estão em um painel diferente. Note que podem
ser selecionados vários botões check da segunda linha, porém na terceira linha é
permitido selecionar apenas um sexo por meio dos botões radio. Na terceira linha
o botão “Alarme” pode ser ativado com um clique e desativado com outro. Veja
na Figura 6.38 como ficará a janela após as algumas seleções de botões.
Ainda não estamos programando as ações dos botões, ou seja, o que deve
ocorrer quando o botão for clicado, mas vamos fazer isso mais a frente no
tópico sobre tratamento de eventos.
234 - Programação Orientada a Objetos com Java – sem mistérios –
chkTeatro.setText(“Shows”);
Troca o rótulo do botão pela palavra “Shows”.
UNINOVE – uso exclusivo para aluno
chkTeatro.setSelected(true);
Seleciona automaticamente o botão.
chkTeatro.setVisible(true);
Torna o botão visível. Para ocultá-lo, mude o parâmetro para false.
if(chkTeatro.isSelected()){}
Verifica se o botão está selecionado.
Para testar o uso dessas classes, crie um novo projeto chamado ProjetoCampos,
com uma classe chamada Tela.java, como mostra a Figura 6.39.
1 import javax.swing.*;
2 import java.awt.*;
UNINOVE – uso exclusivo para aluno
3 import java.text.*;
4 import static javax.swing.JFrame.EXIT_ON_CLOSE;
5 import javax.swing.text.MaskFormatter;
6
7 public class Tela extends JFrame {
8
9 private JLabel lblNome, lblNascimento, lblTelefone, lblCpf, lblCep, lblEndereco;
10 private JTextField txtNome;
11 private JFormattedTextField txtNascimento, txtCep, txtTelefone, txtCpf;
12 private JTextArea txtEndereco;
13 MaskFormatter mskCep, mskTelefone, mskCpf, mskNascimento;
14
15 public Tela() {
16 setLayout(new GridLayout(6, 1));
17 FlowLayout esquerda = new FlowLayout(FlowLayout.LEFT);
18 setDefaultCloseOperation(EXIT_ON_CLOSE);
19 setSize(600, 450);
20 setLocation(300, 200);
21 // Criação dos rótulos dos campos
22 lblNome = new JLabel("Nome");
23 lblNascimento = new JLabel("Nascimento");
24 lblTelefone = new JLabel("Telefone");
25 lblCpf = new JLabel("CPF");
26 lblCep = new JLabel("CEP");
27 lblEndereco = new JLabel("Endereço");
28 // Criação dos campos e definição das máscaras quando pertinente
29 txtNome = new JTextField(40);
30 try {
31 mskNascimento = new MaskFormatter("##/##/####");
236 - Programação Orientada a Objetos com Java – sem mistérios –
32 mskNascimento.setPlaceholderCharacter('_');
33 mskTelefone = new MaskFormatter("(##)####-####");
34 mskTelefone.setPlaceholderCharacter('_');
35 mskCpf = new MaskFormatter("#########-##");
36 mskCpf.setPlaceholderCharacter('_');
37 mskCep = new MaskFormatter("#####-###");
38 mskCep.setPlaceholderCharacter('_');
39 } catch (ParseException ex) {
40 JOptionPane.showMessageDialog (null,"Erro na definição das
máscaras dos campos");
41 }
42 txtNascimento = new JFormattedTextField(mskNascimento);
43 txtTelefone = new JFormattedTextField(mskTelefone);
44 txtCpf = new JFormattedTextField(mskCpf);
45 txtCep = new JFormattedTextField(mskCep);
46 txtEndereco = new JTextArea("", 3, 40);
UNINOVE – uso exclusivo para aluno
74 add(pnlNascimento);
75 add(pnlTelefone);
76 add(pnlCpf);
77 add(pnlCep);
78 add(pnlEndereco);
79
80 }
81
82 public static void main(String arg[]) {
83 Tela tela = new Tela();
84 tela.setVisible(true);
85 }
86 }
Use sempre que possível painéis para agrupar campos ou para agrupar
UNINOVE – uso exclusivo para aluno
Veja na Figura 6.41 como fica a tela após o preenchimento dos campos.
UNINOVE – uso exclusivo para aluno
txtCep.requestFocus();
Posiciona o cursor no campo.
txtCep.setForeground(Color.BLUE);
Define a cor de letra para o campo.
240 - Programação Orientada a Objetos com Java – sem mistérios –
txtCep.setBackground(Color.red);
Define a cor de fundo para o campo.
txtCep.setText("04135-090");
Inclui o valor entre aspas no campo.
1 import javax.swing.*;
2 import java.awt.*;
3
4 public class TelaLista extends JFrame {
5
6 private JList lstCidades;
7 private DefaultListModel lstCidadesModel;
8
9
10 public TelaLista() {
11
Evandro Carlos Teruel - 241
27 lstCidadesModel.addElement(cidade2);
28 lstCidadesModel.addElement(cidade3);
29
30 add(lstCidades, BorderLayout.CENTER);
31
32 JLabel lblCidade = new JLabel("Escolha uma cidade");
33 add(lblCidade, BorderLayout.NORTH);
34 }
35
36 public static void main(String arg[]) {
37 TelaLista tela = new TelaLista();
38 tela.setVisible(true);
39 }
40 }
Para criar uma lista foram utilizados objetos de duas classes: DefaultListModel
e JList. Quando foi instanciado um objeto da classe JList que efetivamente criou
a lista, foi preciso passar como parâmetro o objeto da classe DefaultListModel,
indicando que a lista utiliza um modelo padrão (linha 19).
Note nas linhas de 22 à 24 que são criadas três variáveis do tipo String como
nomes de cidades que serão colocadas na lista nas linhas de 26 à 28 por meio dos
métodos addElement da classe DefaultListModel. As opções da lista recebem um
número de índice iniciado por 0, na ordem que são inseridas na lista.
Na linha 30 a lista é adicionada à janela (JFrame) utilizando o gerenciador de
layout BorderLayout. Veja que a lista é posicionada na área “CENTER”, ou
seja, na área central do layout.
Para que a lista tenha um rótulo como título, um objeto da classe JLabel foi
instanciado na linha 32 e adicionado à janela, ao norte.
242 - Programação Orientada a Objetos com Java – sem mistérios –
Veja que foi clicado na primeira opção da lista e ela ficou selecionada. Você
pode rolar o cursor sobre os elementos da lista utilizando as teclas de direção
do teclado ou clicar na opção que deseja selecionar.
lstCidadesModel.add(2, "Franca");
Adiciona o elemento "Franca" na terceira posição da lista de cima para baixo,
ou seja, na posição de índice 2.
lstCidadesModel.clear();
Remove todos os elementos da lista.
if(lstCidadesModel.contains("Campinas")){ }
Verifica se a lista contém a opção "Campinas".
if(lstCidadesModel.isEmpty()){}
Verifica se a lista está vazia.
Evandro Carlos Teruel - 243
lstCidadesModel.insertElementAt("Itu", 2);
Insere o elemento "Itu" na posição de índice 2 da lista.
lstCidadesModel.remove(2);
Remove o elemento de índice número 2 da lista, ou seja, a terceira opção da
lista de cima para baixo.
lstCidadesModel.removeAllElements();
Remove todos os elementos da lista e define o tamanho da lista como 0.
lstCidadesModel.removeElement("São Paulo");
Remove o elemento "São Paulo" da lista.
244 - Programação Orientada a Objetos com Java – sem mistérios –
lstCidadesModel.removeElementAt(2);
Remove o elemento de índice 2.
lstCidadesModel.set(2, "Votuporanga");
Substitui o item de índice 2 da lista por "Votuporanga".
lstCidadesModel.setSize(2);
Define o número de elementos visíveis na lista.
Você percebeu que as opções foram adicionadas à lista (JList) por meio do
seu modelo (DefaultListModel). Se você quiser, pode dispensar o modelo e
adicionar as opções diretamente na lista, da seguinte forma:
Neste caso você poderia utilizar no objeto lstCidades da classe JList para
acessar diversos métodos importantes, dentre eles:
lstCidades.setForeground(Color.BLUE);
Define uma cor de letra para as opções da lista.
1 import javax.swing.*;
2 import java.awt.*;
3 import static javax.swing.JFrame.EXIT_ON_CLOSE;
4
5 public class TelaCombo extends JFrame {
6
7 private JComboBox cmbCidades;
8 private DefaultComboBoxModel cmbCidadesModel;
9
10 public TelaCombo() {
11
12 setTitle("Exemplo ComoBox");
13 setDefaultCloseOperation(EXIT_ON_CLOSE);
14 setSize(300, 200);
15 setLocation(300, 200);
16
17 cmbCidadesModel = new DefaultComboBoxModel();
18 cmbCidades = new JComboBox(cmbCidadesModel);
19
20 String cidade1 = "São Paulo";
21 String cidade2 = "Rio de Janeiro";
22 String cidade3 = "Campinas";
23
24 cmbCidadesModel.addElement(cidade1);
246 - Programação Orientada a Objetos com Java – sem mistérios –
25 cmbCidadesModel.addElement(cidade2);
26 cmbCidadesModel.addElement(cidade3);
27 cmbCidades.setEditable(true);
28
29 JPanel auxNomes = new JPanel();
30 auxNomes.add(cmbCidades);
31 add(auxNomes, BorderLayout.WEST);
32
33 JLabel lblTituloLista = new JLabel("Escolha uma opção");
34 add(lblTituloLista, BorderLayout.NORTH);
35 }
36
37 public static void main(String arg[]) {
38 TelaCombo tela = new TelaCombo();
39 tela.setVisible(true);
UNINOVE – uso exclusivo para aluno
40 }
41 }
cmbCidadesModel.insertElementAt("Franca", 2);
Insere o elemento "Franca" na posição de índice 2 da lista.
248 - Programação Orientada a Objetos com Java – sem mistérios –
cmbCidadesModel.removeAllElements();
Remove todos os elementos da lista.
cmbCidadesModel.removeElement("Campinas");
Remove o elemento "Campinas" da lista.
cmbCidadesModel.removeElementAt(1);
Remove o elemento de índice 1 da lista.
cmbCidadesModel.setSelectedItem("Itu");
Muda o item selecionado da lista para "Itu".
UNINOVE – uso exclusivo para aluno
Ou ainda:
Veja alguns métodos que podem ser aplicados por meio do objeto cmbCidades
da classe JComboBox, sem utilizar o DefaultComboBoxModel:
cmbCidades.removeItem("Rio de Janeiro");
Remove o item "Rio de Janeiro" da caixa de combinação.
cmbCidades.removeItemAt(1);
Remove o segundo item da caixa de combinação, de cima para baixo, ou seja,
o item "Rio de Janeiro", que tem índice 1.
Evandro Carlos Teruel - 249
cmbCidades.removeAllItems();
Remove todos os itens da caixa de combinação.
cmbCidades.setSelectedItem("Campinas");
A opção selecionada e visível na caixa de combinação será "Campinas".
cmbCidades.setSelectedIndex(2);
A opção selecionada e visível na caixa de combinação será a terceira opção de
cima para baixo (opção que tem índice 2), ou seja, "Campinas".
cmbCidades.setForeground(Color.BLUE);
Define a cor azul de fundo para a caixa de combinação.
cmbCidades.setMaximumRowCount(2);
Define o número de opções que estará visível quando abrir a caixa de combinação.
1 import javax.swing.*;
2 import javax.swing.table.*;
3 import java.awt.*;
4 import static javax.swing.JFrame.EXIT_ON_CLOSE;
5
6 public class TelaTabela extends JFrame {
7
8 private JTable tblClientes;
9 private DefaultTableModel tblClientesModel;
10
11 public TelaTabela() {
12 setTitle("Exemplo de tabela");
13 setDefaultCloseOperation(EXIT_ON_CLOSE);
14 setSize(400, 200);
15 setLocation(300, 200);
16
17 String[] cols = {"Código", "Nome", "E-mail"};
18 tblClientesModel = new DefaultTableModel(cols, 4);
Evandro Carlos Teruel - 251
33 add(scrRolagem, BorderLayout.CENTER);
34
35 JLabel lblTitulo = new JLabel("Lista de Clientes");
36 add(lblTitulo, BorderLayout.NORTH);
37
38 }
39
40 public static void main(String arg[]) {
41 TelaTabela tela = new TelaTabela();
42 tela.setVisible(true);
43 }
44 }
Note que na linha 17 foi criada uma array unidimensional e nela foram
armazenados os valores que serão rótulos das colunas da tabela. Esta array
foi adicionada à tabela na linha 18, juntamente com o número de linhas que a
tabela deverá ter, neste caso, 4 linhas.
Na linha 19 foi instanciado um objeto da classe JTable aplicando o modelo de
tabela instanciado na linha 18.
Nas linhas de 21 à 24 foram criadas arrays unidimensionais com os valores
que serão adicionados em cada linha da tabela. Nas linhas de 26 à 29, estas
arrays foram adicionadas à tabela, respectivamente, nas linhas de 0 à 3, pois
apesar da tabela ter 4 linhas, a numeração vai de 0 à 3.
Na linha 30 foi definido o número de linhas da tabela, neste caso, 4 linhas.
Na linha 32, a tabela foi adicionada à barra de rolagem, indicando, pelos
parâmetros, que estas barras (verticais e horizontais) estarão sempre visíveis,
independente do conteúdo da tabela exceder a área disponível ou não. Na linha
252 - Programação Orientada a Objetos com Java – sem mistérios –
tblClientesModel.addColumn("Telefone");
Adiciona a coluna "Telefone" à direita na tabela.
tblClientesModel.setNumRows(6);
Determina que a tabela terá 6 linhas.
tblClientesModel.setColumnCount(5);
Determina que a tabela terá 5 colunas.
tblClientesModel.removeRow(3);
Remove a linha de número 3 da tabela.
254 - Programação Orientada a Objetos com Java – sem mistérios –
– Eventos de Mouse.
Nos tópicos seguintes serão apresentados exemplos de cada uma dessas
categorias.
@Override
public void actionPerformed(ActionEvent e) {
}
}
Evandro Carlos Teruel - 255
A classe Aplicativo.java vai gerar uma janela com diversos campos e dois
botões: “Adicionar à tabela” e “Limpar campos”. Ao preencher os campos e
clicar no botão “Adicionar à tabela”, o conteúdo dos campos são adicionados
UNINOVE – uso exclusivo para aluno
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.text.ParseException;
6 import static javax.swing.JFrame.EXIT_ON_CLOSE;
7 import javax.swing.border.TitledBorder;
8 import javax.swing.table.DefaultTableModel;
9 import javax.swing.text.MaskFormatter;
10
11 public class Aplicativo extends JFrame implements ActionListener {
12
13 private JPanel pnlCampos, pnlTabela, pnlBotoes, pnlNome,
pnlTelefone, pnlCidade;
14 private TitledBorder tituloPnlCampos, tituloPnlTabela, tituloPnlBotoes;
15 private JLabel lblNome, lblTelefone, lblCidade;
16 private JTextField txtNome;
17 private JFormattedTextField txtTelefone;
18 private MaskFormatter mskTelefone;
19 private JTable tblClientes;
20 private DefaultTableModel tblClientesModel;
21 JButton btnAdicionar, btnLimpar;
22 private JComboBox cmbCidades;
23 private DefaultComboBoxModel cmbCidadesModel;
24
256 - Programação Orientada a Objetos com Java – sem mistérios –
25 public Aplicativo() {
26 definirJanela();
27
28 pnlCampos = new JPanel(new GridLayout(3, 1));
29 tituloPnlCampos = BorderFactory.createTitledBorder("Cadastro de
Clientes");
30 pnlCampos.setBorder(tituloPnlCampos);
31
32 pnlBotoes = new JPanel(new FlowLayout());
33 tituloPnlBotoes = BorderFactory.createTitledBorder("Botões");
34 pnlBotoes.setBorder(tituloPnlBotoes);
35
36 pnlTabela = new JPanel(new GridLayout(1, 1));
37 tituloPnlTabela = BorderFactory.createTitledBorder("Tabela de
exibição de dados");
38 pnlTabela.setBorder(tituloPnlTabela);
UNINOVE – uso exclusivo para aluno
39
40 lblNome = new JLabel("Nome");
41 lblTelefone = new JLabel("Telefone");
42 lblCidade = new JLabel("Cidade");
43 txtNome = new JTextField(50);
44 try {
45 mskTelefone = new MaskFormatter("(##)####-####");
46 mskTelefone.setPlaceholderCharacter('_');
47 } catch (ParseException ex) {
48 JOptionPane.showMessageDialog(null, "Máscara incorreta");
49 }
50 txtTelefone = new JFormattedTextField(mskTelefone);
51 cmbCidadesModel = new DefaultComboBoxModel();
52 cmbCidades = new JComboBox(cmbCidadesModel);
53
54 String cidade1 = "São Paulo";
55 String cidade2 = "Rio de Janeiro";
56 String cidade3 = "Campinas";
57 cmbCidadesModel.addElement(cidade1);
58 cmbCidadesModel.addElement(cidade2);
59 cmbCidadesModel.addElement(cidade3);
60
61 pnlNome = new JPanel(new FlowLayout(FlowLayout.LEFT));
62 pnlNome.add(lblNome);
63 pnlNome.add(txtNome);
64 pnlCampos.add(pnlNome);
65
66 pnlTelefone = new JPanel(new FlowLayout(FlowLayout.LEFT));
67 pnlTelefone.add(lblTelefone);
Evandro Carlos Teruel - 257
68 pnlTelefone.add(txtTelefone);
69 pnlCampos.add(pnlTelefone);
70
71 pnlCidade = new JPanel(new FlowLayout(FlowLayout.LEFT));
72 pnlCidade.add(lblCidade);
73 pnlCidade.add(cmbCidades);
74 pnlCampos.add(pnlCidade);
75
76 btnAdicionar = new JButton("Adicionar à tabela");
77 btnAdicionar.addActionListener(this);
78 btnLimpar = new JButton("Limpar campos");
79 btnLimpar.addActionListener(this);
80 pnlBotoes.add(btnAdicionar);
81 pnlBotoes.add(btnLimpar);
82
UNINOVE – uso exclusivo para aluno
Figura 6.50: Janela com campos preenchidos e tratamento de evento de clique em botões.
Evandro Carlos Teruel - 261
1 import java.awt.event.WindowAdapter;
2 import java.awt.event.WindowEvent;
3 import javax.swing.JOptionPane;
4
5 public class EventoOpen extends WindowAdapter {
6
7 @Override
8 public void windowOpened(WindowEvent we) {
9 JOptionPane.showMessageDialog(null, "A janela foi aberta");
10 }
11 }
1 import java.awt.event.WindowAdapter;
2 import java.awt.event.WindowEvent;
3 import javax.swing.JOptionPane;
4
5 public class EventoClose extends WindowAdapter {
6
7 @Override
8 public void windowClosing(WindowEvent we) {
9 int resp = JOptionPane.showConfirmDialog(null, "Deseja sair ?");
10 if (resp == JOptionPane.YES_OPTION) {
11 System.exit(0);
12 }
13 }
14 }
1 import java.awt.FlowLayout;
2 import javax.swing.JFrame;
3 import javax.swing.JLabel;
4 import javax.swing.JTextField;
5
6 public class Tela extends JFrame {
7
8 private JLabel lblNome;
9 private JTextField txtNome;
10
11 public Tela() {
UNINOVE – uso exclusivo para aluno
12 setTitle("Eventos de Janela");
13 setSize(300, 200);
14 setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
15 setLayout(new FlowLayout());
16 lblNome = new JLabel("Nome");
17 txtNome = new JTextField(20);
18 add(lblNome);
19 add(txtNome);
20 addWindowListener(new EventoClose());
21 addWindowListener(new EventoOpen());
22 }
23
24 public static void main(String[] args) {
25 Tela t = new Tela();
26 t.setVisible(true);
27 }
28 }
Esta é uma classe comum, que gera uma janela com um botão para a inclusão
do nome. Criamos dezenas de classes como esta nos tópicos anteriores, por
isso, vamos à explicação apenas do necessário.
Veja na linha 14 que a finalização automática da aplicação ao se clicar no “X”
do canto superior direito da janela foi cancelada. Isso foi necessário porque
queremos que ao clicar no “X” seja gerado um evento e chamado o método
windowClosing da classe EventoClose.java.
O método addWindowListener da linha 20 monitora a janela até que ela feche.
Quando isso ocorrer, um objeto da classe EventoClose.java é instanciado
264 - Programação Orientada a Objetos com Java – sem mistérios –
e passado como parâmetro para este método. Isso faz com que o método
windowClosing da classe EventoClose.java seja executado.
O mesmo acontece na linha 21, mas com a classe EventoOpen.java, que executa
o método windowOpened.
Perceba que são as linhas 20 e 21 que “puxam o gatilho”, quando o evento
ocorre e direcionam para os métodos corretos para tratá-los. Dessa forma, se
deseja apenas tratar o evento de fechamento da janela, mantenha a linha 20 e
retire a linha 21. Se deseja apenas tratar o evento de abertura da janela, mantenha
apenas a linha 21.
As linhas 20 e 21 poderiam ser desmembradas em quatro linhas, mantendo o
mesmo resultado, ficando da seguinte forma:
addWindowListener(evtClose);
EventoOpen evtOpen = new EventoOpen();
addWindowListener(evtOpen);
1 import java.awt.FlowLayout;
2 import java.awt.event.WindowAdapter;
3 import java.awt.event.WindowEvent;
4 import javax.swing.JFrame;
5 import javax.swing.JLabel;
6 import javax.swing.JOptionPane;
7 import javax.swing.JTextField;
8
UNINOVE – uso exclusivo para aluno
38 }
39
40 public static void main(String[] args) {
41 Tela t = new Tela();
42 t.setVisible(true);
43 }
44 }
Por exemplo, uma caixa de texto ganha o foco quando você clica sobre ela; e
perde o foco quando você sai dela.
Podemos usar diversas classes para tratar eventos de foco, como FocusListener,
FocusAdapter e FocusEvent. Neste tópico criaremos um exemplo utilizando
as duas últimas.
Trataremos os eventos de foco de forma semelhante à que tratamos os eventos
de janela, criando classes auxiliares para o tratamento dos eventos.
Para testar o uso destes eventos, crie um projeto Java no NetBeans chamado
AplicativoFoco e nele crie as classes EventoGanhaFoco.java, EventoPerdeFoco.
java e Tela.java (classe principal), conforme mostra a Figura 6.54.
Nesse projeto, será gerada uma janela com dois campos: nome e renda. Quando
o campo renda ganhar o foco do cursor, será chamado o método focusGained da
classe EventoGanhaFoco.java. Quando o campo perder o foco, será chamado
o método focusLost da classe EventoPerdeFoco.java.
Evandro Carlos Teruel - 267
1 import java.awt.event.FocusAdapter;
2 import java.awt.event.FocusEvent;
3
4 public class EventoGanhaFoco extends FocusAdapter {
5
6 @Override
7 public void focusGained(FocusEvent e) {
8 System.out.println("O campo Renda ganhou o foco");
9 }
10 }
1 import java.awt.event.FocusAdapter;
2 import java.awt.event.FocusEvent;
3
4 public class EventoPerdeFoco extends FocusAdapter {
5
6 @Override
7 public void focusLost(FocusEvent e) {
8 System.out.println("O campo Renda perdeu o foco");
9 }
10 }
1 import java.awt.FlowLayout;
2 import javax.swing.JFrame;
3 import javax.swing.JLabel;
4 import javax.swing.JTextField;
5
6 public class Tela extends JFrame {
7
268 - Programação Orientada a Objetos com Java – sem mistérios –
23 add(txtRenda);
24 txtRenda.addFocusListener(new EventoGanhaFoco());
25 txtRenda.addFocusListener(new EventoPerdeFoco());
26 }
27
28 public static void main(String[] args) {
29 Tela t = new Tela();
30 t.setVisible(true);
31 }
32 }
Caso queira, ao invés de criar classes auxiliares para tratar os eventos de ganho
e perda de foco, pode fazer diretamente na classe que gera a janela, ou seja,
na classe Tela.java, da seguinte forma:
1 import java.awt.FlowLayout;
2 import java.awt.event.FocusAdapter;
3 import java.awt.event.FocusEvent;
4 import javax.swing.JFrame;
5 import javax.swing.JLabel;
6 import javax.swing.JTextField;
270 - Programação Orientada a Objetos com Java – sem mistérios –
7
8 public class Tela extends JFrame {
9
10 private JLabel lblNome, lblRenda;
11 private JTextField txtNome, txtRenda;
12
13 public Tela() {
14 setTitle("Eventos de Foco");
15 setSize(300, 200);
16 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
17 setLayout(new FlowLayout());
18 lblNome = new JLabel("Nome");
19 txtNome = new JTextField(20);
20 lblRenda = new JLabel("Renda");
21 txtRenda = new JTextField(10);
UNINOVE – uso exclusivo para aluno
22 add(lblNome);
23 add(txtNome);
24 add(lblRenda);
25 add(txtRenda);
26 txtRenda.addFocusListener(new FocusAdapter() {
27 @Override
28 public void focusGained(FocusEvent we) {
29 System.out.println("O campo Renda ganhou o foco");
30 }
31 });
32 txtRenda.addFocusListener(new FocusAdapter() {
33 @Override
34 public void focusLost(FocusEvent we) {
35 System.out.println("O campo Renda perdeu o foco");
36 }
37 });
38 }
39
40 public static void main(String[] args) {
41 Tela t = new Tela();
42 t.setVisible(true);
43 }
44 }
9
10 public class Tela extends JFrame {
11
12 private JLabel lblNome;
13 private JTextField txtNome;
14 private JButton btnSalvar;
15
16 public Tela() {
17 setTitle("Eventos de Mouse");
18 setSize(300, 200);
19 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
20 setLayout(new FlowLayout());
21 lblNome = new JLabel("Nome");
22 txtNome = new JTextField(20);
23 btnSalvar = new JButton("Salvar");
UNINOVE – uso exclusivo para aluno
24
25 add(lblNome);
26 add(txtNome);
27 add(btnSalvar);
28 btnSalvar.addMouseListener(new MouseAdapter() {
29 @Override
30 public void mouseEntered(MouseEvent we) {
31 btnSalvar.setBackground(Color.yellow);
32 }
33 @Override
34 public void mouseExited(MouseEvent evt) {
35 btnSalvar.setBackground(Color.red);
36 }
37 });
38 }
39
40 public static void main(String[] args) {
41 Tela t = new Tela();
42 t.setVisible(true);
43 }
44 }
Observe que os eventos mouseEntered (linha 30) e mouseExited (linha 34), são
tratados das linhas 28 à 37. Caso queira tratar outros eventos, deve incluir o
método referente ao evento imediatamente após a linha 36. Perceba na linha 28
que foi adicionado um Listener (“ouvinte”) ao botão para monitorá-lo quanto
aos eventos de mouse. Toda vez que o ponteiro do mouse entra em contato com
a área da superfície do botão, um objeto da classe MouseAdapter é instanciado
e passado como parâmetro ao método addMouseListener. Na instância do
Evandro Carlos Teruel - 273
Você pode perceber que o tratamento de eventos em Java não é uma tarefa fácil.
A maioria dos eventos tratados nos exemplos deste Capítulo foram aplicados
apenas a alguns tipos de elementos da janela, mas a forma de tratamento de
eventos sobre outros elementos ocorre de forma semelhante.
Mais à frente neste Capítulo você verá que há maneiras mais simples de se
trabalhar com a criação de interfaces de usuário utilizando as APIs swing e
awt no NetBeans.
Nesse tópico vamos criar uma aplicação simples que utiliza duas janelas e
mostrar como se faz para passar de uma para outra, quando necessário. Vamos
também criar uma aplicação que utiliza abas na mesma janela e mostrar como
se alterna entre elas.
1 import java.awt.*;
2 import java.awt.event.*;
3 import javax.swing.*;
4
5 public class Menu extends JFrame implements ActionListener {
6
7 JFrame frmJanela1, frmJanela2;
8 JButton btnJanela1, btnJanela2, btnVolta1, btnVolta2;
9
10 public Menu() {
11
12 //Programação da janela principal
13 setTitle("Janela Principal");
14 setDefaultCloseOperation(EXIT_ON_CLOSE);
15 setLayout(new FlowLayout());
16 btnJanela1 = new JButton("Chama Janela 1");
Evandro Carlos Teruel - 275
17 btnJanela1.addActionListener(this);
18 btnJanela2 = new JButton("Chama Janela 2");
19 btnJanela2.addActionListener(this);
20 add(btnJanela1);
21 add(btnJanela2);
22 setBounds(100, 100, 300, 200);
23
24 //Programação da janela 1
25 frmJanela1 = new JFrame("Janela 1");
26 frmJanela1.setDefaultCloseOperation(EXIT_ON_CLOSE);
27 frmJanela1.setBounds(100, 100, 300, 200);
28 frmJanela1.getContentPane().setBackground(Color.yellow);
29 btnVolta1 = new JButton("Voltar");
30 frmJanela1.add(btnVolta1, "South");
31 btnVolta1.addActionListener(this);
UNINOVE – uso exclusivo para aluno
32
33 //Programação da janela 2
34 frmJanela2 = new JFrame("Janela 2");
35 frmJanela2.setDefaultCloseOperation(EXIT_ON_CLOSE);
36 frmJanela2.setBounds(100, 100, 300, 200);
37 frmJanela2.getContentPane().setBackground(Color.green);
38 btnVolta2 = new JButton("Voltar");
39 frmJanela2.add(btnVolta2, "South");
40 btnVolta2.addActionListener(this);
41
42 }
43
44 @Override
45 public void actionPerformed(ActionEvent e) {
46 Object btn = e.getSource();
47 if (btn == btnJanela1) {
48 setVisible(false);
49 frmJanela1.setVisible(true);
50 }
51 if (btn == btnJanela2) {
52 setVisible(false);
53 frmJanela2.setVisible(true);
54 }
55 if (btn == btnVolta1) {
56 setVisible(true);
57 frmJanela1.setVisible(false);
58 }
59 if (btn == btnVolta2) {
60 setVisible(true);
61 frmJanela2.setVisible(false);
276 - Programação Orientada a Objetos com Java – sem mistérios –
62 }
63 }
64
65 public static void main(String[] args) {
66 Menu m = new Menu();
67 m.setVisible(true);
68 }
69 }
que deve ocorrer de acordo com o clique em cada um dos botões das janelas.
Se o evento de clique foi gerado no botão btnJanela1 (linha 47), a janela
principal fica oculta (linha 48) e a janela frmJanela1 se torna visível na tela.
Se o evento de clique foi gerado no botão btnJanela2 (linha 51), a janela
principal fica oculta (linha 52) e a janela frmJanela2 se torna visível na tela.
Se o evento de clique foi gerado no botão btnVolta1 (linha 55), a janela principal
se torna visível (linha 56) e a janela frmJanela1 se torna oculta (linha 57).
Se o evento de clique foi gerado no botão btnVolta2 (linha 59), a janela principal
se torna visível (linha 60) e a janela frmJanela2 se torna oculta (linha 61).
As linhas de 65 à 68 iniciam a aplicação quando ela for compilada e executada.
A linha 66 instancia um objeto da classe Menu por meio de uma chamada ao
construtor da classe utilizando o comando new. O construtor então é executado,
gerando as janelas na memória. A linha 67 exibe apenas a janela principal. As
demais ficam na memória, mas só serão visualizadas quando os botões forem
clicados.
Ao clicar no botão “Chama Janela 1”, a janela principal ficará oculta e a janela
UNINOVE – uso exclusivo para aluno
Se for clicado no botão “Voltar”, a janela atual ficará oculta e a janela principal
será mostrada na tela novamente.
Vocé deve ter observado que trabalhar com janelas em uma única classe não
é uma tarefa difícil, porém, dependendo da quantidade de elementos que
forem colocados na janela, o código-fonte pode ficar muito grande e difícil de
gerenciar e manter. Nesse caso, uma alternativa é criar uma classe que herda a
classe JFrame para cada janela. Quando um botão de uma janela for clicado,
você instancia um objeto da classe referente a outra janela e a torna visível.
Quando você criar aplicação com várias janelas, alterne entre elas tor-
NOTA nando visível a que você deseja, e invisível a que não quer ver. Isto é
feito por meio do método setVisible do objeto referente à janela.
Evandro Carlos Teruel - 279
Para trabalhar com abas você deve criar um painel que suporta abas, utilizando
a classe JTabbedPane. Além desse painel, você deve criar vários painéis
comuns, utilizando a classe JPanel. Nesses painéis comuns você deve colocar os
elementos que cada aba terá. No final, cada painel JPanel será então adicionado
como uma aba do painel JTabbedPane.
Na classe TelaAbas.java, digite o seguinte código-fonte:
1 import java.awt.*;
2 import javax.swing.*;
3
4 public class TelaAbas extends JFrame {
5
6 private JTabbedPane pnlComGuias;
7 private JPanel pnl1, pnl2;
8 private JLabel lblUsuario, lblSenha, lblNome, lblEndereco, lblCidade;
9 private JTextField txtUsuario, txtNome, txtEndereco, txtCidade;
10 private JPasswordField txtSenha;
11
12 public TelaAbas() {
13
14 setTitle("Aplicação de painel com guia");
15 setSize(300, 200);
16 setLocation(300,300);
17 setDefaultCloseOperation(EXIT_ON_CLOSE);
18 setBackground(Color.gray);
19
20 //Cria o painel pnl2 que será incluído na primeira aba
21 pnl1 = new JPanel();
280 - Programação Orientada a Objetos com Java – sem mistérios –
22 pnl1.setLayout(null);
23 lblUsuario = new JLabel("Username:");
24 lblUsuario.setBounds(10, 15, 150, 20);
25 pnl1.add(lblUsuario);
26 txtUsuario = new JTextField();
27 txtUsuario.setBounds(10, 35, 150, 20);
28 pnl1.add(txtUsuario);
29 lblSenha = new JLabel("Senha:");
30 lblSenha.setBounds(10, 60, 150, 20);
31 pnl1.add(lblSenha);
32 txtSenha = new JPasswordField();
33 txtSenha.setBounds(10, 80, 150, 20);
34 pnl1.add(txtSenha);
35
36 //Cria o painel pnl2 que será incluído na segunda aba
37 pnl2 = new JPanel();
UNINOVE – uso exclusivo para aluno
Perceba na Figura 6.63 que a janela da esquerda mostra a aba “Login” aberta,
quando a aplicação é executada. Já a janela da direita mostra a aba “Cadastro”
aberta, quando o usuário clicar nesta aba. Você pode alternar entre as abas
facilmente, bastando para isso clicar sobre o título dela.
As abas possuem um índice numérico começado por 0 que vai aumentando
na medida em que vão sendo adicionadas à janela. Assim, a primeira aba terá
índice 0, a segunda terá índice 1, e assim por diante.
A seguir são apresentados os principais métodos utilizados para executar
operações com as abas.
pnlComGuias.setSelectedIndex(1);
Ao executar a aplicação, a aba ativa será a segunda (aba 1).
UNINOVE – uso exclusivo para aluno
pnlComGuias.setBackgroundAt(0, Color.BLUE);
O plano de fundo do título da primeira aba (aba 0) ficará azul.
pnlComGuias.setEnabledAt(0, false);
A primeira aba (aba 0) será desativada. Ao clicar, não será aberta.
pnlComGuias.setTitleAt(1, "Controle");
O título da segunda aba (aba 1) será "Controle".
if(pnlComGuias.isEnabledAt(1)){};
Verifica se a segunda aba (aba 1) está ativa.
pnlComGuias.remove(1);
Remove a segunda aba (aba 1).
Evandro Carlos Teruel - 283
Agora vamos criar a classe principal, que será um formulário JFrame. Execute,
para isso, os seguintes procedimentos:
– Clique com o botão direito sobre o nome do projeto (ArrastarSoltar),
selecione a opção “Novo” e a opção “Form JFrame”, como mostra a Figura
6.65.
UNINOVE – uso exclusivo para aluno
Veja que na paleta (painel) da direita existe o elemento Label (JLabel), Botão
UNINOVE – uso exclusivo para aluno
(JButton), Painel (JPanel) etc. Há uma barra de rolagem nessa paleta que
permite visualizar os demais elementos. A Figura 6.67 mostra os elementos
disponíveis nesta paleta.
Figura 6.67: Paleta de elementos que podem ser arrastados para o formulários.
Para mudar as propriedades de qualquer elemento, basta clicar sobre ele que
as propriedades passíveis de modificação serão mostradas.
No canto inferior esquerdo da tela há um painel chamado “Navegador”, onde
são exibidos o nome do formulário JFrame e os nomes dos elementos incluídos
no formulário. Clicando com o botão direito do mouse sobre “JFrame”, você
poderá definir algumas propriedades do formulário, como o gerenciador de
layout que ele deve utilizar. A Figura 6.69 mostra este procedimento.
Evandro Carlos Teruel - 287
UNINOVE – uso exclusivo para aluno
Mude também o texto dos elementos, de forma que o formulário fique com a
aparência mostrada na Figura 6.75.
Para compilar e executar o projeto e ver como está o visual da tela, basta
pressionar a tecla F6 a qualquer momento.
Chegou a hora de programar os botões. Para isso, clique com o botão direito
do mouse sobre o botão “Salvar”, selecione a opção “Eventos”, em seguida
a opção “Action” e, por último, a opção “actionPerformed”, como mostra a
Figura 6.77.
Aparecerá uma área para edição de código-fonte, onde o cursor estará na linha
90 da Figura 6.78, e onde deve ser programado o que deve ocorrer quando o
usuário clicar no botão “Salvar”. A Figura 6.78 mostra detalhes desta área de
programação.
UNINOVE – uso exclusivo para aluno
Na Figura 6.78, alguns detalhes merecem atenção. Veja que por trás daquele
formulário para onde você arrasta os elementos, há uma classe gerada
automaticamente, de acordo com os elementos que você vai adicionando
e com as propriedades que você vai mudando. Na linha 10 você pode ver
que a classe foi declarada. Na linha 97 você pode ver a implementação
do método main, já que esta é a classe principal. Na linha 89 você pode
ver o método btnSalvarActionPerformed, utilizado para programar o
evento de clique no botão “Salvar”. Na linha 93 você pode ver o método
btnExcluirActionPerformed, utilizado para programar o evento de clique no
botão “Excluir”.
Veja que a numeração de linhas do número 16 passa para 88. Isso ocorre porque
tem um conjunto de linhas ocultas entre a linha 16 e a linha 88. Para ver essas
linhas, clique no sinal de mais (+) que aparece na linha 16. Você verá que as
linhas ocultas serão mostradas. Verá que nessas linhas está a programação
referente a geração dos elementos arrastados para a tela. Você não pode alterar
o código-fonte dessa área, pois ela é gerada na medida em que você interage
montando o formulário. Poderá apenas inserir código de programação nos
métodos de tratamento de evento.
Evandro Carlos Teruel - 293
Figura 6.80: menu “Janela” para exibir paineis fechados por engano.
Veja que você pode clicar e exibir os painéis “Projetos”, “Arquivos” e “Serviços”,
que aparecem na parte superior esquerda da área de trabalho; o painel “Paleta”,
que aparece na parte superior direita da janela com os elementos que podem
ser arrastados para o formulário; o painel “Propriedades”, que aparece na
parte inferior direita da janela e permite mudar as propriedades dos elementos
colocados no formulário etc.
6.6 Resumo
A interface do usuário é uma das partes mais importantes da aplicação, pois
representa todas as telas às quais o usuário tem acesso.
Para criar interfaces gráficas de usuário (GUIs) em aplicações para desktop
com Java utilizam-se as APIs swing e awt. A API swing é a evolução da awt
e é composta por diversos pacotes de classes, sendo que os mais utilizados
são javax.swing e javax.swing.event. Nesses pacotes existem um conjunto de
classes que permitem criar, configurar e apresentar qualquer componente de
tela como janelas, painéis, rótulos, caixas de texto, menus, tabelas etc, e tratar
eventos que podem ocorrer nesses componentes.
Na criação de uma janela é comum o uso da classe JFrame. Para agrupar
componentes na janela é comum o uso da classe JLabel. Estas classes
permitem criar contêineres para agrupar elementos, normalmente, com
características comuns.
Evandro Carlos Teruel - 295
janelas é a criação de abas (ou guias) na mesma janela. Para criar janelas você
utiliza a classe JFrame, e para criar abas na janela você pode utilizar as classes
JTabbedPane e JPanel.
Os elementos colocados na janela podem ser formatados, tendo suas propriedades
de formatação alteradas. Assim, você poderá definir cores de fonte e de fundo,
tipo e tamanho de fonte etc. Cada elemento permite mudar um conjunto de
formatações específicas, que podem não ser comuns a todos os elementos.
As janelas criadas nas aplicações desktop podem conter menus agrupados em
uma barra de menus posicionada na parte superior da tela. Esses menus podem
ser criados pelas classes JMenuBar, JMenu e JMenuItem. Além dos menus, nas
janelas, você pode inserir diversos tipos de botões por meio de classes como
JButton, JRadioButton, ButtonGroup, JCheckBox e JToogleButton.
As caixas de texto permitem que o usuário entre com informações que podem
UNINOVE – uso exclusivo para aluno
ser manipuladas na aplicação. Para criar e formatar caixas de texto você utiliza
classes como JTextField, JTextArea, JPasswordField, JFormattedTextField e
MaskFormatter.
Além das caixas de texto você pode criar caixas de combinação (combos),
por meio das classes JComboBox e DefaultComboBoxModel; listas, por meio
das classes DefaultListModel e JList; tabelas, por meio das classes JTable e
TableModel etc.
Todos os elementos colocados na janela, incluindo a própria janela, são
sucetíveis a eventos como cliques, abertura, fechamento, foco etc. Quando
estes eventos acontecem, métodos específicos são chamados para tratá-los.
Existem várias categorias de eventos, sendo que as principais são eventos de
ação, eventos de janela, eventos de foco e eventos de mouse.
Os eventos de ação são normalmente disparados quando se clica em um
elemento. Eles são tratados utilizando classes como ActionListener e
ActionEvent. Todos os elementos de tela sucetíveis a clique podem tratar
eventos deste tipo.
Os eventos de janela ocorrem quando a janela recebe algum estímulo, seja
do usuário, ou automaticamente. Ocorrem quando a janela abre, quando ela
fecha, quando ganha ou perde o foco, quando é maximizada ou minimizada
etc. Para tratar os eventos de janela podem ser utilizadas diversas classes,
como WindowEvent, WindowListener, WindowAdapter, WindowFocusEvent,
WindowFocusListener, WindowFocusAdapter, WindowStateEvent,
WindowStateListener e WindowStateAdapter.
Eventos de foco ocorrem normalmente quando o elemento ganha ou perde o
foco. Eles são tratados normalmente pelas classes FocusListener, FocusAdapter
e FocusEvent.
Evandro Carlos Teruel - 297
6.7 Exercícios
Os exercícios serão divididos em duas partes: os exercícios práticos, que
envolvem criação de telas e programação de eventos, e os exercícios conceituais,
que desenvolvem o entendimento dos conceitos apresentados neste capítulo.
4) Crie uma aplicação Java que gere a janela com o menu principal abaixo.
Ao ser clicado na opção “Cadastro de Clientes”, a janela principal deve ser
fechada e deve ser aberta a janela de cadastro de clientes. Ao ser clicado no
botão “Cadastro de Produtos”, a janela principal deve ser fechada e deve ser
aberta a janela para o cadastro de produtos. Ao clicar no botão “Voltar” das
telas secundárias, estas janelas devem ser fechadas e a janela principal deve
ser mostrada. Utilize ou não gerenciadores de layout. Não utilize recursos de
arrastar/soltar.
Evandro Carlos Teruel - 299
5) Crie uma janela que contenha duas abas: “Cadastro de Clientes” e “Cadastro
UNINOVE – uso exclusivo para aluno
7) Crie a janela a seguir, considerando que o menu “Dados” contém a opção “Ver
gráfico” e o menu “Operações” contém a opção “Sair”. Programe a opção “Sair”, de
forma que ao ser clicada finalize a aplicação. Não utilize recursos de arrastar/soltar.
UNINOVE – uso exclusivo para aluno
8) Que método deve ser utilizado para criar caixas de diálogo de confirmação
em uma aplicação?
10) Que métodos são utilizados para mudar a cor do plano de fundo e da fonte
de um elemento?
UNINOVE – uso exclusivo para aluno
11) Quais classes da API swing são utilizadas para criar os principais tipos de
botões que podem existir em um contêiner?
12) A que os botões JRadioButton precisam ser associados para que seja
permitido a seleção de apenas um em um conjunto deste tipo de botão?
13) Que método deve ser utilizado para verificar se um botão foi selecionado?
15) Quais as principais classes utilizadas para criar listas e caixas de combinação
(combos)?
16) Qual método deve ser utilizado para se obter a opção selecionada em uma
caixa de combinação (combo) ou em uma lista?
19) Como se obtém um valor selecionado em uma célula de uma tabela JTable?
20) Quais são os principais tipos de eventos que podem ser tratados em
aplicações desktop que utilizam as APIs swing e awt?
21) Quais classes são normalmente utilizadas para lidar com eventos de ação
de clique do mouse sobre o elemento?
23) Quais as principais classes que podem ser utilizadas para tratar eventos
de janela?
UNINOVE – uso exclusivo para aluno
25) Para que serve o método addActionListener em classes que tratam eventos
de ação?
btnSalvar.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent we) {
btnSalvar.setBackground(Color.yellow);
} @Override
public void mouseExited(MouseEvent evt) {
btnSalvar.setBackground(Color.red);
}
});
27) Qual classe deve ser utilizada para criar um painel que suporta abas (ou
guias)? O que precisa ser adicionado a este painel para construir as abas?
o banco de dados.
Neste Capítulo você aprenderá a realizar conexão com banco de dados e
executar operações de cadastro (insert), alteração (update), consulta (select) e
exclusão (delete). Uniremos tudo que foi visto neste livro até este momento em
projetos mais robustos que envolvem criação de interface gráfica de usuário,
encapsulamento, interfaces, pacotes e operações em banco de dados.
Use ODBC quando precisar de maior desempenho, já que este padrão está
mais integrado ao sistema operacional. Quando precisar de independência
de plataforma, ou seja, quiser que sua aplicação execute em máquinas com
qualquer sistema operacional, use JDBC.
Neste Capítulo utilizaremos o padrão JBDC, cujo driver já vem integrado à
IDE NetBeans. Com este driver, poderemos conectar a aplicação a qualquer
SGBD, modificando apenas algumas strings de conexão.
Existem outras formas para se acessar banco de dados utilizando frameworks
e bibliotecas de persistência, mas estes recursos apenas abstraem e escondem
do programador a complexidade do uso da API JDBC, mas não deixam de
utilizá-la.
– Clique no botão “Executar”, caso queira que após baixar já seja iniciada
a instalação, ou no botão “Salvar”, para salvar na pasta configurada para
receber os downloads em seu computador. Caso queira escolher a pasta,
clique na setinha preta à direita do botão “Salvar”.
– Após o download ser concluído, abra a pasta onde gravou o arquivo mysql-
installer-community-5.6.21.0 e clique sobre ele.
Durante a instalação, basta clicar no botão “Next”, e em algumas telas,
“Execute”, até chegar à tela mostrada na Figura 7.4, onde será solicitado a
UNINOVE – uso exclusivo para aluno
– Após digitar e repetir a senha que você deseja atribuir ao servidor MySQL,
clique no botão “Next” e prossiga a instalação até terminar.
Na tela mostrada na Figura 7.6, já podemos criar nosso banco de dados, as tabelas
que necessitamos e executar outros comandos SQL, caso seja necessário.
– Para criar um novo banco de dados, clique na ferramenta “create a new
schema in the connected server”, na parte superior da tela. Trata-se de
uma ferramenta com desenho de um barril com um sinal de mais no canto
inferior esquerdo ( ).
308 - Programação Orientada a Objetos com Java – sem mistérios –
Note que nosso banco de dados “bd001” já está na lista de bancos de dados
existentes.
Evandro Carlos Teruel - 309
– Aparecerá uma janela onde você deve digitar o nome do banco de dados,
como mostra a Figura 7.16.
jdbc:mysql://localhost:3306/bd002?zeroDateTimeBehavior=convertToNull
Neste tópico você verá um pequeno exemplo que faz uma conexão com o
banco de dados, executa uma inclusão de registro (cadastro) na tabela e fecha
a conexão. O exemplo será apresentado duas vezes, uma utilizando a interface
PreparedStatement para executar o comando SQL insert e outra utilizando a
interface Statement.
Crie um novo projeto Java chamado TesteBanco e uma classe principal chamada
Banco.java.
Para executar operações no banco de dados, temos que adicionar o driver JDBC
à biblioteca do projeto. Para isso, clique com o botão direito do mouse sobre
a pasta “Bibliotecas” e selecione a opção “Adicionar Biblioteca”.
Aparecerá a tela mostrada na Figura 7.22.
2 import java.sql.DriverManager;
3 import java.sql.PreparedStatement;
4 import java.sql.SQLException;
5 import javax.swing.JOptionPane;
6
7 public class Banco {
8
9 public static void main(String[] args) {
10 try {
11 Class.forName("com.mysql.jdbc.Driver");
12 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
13 PreparedStatement st = conn.prepareStatement("insert into cliente
(id, nome, telefone, sexo, renda) values (?, ?, ?, ?, ?)");
14 st.setInt(1, 10);
15 st.setString(2, "Marco Antonio");
16 st.setString(3, "(11)5678-9087");
17 st.setString(4, "Masculino");
18 st.setDouble(5, 14567.56);
19 st.executeUpdate();
20 JOptionPane.showMessageDialog(null, "Os dados do cliente foram
salvos");
21 conn.close();
22 } catch (ClassNotFoundException | SQLException ex) {
23 JOptionPane.showMessageDialog(null, "Erro ao conectar com o
Banco de Dados");
24 }
25 }
26 }
Evandro Carlos Teruel - 319
A linha 19 executa a instrução insert definida na linha 13, após ela receber
todos os parâmetros e se tornar completa. Veja que o método executeUpdate da
interface Statement é responsável por executar o comando insert da linguagem
SQL. A linha 20 mostra uma mensagem indicando que a inclusão foi realizada
e a linha 21 encerra (fecha) a conexão com o banco de dados.
Se ocorrerem as exceções ClassNotFoundException ou SQLException será
mostrada a mensagem contida na linha 23.
Ao compilar e executar o projeto acima por meio do pressionamento da tecla
F6, será mostrada a mensagem apresentada na Figura 7.26.
UNINOVE – uso exclusivo para aluno
1 import java.sql.*;
2 import javax.swing.JOptionPane;
3
4 public class Banco {
5
6 public static void main(String[] args) {
7 try {
8 Class.forName("com.mysql.jdbc.Driver");
9 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
Evandro Carlos Teruel - 321
10 Statement st = conn.createStatement();
11 int id = 12;
12 String nome = "Marco Antonio";
13 String telefone = "(11)5678-9087";
14 String sexo = "Masculino";
15 double renda = 14567.56;
16 String sql = "insert into cliente (id, nome, telefone, sexo, renda)
values (" + id + ", '" + nome + "', '" + telefone + "', '" + sexo + "', " +
renda + ")";
17 st.executeUpdate(sql);
18 JOptionPane.showMessageDialog(null, "Os dados do cliente foram
salvos");
19 conn.close();
20 } catch (ClassNotFoundException | SQLException ex) {
21 JOptionPane.showMessageDialog(null, "Erro ao conectar com o
Banco de Dados");
UNINOVE – uso exclusivo para aluno
22 }
23 }
24 }
Se você deseja se conectar a outro SGBD que não seja o MySQL, deverá
apenas trocar o driver adicionado à biblioteca para o driver fornecido
pelo fabricante do SGBD e mudar as seguintes linhas de conexão:
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn = DriverManager.getConnection (“jdbc:mysql://localhost:3306/
NOTA bd002”, “root”, “teruel”);
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
UNINOVE – uso exclusivo para aluno
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
9 PreparedStatement st = conn.prepareStatement("select * from
cliente where id = ? ");
10 st.setInt(1, 10);
11 ResultSet rs = st.executeQuery();
12 if (rs.next()) {
13 System.out.println("ID: " + rs.getString("id"));
14 System.out.println("Nome: " + rs.getString("nome"));
15 System.out.println("Telefone: " + rs.getString("telefone"));
16 System.out.println("Sexo: " + rs.getString("sexo"));
17 System.out.println("Renda: " + rs.getString("renda"));
18 } else {
19 System.out.println("Cliente não encontrado");
20 }
21 conn.close();
22 } catch (ClassNotFoundException | SQLException ex) {
23 System.out.println("Erro ao tentar se conectar ao banco de
dados");
24 }
25 }
26 }
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
9 Statement st = conn.createStatement();
10 int id = 12;
11 String sql = "select * from cliente where id = " + id;
12 ResultSet rs = st.executeQuery(sql);
13 if (rs.next()) {
324 - Programação Orientada a Objetos com Java – sem mistérios –
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
Evandro Carlos Teruel - 325
23 }
24 }
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
9 Statement st = conn.createStatement();
10 String sql = "select * from cliente";
11 ResultSet rs = st.executeQuery(sql);
12 while (rs.next()) {
13 System.out.println("ID: " + rs.getString("id"));
14 System.out.println("Nome: " + rs.getString("nome"));
15 System.out.println("Telefone: " + rs.getString("telefone"));
16 System.out.println("Sexo: " + rs.getString("sexo"));
17 System.out.println("Renda: " + rs.getString("renda"));
18 System.out.println("--------------------------------------");
19 }
Evandro Carlos Teruel - 327
20 conn.close();
21 } catch (ClassNotFoundException | SQLException ex) {
22 System.out.println("Erro ao tentar se conectar ao banco de dados");
23 }
24 }
25 }
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
9 PreparedStatement st = conn.prepareStatement("delete from
cliente where id = ? ");
10 st.setInt(1, 10);
11 int r = st.executeUpdate();
12 if (r == 1) {
13 System.out.println("Cliente excluído com sucesso");
14 } else {
15 System.out.println("Cliente não encontrado");
16 }
17 conn.close();
18 } catch (ClassNotFoundException | SQLException ex) {
328 - Programação Orientada a Objetos com Java – sem mistérios –
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
9 Statement st = conn.createStatement();
10 int id = 12;
11 String sql = "delete from cliente where id = " + id;
12 int r = st.executeUpdate(sql);
13 if (r == 1) {
14 System.out.println("Cliente excluído com sucesso");
15 } else {
16 System.out.println("Cliente não encontrado");
17 }
18 conn.close();
19 } catch (ClassNotFoundException | SQLException ex) {
20 System.out.println("Erro ao tentar se conectar ao banco de dados");
21 }
22 }
23 }
Evandro Carlos Teruel - 329
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
9 PreparedStatement st = conn.prepareStatement("update cliente
set nome=?, telefone=?, sexo=?, renda=? where id=?");
10 st.setString(1, "Anderson Silva");
11 st.setString(2, "(11)4567-9876");
12 st.setString(3, "Masculino");
13 st.setDouble(4, 22987.56);
14 st.setInt(5, 1);
15 st.executeUpdate();
16 System.out.println("Os dados do cliente foram alterados");
17 conn.close();
18 } catch (ClassNotFoundException | SQLException ex) {
19 System.out.println("Erro ao tentar se conectar ao banco de
dados");
20 }
21 }
22 }
1 import java.sql.*;
2
3 public class Banco {
4
5 public static void main(String[] args) {
6 try {
7 Class.forName("com.mysql.jdbc.Driver");
8 Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/bd002", "root", "teruel");
9 int id = 3;
10 String nome = "João de Deus";
11 String telefone = "(11)7865-9087";
12 String sexo = "Masculino";
13 double renda = 14567.56;
14 Statement st = conn.createStatement();
15 String sql = "update cliente set nome= '" + nome + "', telefone= '" +
telefone + "', sexo= '" + sexo + "', renda=" + renda + " where id= " +
id + "";
16 int r = st.executeUpdate(sql);
17 if (r == 1) {
Evandro Carlos Teruel - 331
Veja que você tem um painel na parte superior onde poderá realizar as operações
de consulta, exclusão e alteração.
Ao digitar no campo ID o valor 1 e clicar no botão “Buscar”, caso exista este
registro no banco de dados, os dados serão carregados na tabela na parte inferior
da janela, como mostra a Figura 7.39.
336 - Programação Orientada a Objetos com Java – sem mistérios –
UNINOVE – uso exclusivo para aluno
Veja na janela mostrada na Figura 7.44 que foi feita uma modificação nos
campos nome e telefone.
338 - Programação Orientada a Objetos com Java – sem mistérios –
1 import java.awt.*;
2 import java.awt.event.*;
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
Evandro Carlos Teruel - 339
8 import java.text.DecimalFormat;
9 import java.text.ParseException;
10 import javax.swing.*;
11 import javax.swing.border.TitledBorder;
12 import javax.swing.table.DefaultTableModel;
13 import javax.swing.text.DefaultFormatterFactory;
14 import javax.swing.text.MaskFormatter;
15 import javax.swing.text.NumberFormatter;
16
17 public class Menu extends JFrame implements ActionListener {
18
19 JFrame frmCadastrarAlterar, frmManutencao;
20 JButton btnCadastro, btnOp, btnVoltaCadAlt, btnVoltaManutencao,
btnSair;
21 JButton btnSalvar, btnSalvarAlteracao, btnAlterar, btnBuscar, btnExcluir,
btnExibirTudo;
UNINOVE – uso exclusivo para aluno
113 frmCadastrarAlterar.add(lblRenda);
114
115 txtRenda = new JFormattedTextField();
116 txtRenda.setFormatterFactory(new DefaultFormatterFactory(new
NumberFormatter(new DecimalFormat("#0.00"))));
117 txtRenda.setBounds(450, 110, 100, 30);
118 txtRenda.setToolTipText("Utilize vírgula para separar as casas
decimais");
119 frmCadastrarAlterar.add(txtRenda);
120
121 btnSalvar = new JButton("Salvar");
122 btnSalvar.setBounds(10, 170, 150, 30);
123 btnSalvar.addActionListener(this);
124 btnSalvar.setVisible(false);
125 frmCadastrarAlterar.add(btnSalvar);
126
127 btnSalvarAlteracao = new JButton("Salvar Alteração");
128 btnSalvarAlteracao.setBounds(10, 170, 150, 30);
129 btnSalvarAlteracao.addActionListener(this);
130 btnSalvarAlteracao.setVisible(false);
131 frmCadastrarAlterar.add(btnSalvarAlteracao);
132
133 btnVoltaCadAlt = new JButton("Voltar");
134 btnVoltaCadAlt.setBounds(170, 170, 150, 30);
135 btnVoltaCadAlt.addActionListener(this);
136 frmCadastrarAlterar.add(btnVoltaCadAlt);
137
138 //Programação da janela de consulta e exclusão (Outras Operações)
139
140 frmManutencao = new JFrame("Manutenção");
141 frmManutencao.setDefaultCloseOperation(EXIT_ON_CLOSE);
342 - Programação Orientada a Objetos com Java – sem mistérios –
142 frmManutencao.setLayout(null);
143 frmManutencao.setBounds(400, 200, 600, 500);
144 frmManutencao.getContentPane().setBackground(Color.LIGHT_
GRAY);
145
146 pnlCampos = new JPanel(null);
147 tituloPnlCampos = BorderFactory.createTitledBorder("Área de
operações");
148 pnlCampos.setBorder(tituloPnlCampos);
149 pnlCampos.setBounds(10, 10, 565, 100);
150
151 lblId = new JLabel("ID:");
152 lblId.setBounds(10, 35, 50, 30);
153 pnlCampos.add(lblId);
154
155 txtIdConsulta = new JFormattedTextField();
UNINOVE – uso exclusivo para aluno
200 btnVoltaManutencao.addActionListener(this);
201
201 }
203
204 //Programação dos botões
205 @Override
206 public void actionPerformed(ActionEvent e) {
207 Object btn = e.getSource();
208
209 if (btn == btnCadastro) {
210 setVisible(false);
211 btnSalvar.setVisible(true);
212 frmCadastrarAlterar.setVisible(true);
213 }
214
215 if (btn == btnOp) {
216 setVisible(false);
217 tblConsultaModel.setRowCount(0);
218 txtIdConsulta.setText("");
219 frmManutencao.setVisible(true);
220 }
221
222 if (btn == btnVoltaCadAlt) {
223 setVisible(true);
224 limparCampos();
225 frmCadastrarAlterar.setVisible(false);
226 }
227
228 if (btn == btnVoltaManutencao) {
229 setVisible(true);
230 frmManutencao.setVisible(false);
344 - Programação Orientada a Objetos com Java – sem mistérios –
231 }
232
233 if (btn == btnSair) {
234 System.exit(0);
235 }
236
237 if (btn == btnSalvar) {
238 int id;
239 double renda;
240 String nome, telefone, sexo;
241 id = Integer.parseInt(txtId.getText());
242 nome = txtNome.getText();
243 telefone = txtTelefone.getText();
244 if (rdoMasculino.isSelected()) {
245 sexo = rdoMasculino.getText();
246 } else if (rdoFeminino.isSelected()) {
UNINOVE – uso exclusivo para aluno
273 desconectar();
274 }
275 }
276
277 if (btn == btnBuscar) {
278 try {
279 if (conectar() == null) {
280 JOptionPane.showMessageDialog(btnBuscar, "Erro ao tentar
conectar ao banco de dados");
281 } else {
282 if (txtIdConsulta.getText().isEmpty()) {
283 JOptionPane.showMessageDialog(btnBuscar, "Por favor,
digite um valor no campo ID");
284 txtIdConsulta.requestFocus();
285 } else {
286 int id = Integer.parseInt(txtIdConsulta.getText());
UNINOVE – uso exclusivo para aluno
351 }
352 } catch (SQLException ex) {
353 JOptionPane.showMessageDialog(btnExcluir, "Erro na exclusão");
354 }
355 }
356
357 if (btn == btnAlterar) {
358 try {
359 if (conectar() == null) {
360 JOptionPane.showMessageDialog(btnAlterar, "Erro ao tentar se
conectar ao banco de dados");
361 } else {
362 if (txtIdConsulta.getText().isEmpty()) {
363 JOptionPane.showMessageDialog(btnAlterar, "Por favor,
digite um valor no campo ID");
364 txtIdConsulta.requestFocus();
UNINOVE – uso exclusivo para aluno
365 } else {
366 int id = Integer.parseInt(txtIdConsulta.getText());
367 st=conn.prepareStatement("select * from cliente where id=?");
368 st.setInt(1, id);
369 rs = st.executeQuery();
370 if (rs.next()) {
371 txtId.setText(rs.getString("id"));
372 txtId.setEditable(false);
373 txtNome.setText(rs.getString("nome"));
374 txtTelefone.setText(rs.getString("telefone"));
375 if (rs.getString("sexo").equalsIgnoreCase("masculino")) {
376 rdoMasculino.setSelected(true);
377 }
378 if (rs.getString("sexo").equalsIgnoreCase("feminino")) {
379 rdoFeminino.setSelected(true);
380 }
381 txtRenda.setText(rs.getString("renda").replace(".", ","));
382 btnSalvar.setVisible(false);
383 btnSalvarAlteracao.setVisible(true);
384
385 frmManutencao.setVisible(false);
386 frmCadastrarAlterar.setVisible(true);
387 } else {
388 JOptionPane.showMessageDialog(btnAlterar, "Este cliente
não foi encontrado");
389 }
390 }
391 }
392 } catch (SQLException ex) {
393 JOptionPane.showMessageDialog(btnAlterar, "Erro na consulta");
394 }
395
348 - Programação Orientada a Objetos com Java – sem mistérios –
396 }
397
398 if (btn == btnSalvarAlteracao) {
399 int id;
400 double renda;
401 String nome, telefone, sexo;
402 id = Integer.parseInt(txtId.getText());
403 nome = txtNome.getText();
404 telefone = txtTelefone.getText();
405 if (rdoMasculino.isSelected()) {
406 sexo = rdoMasculino.getText();
407 } else if (rdoFeminino.isSelected()) {
408 sexo = rdoFeminino.getText();
409 } else {
410 sexo = "";
411 }
UNINOVE – uso exclusivo para aluno
454
455 private void limparCampos() {
456 txtId.setEditable(true);
457 txtId.setText("");
458 txtNome.setText("");
459 txtTelefone.setText("");
460 gruSexo.clearSelection();
461 txtRenda.setText("");
462 txtId.requestFocus();
463 }
464
465 // método principal de star da aplicação
466 public static void main(String[] args) {
467 Menu m = new Menu();
468 m.setVisible(true);
469 }
470 }
Note a linha 49, que por meio do método setToolTipText aplica uma mensagem
ao botão ao botão btnOp, que será mostrada quando o ponteiro do mouse for
posicionado sobre ele.
Observe também as linhas 47, 51 e 54, que adicionam um Listener (ouvinte)
aos botões, de tal forma que quando eles receberem o clique do mouse, será
feito um desvio para o método actionPerformed, que tratará os eventos de
clique sobre os botões. As linhas de 55 à 57 adicionam os botões “Cadastro”,
“Outras Operações” e “Sair” à janela principal.
As linhas de 59 à 136 criam a janela com os campos. Esta janela será utilizada
para fazer o cadastro e a alteração nos dados de um cliente. A janela gerada é
mostrada na Figura 7.47.
Evandro Carlos Teruel - 351
entrada de números e da vírgula para separar as casas decimais. Caso você inclua
outro caracter que não sejam os permitidos, eles automaticamente desaparecerão.
Note também que três botões são adicionados a esta janela: “Salvar”, “Salvar
Alteração” e “Voltar”, mas apenas um é definido como visível, o botão “Voltar”.
O botão “Salvar Alteração” ficará oculto (linha 130) e será visualizado somente
quando esta janela for aberta para alteração de dados. Já o botão “Salvar” será
visualizado somente quando a tela for aberta para cadastro de um novo cliente.
Veja que os botões “Salvar” e “Salvar Alteração” ocupam a mesma posição,
pois nunca ficarão visíveis ao mesmo tempo e dependerão da operação a ser
realizada.
Da linha 138 à linha 200 é criada a janela para consulta e exclusão de dados,
referente à opção “Outras Operações” do menu principal. Esta janela é mostrada
pela Figura 7.48.
352 - Programação Orientada a Objetos com Java – sem mistérios –
UNINOVE – uso exclusivo para aluno
receberá o foco do cursor (linha 268). Se o erro não for o de número 1062, a
mensagem da linha 270 será exibida.
Após a operação ter sido realizada, a linha 273 chama o método desconectar,
escrito das linhas 447 à 453. Este método fecha a conexão com o banco de dados.
As linhas de 277 à 304 referem-se ao botão “Buscar”, pressionado no
formulário para consulta e exclusão. Se a conexão com o banco de dados não
foi estabelecida (linha 279), a mensagem de erro da linha 280 é mostrada.
Senão, se a conexão foi estabelecida com sucesso (linha 281), as linhas de
282 à 297 são executadas.
Se o campo ID estiver vazio (linha 282), a mensagem pedindo o preenchimento
do campo será exibida (linha 283) e o cursor será posicionado no campo ID
(linha 284). Senão, se o campo ID tiver um valor de ID válido (linha 285), este
valor é capturado e armazenado na variável id (linha 286).
UNINOVE – uso exclusivo para aluno
A linha 287 prepara uma instrução SQL select aguardando o id como parâmetro.
Este id é passado para a instrução na linha 288. Na linha 289 a tabela que exibirá
os dados é limpa e a instrução select é executada na linha 290. O resultado
retornado da tabela do banco de dados é armazenado no objeto rs da interface
ResultSet (linha 290). Se este objeto recebeu um registro (linha 291), ele é
carregado na tabela da parte inferior da janela (linhas 292 e 293). Senão, uma
mensagem será exibida informando que o cliente não foi encontrado.
Caso tenha ocorrido algum erro na execução da instrução select, a linha 300
será executada e a mansegem da linha 301 será exibida na tela.
As linhas de 306 à 333 são referentes ao botão “Exibir Tudo” do formulário
para consulta e exclusão de dados. Ao clicar nesse botão, todos os registros
cadastrados na tabela do banco de dados serão exibidos em uma tabela na parte
inferior da janela. Veja que a programação deste botão é muito semelhante à
programação do botão “Buscar”. Quando a conexão com o banco de dados
é estabelecida (linha 310), uma instrução select é preparada (linha 311) e
executada (linha 312). Em seguida, da linha 314 à 317, um laço de repetição
percorre o objeto rs da interface ResultSet, que contém os dados, carregando
cada registro em uma linha da tabela que fica na parte inferior da janela.
As linhas de 325 à 355 são referentes ao botão “Excluir” do formulário de
consulta e exclusão de dados. Ao clicar nesse botão, uma caixa de diálogo
pergunta se o usuário realmente deseja excluir o registro cujo ID foi informado
no campo ID. Se o usuário confirmar, o registro será excluído.
A programação deste botão é semelhante à programação dos demais botões.
Quando a conexão com o banco de dados é estabelecida, as linhas de 330 à
348 são executadas. A linha 330 verifica se o campo ID está vazio e mostra
uma mensagem pedindo seu preenchimento, caso esteja. Se o campo ID não
Evandro Carlos Teruel - 355
estiver vazio, a linha 334 abre uma caixa de diálogo pedindo a confirmação da
exclusão. Se o usuário clicar na opção “Sim” desta caixa de diálogo (linha 335),
o ID digitado no campo ID é capturado (linha 336), uma instrução SQL delete
é preparada (linha 337) e o id é passado como parâmetro para esta instrução
(linha 338). A linha 339 executa a instrução delete e guarda o retorno desta
execução em uma variável. Se o retorno for 1, ou seja, se a exclusão ocorreu
com sucesso (linha 340), será mostrada uma mensagem avisando que o registro
foi excluído (linha 341). Em seguida, a tabela que está na parte inferior da
janela é limpa, assim como o campo ID (linha 343), e o cursor é posicionado
neste campo (linha 344). Se a exclusão não ocorreu (linha 345), será mostrada
a mensagem da linha 346. Em seguida, a conexão com o banco de dados é
encerrada (linha 348). Se houve alguma exceção na execução da instrução
delete (linha 352), será mostrada a mensagem da linha 353.
As linhas de 357 à 396 são referentes ao botão “Alterar” do formulário de
UNINOVE – uso exclusivo para aluno
1 package persistence;
2
3 import java.sql.*;
4
5 public class ClienteDao {
6
Evandro Carlos Teruel - 359
22 return 3;
23 }
24 }
25
26 public int salvar(Cliente cli) {
27 try {
28 st = con.prepareStatement("insert into cliente (id, nome, telefone,
sexo, renda) values (?, ?, ?, ?, ?)");
29 st.setInt(1, cli.getId());
30 st.setString(2, cli.getNome());
31 st.setString(3, cli.getTelefone());
32 st.setString(4, cli.getSexo());
33 st.setDouble(5, cli.getRenda());
34 int retorno = st.executeUpdate();
35 return retorno;
36 } catch (SQLException ex) {
37 int c = ex.getErrorCode();
38 if (c == 1062) {
39 return 2;
40 } else {
41 return 3;
42 }
43 }
44
45 }
46
47 public int desconectar() {
48 try {
49 con.close();
50 return 1;
360 - Programação Orientada a Objetos com Java – sem mistérios –
tentar fechar uma conexão que nunca foi estabelecida. Nesse caso, geraria
uma exceção do tipo SQLException. Se a conexão for fechada com sucesso,
este método retornará 1, senão, retornará 0.
1 package persistence;
2
3 public class Cliente {
4 private int id;
5 private String nome;
6 private String telefone;
7 private String sexo;
362 - Programação Orientada a Objetos com Java – sem mistérios –
23 }
24
25 public void setId(int id) {
26 this.id = id;
27 }
28
29 public String getNome() {
30 return nome;
31 }
32
33 public void setNome(String nome) {
34 this.nome = nome;
35 }
36
37 public String getTelefone() {
38 return telefone;
39 }
40
41 public void setTelefone(String telefone) {
42 this.telefone = telefone;
43 }
44
45 public String getSexo() {
46 return sexo;
47 }
48
49 public void setSexo(String sexo) {
50 this.sexo = sexo;
51 }
Evandro Carlos Teruel - 363
52
53 public double getRenda() {
54 return renda;
55 }
56
57 public void setRenda(double renda) {
58 this.renda = renda;
59 }
60
61 }
Note que esta classe possui dois construtores, um vazio (linhas 10 e 11) e um
que recebe os parâmetros que serão guardados em atributos do objeto (linhas
de 13 à 19). Observe que para cada atributo é definido um método setter e um
método getter equivalente.
UNINOVE – uso exclusivo para aluno
1 package view;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
364 - Programação Orientada a Objetos com Java – sem mistérios –
5 import java.text.DecimalFormat;
6 import java.text.ParseException;
7 import javax.swing.*;
8 import javax.swing.text.DefaultFormatterFactory;
9 import javax.swing.text.MaskFormatter;
10 import javax.swing.text.NumberFormatter;
11 import persistence.Cliente;
12 import persistence.ClienteDao;
13
14 public class TelaCliente extends JFrame implements ActionListener {
15
16 JButton btnSalvar;
17 JLabel lblId, lblNome, lblTelefone, lblSexo, lblRenda;
18 JTextField txtNome;
19 JFormattedTextField txtTelefone, txtId, txtRenda;
UNINOVE – uso exclusivo para aluno
64
65 rdoMasculino = new JRadioButton("Masculino");
66 rdoMasculino.setBounds(170, 110, 100, 30);
67 rdoFeminino = new JRadioButton("Feminino");
68 rdoFeminino.setBounds(300, 110, 100, 30);
69 gruSexo = new ButtonGroup();
70 gruSexo.add(rdoMasculino);
71 gruSexo.add(rdoFeminino);
72 add(rdoMasculino);
73 add(rdoFeminino);
74
75 lblRenda = new JLabel("Renda:");
76 lblRenda.setBounds(450, 80, 150, 30);
77 add(lblRenda);
78
79 txtRenda = new JFormattedTextField();
80 txtRenda.setFormatterFactory(new DefaultFormatterFactory(new
NumberFormatter(new DecimalFormat("#0.00"))));
81 txtRenda.setBounds(450, 110, 100, 30);
82 txtRenda.setToolTipText("Utilize vírgula para separar as casas
decimais");
83 add(txtRenda);
84
85 btnSalvar = new JButton("Salvar");
86 btnSalvar.setBounds(10, 170, 150, 30);
87 btnSalvar.addActionListener(this);
88 add(btnSalvar);
89 }
90
91 public static void main(String[] args) {
366 - Programação Orientada a Objetos com Java – sem mistérios –
107 if (rdoMasculino.isSelected()) {
108 sexo = rdoMasculino.getText();
109 } else if (rdoFeminino.isSelected()) {
110 sexo = rdoFeminino.getText();
111 } else {
112 sexo = "";
113 }
114 renda = Double.parseDouble(txtRenda.getText().replace(",", "."));
115 Cliente cli = new Cliente(id, nome, telefone, sexo, renda);
116 ClienteDao dao = new ClienteDao();
117 int r = dao.conectar();
118 if (r == 2) {
119 mensagem = "Driver de conexão não foi encontrado";
120 } else if (r == 3) {
121 mensagem = "Os dados de conexão com o banco de dados
estão incorretos";
122 } else {
123 int x = dao.salvar(cli);
124 if (x == 1) {
125 mensagem = "Dados gravados com sucesso";
126 limparCampos();
127 } else if (x == 2) {
128 mensagem = "Você está tentando cadastrar um ID que já
existe";
129 } else {
130 mensagem = "Dados gravados com sucesso";
131 }
132 dao.desconectar();
133 }
134 JOptionPane.showMessageDialog(null, mensagem);
Evandro Carlos Teruel - 367
135 }
136 }
137
138 private void limparCampos() {
139 txtId.setText("");
140 txtNome.setText("");
141 txtTelefone.setText("");
142 gruSexo.clearSelection();
143 txtRenda.setText("");
144 txtId.requestFocus();
145 }
146 }
Além dos campos, haverá no formulário apenas o botão “Salvar”, criado das
linhas 85 à 88. Note que a este botão foi adicionado um Listener (ouvinte)
para que quando ele for clicado seja executado o método actionPerformed da
linha 98. Neste método, o objeto e do tipo ActionEvent permitirá identificar a
origem do clique por meio do método getSource. Se houve um clique no botão
“Salvar” (btnSalvar – linha 100), a operação de gravação será executada (das
linhas 101 à 135).
As linhas de 104 à 114 capturam os valores inseridos nos campos do formulário
e guardam em variáveis. Em seguida, na linha 115, estes dados são armazenados
(encapsulados) no objeto cli da classe Cliente.java.
A linha 116 instancia um objeto da classe ClienteDao.java para que seja
possível chamar o método conectar desta classe por meio deste objeto (linha
117). Na chamada ao método conectar (linha 117) é retornado o valor inteiro
1 (se a conexão foi estabelecida), 2 (se a classe do driver não estiver na
biblioteca do projeto) ou 3 (se os parâmetros de conexão estiverem incorretos).
Se o retorno foi 2 (linha 118), a mensagem da linha 119 é armazenada na
variável mensagem. Se o retorno foi 3 (linha 120), a mensagem da linha 121
é armazenada na variável mensagem. Se o retorno foi 1 (linha 122), executa
as linhas de 123 à 132, que realizam a operação de cadastro.
A linha 123 chama o método salvar da classe ClienteDao.java e passa como
parâmetro o objeto da classe Cliente.java que contém os dados cadastrados no
formulário. O método salvar, após ser executado, retornará 1 (se a operação de
cadastro for realizada com sucesso), 2 (se o id já existe cadastrado na tabela
do banco de dados) ou 3 (se ocorreu qualquer outro erro na inclusão dos
dados na tabela do banco de dados). Se o retorno foi 1 (linha 124), armazena a
mensagem da linha 125 na variável mensagem e limpa os campos por meio de
368 - Programação Orientada a Objetos com Java – sem mistérios –
Quando você precisa exibir apenas uma dentre muitas mensagens que são
geradas em uma estrutura de seleção (if..else if..else), crie uma variável para
DICA receber a mensagem e exiba o conteúdo desta variável somente após sair
UNINOVE – uso exclusivo para aluno
1 package persistence;
2
3 import java.sql.*;
4 import java.util.ArrayList;
5
6 public class ClienteDao {
7
8 private String url = "jdbc:mysql://localhost:3306/bd002";
9 private String usuario = "root";
10 private String senha = "";
11 private Connection con;
12 private PreparedStatement st;
13 private ResultSet rs;
14
15 //Método para conectar ao banco de dados
UNINOVE – uso exclusivo para aluno
45 }
46 }
47 }
48
49 //Método para consultar apenas um cliente cujo id foi informado
50 public Cliente buscar(int id) {
51 try {
52 st = con.prepareStatement("select * from cliente where id = ? ");
53 st.setInt(1, id);
54 rs = st.executeQuery();
55 if (rs.next()) {
56 Cliente cli = new Cliente();
57 cli.setId(rs.getInt("id"));
58 cli.setNome(rs.getString("nome"));
59 cli.setTelefone(rs.getString("telefone"));
UNINOVE – uso exclusivo para aluno
60 cli.setSexo(rs.getString("sexo"));
61 cli.setRenda(rs.getDouble("renda"));
62 return cli;
63 } else {
64 return null;
65 }
66 } catch (SQLException ex) {
67 return null;
68 }
69 }
70
71 //Método para buscar todos os registros cadastrados
72 public ArrayList buscarTudo() {
73 ArrayList<Cliente> listaClientes = new ArrayList<>();
74 try {
75 st = con.prepareStatement("select * from cliente");
76 rs = st.executeQuery();
77 while (rs.next()) {
78 Cliente cli = new Cliente();
79 cli.setId(rs.getInt("id"));
80 cli.setNome(rs.getString("nome"));
81 cli.setTelefone(rs.getString("telefone"));
82 cli.setSexo(rs.getString("sexo"));
83 cli.setRenda(rs.getDouble("renda"));
84 listaClientes.add(cli);
85 }
86 return listaClientes;
87 } catch (SQLException ex) {
88 return null;
89 }
Evandro Carlos Teruel - 371
90 }
91
92 //Método para excluir um registro cujo id foi informado
93 public int excluir(int id) {
94 try {
95 st = con.prepareStatement("delete from cliente where id = ? ");
96 st.setInt(1, id);
97 int r = st.executeUpdate();
98 return r;
99 } catch (SQLException ex) {
100 return 0;
101 }
102 }
103
104 // Método para alterar o registro cujo id foi informado
UNINOVE – uso exclusivo para aluno
@Override
public int salvar(Object obj) {
//implementação do método aqui
}
@Override
public Object consultar(int id) {
//implementação do método aqui
}
@Override
public int excluir(int id) {
UNINOVE – uso exclusivo para aluno
@Override
public int alterar(Object obj) {
//implementação do método aqui
}
@Override
public int conectar() {
//implementação do método aqui
}
@Override
public void desconectar() {
//implementação do método aqui
}
}
7.7 Resumo
Para acessar bancos de dados em aplicações Java existem dois padrões que
determinam as regras para acesso de maneira eficiente: Open Database
Connectivity (ODBC) e Java Database Connectivity (JDBC). Para utilizar
Evandro Carlos Teruel - 375
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection ("jdbc:mysql://localhost:3306/bd002",
"root", "teruel");
7.8 Exercícios
Os exercícios presentes neste tópico são divididos em duas categorias: práticos e
conceituais. Os exercícios práticos precisam ser realizados em um computador com
ambiente de programação Java instalado e configurado. Os exercícios conceituais
cobram conceitos referentes aos temas abordados neste capítulo.
Evandro Carlos Teruel - 377
2) Implemente uma aplicação Java utilizando as APIs swing e awt para criar a
interface do usuário. Esta aplicação deverá executar as operações CRUD em
um banco de dados chamado BdProd com uma tabela produto contendo os
seguintes campos:
4) O que é driver e onde ele deve ser adicionado no projeto Java que acessa
banco de dados?
8) Que exceção (ou exceções) pode gerar um método que realiza conexão com
banco de dados?
9) Como pode ser verificado em uma operação de cadastro se o valor que está
sendo inserido na chave primária da tabela já foi cadastrado?
13) Quais são as principais classes e/ou interfaces contidas no pacote java.sql?
Evandro Carlos Teruel - 379
8. Recomendações para
complementar a formação
em Java
Após ler e praticar os conteúdos vistos até aqui neste livro, você estará
pronto para aprofundar seus conhecimentos em Java estudando assuntos
mais complexos como Collections, Mapeamento Objeto-Relacional com
JPA e Hibernate, desenvolvimento de sites ou aplicações distribuídas com
Java EE (JSP, servlet, EJB, JSF etc.), desenvolvimento Java para celulares
e tablets que usam o sistema Android, design patterns (padrões de projeto)
e frameworks. Poderá ainda, se desejar, fazer provas para certificações Java
UNINOVE – uso exclusivo para aluno
8.1 Collections
Agora que você já conheceu e utilizou as diversas formas de manipulação
de dados com variáveis simples, constantes, objetos, tipos primitivos e de
referência, um bom caminho é estudar um tipo de estrutura mais complexa
chamada de coleção (collection).
As coleções (collections) em Java são estruturas de dados semelhantes as
arrays, porém, que manipulam dados como objetos, são dimensionadas
dinamicamente (ou seja, não tem tamanho pré-definido) e possuem um conjunto
de métodos úteis para manipular dados como listas, filas etc.
Da interface Collection descendem as interfaces Set(conjunto), Queue (filas)
e List (listas) que formam a base das coleções genéricas da linguagem Java,
como pode ser visto na Figura 8.1.
A interface Set define uma coleção que não contém valores duplicados;
Queue define uma coleção que representa uma fila no modelo FIFO (First-
In, First-Out); e List define uma coleção ordenada que pode conter elementos
duplicados.
380 - Programação Orientada a Objetos com Java – sem mistérios –
<<interface>>
Collection
<<interface>>
SortedSet
8.3 Java EE
Hoje em dia, a maioria das aplicações funcionam na web, o que torna
atrativo aprender Java EE. Com os recursos disponíveis no Java EE você
pode desenvolver sites e aplicações corporativas distribuídas, como aquelas
que disponibilizam um conjunto de recursos acessados de aplicações web,
desktop e mobile, oferecendo uma interface adequada para cada uma. Dentre
os recursos mais importantes do Java EE que vale a pena estudar estão JSP,
servlet, JSTL, EJB e JSF. Para criar aplicações Java EE você vai precisar de
um servidor de aplicação como TomEE, Glasfish, JBoss, Weblogic, Tomcat
(apenas contêiner web) etc.
(design patterns).
Os padrões de projeto são soluções reutilizáveis, pré-definidas e modeladas
para problemas comuns dentro de um determinado contexto (ou domínio) de
aplicação. O padrão de projeto dita ou apresenta uma maneira de fazer algo
de forma já testada em que os resultados positivos já foram comprovados. É
uma maneira de não ter que “reinventar a roda”.
Alguns dos principais padrões de projeto foram apresentado em um livro escrito
por quatro autores conhecidos como a Gangue dos Quatro (Gang of Four –
GoF). Eles apresentaram os padrões de projetos divididos em três grupos:
padrões de criação, relacionados à criação de objetos; padrões estruturais, que
tratam das associações entre classes e objetos; e padrões comportamentais,
que tratam das interações e divisões de responsabilidades entre as classes ou
objetos. Os padrões de cada grupo são apresentados a seguir:
8.5 Frameworks
Depois de entender o conceito de padrão de projeto, ou design pattern, você
deve estudar um pouco sobre os frameworks. Enquanto os design patterns
representam modelos de procedimentos que comprovadamente funcionam,
os frameworks trazem normalmente algo pronto, ou seja, pelo menos uma
parte dos códigos necessários para executar os procedimentos definidos em
algum padrão de projeto. Alguns frameworks, principalmente voltados para o
desenvolvimento de aplicações web, são listados a seguir:
Spring – http://www.springsource.org/
EJB – http://www.oracle.com/technetwork/java/javaee/ejb/index.html
Hibernate – http://www.hibernate.org/
EJB – http://www.oracle.com/technetwork/java/javaee/ejb/index.html
Struts – http://struts.apache.org/
JSF – http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html
<https://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage
?page_id=632>
8.8 Resumo
As coleções (collections) são estruturas de dados semelhantes às arrays,
que manipulam dados como objetos, são dimensionadas dinamicamente e
possuem um conjunto de métodos úteis para manipular dados como listas, filas
e conjunto. Da interface Collection descendem as interfaces Set (conjuntos),
Queue (filas) e List (listas), que formam a base das coleções em Java.
Quando precisar fazer a comunicação de aplicação com o banco de dados,
você pode utilizar a API JPA com o framework Hibernate para mapear objetos
para o banco de dados diretamente, sem ter necessariamente que utilizar
comandos SQL, e receber registros do banco de dados como objetos, sem ter
necessariamente que utilizar comandos de consulta SQL. A criação e execução
dos comandos SQL pode ser deixada a cargo da JPA.
Para criar sites e aplicações distribuídas e multiplataforma, você pode utilizar
UNINOVE – uso exclusivo para aluno
recurso do Java EE como JSP, servlets, EJB, JSF, Struts etc. Estas aplicações
necessitam de servidores, alguns deles integrados à IDE, como Glassfish,
Tomcat entre outros.
Muitas das situações e problemas encontrados no projeto e desenvolvimento
de software já foram resolvidos e as soluções já foram testadas e tiveram a
eficiência comprovada. Estas soluções foram desenhadas e documentadas em
padrões de projeto, para evitar que novos desenvolvedores tenham os mesmos
problemas e as mesmas dificuldades para solucioná-los. Há um conjunto de
padrões de projeto utilizados com frequência no mercado que é interessante o
desenvolvedor conhecer, como o MVC e DAO. Além dos padrões de projeto,
que apresentam modelos de soluções, existem os frameworks, que apresentam
parte da solução já desenvolvida, normalmente partes de código já prontos
para facilitar a implementação dos design patterns. Alguns dos principais
frameworks são JSF, Hibernate, Struts e EJB.
Se desejar programar para celulares e tablets, ou você utiliza o Java ME, ou
utiliza programação Java para dispositivos que utilizam o Sistema Operacional
Android. O desenvolvimento desse tipo de aplicação tem crescido muito devido
à popularização dos dispositivos móveis e do acesso sem fio à Internet.
Uma boa opção para conseguir espaço no mercado de trabalho tão concorrido,
é fazer uma certificação Java internacional, principalmente se você não tem
experiência comprovada em desenvolvimento com Java. As duas certificações
Java SE mais importantes hoje são OCAJP e OCPJP. A primeira aborda aspectos
mais básicos e a segunda, conceitos mais avançados.
Evandro Carlos Teruel - 385
Referências
CODEJAVA. JComboBox basic tutorial and examples. Disponível em: < http://www.
codejava.net/java-se/swing/jcombobox-basic-tutorial-and-examples>. Acesso em: 08
ago. 2014.
DEITEL, H.; DEITEL, P. Java: como programar. 8. ed. São Paulo: Pearson Prentice-
Hall, 2010.
UNINOVE – uso exclusivo para aluno
TERUEL, Evandro Carlos. Arquitetura de sistemas para web com Java utilizando
design patterns e frameworks. Rio de Janeiro: Ciência Moderna, 2012.