Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagem de Programação
Linguagem de Programação
1ª edição
Linguagem de Programação
C
CM
MY
CY
CMY
K
LINGUAGENS DE
PROGRAMAÇÃO
autor
FABIANO SANTOS
1ª edição
SESES
rio de janeiro 2015
Conselho editorial regiane burger; roberto paes; gladis linhares; karen bortoloti;
helcimara affonso de souza
Todos os direitos reservados. Nenhuma parte desta obra pode ser reproduzida ou transmitida
por quaisquer meios (eletrônico ou mecânico, incluindo fotocópia e gravação) ou arquivada em
qualquer sistema ou banco de dados sem permissão escrita da Editora. Copyright seses, 2015.
isbn: 978-85-5548-001-0
Prefácio 7
Objetivos 92
3.1 Introdução 93
3.2 Atributos e métodos de classe 95
3.3 Herança 96
3.3.1 Herança de métodos 99
3.4 Polimorfismo 102
3.5 Classes abstratas 104
3.6 Métodos abstratos 104
3.7 Interfaces 105
3.8 Encapsulamento e associações de classe 108
3.8.1 Agregação 109
3.8.2 Composição 110
Atividades 113
Reflexão 115
Referências bibliográficas 116
Objetivos 118
4.1 Introdução 119
4.2 Menus e barras de ferramentas 119
4.2.1 Menu com checkbox 122
4.2.2 Menus popup 123
4.2.3 Barras de ferramentas (toolbar) 123
4.3 Gerenciadores de layout 124
4.3.1 Containers sem gerenciador de layout 125
4.3.2 Tipos de gerenciadores de layout 125
4.3.2.1 FlowLayout 126
4.3.2.2 BorderLayout 127
4.3.2.3 BoxLayout 128
4.3.2.4 CardLayout 128
4.3.2.5 GridBagLayout 128
4.3.2.6 GridLayout 129
4.3.2.7 GroupLayout 129
4.3.2.8 pringLayout 130
4.3.3 Outros componentes 130
4.4 Telas polimórficas 138
4.5 Introdução ao tratamento de eventos com classes aninhadas 142
4.6 Classes aninhadas 145
4.6.1 Sobre o método TrataTextField.actionPerfomed() 146
4.7 Tipos comuns de eventos e interfaces ouvintes 148
4.8 Como funciona o tratamento de eventos? 149
4.8.1 Adaptadores de eventos 152
4.8.2 Classes internas e classes anônimas internas 155
Atividades 157
Reflexão 159
Referências bibliográficas 159
5. Tratamento de Exceções e
Breve Estudo de Caso 161
Objetivos 162
5.1 Introdução ao tratamento de exceções (Exceptions) 163
5.2 Breve estudo de caso 168
5.2.1 Interação entre os componentes do MVC 169
5.3 Estudo de caso – Desenvolvimento de uma interface gráfica para
controle de atividades de um clube 170
5.3.1 Criando as classes de interface 171
5.3.2 Criando as classes de negócio 183
Atividades 185
Reflexão 186
Referências bibliográficas 187
Gabarito 187
Prefácio
Prezados(as) alunos(as),
Bons estudos!
7
1
Introdução à
Linguagem de
Programação
Estudar uma linguagem de programação nova é como aprender um novo idio-
ma: temos que entender seu vocabulário, sintaxe e semântica. E com a lingua-
gem Java não é diferente.
A linguagem Java possui várias formas de realizar as tarefas e vamos apre-
sentar neste capítulo algumas das maneiras principais. Conhecer os blocos de
estruturação e controle de programas é fundamental e esperamos que este ca-
pítulo te ajude nisso.
Porém é importante que você aprimore seus conhecimentos com muita
prática e estudos em outras fontes de informação. Só assim você vai se tornar
fluente na linguagem.
Vamos lá?
OBJETIVOS
Neste capítulo vamos estudar os seguintes assuntos:
10 • capítulo 1
1.1 Introdução à linguagem de programação
Antes de tratarmos sobre a linguagem Java, é importante abordar sobre as lin-
guagens de programação em geral.
Sabemos que os computadores atuais são dispositivos digitais e interna-
mente só entendem duas coisas: 0 e 1 (bits). Os bits formam o que é chamado
de linguagem de máquina e cada computador possui seu conjunto próprio de
instruções. Portanto, computadores diferentes possuem linguagens de máqui-
na diferentes.
Programar um computador em linguagem de máquina é muito complexo,
ainda mais nos dias atuais devido à grande quantidade de diferentes tipos de
computadores. Veja como seria um antigo programa em linguagem de máqui-
na o qual faz a soma do ganho em horas extras no salário base e depois armaze-
na o resultado no salário bruto:
+1300042774
+1400593419
+1200274027
load salbase
add horaextra
store salbruto
capítulo 1 • 11
O entendimento do código fica mais fácil. Mas ainda assim não é o ideal
pois em programas muito grandes, você pode imaginar a quantidade de linhas
que devem ser escritas e no caso de erros na programação, o tempo que é per-
dido tentando encontrar onde está o problema. E ainda tem um detalhe: é ne-
cessário um programa tradutor o qual lê o código assembly e o transforma na
linguagem de máquina do computador no qual está executando o programa.
Logo, para cada computador, há uma linguagem assembly diferente.
O melhor seria termos uma linguagem de programação que se aproxi-
ma da forma na qual conversamos e escrevemos. Melhor ainda se ela entendes-
se a nossa fala e já programasse o computador (isso é chamado de linguagem
natural). Desta necessidade, surgiram as linguagens de alto nível. Elas apa-
receram devido à grande popularização dos computadores e devido à grande
necessidade de executar tarefas simples com instruções mais simples. As lin-
guagens Java, C, C++, C#, PHP, Visual Basic, Python e tantas outras que conhe-
cemos atuais são linguagens de alto nível.
Assim como o assembly, é preciso que um programa tradutor leia o código
fonte (escrito em linguagem de alto nível) e o converta para a linguagem de má-
quina. Este programa é chamado de compilador e cada linguagem de progra-
mação possui o seu próprio compilador. As linguagens de alto nível permitem
que os programadores escrevam programas com palavras que entendemos. Por
exemplo:
12 • capítulo 1
1.2 Introdução à linguagem Java
A linguagem Java começou em 1991 com um projeto mantido pela Sun
Microsystems chamado Green. Este projeto tinha como objetivo integrar vários
dispositivos eletrônicos, entre eles os computadores, por meio de uma mesma
linguagem de programação. Uma vez que os dispositivos eletrônicos são com-
postos por microprocessadores, a ideia era desenvolver uma linguagem na qual
um mesmo programa pudesse ser executado em diferentes dispositivos.
Com o passar do tempo, o projeto recebeu outro nome, Oak (carvalho, em
inglês) e depois Java. O mercado de dispositivos eletrônicos não evoluiu como a
Sun esperava e o projeto correu o risco de ser abortado. Porém, com o advento
da internet, e a necessidade de gerar conteúdo dinâmico para as páginas web,
o projeto tomou outro rumo e o Java foi lançado oficialmente em 1995 e cha-
mou a atenção pelas várias facilidades que possuía para desenvolver aplicati-
vos para a internet. Além disso, o Java possibilitava desenvolver também para
aplicações em computadores desktop bem como outros dispositivos como os
pagers e celulares.
capítulo 1 • 13
por meio do programa javac.exe (no Windows), o arquivo
COMPILAÇÃO: .java é compilado em bytecodes e armazenado no disco
com a extensão .class
14 • capítulo 1
O Netbeans é usado tanto para desenvolvimento de aplicações simples até
grandes aplicações empresariais e assim como o Eclipse, suporta outras lingua-
gens de programação como C, C++, PHP, etc. O Netbeans é um ambiente de
desenvolvimento, ou seja, uma ferramenta para programadores o qual permite
escrever, compilar, depurar e instalar programas. O IDE é completamente es-
crito em Java, mas pode suportar qualquer linguagem de programação. Existe
também um grande número de módulos para extender as funcionalidades do
NetBeans.
capítulo 1 • 15
• Java para web, com o uso de vários frameworks como o Struts, Java Server
Faces e outros, integrado a servidores de aplicações como o JBoss, Tomcat e
bancos de dados;
• Aplicativos para dispositivos móveis;
• Applets;
• Aplicativos para web em geral com HTML5;
• E outros.
Agora vamos precisar que você instale o Netbeans e o JDK. No site do Netbeans
existe uma versão do programa que inclui o JDK (chamada bundled version). Se
você não possui o JDK instalado na sua máquina é interessante que baixe esta
versão integrada. No próprio site do Netbeans tem instruções de instalação de-
talhadas de acordo com o sistema operacional.
Nosso primeiro programa será bem simples e para usar o Netbeans pela pri-
meira vez é necessário que você entenda alguns termos que são usados no pro-
grama a fim de melhor se acostumar com o software. Para isso recomendamos
a leitura e execução das atividades do seguinte link:
https://netbeans.org/kb/docs/java/quickstart_pt_BR.html
16 • capítulo 1
1.6 Tipos de dados primitivos
Quando vamos escrever um programa de computador, em qualquer linguagem,
vamos ter que usar variáveis. As variáveis servem para guardar valores dos mais va-
riados tipos: podem guardar números inteiros ou decimais, valores alfanuméricos,
somente alfabéticos, valores lógicos (como verdadeiro ou falso) e muitos outros.
Existem linguagens que permitem que o programador crie seus próprios tipos.
Vamos usar um algoritmo bem simples para ilustrar:
algoritmo Soma
numero1, numero2, soma: inteiro
inicio
soma ← 0
escreval(“Digite o primeiro número inteiro:”)
leia(numero1)
escreval(“Digite o segundo número inteiro:”)
leia(numero2)
soma ← numero1 + numero2
escreval(“A soma é”,soma)
fim
capítulo 1 • 17
Linguagens não tipada: é aquela em que só existe um tipo genérico para todo o
programa ou nem existe. Exemplo: Perl
Linguagem de tipo estático: neste tipo de linguagem, o compilador deve conhecer o
tipo antes da execução do programa. Exemplo: Java, C, C++, etc.
Linguagem de tipo dinâmico: o tipo da variável é conhecido somente na execução
do programa. Exemplo: PHP, Ruby, Python
TAMANHO
TIPO ESCALA
(BITS)
18 • capítulo 1
TAMANHO
TIPO ESCALA
(BITS)
9223372036854775808 a
long 64
9223372036854775807
1,40129846432481707e-45 a
float 32
3,40282346638528860e+38
4,94065645841246544e-324d a
double 64
1,79769313486231570e+308d
1 O Unicode é um padrão para representar caracteres usando números inteiros de 16 bits. O caractere “A” é
representado como ‘/u0041’ e o caractere “a” representado por ‘/u0061’
capítulo 1 • 19
Quando declaramos uma variável e não atribuímos nenhum valor a ela, o
Java atribui um valor automaticamente a ela de acordo com alguns padrões
conforme mostra a tabela 1.2.
BYTE 0
SHORT 0
INT 0
LONG 0L
FLOAT 0.0f
DOUBLE 0.0d
CHAR '\u0000'
BOOLEAN false
1.6.1 Literais
Um literal é uma representação de algum valor fixo que o programador literal-
mente estabelece. Cada tipo primitivo possui um literal correspondente e na
tabela 1.2 estão representados os literais padrões para cada tipo. Observe os
exemplos a seguir. São todos exemplos de literais.
20 • capítulo 1
boolean resultado = true;
char cMaiusculo = 'C';
byte b = 100;
short s = 10000;
int i = 100000;
// O número 26 em decimal
int decimal = 26;
// Em hexadecimal
int hexa = 0x1a;
// E em binário
int binario = 0b11010;
capítulo 1 • 21
Os tipos de ponto flutuante (float e double) também podem ser expressos
na notação científica usando a letra “E” ou “e”, “F” ou “f” para um literal float e
“D” ou “d” para um literal double. Observe os exemplos:
double d1 = 123.4;
// é o mesmo valor que d1 mas em notação científica
double d2 = 1.234e2;
float f1 = 123.4f;
Os literais dos tipos char e String podem conter qualquer caractere Unico-
de. Dependendo do editor de texto que você estiver usando para programar
você pode digitar diretamente caracteres como “Ç”, “ã” e outros ou usar uma
sequência chamada “escape para Unicode” para poder gera-los. Esta sequência
são os caracteres \u. Veja os exemplos:
//literal char
char c = ‘a’; //observe que o literal char tem que estar entre aspas simples!
22 • capítulo 1
//exemplo de literal String
//observe que a classe String começa com S maiúsculo!
1.7.1.1 IF-THEN
Para poder mostrar o funcionamento dos comandos em Java vamos usar o dia-
grama de atividades da UML. Desta forma você pode entender visualmente como
o comando é executado e compará-lo com o código em Java correspondente.
A figura 1.2 mostra o diagrama de atividade de uma instrução de seleção
básica e o código correspondente em Java.
Por enquanto vamos adotar que todas as saídas para a tela dos nossos pro-
gramas serão exibidas no console de comandos do sistema operacional. O co-
mando para gerar uma saída no console em Java é:
System.out.println(String s);
//o println mostra a string s e coloca o cursor na próxima linha
System.out.print(String s);
//o print mostra a string s e deixa o cursor na mesma linha
capítulo 1 • 23
if (nota >=5)
System.out.println (”aprovado”)
Imprimir
nota >=5
(”aprovado”)
nota <5
Observe que neste caso temos apenas uma instrução que é executada se a
condição do if for verdadeira. É claro que é possível ter várias instruções sendo
executadas porém neste caso teremos que abrir um bloco, como no exemplo a
seguir onde temos 2 instruções dentro de um bloco:
1.7.1.2 IF-THEN-ELSE
24 • capítulo 1
instrução após a condição verdadeira e uma após a condição falsa. E assim
como ocorre no IF-THEN, é possível ter um bloco após cada condição.
Uma boa prática de programação que você já deve ter aprendido anterior-
mente é a identação do código. Identar significa deslocar o código interno de
um bloco para melhor legibilidade do código.
if (nota>= 5)
System.out.println (”aprovado”);
else
System.out.println (”reprovado);
Imprimir Imprimir
nota<5 nota>=5
(”reprovado”) (”aprovado”)
No Java existe um operador condicional (?:) que pode ser usado no lugar do
IF-THEN-ELSE. Esse na verdade é o único operador ternário do Java, ou seja, ele
recebe três operandos juntos.
capítulo 1 • 25
Observe que foi criado um bloco para o último else (apenas como exemplo).
if (nota>=9)
System.out.println(“Conceito A”);
else
if (nota>=8)
System.out.println(“Conceito B”);
else
if (nota>=7)
System.out.println(“Conceito C”);
else
if (nota>=6)
System.out.println(“Conceito D”);
else {
System.out.println(“Conceito E”);
System.out.println(“Você está reprovado!”);
}
1.7.2 SWITCH
26 • capítulo 1
Ação(ões) do
Case a [true] Break
Case a
[false]
Ação(ões) do
Case b [true] Break
Case b
[false]
Ação(ões) do Break
Case z [true]
Case z
[false]
Ação(ões)
default
O switch pode ser usado com os tipos byte, short, char e int, além de tipos
enumerados, com a classe String e algumas classes especiais que encapsulam
alguns tipos primitivos como Character, Byte, Short e Integer (veremos essas
classes ao longo deste livro).
Para ilustrar esse comando, vamos usar um exemplo. No exemplo é decla-
rada uma variável inteira que representa o valor do mês. O programa mostra o
nome do mês de acordo com o valor numérico associado.
capítulo 1 • 27
1 public class Selecao {
2 public static void main(String[] args) {
3
4 int mes = 8;
5 String nomeMes;
6 switch (mes) { //inicio do bloco
7 case 1: nomeMes = "Janeiro";
8 break; //perceba o comando break no
//final de cada condição
9 case 2: nomeMes = "Fevereiro";
10 break;
11 case 3: nomeMes = "Março";
12 break;
13 case 4: nomeMes = "Abril";
14 break;
15 case 5: nomeMes = "Maio";
16 break;
17 case 6: nomeMes = "Junho";
18 break;
19 case 7: nomeMes = "Julho";
20 break;
21 case 8: nomeMes = "Agosto";
22 break;
23 case 9: nomeMes = "Setembro";
24 break;
25 case 10: nomeMes = "Outubro";
26 break;
27 case 11: nomeMes = "Novembro";
28 break;
29 case 12: nomeMes = "Dezembro";
30 break;
31 default: nomeMes = "Mês inválido";
32 break;
33 } //fim do bloco
34 System.out.println(nomeMes);
35 }
36 }
28 • capítulo 1
Neste caso, o mês “Agosto” será impresso na tela.
O corpo de um comando switch é chamado de bloco switch. Uma declara-
ção dentro do bloco switch pode ser rotulada com um ou mais comandos case
(ou default). O comando switch avalia sua expressão e depois executa todas
as declarações que “batem” com o rótulo case correspondente. No exemplo é
mostrado na linha 21 e 22.
O mesmo código mostrado como exemplo pode ser convertido em vários
comandos IF-THEN-ELSE:
int mes = 8;
if (mes == 1) {
System.out.println("Janeiro");
}
37 else if (mes == 2) {
System.out.println("Fevereiro");
}
... // e assim por diante
capítulo 1 • 29
switch (mes) {
case 1: meses.add("Janeiro");
case 2: meses.add("Fevereiro");
case 3: meses.add("Março");
case 4: meses.add("Abril");
case 5: meses.add("Maio");
case 6: meses.add("Junho");
case 7: meses.add("Julho");
case 8: meses.add("Agosto");
case 9: meses.add("Setembro");
case 10: meses.add("Outubro");
case 11: meses.add("Novembro");
case 12: meses.add("Dezembro");
break;
default: break;
}
if (meses.isEmpty()) {
System.out.println("Número de mês inválido");
}
else {
for (String nomeMes : meses) {
System.out.println(nomeMes);
}
}
}
}
Embora existam comandos que nós não vimos ainda, dá para perceber que
temos vários case sem o comando break para finalizar cada bloco. A saída na
tela desse programa será:
Agosto
Novembro
Setembro
Dezembro
Outubro
30 • capítulo 1
Veja no exemplo que o programa busca o case que “bate” com o valor da va-
riável mês e encontra no “case 8”. O programa adiciona a palavra “Agosto” na
lista de meses e assim prossegue com o “case 9”, “case 10” até o “case 12” pois
não há um comando break para parar a execução.
Assim, tecnicamente o break final acaba sendo desnecessário. Usar o break
é recomendado para a legibilidade e deixar o código menos propenso a erros. O
default trata todos os valores que não foram listados anteriormente nos case.
1.8.1 WHILE
While (condição) {
Comando (s)
{
Condição
[true]
[false]
Comando(s)
capítulo 1 • 31
O comando while avalia a condição, a qual sempre retorna um valor boolean
(true ou false). Se a condição retorna true, o while executa o(s) comando(s) no bloco.
O while continua testando a condição e executando o bloco até que a condição seja
false.
class Repete {
public static void main(String[] args){
int conta = 1;
while (conta < 11) {
System.out.println("Contando: " + conta);
conta = conta+1;
}
}
}
do {
comando(s)
} while (condição);
class Repete2 {
public static void main(String[] args){
int conta = 1;
do {
System.out.println("Contando: " + conta);
conta = conta+1;
} while (conta < 11);
}
}
32 • capítulo 1
1.8.2 FOR
for (inicialização;término;incremento) {
comando (s) ;
{
Inicializa contador
e Condição
Condição
[true]
[false]
Comando(s)
capítulo 1 • 33
class Repete3 {
public static void main(String[] args){
for(int i=1; i<11; i++){
System.out.println("Contando: " + i);
}
}
}
A saída do programa é:
Contando: 1
Contando: 2
Contando: 3
Contando: 4
Contando: 5
Contando: 6
Contando: 7
Contando: 8
Contando: 9
Contando: 10
34 • capítulo 1
class EnhancedFor {
public static void main(String[] args){
//declarando um vetor inteiro contendo uma lista de números
int[] numeros = {1,2,3,4,5,6,7,8,9,10};
//o for abaixo percorre o vetor e mostra na tela cada um dos números
for (int item : numeros) {
System.out.println("Contando: " + item);
}
}
}
Contando: 1
Contando: 2
Contando: 3
Contando: 4
Contando: 5
Contando: 6
Contando: 7
Contando: 8
Contando: 9
Contando: 10
Esta forma de usar o for deve ser usada sempre que possível, ok?
1.9 Strings
As strings são muito usadas na linguagem Java e são na verdade sequências de
caracteres. Na linguagem Java, as strings são objetos. A plataforma Java fornece
uma classe chamada String (perceba a letra maiúscula inicial) para criar e ma-
nipular strings.
capítulo 1 • 35
1.9.1 Criação de strings
Neste caso, “Alô mundo!” é um literal string, ou seja, uma série de caracte-
res que são limitados por aspas duplas. Toda vez quem um literal string é en-
contrado no programa, o compilador cria um objeto String com seu valor, neste
caso Alô Mundo!.
Como veremos mais adianta, assim como qualquer outro objeto, você pode
criar objetos String usando a palavra chave new e um construtor. A classe String
possui vários construtores que permitem você definir o valor inicial de uma
string de diversas formas, como por exemplo:
Como as strings em Java são objetos então existem métodos para obter infor-
mações destes objetos e são chamados de métodos assessores. Um dos méto-
dos assessores para as strings é o length(). Este método retorna o número de
caracteres de uma string. Veja o exemplo:
36 • capítulo 1
Um palíndromo é uma palavra ou frase que mantém o mesmo sentido
quando lida de trás para a frente. Leia “A sacada da casa” de trás para frente:
você perceberá que é a mesma frase!
No exemplo anterior, a variável tamanho, após a execução do método, con-
terá o valor 16, que é o tamanho da string palíndromo. Não esqueça que o espa-
ço conta como um caractere normal!
Veja o programa a seguir:
O programa não é muito útil pois ele inverte um palíndromo! Porém ele ser-
ve para exemplificar o uso de alguns métodos assessores das strings (lenght() e
o charAt() ) e relembrar alguns tópicos vistos sobre repetição com o for (observe
o uso das variáveis i e j).
Inicialmente o programa precisa converter a string em um vetor de caracte-
res (no primeiro loop), inverter o vetor em um segundo vetor (segundo loop) e
depois converter novamente em uma string. A classe String contém um método
capítulo 1 • 37
chamado getChars() que converte uma string (ou parte dela) em um vetor de
caracteres e assim poderíamos trocar o primeiro loop do programa para a se-
guinte linha:
Foi usado outro método no programa chamado charAt(x). Este método re-
torna o caractere encontrado na posição x do vetor que estamos usando para
fazer a pesquisa.
//com literias
"Meu nome é ".concat("Bond. James Bond");
A concatenação pode ser uma mistura de qualquer objeto. Para cada objeto
que não for uma string, é necessário usar o método toString() que converte o
objeto em uma string.
38 • capítulo 1
CONEXÃO
Existem mais métodos muito úteis na classe String. Porém um bom desenvolvedor preci-
sa conhecer a API da linguagem para poder usar os métodos eficientemente. A API da
linguagem Java, especialmente da classe String pode ser encontrada no seguinte link:
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
1.10 Vetores
Um vetor (ou array) é uma estrutura de dados que armazena uma sequência de
dados, ou objetos, todos do mesmo tipo em posições consecutivas da memória.
O tamanho de um vetor é fixado assim que o vetor é criado.
Cada item em um vetor é chamado de elemento e cada elemento é acessado
por meio de um valor chamado índice. Em Java, os índices dos vetores come-
çam com 0 (zero).
Vamos ver um exemplo no qual é criado um vetor de inteiros, alguns valores
são adicionados e depois impressos na tela.
class Array1 {
public static void main(String[] args) {
// declarando um vetor de inteiros
int[] umVetor;
capítulo 1 • 39
umVetor[5] = 600;
umVetor[6] = 700;
umVetor[7] = 800;
umVetor[8] = 900;
umVetor[9] = 1000;
40 • capítulo 1
1.10.1 Declarando uma variável como vetor
byte[] vetorBytes;
short[] vetorShorts;
long[] vetorLongs;
float[] vetorFloats;
double[] vetorDoubles;
boolean[] vetorBooleanos;
char[] vetorChars;
String[] vetorStrings;
Uma forma de criar um vetor é usar o operador new como já falamos. A linha do
programa Array1.java anterior cria um vetor com 10 posições.
capítulo 1 • 41
Se o new for esquecido ou omitido, o compilador gerará um erro dizendo
que a variável umVetor não foi inicializada.
As linhas abaixo atribuem um valor a cada posição do vetor:
int[] umVetor = {100, 200, 300,400, 500, 600,700, 800, 900, 1000};
42 • capítulo 1
a[0][0] a[0][1] a[0][2] a[0][3]
Nas figuras 1.7 e 1.8 cada elemento é identificado por uma expressão de acesso
ao vetor da forma a[linha][coluna]; a é o nome do vetor e linha e coluna são os índi-
ces unicamente identificados para cada elemento do vetor, por número de linha e
coluna.
Vamos usar um programa como exemplo:
class MultiDim {
public static void main(String[] args) {
String[][] nomes = { {"Sr. ", "Sra. ", "Srta. "},
{"Silva", "Santos"}
};
// Sr. Silva
System.out.println(nomes[0][0] + nomes[1][0]);
// Srta. Santos
System.out.println(nomes[0][2] + nomes[1][1]);
}
}
capítulo 1 • 43
Você pode usar a propriedade length para determinar o tamanho de cada
vetor. Veja o exemplo:
System.out.println(umVetor.length);
Como já dissemos, a linguagem Java possui muitas classes que auxiliam o de-
senvolvedor em tarefas como manipulação de vetores. Uma tarefa útil e muito
usada é a cópia de vetores. A classe System possui um método arraycopy que
você pode usar para fazer a cópia dos dados de um vetor para outro. O método
possui a seguinte sintaxe:
44 • capítulo 1
//agora copiamos a palavra "ele"
//(3) exibe o conteúdo de "b"
for (int i=0; i < b.length; i++) {
System.out.println("b[" + i + "]=" + b[i]);
}
}
}
0 T
1 E 1 E
2 L 2 L
3 E 3 E
4 F
System.arraycopy(a,1,b,0,3);
5 O
6 N
7 E
vetor a
capítulo 1 • 45
1.11 Conversões simples de tipos
Qualquer linguagem de programação possui várias formas de se fazer conver-
sões entre seus tipos suportados e Java não é diferente. Porém, as conversões
mais simples que podemos ter são as conversões entre números e strings e va-
mos mostrar algumas das formas. Não se esqueça que as outras formas você
precisa investigar na API do Java para verificar outras mais apropriadas para o
seu problema.
CONEXÃO
Os links a seguir mostram onde encontrar mais referências sobre a linguagem Java:
http://www.oracle.com/technetwork/java/api-141528.html: Especificações de todas as API Java
http://docs.oracle.com/javase/7/docs/api/: Especificação da API do Java 7
46 • capítulo 1
6 float b = (Float.valueOf(args[1])).floatValue();
7 // algumas contas
8 System.out.println("a + b = " + (a+b));
9 System.out.println("a - b = " + (a-b));
10 System.out.println("a * b = " + (a*b));
11 System.out.println("a / b = " + (a/b));
12 System.out.println("a % b = " + (a%b));
13 }
14 else {
15 System.out.println("Digite dois números:");
16 }
17 }
18 }
//Neste caso, o programa vai converter 100 graus Celsius para Fahrenheit. A
saída seria:
212.0
C:\>
capítulo 1 • 47
As linhas 5 e 6 são semelhantes. Vamos analisar a linha 5 e você analise a
linha 6 posteriormente.
5 float a = (Float.valueOf(args[0])).floatValue();
float a = Float.parseFloat(args[0]);
48 • capítulo 1
int i;
// Concatena "i" com uma string vazia; a conversão é feita “na mão”, usando o “+”
String s1 = "" + i;
ou
Cada uma das classes Number possui um método toString() para converter
um número em uma string. Veja o exemplo a seguir:
A saída do programa é:
ATIVIDADES
01. Verifique se os clientes de uma loja excederam o limite do cartão de crédito. Para cada
cliente, temos os seguintes dados:
- número da conta corrente
- saldo no início do mês
capítulo 1 • 49
- total de todos os itens comprados no cartão
- total de créditos aplicados ao cliente no mês
- limite de crédito autorizado
Todos esses dados são inteiros. O programa deve mostrar o novo saldo de acordo com a
seguinte fórmula (saldo inicial + despesas – créditos) e determinar se o novo saldo excede o
limite de crédito. Para aqueles clientes que o novo saldo excedeu, o programa deve mostrar
a frase: “Limite de crédito excedido”.
if (umNumero >= 0)
if (umNumero == 0)
System.out.println("Primeira string");
else System.out.println("Segunda string");
System.out.println("Terceira string");
04. No programa seguinte, qual é o valor do resultado do valueOf após cada linha nume-
rada? Neste exercício você terá que pesquisar sobre a classe StringBuilder para responder.
50 • capítulo 1
public class ComputeResult {
public static void main(String[] args) {
String original = "software";
StringBuilder resultado = new StringBuilder("olá");
int indice = original.indexOf('a');
System.out.println(resultado);
}
}
05. Um anagrama é uma palavra ou frase resultante do rearranjo das letras e produzindo outra pa-
lavra, usando as letras originais apenas uma vez. Por exemplo “Iracema” é um anagrama de “Améri-
ca”, “Amor” tem os seguintes anagramas: “Roma”, “Armo”, “Mora”, etc.. Escreva um programa que ve-
rifica se um string é um anagrama de outra string. O programa deve ignorar espaços e pontuações.
REFLEXÃO
O desenvolvimento em Java requer um esforço além dos livros didáticos. Aliás, qualquer lingua-
gem é assim. Cabe ao estudante se esforçar em conhecer outros recursos da linguagem os quais
não são explorados nos livros. Estudar a documentaçã, saber navegar dentro da documentação,
saber pesquisar dentro dela é fundamental para o bom aprendizado de qualquer linguagem.
LEITURA
Java é uma linguagem com muito material publicado e na internet.
A seguir apresentamos alguns materiais que podem ajudá-lo no seu aprendizado:
- SIERRA, K. Use a cabeça Java. Rio de Janeiro: Altabooks, 2010.
- ECKEL, B. Thinking in Java. Disponível em http://www.mindview.net/Books/TIJ/.
capítulo 1 • 51
- Java Progressivo. Disponível em: http://www.javaprogressivo.net/2013/02/Curso-Java-
Progressivo-Tutorial-Inicial.html
REFERÊNCIAS BIBLIOGRÁFICAS
DEITEL, H. M.; DEITEL, P. J. Java como programar. Bookman, 2002.
FLANAGAN, D. Java o guia essencial. Bookman, 2006.
GARY, C.; HORSTMANN, C. Core Java 2: Fundamentos. Makron Books, 2001.
GARY, C.; HORSTMANN, C. Core Java 2: Recursos Avançados. Makron Books, 2001.
HUBBARD, J. R. Programação com Java. Bookman, 2006.
52 • capítulo 1
2
Interfaces Gráficas
e Orientação a
Objetos
Todo mundo gosta de interagir com um programa de uma maneira agradável
e objetiva. Com a explosão da internet, cada dia que passa exigimos que os
programas tenham uma aparência e um comportamento parecido uns com
os outros para aumentar a nossa produtividade e experiência no uso da infor-
mática. Com a popularização dos celulares isso aumenta ainda mais.
Porém ainda existe uma grande demanda de programas que rodam exclusi-
vamente em computadores desktop, em redes e que não precisam estar na in-
ternet ou ter os mesmos recursos que a internet oferece. Muitos programas que
usamos no dia a dia são assim como os editores de texto, planilhas eletrônicas,
softwares para apresentações, jogos, entre outros.
Este capítulo vai mostrar os principais componentes para gerar programas
para esta categoria de software. Bons estudos!
OBJETIVOS
O objetivo principal deste capítulo é estudar os seguintes tópicos:
54 • capítulo 2
2.1 Introdução
Antes de estudarmos as interfaces gráficas vamos apresentar um ambiente de
desenvolvimento muito conhecido e usado por vários desenvolvedores Java: o
Netbeans.
O Netbeans foi criado em 1997 por um grupo de estudantes da antiga
Tchecoslováquia e tinha como ideia principal ser um ambiente de desenvolvi-
mento parecido com o Delphi. O Delphi na ocasião era um ambiente bastante
utilizado por oferecer vários recursos de arrastar e soltar além de outras faci-
lidades que não era encontrada em ambientes de desenvolvimento para Java.
Ainda mais na questão de desenvolvimento de interfaces gráficas.
Uma das vantagens de se utilizar um ambiente para o desenvolvimento de
interfaces gráficas é a produtividade e a maneira visual de prever como a tela
ficará na execução do programa. Porém isso traz uma desvantagem a qual era
presente inclusive no Delphi na época: o uso do arrastar e soltar para montar
as telas gera um código fonte o qual pode ser difícil de ser entendido pelos pro-
gramadores. Além disso, ele pode não ser tão otimizado quanto feito “na mão”.
A grande vantagem de se utilizar um ambiente de programação como o
Netbeans é usufruir das várias ferramentas de desenvolvimento embutidas
como por exemplo as ferramentas de depuração de código (debugger), integra-
ção e manipulação de servidores de aplicações como o JBoss, Apache Tomcat
e outros, além de criação de projetos específicos para a Web, Celulares, etc.. O
Netbeans também possui uma paleta de componentes específicos para a cria-
ção de interfaces gráficas.
capítulo 2 • 55
Figura 2.1 –Tela inicial do Netbeans após a criação de um projeto.
56 • capítulo 2
A linguagem Java possui algumas alternativas para o desenvolvimento de in-
terfaces gráficas para aplicações desktop. Todas elas são bibliotecas de compo-
nentes baseadas em uma hierarquia de classes a qual vamos tratar mais tarde
mas é fundamental que o desenvolvedor a conheça.
Inicialmente o Java contou com uma biblioteca chamada AWT (Abstract Window
Toolkit). Esta biblioteca possui alguns principais componentes usados nas aplica-
ções como por exemplo botões, caixas de texto, menus e eventos. Componentes mais
modernos e encontrados nas aplicações atualmente não existiam no AWT. Depois
do AWT apareceu o Swing Application Framework. Por muito tempo o Swing foi a
biblioteca mais utilizada, estudada e publicada no ambiente Java e muitas aplicações
ainda são desenvolvidas neste framework. Porém ele foi descontinuado da versão ofi-
cial do Java mas ainda é mantido por terceiros. Atualmente a Sun apoia o desenvol-
vimento usando uma biblioteca chamada JavaFX porém a documentação e o aceite
pela comunidade de desenvolvedores ainda não é tão significativo quanto foi o Swing
e por isso vamos dar preferência a este.
Para você ter uma ideia do que é o Swing, observe o programa abaixo:
import java.awt.EventQueue;
import javax.swing.JFrame;
capítulo 2 • 57
O programa é muito simples. Ele não faz nada além do que colocar uma ja-
nela na tela com o nome “Primeiro exemplo”. Observe que no programa princi-
pal nós colocamos a chamada da tela em um agendador do próprio Swing a fim
de evitar problemas em algumas situações. Vamos ver isso mais tarde.
Vamos agora estudar alguns componentes.
import javax.swing.JOptionPane;
58 • capítulo 2
O método showMessageDialog() possui vários construtores e foi usado na
linha 14 a forma mais simples. Observe que o segundo parâmetro do método é
a String que desejamos mostrar na tela.
CONEXÃO
Novamente enfatizamos o estudo da API do Java e neste caso especificamente a API do
Swing para poder saber as possíveis formas de uso da classe JOptionPane e seus inúmeros
(e úteis) métodos para criar diálogos com o usuário. Não deixe de ver o link: http://docs.
oracle.com/javase/6/docs/api/javax/swing/package-summary.html
capítulo 2 • 59
A hierarquia da Error! Reference source not found. mostra a hierarquia de
classes que compõem os componentes e os containers. É muito importante
conhecer estas classes e métodos para um melhor entendimento do Swing.
java.lang.Object
java.awt.Componet
java.awt.Container
javax.swing.JComponent
Frame
Painel de Conteúdo
Com Label amarelo
A Top-Level
Container
JFrame
JLabel
60 • capítulo 2
O código para gerar o frame da figura 2.5 está mostrado logo em seguida.
1 import java.awt.*;
2 import java.awt.event.*;
3 import javax.swing.*;
4
5 public class TopLevelDemo {
6 private static void mostra() {
7 //Cria e configura a janela
8 JFrame frame = new JFrame("TopLevelDemo");
9 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
10
11 //Cria a barra de menus com fundo verde
12 JMenuBar greenMenuBar = new JMenuBar();
13 greenMenuBar.setOpaque(true);
14 greenMenuBar.setBackground(new Color(154, 165, 127));
15 greenMenuBar.setPreferredSize(new Dimension(200, 20));
16
17 //Cria um label amarelo para colocar no painel
18 JLabel yellowLabel = new JLabel();
19 yellowLabel.setOpaque(true);
20 yellowLabel.setBackground(new Color(248, 213, 131));
21 yellowLabel.setPreferredSize(new Dimension(200, 180));
22
23 //Configura a barra de menu e coloca no painel
24 frame.setJMenuBar(greenMenuBar);
25 frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);
26
27 //Mostra a janela.
28 frame.pack();
29 frame.setVisible(true);
30 }
31
32 public static void main(String[] args) {
33 javax.swing.SwingUtilities.invokeLater(new Runnable() {
34 public void run() {
35 mostra();
36 }
37 });
38 }
capítulo 2 • 61
Como percebemos, cada programa em Swing terá pelo menos um container
principal, chamado top-level container. Ele será a raiz de uma hierarquia de
containers. Como regra, uma aplicação stand-alone com Swing terá uma hie-
rarquia de containers com um JFrame na raiz. Por exemplo, se uma aplicação
tiver uma janela principal e duas janelas de diálogo, então a aplicação terá três
hierarquias de compartimentos e três top-level containers. Uma hierarquia terá
um JFrame na raiz e cada uma das duas terá um JDialog na raiz.
import java.awt.EventQueue;
import javax.swing.JFrame;
62 • capítulo 2
PrimeiroExemplo ex = new PrimeiroExemplo();
ex.setVisible(true);
}
});
}
}
capítulo 2 • 63
isso mais a frente. As linhas de 4 a 9 definem a resposta do clique do botão e na
linha 7 o programa é finalizado. A linha 11 insere o botão definido no frame.
A Figura 2.6 mostra o resultado final do código do exemplo do botão.
64 • capítulo 2
5a marcha
Mudar
marcha
Campos 90 rmp
(Estados)
Frear
Aumentar
cadência
25 km/h
Métodos
(Comportamentos)
capítulo 2 • 65
usando apenas os métodos dos objetos, os deta-
OCULTAMENTO DA lhes da implementação interna permanecem es-
INFORMAÇÃO condidos do mundo externo
2.8 Classes
Vamos usar o exemplo da bicicleta para poder entender o conceito de classes e
objetos. No mundo real temos vários tipos de bicicleta: as speed (usadas para
corridas de longa distância), as mountain bike, e o tipo padrão. Existem outras
mas essas já são suficientes para o nosso estudo. Mesmo tendo usos e caracte-
rísticas diferentes, toda bicicleta tem um conjunto de propriedades e compor-
tamentos em comum.
No vocabulário da orientação a objetos, dizemos que uma bicicleta é uma
instância da classe de objetos conhecida como bicicleta. Uma classe é um pa-
drão no qual objetos individuais são criados.
Já dissemos que um objeto é implementado por um conjunto de variáveis e
funções. Sendo assim, vamos considerar que uma bicicleta pode ser implemen-
tada da forma mostrada na Listagem 1 em Java.
66 • capítulo 2
class Bicicleta {
int cadencia = 0;
int velocidade = 0;
int marcha = 1;
void mudarCadencia (int novoValor) {
cadencia = novoValor;
}
void mudarMarcha(int novoValor) {
marcha = novoValor;
}
void acelerar(int incremento) {
velocidade = velocidade + incremento;
}
void brecar(int decremento) {
velocidade = velocidade - decremento;
}
void imprimirEstado() {
System.out.println("Cadencia:" + cadencia + " Velocidade:" + velocidade
+ " Marcha:" + marcha);
}
}
Listagem 1
capítulo 2 • 67
Classe MinhaClasse{
// campos, construtor e declarações de métodos
}
68 • capítulo 2
class DemoBicicleta {
public static void main(String[] args) {
// criar dois tipos de objetos Bicicleta
Bicicleta bike1 = new Bicicleta();
Bicicleta bike2 = new Bicicleta();
bike2.mudarCadencia(50);
bike2.acelerar(10);
bike2.mudarMarcha(2);
bike2.mudarCadencia(40);
bike2.acelerar(10);
bike2.mudarMarcha(3);
bike2.imprimirEstado();
}
}
A saída deste teste imprime a cadência final, velocidade e marcha das duas
bicicletas:
Listagem 2
capítulo 2 • 69
A classe Bicicleta (Error! Reference source not found.) usa as seguintes li-
nhas de código para definir seus campos:
int cadencia = 0;
int velocidade = 0;
int marcha = 1;
• O public faz com que o campo seja acessível para todas as outras classes
• O private faz com que o campo seja acessível somente dentro da própria
classe
70 • capítulo 2
public class Bicicleta {
private int cadencia;
private int marcha;
private int velocidade;
public Bicicleta(int cadenciaInicial, int VelocidadeInicial, int marchaI-
nicial){
marcha = marchaInicial;
cadencia = cadenciaInicial;
velocidade = velocidadeInicial;
}
public int getCadencia() { return cadencia; }
public void setCadence(int novo) { cadencia = novo; }
public int getMarcha() { return marcha; }
public void setMarcha(int novo) { marcha = novo; }
public int getVelocidade() { return velocidade; }
public void brecar(int decremento) { velocidade -= decremento; }
public void acelerar(int incremento) { velocidade += incremento; }
}
Listagem 3
Todas as variáveis devem ter um tipo. Podemos usar tipos primitivos como int,
float, boolean, etc ou usar tipos referenciados como strings, arrays e objetos.
Todas as variáveis, sendo elas campos, variáveis locais ou parâmetros se-
guem as mesmas regras de nomeação e convenções. Em Java convenciona-se
que toda variável deve ser iniciada com letras minúsculas e adotar a convenção
CamelCase. Fique atento porque a convenção CamelCase também é aplicada
para classes e métodos, exceto que nas classes, a primeira letra sempre é mai-
úscula e a primeira letra (ou palavra) no método deve ser um verbo.
capítulo 2 • 71
2.8.4 Definindo métodos
72 • capítulo 2
Alguns nomes estão em inglês porque são métodos bastante usados em vá-
rios programas, e para manter uma maior legibilidade, ficam em inglês.
Normalmente um nome de método é único dentro da classe. Entretanto, um mé-
todo pode ter o mesmo nome que outros métodos. Isto é chamado de sobrecarga.
2.8.6 Construtores
Uma classe contém construtores que são invocados quando um objeto da clas-
se é criado. As declarações de construtores se parecem com declarações de mé-
todos, exceto que eles tem exatamente o mesmo nome da classe e não possuem
tipos de retorno. A classe Bicicleta a seguir possui o construtor:
capítulo 2 • 73
public Bicicleta(int cadenciaInicial, int velocidadeInicial, int marchaInicial) {
marcha = marchaInicial;
cadencia = cadenciaInicial;
velocidade = velocidadeInicial;
}
Public Bicicleta(){
marcha = 1;
cadencia = 10;
velocidade = 0;
}
74 • capítulo 2
superclasse e nesta situação, o compilador vai acusar que a superclasse não
tem um construtor assim, portanto, é bom você verificar isso antes de usar este
recurso. O melhor mesmo é sempre criar um construtor. Caso a classe não te-
nha uma superclasse explícita, será usado o construtor da classe Object o qual
tem um construtor sem argumentos.
Você pode usar modificadores de acesso em uma declaração de construtor
para controlar quais outras classes podem chamar o construtor.
capítulo 2 • 75
Parâmetros referem-se à lista de variáveis na declaração do método.
Argumentos são os valores atuais que são passados quando os métodos são chama-
dos. Quando um método é executado, os argumentos usados “casam” com as declara-
ções de parâmetros pelo tipo e pela ordem.
Você pode usar qualquer tipo de dado para um parâmetro de um método ou cons-
trutor. Isto inclui tipos primitivos e tipos referenciados, como arrays e objetos.
Em relação aos nomes dos parâmetros, é importante saber que quando
você declara um parâmetro, ele terá o seu nome conhecido por todo o escopo
do método. Não é possível criar uma variável dentro do escopo com o mesmo
nome nem do construtor da classe. Além disso, um parâmetro pode ter o mes-
mo nome que o campo da classe correspondente, isso é chamado de sombra do
campo. Veja o exemplo a seguir:
76 • capítulo 2
public class PassagemPorValor {
public static void main(String[] args) {
int x = 3;
2.9 Objetos
Para estudarmos os objetos, vamos usar a Error! Reference source not found.
Listagem 4 como exemplo. Ela possui duas classes: Ponto e Retangulo e uma
classe para testar as duas.
O programa cria, manipula e mostra informação de vários objetos. A saída
do programa é a seguinte:
capítulo 2 • 77
Posição X do ret2: 23
Posição Y do ret2: 94
Posição X do ret2: 40
Posição Y do ret2: 72
Vimos que uma classe é um padrão, um modelo para criar objetos. O código
abaixo, obtido da Listagem 4, cria um objeto e o associa a uma variável:
78 • capítulo 2
x = a;
y = b;
}
}
capítulo 2 • 79
System.out.println("Altura do ret1: " + ret1.altura);
System.out.println("Área do ret1: " + ret1.getArea());
Listagem 4
Tipo nome_da_variável;
Isto faz com o que o compilador identifique que o nome da variável terá
aquele tipo especificado. Para um tipo primitivo, esta declaração também re-
serva um espaço de memória. Para um objeto a sintaxe é semelhante:
Ponto origem1;
Se você declara origem1 como o exemplo, seu valor será indeterminado até
que o objeto seja criado e associado. Somente declarar a variável não cria o ob-
jeto. Para a criação você deve usar a palavra-chave new. Veja a figura 2.8:
80 • capítulo 2
Origem1
O operador new instancia uma classe alocando memória para um novo objeto
e retornando uma referência para a memória. Além disso, o new chama o cons-
trutor da classe.
Quando dizemos que “instanciamos uma classe” é o mesmo que dizer que “criamos um
objeto”. Quando você cria um objeto você cria uma instância, um elemento de uma classe.
capítulo 2 • 81
Um objeto Ponto
x 23
Origem1 Ponto Origem1 =
new Ponto (23, 94)
y 94
public Retangulo ()
public Retangulo (Ponto p)
public Retangulo (int l, int a)
public Retangulo (Ponto p, int l, int a)
Cada construtor permite que seja fornecido valores iniciais para a origem,
altura e largura do retângulo usando tanto tipos primitivos e tipos referencia-
dos. Se uma classe tem múltiplos construtores, eles devem ter diferentes assi-
naturas. O compilador diferencia os construtores baseados no número e o tipo
dos argumentos.
Quando o compilador encontra o código seguinte, ele sabe chamar o cons-
trutor na classe Retangulo que precisa de um argumento Ponto seguido por 2
argumentos:
82 • capítulo 2
O código seguinte chama o construtor de Retangulo que pede dois inteiros
como argumentos referentes à largura e altura. Se você ler o código dentro do
construtor perceberá que ele cria um novo objeto Ponto o qual x e y são inicia-
lizados com 0.
Origem1
x 23
y 94
Origem1
Largura 100
Altura
200
Lembre-se: é muito recomendável que todas as classes devem ter pelo me-
nos um construtor.
capítulo 2 • 83
2.9.4 Usando objetos
Uma vez que você criou um objeto, você vai querer usá-lo. Você pode precisar
usar o valor de um de seus campos, mudar um dos seus campos ou chamar um
de seus métodos para fazer alguma coisa.
Os campos de um objeto são acessados pelo seu nome. Você deve usar um
nome único e sem duplas interpretações.
O código que fica fora da classe do objeto deve usar uma referência de ob-
jeto ou expressão, seguida de um ponto (.), seguida por um nome de campo
simples, por exemplo:
84 • capítulo 2
Note que após esta declaração for executada, o programa não terá mais a refe-
rência criada para Retangulo, porque o programa nunca guardou a referência.
O objeto fica sem referência e seus recursos são liberados para serem consumi-
dos pela JVM.
Você também pode usar uma referência de objeto para invocar os métodos de
um objeto. Para fazer isso basta você colocar o nome do objeto, o ponto, e o
nome do método. Além disso, é necessário passar a lista de argumentos entre
parênteses ou deixar a lista vazia quando não houver argumentos.
nomeDoObjeto.nomeDoMétodo(listaDeArgumentos);
ou
nomeDoObjeto.nomeDoMétodo();
A classe Retangulo tem dois métodos: getArea() para calcular a área do re-
tângulo e move() para movimentar o retângulo. Veja como é feita a chamada de
um método:
new Retangulo(50,100).getArea();
capítulo 2 • 85
int areaDoRetangulo = new Retangulo(50,100).getArea();
86 • capítulo 2
public Bicicleta quemEOMaisRapido(Bicicleta minha, Bicicleta sua, Ambiente amb) {
Bicicleta maisRapida;
// aqui vai o código para calcular qual bicicleta é mais rápida, dada sua ca-
dência e ambiente(terreno e vento)
return maisRapida;
}
Por enquanto o que vimos nesse capítulo é suficiente para fazermos algu-
mas brincadeiras e desenvolver alguns programas simples. Vamos lá?
ATIVIDADES
01. Considere a seguinte classe
capítulo 2 • 87
02. Baseado nos atributos de uma Pessoa como nome e idade e no comportamento fazA-
niversario, construa uma classe e crie alguns objetos. Faça com que alguns objetos façam
aniversário e imprima os dados dos objetos criados.
03. Uma conta corrente possui um número, um saldo, um status que informa se ela é espe-
cial ou não, um limite e um conjunto de movimentações. Crie uma classe em Java com essas
especificações e crie alguns objetos para testá-la.
04. Escreva uma classe que represente um país. Um país tem como atributos o seu nome, o
nome da capital, sua dimensão em km2 e uma lista de países com os quais ele faz fronteira.
Crie a classe em Java e forneça os seguintes construtores e métodos:
a) Construtor que inicialize o nome, capital e dimensão do país
b) Métodos de acesso (get e set) para obter as propriedades indicadas no item (a)
c) Um método que permita verificar se dois países são iguais. Dois países são iguais se
tiverem o mesmo nome e a mesma capital. A assinatura desse método deve ser: public boo-
lean equals(final Pais outro)
d) Um método que define quais outros países fazem fronteira (note que um país não pode
fazer fronteira com ele mesmo)
e) Um método que retorne a lista de países que fazem fronteira
f) Um método que receba um outro país como parâmetro e retorne uma lista de vizinhos
comuns aos dois países.
OBS: Este exercício é muito interessante e abrangente. Você vai precisar usar arrays de
objetos para poder resolvê-lo. Encare como um bom desafio. Use a API do Java e suas outras
fontes de informação para resolver o exercício corretamente.
REFLEXÃO
Vimos neste capítulo o que são classes e objetos e um pouquinho sobre interfaces gráficas.
É importante que você observe o mundo real e perceba que tudo que nos rodeia pode ser
abstraído em campos e estados, assim como as classes e objetos. Conseguir encontrar es-
ses campos e comportamentos, criar classes genéricas e relacioná-las umas com as outras
certamente fará de você um grande analista e programador em qualquer linguagem de pro-
gramação orientada a objetos.
88 • capítulo 2
LEITURA
Procure na internet uma IDE chamada BlueJ. Trata-se de um programa que vai ajudá-lo a
programar em Java com mais facilidade. No site deste programa você encontrará várias do-
cumentações a respeito de como usar o programa e outras explicações a respeito de classes
e objetos. Apesar de ser em inglês, é uma leitura fácil e muito recomendada.
Existem alguns livros que ensinam Java por meio de jogos. É uma abordagem interes-
sante e muito válida. A lista seguinte apresenta alguns títulos interessantes sobre o assunto:
Developing games in Java. David Brackeen, Bret Barker, Lawrence Vanhelsuwe. New Riders, 2003
Fundamental 2D game programming in Java. Timothy M. Wright. Cengage Learning PTR, 2014
REFERÊNCIAS BIBLIOGRÁFICAS
DEITEL, H. M.; DEITEL, P. J. Java como programar. Bookman, 2002.
FLANAGAN, D. Java o guia essencial. Bookman, 2006.
GARY, C.; HORSTMANN, C. Core Java 2: Fundamentos. Makron Books, 2001.
GARY, C.; HORSTMANN, C. Core Java 2: Recursos Avançados. Makron Books, 2001.
HUBBARD, J. R. Programação com Java. Bookman, 2006.
capítulo 2 • 89
90 • capítulo 2
3
Herança e
Associações de
Classe
A orientação a objetos tem grande aceitação no mercado e nas empresas que
desenvolvem ferramentas de software devido a mecanismos eficientes para
abstrair o mundo real em pedaços de código.
A herança certamente é um desses mecanismos e por meio dela é possível
desenvolver sistemas cada vez mais complexos e completos. Neste capítulo va-
mos estudar seus conceitos gerais e algumas de suas derivações.
Além disso vamos estudar a forma pela qual as classes se relacionam entre
si por meio dos vários tipos de associações.
Bons estudos!
OBJETIVOS
Neste capítulo nosso objetivo é aprender os conceitos básicos de:
• Herança;
• Interfaces e classes abstratas;
• Encapsulamento e polimorfismo;
• Associações entre classes e objetos.
92 • capítulo 3
3.1 Introdução
Antes de entrarmos nos assuntos do capítulo, vamos adotar algumas conven-
ções e apresentar um exemplo para posteriormente entendermos os conceitos
propostos para este capítulo.
Podemos representar uma classe por meio de uma notação, um diagra-
ma. Existe uma linguagem de modelagem chamada UML (Unified Modeling
Language) cujo objetivo é usar diagramas para representar um sistema orienta-
do a objetos. A UML serve para diagramar classes, objetos e várias outras situ-
ações encontradas na análise de sistemas. Ela serve para qualquer linguagem
orientada a objetos e não é exclusiva do Java. A figura 3.1 mostra a classe Conta,
que iremos usar nos nossos exemplos, e sua implementação em Java. Observe a
figura atentamente e como é o código correspondente.
capítulo 3 • 93
O sinal de subtração (–) significa que o elemento é private. O sinal de adição
(+) significa que o elemento seguinte é public.
Na parte inferior do diagrama encontram-se os métodos. Temos no exem-
plo 3 métodos:
Uma vez que mostramos como podemos representar uma classe por meio
de um diagrama, considere o diagrama de classes mostrado na figura 3.2:
Agência
- número: int
- funcionários [ ] : funcionários
Funcionário
- nome: String
- salário: double
- vale refeição: double Cartão de Crédito
- número: int
+ aumentar salário ( ) void; - dataExpedição: String
+ aumentar salário (double) void; - cliente: Cliente
+ alterar vale refeição (double)
Conta
- número: int
- saldo: double Cliente
Gerente - limite: double
- nome: String - agêcia: Agência - código: int
- saldo: double - nome: String
+ depositar (double) void;
- vale refeição: double - contas [ ]: conta
+ sacar (double) void;
+ aumentar salário ( ) void; + imprimirExtrato ( ): void;
+ aumentar salário (double) void; + imprimirExtrato (int): void;
+ alterar vale refeição (double) + consultar Saldo ( )
O diagrama mostrado nos conta muitas coisas que refletem o mundo real
na visão do analista que fez esta modelagem. Um cliente possui vários car-
tões de crédito, um cliente está associado a uma ou mais contas, uma conta
a uma agência, a qual possui várias contas. Em uma agência trabalham vários
94 • capítulo 3
funcionários e um deles ou mais, é do tipo gerente. A especificação do diagra-
ma de classes você conhecerá na disciplina de modelagem de sistemas usando
UML.
Portanto, o diagrama mostra que existem classes que estão relacionadas de
várias formas e cada uma dessas associações tem uma representação gráfica
diferente que será discutida brevemente neste capítulo.
Vamos usar este diagrama com suas associações durante todo esse capítulo.
O diagrama reflete um sistema bancário muito simples.
O acesso a este atributo é feito de uma maneira direta, sem precisar criar
uma instância dessa classe para poder acessar e modificar o atributo.
capítulo 3 • 95
Funcionario.valeRefeicao = 25.50;
Pela maneira acima, todas as instâncias (objetos) que forem criados da clas-
se Funcionario terão o mesmo valor neste atributo.
Já vimos que a recomendação para a visibilidade dos atributos é que eles
sejam private. Portanto, o acesso ao atributo mostrado acima na prática não irá
ocorrer. Então precisamos criar métodos para poder manipular esses atribu-
tos, da mesma forma que fazemos com os atributos de instâncias.
Por exemplo, se o banco quiser alterar o valor do vale refeição de seus fun-
cionários é preciso criar um método para tal pois isto não depende dos dados de
um funcionário só. O método para alterar o atributo está apresentado a seguir:
Funcionario.alterarValeRefeicao(0.2);
3.3 Herança
A herança é um mecanismo fundamental para a orientação a objetos. Usamos
este mecanismo diariamente na área de desenvolvimento e como usuários de
internet, programas e outros softwares, temos contato constante com isso.
Uma das grandes vantagens do uso da herança é sem dúvida a reutilização
de código. Como exemplo, vamos pensar na modelagem do banco da Figura
20. Um banco normalmente oferece serviços para os seus clientes como em-
préstimos, financiamentos, seguros e outros. Todo serviço, independente de
96 • capítulo 3
qual seja, tem características semelhantes: cliente, valor, data de vencimento,
data de abertura, entre outras. O programador deste sistema naturalmente vai
desenvolver uma classe para um serviço com esses atributos. Porém quando ele
for escrever o código para os tipos de serviços especificamente como o emprés-
timo, o financiamento, ele teria que escrever novamente as classes com esses
atributos, repetindo todo o trabalho que teve anteriormente. A herança evita
esse retrabalho.
Observe os exemplos no código em Java. A classe serviço completa está mos-
trada abaixo:
//dados do empréstimo
private double valor;
private double taxa;
//dados do seguro
private Carro carro
private double valorSeguroCarro;
private double franquia;
}
capítulo 3 • 97
Serviço
Seguro Empréstimo
class Servico {
private Cliente contratante;
private Funcionario responsavel;
private Date dataDeContratacao;
}
98 • capítulo 3
Empréstimo
valor
taxa
Serviço
contratante
responsável
dataDeContratação
É frequente o uso de métodos que são usados por todas as classes de uma deter-
minada hierarquia. Podemos exemplificar com um atributo da classe Servico
que represente uma taxa administrativa presente em todos os tipos de serviços.
Este atributo será definido na classe Servico. Teremos também um método cal-
cularTaxa() o qual é responsável por fazer os cálculos desta taxa. Todas as clas-
ses que herdam de Servico irão reaproveitar este método.
class Servico {
// atributos
public double calcularTaxa(){
return 100;
}
}
capítulo 3 • 99
Emprestimo e = new Emprestimo();
Seguro s = new Seguro();
e.calcularTaxa(); //veja que tanto o objeto e o objeto s utilizam o método
s.calcularTaxa();
100 • capítulo 3
class Emprestimo extends Servico {
// ATRIBUTOS
public double calculaTaxa() {
return 5 + this.valor*0.1; //10% do valor + R$5,00 fixos
}
}
O problema agora é: se o valor fixo tiver que ser alterado, todas as subclasses
de Servico deverão ser alteradas. No nosso exemplo é fácil pois são 2 classes
somente. Mas e se fossem bem mais do que isso? Seria um grande retrabalho.
Uma solução é criar um método na superclasse para essa tarefa e depois repli-
car este método nas subclasses. Assim:
class Servico {
public double calculaTaxa(){
return 5 ;
}
}
capítulo 3 • 101
Quando tratamos os métodos e herança não podemos deixar de lado os
construtores das classes. Como sabemos, os construtores são métodos espe-
ciais que inicializam os atributos e sendo assim merecem uma atenção especial
quando existe uma hierarquia de classes.
Observe a figura 4.3 e lembre que um Emprestimo é um tipo de Servico.
Quando criamos um objeto empréstimo, o construtor da classe Emprestimo ou
da classe Servico deve ser chamado. Se houver um construtor em cada uma des-
sas classes, o construtor da classe mais genérica é chamado antes (neste caso,
o objeto empréstimo ao ser criado passa pelo construtor de Servico e depois
Emprestimo). Quando não há construtores definidos, o compilador chamará o
construtor sem argumentos da superclasse.
3.4 Polimorfismo
A palavra polimorfismo possui 2 partes: poli (muitas) morfismo (formas) – mui-
tas formas. O polimorfismo é outro recurso que contribui para a reutilização de
código. No exemplo do banco que estamos usando, falta um controle de ponto
dos funcionários.
Todo funcionário deve “picar o cartão” no início e no fim do expediente.
Portanto, se pensarmos em uma classe para essa finalidade, precisaremos de
2 métodos: um para a entrada e outro para a saída. Porém em uma empresa, os
tipos de funcionários possuem formas de controle de ponto diferentes. Logo,
se para 1 tipo de funcionário precisaríamos de 2 métodos, para N tipos de fun-
cionários precisaríamos de N * 2 métodos! E que fazem a mesma coisa! Imagine
o retrabalho!
A solução para este problema é analisar o mundo real e abstrai-lo na pro-
gramação. No mundo real temos vários tipos de funcionários: Gerentes,
Atendentes, Caixas, etc.. Logo, percebe-se que existe uma relação de herança:
Um funcionário que deriva outros tipos, ou seja, o gerente é um funcionário, o
atendente é um funcionário, o caixa é um funcionário, etc..
Na programação, a herança faz com que os objetos das subclasses criados
sejam tratados como objetos da superclasse, ou seja, um objeto Gerente e um
objeto Atendente são tratados como objetos da classe Funcionario.
102 • capítulo 3
class Gerente extends Funcionario // todo gerente é um funcionário
...
Gerente g = new Gerente(); //criamos um objeto Gerente
Funcionario f = g; //tratando um gerente como da classe Funcionario
Vamos dar uma olhada na classe que poderia implementar o nosso ponto
eletrônico:
class PontoEletronico {
public void registraEntrada(Funcionario fun){
//implementação do código
}
Como já tratamos anteriormente, não faz sentido criar uma classe de ponto
eletrônico para cada tipo de funcionário. A classe acima é uma boa forma de
implementar a solução pois os métodos registraEntrada() e registraSaida() re-
cebem como parâmetro um objeto da classe Funcionario e sendo assim podem
receber referências de objetos de qualquer subclasse de Funcionario. Temos
aqui então um exemplo de polimorfismo.
Polimorfismo provém da biologia onde um organismo ou espécie pode ter várias formas
ou estágios (sapo, borboleta, etc). No nosso caso, polimorfismo é quando subclasses
de uma classe pode definir seu próprio e único comportamento e ainda compartilhar as
mesmas funcionalidades que sua superclasse.
capítulo 3 • 103
3.5 Classes abstratas
Em um banco sabemos que existem vários tipos de contas: conta corrente, con-
ta salário e conta poupança são alguns exemplos. Não é necessário explicar que
então temos uma hierarquia de classes novamente na qual a superclasse é a
Conta e suas subclasses são: ContaCorrente, ContaPoupanca e ContaSalario.
Na hora da criação de objetos, iremos sempre criar objetos de uma dessas
três classes somente, não vamos precisar criar um objeto do tipo Conta porque
ele será incompleto, ele não será uma conta com todas as suas propriedades e
métodos, ela servirá apenas como uma base para poder criar outros tipos de
contas. Logo, como criaremos somente objetos de um dos três tipos das sub-
classes, dizemos que essas classes são concretas e Conta é uma classe abstrata.
Uma classe concreta serve então para criar instâncias de objetos e a classe abs-
trata, não. Veja abaixo como definir uma classe abstrata:
Desta forma não será mais possível criar um objeto Conta e a linha abaixo
representará um erro ao compilar:
Conta con = new Conta(); // ERRO!! Conta é abstract, não pode criar objetos
104 • capítulo 3
O problema é que cada subclasse pode implementar de uma maneira diferente
o método da impressão dos extratos e é sempre importante manter um padrão no
desenvolvimento de software. Como a classe base será a classe Conta, ela poderia
conter uma forma de padronizar o método de impressão de extrato e assim orien-
tar que suas subclasses implementem o método de uma maneira uniforme.
Para garantir que cada subclasse (concreta) que provém direta ou indire-
tamente de uma superclasse tenha uma implementação de método para im-
primir os extratos, inclusive com uma mesma assinatura (e manter o padrão
comentado), usamos o conceito de métodos abstratos.
3.7 Interfaces
Em muitas situações da engenharia de software é importante que os desenvol-
vedores entrem em acordo com um “contrato” o qual mostra como o software
irá interagir. Cada grupo de programadores deverá ser capaz de escrever o seu
código sem conhecimento de como o código do outro grupo foi desenvolvido.
Estes contratos mencionados, estes acordos, são chamados de interfaces.
capítulo 3 • 105
No exemplo do banco, podemos definir uma interface Conta para padro-
nizar as assinaturas dos métodos oferecidos pelos objetos que representam as
contas do banco.
interface Conta{
void depositar(double quantia);
void sacar(double quantia);
}
CONEXÃO
Um padrão de projeto é como uma especificação de uma determinada solução para um pro-
blema específico no software. Este conceito será melhor explicado e desenvolvido em outras
106 • capítulo 3
disciplinas. Mas para antecipar, veja os padrões J2EE da Oracle: eles estão “recheados” de
interfaces. Um padrão muito útil e usado é o Data Access Object (DAO). Veja no link: http://
www.oracle.com/technetwork/java/dataaccessobject-138824.html
Cliente Funcionário
O banco pode ter uma classe para autenticar usuários no sistema. Os usu-
ários podem ser funcionários do banco ou empresas externas mas neste caso,
como implementar um método de autenticação que aceite tanto gerentes (que
é de uma hierarquia) e empresas (de outra hierarquia)? Perceba que não há
como usar polimorfismo neste caso e para existir, devemos de alguma forma
juntar as duas hierarquias o que seria incorreto do ponto de vista natural (clien-
tes e funcionários são entidades, coisas diferentes). Usando uma interface te-
mos uma possibilidade:
capítulo 3 • 107
Cliente Usuário Funcionário
class Login{
public boolean autenticar(Usuario u) {
// implementação
}
}
108 • capítulo 3
Funcionário
- nome: String Agência
-é
- salário: double - gerencia - número: int
gerenciado
- vale refeição: double
1 Gerenciar 0..* - funcionários [ ] : funcionários
+ aumentar salário ( ) void;
+ aumentar salário (double) void;
+ alterar vale refeição (double)
3.8.1 Agregação
capítulo 3 • 109
Na agregação, a classe que possui a regra do “todo” é composta (tem) de
outras classes, que possuem a regra das “partes”. Só pode ocorrer agregação
entre duas classes.
Podemos dar algumas dicas para identificar possíveis associações de
agregação:
3.8.2 Composição
110 • capítulo 3
Mais alguns exemplos finais:
Veja a figura 3.9, vamos mostrar como fica o código deste diagrama. Observe
que em UML a agregação é simbolizada com um losango preenchido e a com-
posição é simbolizada com um losango vazado.
Conta Transação
Agregação - valor: double
- código: int
- data: date
+ inserirTransacao (t: transacao): void 0..* - tipo: char
+ setCliente (c: Cliente): void + getValor ( ): double
+ setValor (v; double): void
Composição + getTipo ( ): char
+ setTipo (t: char): void
Cliente + getDate ( ): date
+ setDate (d: Date): void
- nome: String
- endereço: String
setConta (c: Conta): void
setConta ( ): Conta
capítulo 3 • 111
class Conta{
private int código;
private Cliente cliente; //apenas 1 referência para Cliente
private Transacao[] transação; //várias referências para Transação
private int qtdTransacoes;
...
public setCliente(Cliente c){
this.cliente = c;
}
class Cliente{
private String nome;
private Conta conta;
private String endereço;
...
public void setConta(Conta c){ //como o relacionamento entre Cliente
e Conta é
conta = c; // bidirecional, cada uma das classes
possui um
} // atributo que é do tipo da outra
}
class Transacao {
private double valor;
private char tipo;
priavte Date data;
...
}
112 • capítulo 3
Lembre-se que ao instanciar um objeto da classe de onde parte a associação
você não estará criando uma instância do objeto destinatário da associação. Ou
seja, ao criar um objeto da classe Conta, você não criará um objeto da classe
Cliente ou vários objetos da classe Transação. Para isso, métodos em ambas
as classes deverão fazer a agregação e composição em tempo de execução da
aplicação. Veja o código abaixo, o qual mostra esse processo em alguma parte
da aplicação:
con.setCodigo(100);
con.setCliente(clie); // nessas duas linhas
cli.setConta(con); // temos a agregação entre Cliente e
Conta
credito = new Transacao();
credito.setValor(10000000.0);
credito.setTipo('C');
credito.setData(new Date());
con.addTransacao(credito); // aqui temos a composição
}
ATIVIDADES
01. Um animal possui um nome, comprimento, cor, ambiente, velocidade e número de patas
(4 é o padrão).
Um peixe é um animal mas não tem patas. O seu ambiente é o mar, a cor é cinza (padrão)
e além disso um peixe tem barbatanas e cauda.
Um mamífero é um animal que vive na terra por padrão (ambiente). Um urso é um mamí-
fero que vive na terra, é marrom, e o seu alimento preferido é o mel.
Faça em Java as classes Animal, Peixe e Mamífero de acordo com o diagrama UML a
seguir:
capítulo 3 • 113
Animal
- nome: String
- comprimento: int
- patas: int
- cor: String
- ambiente: String
- velocidade: float
+ getValor ( ): double
+ setValor (v; double): void
+ getTipo ( ): char
+ setTipo (t: char): void
+ getDate ( ): date
+ setDate (d: Date): void
Peixe Mamífero
+ Peixe ( ): void + Mamífero (n: String, c: String, com: int,
+ setCaracterísticas (c: int): void v: float, p: int): Void
+ getCaracterísticas ( ): String + setAlimento(a: String): void
+ toString(): String + getAlimento( ): string
+ toString(): String
Depois faça um outro teste para que possam ser incluídos quantos animais
o usuário quiser, porém no máximo 10 animais de cada tipo (use vetores de
objetos).
114 • capítulo 3
02. Implemente o diagrama a seguir em Java:
Cliente Data
- código: int - dia: int
- descrição: int - mes: int
- validade: Data - ano: int
- Produto (c: int, d: int, v: Data) + Data: (d: int, m: int, a: int): void
- getCódigo0: int + set (dia: int, mes: int, ano: int): void
- getCódigo (c: int): void + get ( ): int
- getValidade0: Data + extenso ( ): String
+ toString ( ): String
REFLEXÃO
Esperamos que esses conceitos que estudamos até agora sirvam para você refletir nas gran-
des vantagens que a orientação a objetos pode trazer para as atividades de desenvolvimento.
Esperamos que seja percebido que a orientação a objetos torne mais rápida as atividades de
programação e manutenção de sistemas. Além disso, a orientação a objetos tem um caráter
unificador ou seja, trata todas as etapas do desenvolvimento sob uma única abordagem
destacando a reusabilidade de código, a escalabilidade das aplicações, a manutenibilidade
entre outras características.
LEITURA
Não é só a linguagem Java que é orientada a objetos. Existem várias como já citamos. Uma
delas é a Smalltalk, uma das primeiras linguagens orientadas a objetos que apareceu. Ler
sobre Smalltalkvai ajuda-lo a entender muitos conceitos que estamos tratando aqui. A seguir
apresentamos algumas boas referências desta linguagem:
Dynamic Web Development with Seaside. Stephane Ducasse, Lukas Renggli, David C. Shaffer and
Rick Zaccone. Square Bracket Associates, 2009.
Smalltalk design pattern companion book drafts. Sherman Alpert, Kyle Brown, and Bobby Woolf.
Addison-Wesley, 978-02011846241998.
Smalltalk by Example: the Developer's GuideAlex Sharp, McGraw Hill Text; ISBN: 0079130364, 1997.
Smalltalk With Style by Edward Klimas, Suzanne Skublics and David A. Thomas. ISBN: 0-13-165549-
3, Publisher: Prentice Hall, Copyright: 1996
Todos estes livros estão disponíveis online.
capítulo 3 • 115
REFERÊNCIAS BIBLIOGRÁFICAS
DEITEL, H. M.; DEITEL, P. J. Java como programar. Bookman, 2002.
FLANAGAN, D. Java o guia essencial. Bookman, 2006.
GARY, C.; HORSTMANN, C. Core Java 2: Fundamentos. Makron Books, 2001.
GARY, C.; HORSTMANN, C. Core Java 2: Recursos Avançados. Makron Books, 2001.
HUBBARD, J. R. Programação com Java. Bookman, 2006.
116 • capítulo 3
4
Interfaces Gráficas
Todo mundo gosta de interagir com um programa de uma maneira agradável
e objetiva. Com a explosão da internet, cada dia que passa exigimos que os
programas tenham uma aparência e um comportamento parecido uns com
os outros para aumentar a nossa produtividade e experiência no uso da infor-
mática. Com a popularização dos celulares isso aumenta ainda mais.
Porém ainda existe uma grande demanda de programas que rodam exclusi-
vamente em computadores desktop, em redes e que não precisam estar na
internet ou ter os mesmos recursos que a internet oferece. Muitos programas
que usamos no dia a dia são assim como os editores de texto, planilhas eletrô-
nicas, softwares para apresentações, jogos, entre outros.
Este capítulo vai mostrar os principais componentes para gerar programas
para esta categoria de software. Bons estudos!
OBJETIVOS
O objetivo principal deste capítulo é introduzi-lo nos principais componentes básicos de interfa-
ce gráfica usando a linguagem Java e o Swing.
118 • capítulo 4
4.1 Introdução
No Capítulo 2 começamos o estudo sobre interfaces gráficas. Vimos que exis-
tem dois pacotes muito utilizados na programação de programas para desktop
chamados java.awt e java.swing. Atualmente a tecnologia suportada pela Ora-
cle é a JavaFX.
Naquele capítulo fizemos um exemplo simples de um formulário para poder-
mos conhecer o mecanismo de desenvolvimento. Agora é hora de aprofundarmos
o estudo em outros componentes que poderão dar nova cara às suas aplicações.
capítulo 4 • 119
//cria uma tecla de atalho para o item Sair: ALT+r
itemSair.setMnemonic(KeyEvent.VK_R);
itemSair.setToolTipText("Sai do programa");
//cria o evento
itemSair.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
//coloca o item Sair no menu Arquivo, o menu Arquivo na barra de menu e o menu
no Frame
arquivo.add(itemSair);
menubar.add(arquivo);
setJMenuBar(menubar);
//configura o frame
setTitle("Menu Simples");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
// aqui ficaria o método main, semelhante ao código anterior
}
120 • capítulo 4
Figura 4.1 – Implementação do código sem e com submenu.
capítulo 4 • 121
4.2.1 Menu com checkbox
Para criar este item de menu e a barra de status usamos o código a seguir:
122 • capítulo 4
O evento que mostra e esconde a barra de status será visto no Capítulo 5
onde iremos tratar exclusivamente dos eventos nas interfaces gráficas.
Outro tipo de menu que usamos muito é o menu popup. Em Java existe a classe
JPopupMenu que implementa este tipo de menu o qual algumas vezes é chamado
de menu de contexto e aparece quando clicamos com o botão direito do mouse.
Basicamente, a forma de criação e vinculação de itens de menu ao menu
popup é parecida com os menus que já estudamos. Observe:
Usando o Swing podemos usar a classe JToolBar para criar barras de ferramen-
tas conforme o código abaixo:
//criamos a barra
JToolBar toolbar1 = new JToolBar();
capítulo 4 • 123
//alinhamos a barra à esquerda
toolbar1.setAlignmentX(0);
124 • capítulo 4
Um gerenciador de layout é um objeto que implementa a interface
LayoutManager e determina o tamanho e posição dos componentes dentro de
um container. Mesmo que os componentes possam determinar seu tamanho,
alinhamento e outras propriedades, um gerenciador de layout de um container
é quem “diz” o tamanho e a posição dentro dele.
add(ok);
add(fechar);
capítulo 4 • 125
4.3.2.1 FlowLayout
126 • capítulo 4
Figura 4.3 – FlowLayout.
4.3.2.2 BorderLayout
capítulo 4 • 127
4.3.2.3 BoxLayout
4.3.2.4 CardLayout
Este gerenciador permite que seja implementada uma área que contém com-
ponentes diferentes em vezes diferentes. Normalmente se usa este gerenciador
com um combobox no qual o estado do combo determina a aparência da jane-
la, veja a Figura 33: conforme o usuário seleciona um valor no combo, o painel
inferior muda.
4.3.2.5 GridBagLayout
128 • capítulo 4
Figura 4.7 – GridBagLayout. Fonte: http://docs.oracle.com/javase/tutorial/uiswing/layout/
visual.html
4.3.2.6 GridLayout
4.3.2.7 GroupLayout
capítulo 4 • 129
Figura 4.9 – GroupLayout. Fonte: http://docs.oracle.com/javase/tutorial/uiswing/layout/
visual.html
4.3.2.8 pringLayout
Assim como o GroupLayout, este gerenciador é muito usado em IDEs que pos-
suem plug-ins para interface gráfica. Este gerenciador permite que seja especi-
ficada relações entre os limites dos componentes sobre seus controles.
O Swing possui outros componentes muito úteis para os seus programas. Não
é nosso escopo cobrir todos os componentes mas mostrar os principais e as
formas de criar e usa-los. Você vai perceber que eles possuem uma forma seme-
lhante de definição, criação e uso. Na verdade é uma aplicação dos conceitos de
orientação a objetos que veremos no próximo capítulo.
130 • capítulo 4
Observe a Figura 4.11. Ela mostra uma tela simples contendo vários compo-
nentes Swing. Os componentes mostrados nesta figura são bastante utilizados
na maioria das aplicações que conhecemos.
Logo após a figura mostramos o código em Java para gerar a tela. Vamos
explicar vários componentes usando o código portanto, preste atenção!
Figura 4.11 – Tela simples de cadastro de alunos com vários componentes Swing
capítulo 4 • 131
17 private Container c;
18 private JList lista;
19 private DefaultListModel modeloLista;
20
21 public Cadastro(){
22 super("Cadastro de Alunos");
23 labNome = new JLabel("Nome");
24 labSexo = new JLabel("Sexo");
25 labCidade = new JLabel("Cidade");
26 labEstado = new JLabel("Estado");
27 labBolsa = new JLabel("Possui Bolsa ?");
28 labDisciplinas = new JLabel("Matriculas:");
29
30 String[] estados = { "SP", "RJ", "MG", "ES" };
31 comEstado = new JComboBox(estados);
32
33 cheBolsa = new JCheckBox("Sim");
34
35 texNome = new JTextField(30);
36 texCidade = new JTextField(30);
37
38 grupo = new ButtonGroup();
39 radMasculino = new JRadioButton("Masculino");
40 radFeminino = new JRadioButton("Feminino");
41 grupo.add(radMasculino);
42 grupo.add(radFeminino);
43
44 c = getContentPane();
45 c.setLayout(new FlowLayout());
46
47 modeloLista = new DefaultListModel();
48 String[] disciplinas = {"Matematica","Quimica","Fisica"};
49 lista = new JList(disciplinas);
50
51 c.add(labNome); c.add(texNome);
52 c.add(labCidade); c.add(texCidade);
53 c.add(labEstado); c.add(comEstado);
54 c.add(labSexo); c.add(radMasculino); c.add(radFeminino);
55 c.add(labBolsa); c.add(cheBolsa);
132 • capítulo 4
56 c.add(labDisciplinas); c.add(lista);
57
58 setSize(450, 200);
59 setVisible(true);
60 }
61
62 public static void main(String args[]){
63 Cadastro app = new Cadastro();
64 app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
65 }
66 }
capítulo 4 • 133
CONEXÃO
Lembre-se sempre de estudar e investigar a API da biblioteca que você está usando para
desenvolver seus programas. Como estamos tratando de interfaces gráficas neste capítulo, é
importante estudar os componentes da API do Swing em http://docs.oracle.com/javase/7/
docs/api/javax/swing/package-summary.html
Uma interface gráfica possui outros detalhes além dos componentes como
por exemplo o tratamento de eventos como os cliques do mouse, comandos de
arrastar e soltar (drag and drop), conexão com bancos de dados entre outras
características que não são possíveis cobrir aqui neste material.
Alguns assuntos que sugerimos que você estude para completar o seu estu-
do sobre interfaces gráficas são:
• Como usar ícones nos componentes, para deixá-los mais intuitivos e com
melhor aparência. Botões, menus, listas são exemplos de componentes que po-
demos associar ícones
• Bordas: as bordas são importantes também para melhorar a aparência
das janelas. Lembre-se que existem janelas que não podem ser redimensiona-
das e isto implica no estudo das bordas das janelas
• Caixas de diálogo: no uso dos programas desktop é comum abrir janelas
para salvar e abrir arquivo, imprimir um documento, escolher fonte, cores e
outras tarefas. Estas janelas são caixas de diálogo. O Java possui classes que
implementam estes tipos de janelas e facilitam o trabalho do programador
• Timers: componentes que lidam com temporizações diversas.
• System Tray: componentes que são executados em segundo plano e ficam
alojados na barra do sistema operacional
• Splash Screens: criação de telas de abertura de programas com dicas e ou-
tras funcionalidades
• Impressão: classes que suportam a impressão em papel
• Modificar o look and feel: as aplicações em Swing possuem formas de se
modificar sua aparência e comportamento. É possível criar temas ou usar ou-
tros existentes para deixar a aplicação mais interativa e rica com o usuário.
134 • capítulo 4
Lembre-se que ainda vamos abordar no Capítulo 5 o tratamento de eventos
e outros conceitos importantes para as interfaces gráficas como as classes ani-
nhadas, as classes internas e classes anônimas.
Percebemos que fornecer componentes consistentes e intuitivos de inter-
face com o usuário aos diferentes programas permite, de certa maneira, que
os usuários se familiarizem com um programa para que possa aprendê-lo mais
rapidamente.
Vimos que as GUI (Graphical User Interface) são construídas a partir de
componentes GUI que em Java são implementados por classes do pacote Swing.
Esses componentes também são chamados de controles ou widgets.
A maioria dos componentes Swing estão localizados no pacote javax.swing.
É importante lembrar que as listagens de programas que vimos não possuem
as linhas das importações dos pacotes. Ao utilizar uma IDE como o Netbeans
ou Eclipse, a própria ferramenta irá apontar as dependências dos pacotes.
Um último detalhe a ser considerado é que os componentes gráficos podem
ser leves ou pesados. Os componentes Swing leves não são amarrados aos com-
ponentes GUI reais suportados pela plataforma subjacente em que um aplica-
tivo é executado. Logo, os componentes leves são independentes de plataforma
ou seja, ele terá a mesma aparência e comportamento executando no Windows,
Linux ou MacOS. Logo, os componentes pesados, principalmente os compo-
nentes AWT, são chamados de pesados.
Em seguida apresentamos outros componentes Swing disponíveis em Java
com suas classes.
capítulo 4 • 135
Figura 4.14 – JToggleButton: este botão apresenta 2 estados: pressionado ou não pressionado.
Fonte: http://docs.oracle.com/javase/tutorial/uiswing
136 • capítulo 4
Figura 4.17 – JFileChooser. Fonte: http://docs.oracle.com/javase/tutorial/uiswing
capítulo 4 • 137
Figura 4.21 – JTree. Fonte: http://docs.oracle.com/javase/tutorial/uiswing
138 • capítulo 4
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
botaoIncluir.setText("Incluir");
botaoConsultar.setText("Consultar");
botaoAlterar.setText("Alterar");
botaoExcluir.setText("Excluir");
botaoSair.setText("Sair");
botaoSair.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
handlerBotaoSair(evt);
}
});
capítulo 4 • 139
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.
createSequentialGroup()
.addContainerGap(266, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE)
.addComponent(botaoIncluir)
.addComponent(botaoConsultar)
.addComponent(botaoAlterar)
.addComponent(botaoExcluir)
.addComponent(botaoSair))
.addContainerGap())
);
pack();
}
private void handlerBotaoSair(java.awt.event.ActionEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.
UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(TelaCad.class.getName()).log(java.util.
logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(TelaCad.class.getName()).log(java.util.
logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(TelaCad.class.getName()).log(java.util.
logging.Level.SEVERE, null, ex);
140 • capítulo 4
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(TelaCad.class.getName()).log(java.util.
logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TelaCad().setVisible(true);
}
});
}
private javax.swing.JButton botaoAlterar;
private javax.swing.JButton botaoConsultar;
private javax.swing.JButton botaoExcluir;
private javax.swing.JButton botaoIncluir;
private javax.swing.JButton botaoSair;
}
As outras telas de cadastro são herdadas de TelaCad. Mas, cada uma contém
um painel que determina as peculiaridades de cada cadastro. Todas as funcio-
nalidades comuns são descritas em TelaCad, enquanto que as necessidades
particulares são escritas novamente.
capítulo 4 • 141
4.5 Introdução ao tratamento de eventos
com classes aninhadas
142 • capítulo 4
public class TextFieldFrame extends JFrame {
private JTextField textField1;
private JTextField textField2;
private JTextField textField3;
private JPasswordField passwordField;
public TextFieldFrame() {
super( "Testando ..." );
setLayout(new FlowLayout());
capítulo 4 • 143
A Listagem 6 contém a segunda parte da listagem 5. Nesta listagem mostra-
mos a parte na qual o tratamento de evento é configurado. O objetivo deste pro-
grama é mostrar um diálogo de mensagem que contém o texto de um campo de
texto quando o usuário apertar a tecla Enter neste campo de texto.
144 • capítulo 4
Toda vez que você for implementar um aplicativo que responda a eventos de
um componente gráfico, lembrar de alguns passos na codificação:
capítulo 4 • 145
interessante estudar a API do Java para aquela classe do componente e de suas
superclasses.
No nosso caso, quando o usuário aperta a tecla Enter é disparado pelo tex-
tfield um evento de teclado chamado ActionEvent e é processado por um objeto
que implementa a interface ActionListener. Uma vez que JPasswordField é uma
subclasse de JTextField, JPasswordField possui os mesmos eventos.
A classe interna TrataTextField implementa a interface ActionListener e de-
clara um método, o actionPerformed(). Dentro deste método está o código que
vai especificar o que será feito quando o evento ActionEvent for tratado e assim
a classe TrataTextField contempla os passos 1 e 2 mostrados anteriormente.
No construtor da classe, na listagem 5, é criado um objeto chamado handler
da classe TrataTextField. O método actionPerformed() deste objeto é chamado
automaticamente quando o usuário apertar Enter em qualquer um dos textfiel-
ds declarados na classe. Porém antes que isso aconteça, o programa deve regis-
trar esse objeto como o tratador de evento para os três componentes da tela.
Isso foi feito no final da listagem 5. O programa chama o método JTextField.
addActionListener para registrar o tratador de evento para cada componente.
Esse método recebe um objeto ActionListener como argumento que pode ser
um objeto de qualquer classe que implemente ActionListener.
O objeto handler é um ActionListener porque a classe TrataTextField imple-
menta a interface ActionListener (lembre-se desses conceitos, vistos no Capítulo
4). Depois que as linhas finais da listagem 5 são executadas e os tratadores de
eventos registrados, o objeto handler passa a ouvir eventos (torna-se então o
listener – ouvinte). Logo, toda vez que o usuário apertar Enter, em qualquer um
dos componentes o método actionPerformed() da classe TrataTextField será
executado para tratar o evento. Caso acontecer que um evento não for regis-
trado, após o pressionamento da tecla Enter, ele será ignorado pelo programa.
146 • capítulo 4
Figura 4.24 – Eventos disparados
capítulo 4 • 147
4.7 Tipos comuns de eventos e interfaces
ouvintes
CONEXÃO
Mostramos aqui 8 classes do pacote java.awt.event. Porém na atual versão do Java exis-
tem 18 e se você vai desenvolver interfaces gráficas é muito recomendável estuda-las. O
link para essa parte na API do Java é: http://docs.oracle.com/javase/7/docs/api/java/awt/
event/package-summary.html
Vimos que para cada tipo de objeto de evento, há em geral uma interface
ouvinte de eventos (um objeto que implementa uma ou mais das interfaces ou-
vintes de evento) correspondente. Alguns deles são mostrados a seguir:
• ActionEvent: ActionListener
• MouseEvent: MouseListener e MouseMotionListener
• ItemEvent: ItemListener
• AdjustmentEvent: AdjustmentListener
148 • capítulo 4
• TextEvent: TextListener
• WindowEvent: WindowListener
• FocusEvent: FocusListener
• KeyEvent: KeyListener
textField1 handler
Objeto JTextField
public void actionPerformed(Action Event evento){
listener List ... Tratamento do evento aqui
}
Objeto TrataTextField
capítulo 4 • 149
O handler de eventos é registrado no final da listagem 1 pelas linhas:
150 • capítulo 4
A tabela 4.1 mostra alguns eventos, listeners e operações para você se
familiarizar:
ACTIOPERFORMED
ACTIONEVENT ACTIONLISTENER (ACTIONEVENT)
keyPressed(KeyEvent)
KeyEvent KeyListener keyReleased(KeyEvent)
keyTyped(KeyEvent)
mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
MouseEvent MouseListener mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseDragged(MouseEvent)
MouseMotionListener
mouseMoved(MouseEvent)
windowActivated(WindowEvent)
windowClosed(WindowEvent)
windowClosing(WindowEvent)
WindowEvent WindowListener windowDeactivated(WindowEvent)
windowDeiconifed(WindowEvent)
windowIconifed(WindowEvent)
windowOpened(WindowEvent)
capítulo 4 • 151
Visto esses conceitos, vamos estudar outro exemplo para tratarmos do pró-
ximo assunto: os adaptadores e as classes internas anônimas.
152 • capítulo 4
Como podemos perceber, este conjunto de métodos vazios prejudica a lei-
tura do código e sua manutenção. Para evitar a implementação de métodos va-
zios, a API geralmente inclui uma classe adaptadora para cada interface que
possui mais de um método.
CONEXÃO
A tabela de Listeners da API lista todos os listeners e seus adaptadores.
http://docs.oracle.com/javase/tutorial/uiswing/events/api.html
/*
* Um exemplo de classe adaptadora ao invés de implementar uma interface de
listener
*/
public class MinhaClasse extends MouseAdapter {
...
objeto.addMouseListener(this);
...
public void mouseClicked(MouseEvent e) {
...//Implementação vai aqui...
}
}
Vamos usar outro exemplo para ilustrar o uso de classes adaptadoras. O re-
sultado do exemplo é apresentado na figura 4.26. Trata-se de um programa que
conta quantas vezes o botão direito, central e esquerdo do mouse foram pres-
sionados e mostra em uma barra de status na parte inferior do frame.
capítulo 4 • 153
Figura 4.26 – Execução do programa da Listagem 6.
154 • capítulo 4
statusBar.setText(detalhes);
}
}
}
-----------------------------------------------------------
public class TestaMouseFrame {
public static void main(String[] args) {
MouseFrame mf = new MouseFrame();
mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mf.setSize(400, 150);
mf.setVisible(true);
}
}
Embora já visto neste capítulo, vamos enfatizar as classes internas neste tópico
e relaciona-las com as classes anônimas.
E se você quiser usar uma classe adaptadora mas não quer que sua classe
pública herde de um adaptador? Por exemplo, vamos supor que você escreva
um Applet e queira que ele tenha um tratamento de eventos de mouse.
capítulo 4 • 155
Um Applet é uma pequena aplicação Java que normalmente roda em um navegador
e executa uma atividade específica. Um exemplo de applet é encontrado nos internet
banking que possuem teclados virtuais. Normalmente possui uma interface gráfica com
o usuário. Uma aplicação Applet é um objeto que herda da classe JApplet.
Uma vez que a linguagem Java não permite herança múltipla, a classe
do applet que vamos implementar não poderá herdar das classes Applet e
MouseAdapter ao mesmo tempo. Uma solução é definir uma classe interna
como já vimos.
Também vimos que classes internas podem ser úteis para listeners de even-
tos que implementam uma ou mais interfaces diretamente como no exemplo
a seguir:
É possível criar uma classe interna sem especificar um nome. Ela é chamada
de classe anônima. Embora possa parecer estranho, classes anônimas podem
fazer o seu código ficar mais fácil de ser lido porque a classe está definida onde
ela é referenciada. Entretanto, você vai precisar verificar a conveniência contra
possíveis implicações de desempenho no aumento do número de classes. Veja
o exemplo a seguir:
156 • capítulo 4
//Exemplo de classe anônima
public class MinhaClasse extends Applet {
...
objeto.addMouseListener(new MouseAdapter() { //classe anônima
public void mouseClicked(MouseEvent e) {
...//Implementação do listener de evento vai aqui...
}
});
...
}
}
Em Java, uma classe final não pode ter subclasses. Um método final não pode ser
sobrecarregado. Uma variável final só pode ser instanciada uma vez, ou por um inicia-
lizador ou por uma declaração de atribuição.
ATIVIDADES
01. Monte a seguinte tela com as suas funcionalidades.
capítulo 4 • 157
02. Monte a seguinte tela, sem acrescentar funcionalidades
03. Usando a classe JOptionPane faça um programa que converta graus Fahrenheit para
Celsius. A fórmula de conversão é: Celsius = 5/9*(Fahrenheit-32).
04. Faça a seguinte tela para calcular o total poupado por uma aplicação na poupança.
158 • capítulo 4
REFLEXÃO
Os componentes apresentados neste capítulo são os mais básicos. Ao longo do tempo, per-
cebemos que as empresas que desenvolvem aplicações como editores de texto, planilhas
eletrônicas e outras tem inovado em componentes mais intuitivos e dinâmicos. Um bom
programador Java também precisa acompanhar essa evolução e usar a própria plataforma da
linguagem, a qual é aberta, a criar e inovar as interfaces dos seus programas a fim de poder
tornar o programa cada vez mais amigável para o seu usuário.
LEITURA
Os tutoriais da Oracle são excelentes para o aprendizado de Java. Para o Swing existe uma
colação de tutoriais disponíveis em: http://docs.oracle.com/javase/tutorial/uiswing/
Um livro que traz bastante informação e integra com outros conceitos é o: Java 6 – Fun-
damentos, Swing, BlueJ e JDBC (Ivan Mecenas, Editora Alta Books, 2008).
Um livro excelente é o Java Swing (Robert Eckstein, Marc Loy, Dave Wood, O’Reilly Media,
1998). É um pouco antigo mas os fundamentos presentes no livro não mudaram até hoje.
REFERÊNCIAS BIBLIOGRÁFICAS
DEITEL, H. M.; DEITEL, P. J. Java como programar. Bookman, 2002.
FLANAGAN, D. Java o guia essencial. Bookman, 2006.
GARY, C.; HORSTMANN, C. Core Java 2: Fundamentos. Makron Books, 2001.
GARY, C.; HORSTMANN, C. Core Java 2: Recursos Avançados. Makron Books, 2001.
HUBBARD, J. R. Programação com Java. Bookman, 2006.
capítulo 4 • 159
160 • capítulo 4
5
Tratamento de
Exceções e Breve
Estudo de Caso
Já vimos que a interação entre o usuário e o computador é muito importante.
Uma boa interface, com componentes modernos é recomendável para que se
tenha um bom uso do programa. Porém as vezes ocorrem alguns erros e isso
é mostrado para o usuário.
O usuário por sua vez certamente preferirá que a mensagem de erro seja
esclarecedora e o oriente para a correta resolução do problema. Mas as vezes
a mensagem vem de forma extremamente técnica e não possui uma descrição
clara do problema. Isso é chamado de exceção que na verdade pode ser enten-
dida como uma condição anormal ou especial que requer um processamento
especial e que muda o estado normal do programa. Vamos aprender como tra-
tar essas ocorrências.
Além disso, vamos fechar a disciplina mostrando um pedaço de uma aplica-
ção prática envolvendo o padrão MVC.
Bons estudos!
OBJETIVOS
Neste capítulo nosso objetivo é:
162 • capítulo 4
5.1 Introdução ao tratamento de exceções
(Exceptions)
capítulo 4 • 163
Throwable
Exception Error
A subclasse Exception possui métodos que definem erros nos quais a apli-
cação consegue trata-los e continuar sendo executada. A subclasse Error possui
métodos que definem os erros que não devem ser capturados pelas aplicações
porque são erros graves e não possibilitam que a execução do programa conti-
nue satisfatoriamente.
Uma exceção é um evento que ocorre durante a execução de um programa
que interrompe o fluxo normal das instruções.
Quando um erro ocorre dentro de um método, o método cria um objeto e
informa ao sistema de execução da JVM. O objeto, que é a exceção, contém in-
formação sobre o erro, incluindo seu tipo e o estado do programa quando o erro
ocorreu. Ao criar um objeto de exceção e fazer o seu tratamento no sistema de
execução da JVM é chamado de tratamento de exceção.
Depois que um método lança uma exceção, o sistema tenta achar alguma
coisa para trata-lo. O conjunto possível de alternativas de tratamento é uma lis-
ta ordenada de métodos que são chamados para pegar o método onde o erro
ocorreu. Esta lista de métodos é chamada de call stack (pilha de chamada) mos-
trada na 5.1.
O sistema de execução procura a pilha por um método que contenha um
código que pegue a exceção. Este bloco é chamado de tratador de exceção. A
procura começa com o método no qual o erro ocorreu e procede na pilha de
chamadas na ordem reversa na qual o método foi chamado (veja a figura 5.2).
Quando um tratador apropriado é encontrado, o sistema de execução passa a
exceção para o tratador. Um tratador é considerado apropriado se o tipo do ob-
jeto lançado “casa” com o tipo que foi pego pelo tratador.
164 • capítulo 4
Método onde o erro ocorreu
Chamada do método
Chamada do método
Chamada do método
Main
Main
Exception
capítulo 4 • 165
Todas as classes que estão vinculadas à classe RunTimeException são un-
checked. As outras classes que não fazem parte da RunTimeException são
checked.
Quando ocorrer um erro durante a execução do programa e o identificamos
este erro, é possível criar algum objeto de uma classe unchecked e lançar a refe-
rência dele com o comando throw:
166 • capítulo 4
try {
... // código onde pode ser lançada uma exceção
}
catch (nome da exceção){
...,
}
catch (nome da exceção) {
...
}
finally {
...
}
1 try {
2 // código onde pode conter uma exceção
3 } catch (IndexOutOfBoundsException e) {
4 System.err.println("IndexOutOfBoundsException: " + e.getMessage());
5 } catch (IOException e) {
6 System.err.println("IOException: " + e.getMessage());
7 }
O bloco try executa a parte do código na qual a exceção pode aparecer. Se a ex-
ceção for um índice não encontrado em um array (IndexOutOfBoundException)
o tratador será o objeto e da linha 4. Caso ocorra uma exceção, como por exem-
plo uma falha ao escrever um arquivo, vai ocorrer a exceção IOException e o
tratamento dela será feito a partir da linha 5. Neste caso o tratamento é simples
e só irá mostrar uma mensagem no console mas outros comandos mais elabo-
rados podem ser colocados dentro do tratador de exceção como por exemplo
mostrar uma janela de erros mais bonita, informar o usuário o procedimento
para evitar o erro novamente, etc. Porém neste caso, o programa terminará.
capítulo 4 • 167
Para o programa não terminar, usamos o bloco finally. Ele sempre executa
quando o bloco try termina. Isto garante que o bloco finally é executado mesmo
que uma exceção imprevista ocorra. Mas o finally é útil não somente para o trata-
mento de exceções – ele pode ser usado sempre.
CONEXÃO
Alguns links que podem te ajudar a entender um pouco mais sobre exceções em Java:
http://docs.oracle.com/javase/tutorial/essential/exceptions/
http://blog.caelum.com.br/lidando-com-exceptions/
http://www.tutorialspoint.com/java/java_exceptions.htm
168 • capítulo 4
em ações que o modelo executará. Em uma aplicação gráfica stand-alone, as
interações do usuário podem ser cliques em botões ou seleções de menu, en-
quanto que em uma aplicação web, essas interações tomam forma de requisi-
ções HTTP GET e POST. Dependendo do contexto, um controlador pode tam-
bém selecionar uma nova visão, por exemplo uma página web de resultados,
para ser apresentada ao usuário.
Modelo
· Encapsula o estado da aplicação
· Responde às consultas de estado
· Mostra a funcionalidade da aplicação
Consulta
· Notifica as visões sobre mudanças Mudança
de
Mudar de
estado
notificação estado
Visão
· Renderiza o modelo Seleção Controlador
· Pede atualizações do modelo de visão · Define o comportamento da aplicação
· Manda os gestos do usuário para o · Mapeias as ações do usuário para as
controlador atualizações do modelo
· Permite ao controlador selecionar · Seleciona a visão de resposta
a visão Gestos do · Um para cada funcionalidade
usuário
Invocações de métodos
Eventos
A figura 5.5 mostra uma forma de se implementar o padrão MVC. Uma vez que
os objetos do modelo, visão e controlador sejam instanciados, ocorrem os se-
guintes passos:
capítulo 4 • 169
Uma vez que o usuário interaja com a visão, as seguintes ações ocorrem:
1. A visão reconhece uma ação que vem da interface, como por exemplo,
pressionar um botão ou arrastar uma barra de rolagem, usando um método
apropriado que é registrado de modo que seja chamado cada vez que a ação
ocorra.
2. A visão chama o método apropriado no controlador.
3. O controlador acessa o modelo, possivelmente atualizando-o de forma
adequada a ação do usuário.
4. Se o modelo for alterado, ele notifica os ouvintes interessados, com as
visões, da alteração. Em algumas arquiteturas, o controlador pode ser respon-
sável também pela atualização da visão.
170 • capítulo 4
As classes de negócio são: Atividade, Sócio e Alocação. O sistema é uma par-
te de uma aplicação maior que trata da manutenção de um clube recreativo. A
parte que vamos considerar no estudo de caso é responsável pelo cadastramen-
to de atividades, como por exemplo carnaval de salão, campeonato de futebol,
ginacana, etc e os sócios que vão aderir à atividade. Desta forma é possível guar-
dar um histórico referente às atividades que o sócio já participou.
TelaPrinc TelaCad
TelaCadClube TelaCadSocio
Atividade Socio
– CodAtv: int – Matricula: int
– Descricao: String – Nome: String
+ setDescricao(Descricao : String) : void + setMatricula(Matricula : int) : void
+ getDescricao0 : String + getMatricula0 : String
+ setCodAtv(CodAtv : int) : void + setNome(Nome : String) : void
+ getCodAtv0 : int + getNome : String
Alocacao
– data : Date
A tela principal terá a aparência conforme a figura 5.7. O menu Cadastro irá
acessar as duas telas de cadastro: a de Sócio e a do Clube e o menu Sair, mostra-
do na figura 5.8 irá encerrar a aplicação após mostrar uma confirmação usando
o método JOptionPane.showConfirmDialog().
capítulo 4 • 171
Figura 5.7 – Tela principal
172 • capítulo 4
dentro do construtor o qual é implementado com todas as configurações ini-
ciais do frame, inclusive com as chamadas para os tratamentos de evento.
Devido à montagem da tela ter usado o arrastar e soltar, o Netbeans usa um
gerenciador de layout próprio para poder prover as funcionalidades e aparência
que o usuário deseja. A seta mostrada na linguagem destaca o trecho do código
no qual o layout é configurado.
import javax.swing.JOptionPane;
public class TelaPrinc extends javax.swing.JFrame {
public TelaPrinc() {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
jMenuBar1 = new javax.swing.JMenuBar();
menuCadastros = new javax.swing.JMenu();
menuClube = new javax.swing.JMenuItem();
menuSocio = new javax.swing.JMenuItem();
menuSair = new javax.swing.JMenu();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Clube Recreativo");
menuCadastros.setText("Cadastros");
menuClube.setText("Clube");
menuClube.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuClubeActionPerformed(evt);
}
});
capítulo 4 • 173
menuSocio.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuSocioActionPerformed(evt);
}
});
menuCadastros.add(menuClube);
menuSocio.setText("Sócio");
menuCadastros.add(menuSocio);
jMenuBar1.add(menuCadastros);
menuSair.setText("Sair");
menuSair.addMenuListener(new javax.swing.event.MenuListener() {
public void menuCanceled(javax.swing.event.MenuEvent evt) {
}
public void menuDeselected(javax.swing.event.MenuEvent evt) {
}
public void menuSelected(javax.swing.event.MenuEvent evt) {
menuSairMenuSelected(evt);
}
});
jMenuBar1.add(menuSair);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.
GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup( layout.createParallelGroup(javax.
swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup( layout.createParallelGroup(javax.
swing.GroupLayout.Alignment.LEADING)
.addGap(0, 279, Short.MAX_VALUE)
);
pack();
}
174 • capítulo 4
private void menuClubeActionPerformed(java.awt.event.ActionEvent evt) {
TelaCadClube tela = new TelaCadClube();
tela.setVisible(true);
}
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception ex) {
java.util.logging.Logger.getLogger(TelaPrinc.class.getName()).log(java.util.
logging.Level.SEVERE, null, ex);
}
capítulo 4 • 175
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TelaPrinc().setVisible(true);
}
});
}
Listagem 8
@SuppressWarnings("unchecked")
private void initComponents() {
botaoIncluir = new javax.swing.JButton();
botaoConsultar = new javax.swing.JButton();
botaoAlterar = new javax.swing.JButton();
176 • capítulo 4
botaoExcluir = new javax.swing.JButton();
botaoSair = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setResizable(false);
setType(java.awt.Window.Type.UTILITY);
botaoIncluir.setText("Incluir");
botaoConsultar.setText("Consultar");
botaoAlterar.setText("Alterar");
botaoExcluir.setText("Excluir");
botaoSair.setText("Sair");
botaoSair.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
botaoSairActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.
GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(botaoIncluir)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(botaoConsultar)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(botaoAlterar)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(botaoExcluir)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(botaoSair)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.
MAX_VALUE)));
layout.setVerticalGroup( layout.createParallelGroup(javax.swing.
GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.
createSequentialGroup()
.addContainerGap(266,Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
capítulo 4 • 177
.addComponent(botaoIncluir)
.addComponent(botaoConsultar)
.addComponent(botaoAlterar)
.addComponent(botaoExcluir)
.addComponent(botaoSair))
.addContainerGap())
);
pack();
}
Listagem 9
178 • capítulo 4
específico porque eles estão altamente relacionados com a persistência, a qual
não iremos tratar aqui neste exemplo.
Perceba que na classe Atividade e na classe Socio foi implementado um método cha-
mado toString(). Este método é muito útil porque ele é uma forma padronizada para
poder mostrar os valores das variáveis de instância em formato String. É recomendável
que as classes do Modelo implementem este método, desta forma qualquer outro obje-
to que precisar imprimir os dados em String pode usar este método.
capítulo 4 • 179
import javax.swing.JOptionPane;
public class TelaCadClube extends TelaCad {
public TelaCadClube() {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax wing.JLabel();
txtNome = new javax.swing.JTextField();
txtAtividade = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Cadastro de Clube");
jLabel1.setText("Nome");
jLabel2.setText("Atividade");
jLabel2.setToolTipText("");
180 • capítulo 4
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(45, 45, 45)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE)
.addComponent(jLabel1)
.addComponent(txtNome,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_
SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
BASELINE)
.addComponent(jLabel2)
.addComponent(txtAtividade,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_
SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(197, Short.MAX_VALUE))
);
botaoIncluir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
botaoIncluirActionPerformed(evt);
}
});
botaoAlterar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
botaoAlterarActionPerformed(evt);
}
});
botaoConsultar.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt) {
botaoConsultarActionPerformed(evt);
}
});
capítulo 4 • 181
botaoExcluir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
botaoExcluirActionPerformed(evt);
}
});
pack();
}
Listagem 10
182 • capítulo 4
5.3.2 Criando as classes de negócio
Plain Old Java Objects (POJO) são objetos Java que tendem a ser os mais simples
possíveis, em contraposição ao Enterprise Java Bean (EJB). Este é mais complexo e
caracteriza-se por ser um objeto componente da plataforma JEE o qual roda em um
container de um servidor de aplicação. Normalmente o POJO possui gets e sets para
cada um de seus atributos, um método construtor sem parâmetros e outro construtor
para inicializar os atributos, além de ser serializável, ou seja, pode ser transformado em
bytes como por exemplo ser gravado em disco. A especificação dos POJOs possui
outros detalhes os quais foram omitidos aqui por questão de escopo.
capítulo 4 • 183
public class Socio {
private int matricula;
private String nome;
@Override
public String toString() {
return "Socio{" + "matricula=" + matricula + ", nome=" + nome + '}';
}
}
Listagem 11
CONEXÃO
Os links a seguir podem te ajudar a conhecer o JDBC. São tutoriais muito bons a respeito
do assunto:
http://www.guj.com.br/articles/7
184 • capítulo 4
http://docs.oracle.com/javase/tutorial/jdbc/
http://docs.oracle.com/javase/tutorial/jdbc/basics/
Por enquanto é só. Porém não deixe de estudar. Lembre-se que nosso obje-
tivo aqui é passar os principais conceitos. O aprimoramento é com você! Vamos
fazer alguns exercícios.
ATIVIDADES
01. Liste 5 exemplos de exceções comuns.
try {
} finally {
capítulo 4 • 185
04. Que tipos de exceções podem ser tratadas pelo seguinte tratador?
catch (Exception e) {
try {
} catch (Exception e) {
} catch (ArithmeticException a) {
REFLEXÃO
Muitos projetos são executados sem muitos cuidados. Aprender a planejar, conhecer pa-
drões de desenvolvimento bem como a linguagem de programação é importante. Atualmente
percebe-se que os programadores tem evoluído em muitos conceitos relacionados com a co-
dificação dos programas e repetem tutoriais e comandos que acham na internet. É importan-
te que você aprenda e tire suas conclusões. Compartilhe o conhecimento, participe de fóruns,
preze por desenvolvimentos mais inteligentes e produtivos. Todos tem a ganhar com isso.
LEITURA
Neste capítulo tratamos de alguns assuntos que não foram bem explorados porque não é
o objetivo da disciplina e foge do escopo. Porém vamos indicar alguns links nos quais você
poderá encontrar boas referências e terminar o estudo de caso com “chave de ouro”.
186 • capítulo 4
• http://www.gqferreira.com.br/artigos/ver/mvc-com-java-desktop-parte1: artigo dividido em
3 partes contendo dicas para o desenvolvimento de aplicações para desktop e o padrão MVC
• http://www.yaw.com.br/open/projetos/swing-jdbc-crud/: projeto de código aberto que
trata de aplicações envolvendo banco de dados e Swing. Muito interessante!
• http://wiki.netbeans.org/JavaPersistenceApi: Trata sobre a biblioteca de persistência em Java
• https://platform.netbeans.org/tutorials/nbm-crud.html: Tutorial que mostra a criação de
uma aplicação com banco de dados
REFERÊNCIAS BIBLIOGRÁFICAS
DEITEL, H. M.; DEITEL, P. J. Java como programar. Bookman, 2002.
FLANAGAN, D. Java o guia essencial. Bookman, 2006.
GARY, C.; HORSTMANN, C. Core Java 2: Fundamentos. Makron Books, 2001.
GARY, C.; HORSTMANN, C. Core Java 2: Recursos Avançados. Makron Books, 2001.
HUBBARD, J. R. Programação com Java. Bookman, 2006.
GABARITO
Capítulo 1
01.
import javax.swing.JOptionPane;
capítulo 4 • 187
entrada = JOptionPane.showInputDialog("Digite o total de itens");
totalItens = Integer.parseInt(entrada);
entrada = JOptionPane.showInputDialog("Digite o total de creditos");
totalCreditos = Integer.parseInt(entrada);
entrada = JOptionPane.showInputDialog("Digite o limite");
limiteCredito = Integer.parseInt(entrada);
novoSaldo = saldo + totalItens - totalCreditos;
if (novoSaldo > limiteCredito){
JOptionPane.showMessageDialog(null, "O cliente da conta "+numero-
Conta+" excedeu o limite!");
}
else {
JOptionPane.showMessageDialog(null, "O cliente da conta "+numero-
Conta+" NAO excedeu o limite!");
}
}
}
02.
a)
Segunda string
Terceira string
b)
188 • capítulo 4
else System.out.println("Segunda string");
System.out.println("Terceira string");
}
}
c)
d)
capítulo 4 • 189
03.
a) 32
b) e
c) hannah.charAt(15)
04.
slá
oeá
owlá
oláoft
oláar
05.
Não “reinvente a roda”. Procure na API do Java por métodos já existentes. Vamos usar
a classe Arrays:
import java.util.Arrays;
import javax.swing.JOptionPane;
190 • capítulo 4
Capítulo 2
01.
a) x e y
b)
a.y = 5
b.y = 6
a.x = 1
b.x = 2
Erro pois a classe Exercicio1 não é estática
02.
capítulo 4 • 191
Teste e objetos:
03.
import java.util.Scanner;
192 • capítulo 4
System.out.println("Saques realizados hoje: " + this.saques + "\n");
do{
exibeMenu();
opcao = entrada.nextInt();
escolheOpcao(opcao);
}while(opcao!=4);
}
capítulo 4 • 193
public void escolheOpcao(int opcao){
double valor;
switch( opcao ){
case 1:
extrato();
break;
case 2:
if(saques<3){
System.out.print("Quanto deseja sacar: ");
valor = entrada.nextDouble();
sacar(valor);
} else{
System.out.println("Limite de saques diários atingidos.\n");
}
break;
case 3:
System.out.print("Quanto deseja depositar: ");
valor = entrada.nextDouble();
depositar(valor);
break;
case 4:
System.out.println("Sistema encerrado.");
break;
default:
System.out.println("Opção inválida");
}
}
}
04.
import java.util.List;
194 • capítulo 4
private String capital;
private String tamanho;
private List<Pais> vizinhos;
capítulo 4 • 195
public String getTamanho() {
return tamanho;
}
import java.util.ArrayList;
}
}
Capítulo 3
196 • capítulo 4
public Produto(int codigo, String descricao, Data validade) {
super();
this.codigo = codigo;
this.descricao = descricao;
this.validade = validade;
}
capítulo 4 • 197
this.ano = ano;
this.produto = produto;
}
198 • capítulo 4
Capítulo 4
01.
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
import javax.print.DocFlavor;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
Container c = this.getContentPane();
c.setLayout(null);
capítulo 4 • 199
btn7 = new JButton("7");
btn7.setBounds(20, 80, 45, 45);
btn7.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "7";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn7);
btn8 = new JButton("8");
btn8.setBounds(70, 80, 45, 45);
btn8.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "8";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn8);
btn9 = new JButton("9");
btn9.setBounds(120, 80, 45, 45);
btn9.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "9";
if(cont == 1){
primeiro = primeiro + n;
200 • capítulo 4
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn9);
btn4 = new JButton("4");
btn4.setBounds(20, 130, 45, 45);
btn4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "4";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn4);
btn5 = new JButton("5");
btn5.setBounds(70, 130, 45, 45);
btn5.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "5";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
capítulo 4 • 201
});
c.add(btn5);
btn6 = new JButton("6");
btn6.setBounds(120, 130, 45, 45);
btn6.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "6";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn6);
btn1 = new JButton("1");
btn1.setBounds(20, 180, 45, 45);
btn1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "1";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn1);
btn2 = new JButton("2");
btn2.setBounds(70, 180, 45, 45);
btn2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "2";
202 • capítulo 4
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn2);
btn3 = new JButton("3");
btn3.setBounds(120, 180, 45, 45);
btn3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = "3";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btn3);
btn0 = new JButton("0");
btn0.setBounds(20, 230, 45, 45);
btn0.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String n = "0";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
capítulo 4 • 203
});
c.add(btn0);
this.setVisible(true);
btnponto = new JButton(".");
btnponto.setBounds(70, 230, 45, 45);
btnponto.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String n = ".";
if(cont == 1){
primeiro = primeiro + n;
tbxPrincipal.setText(primeiro);
} else if(cont==2) {
segundo = segundo + n;
tbxPrincipal.setText(segundo);
}
}
});
c.add(btnponto);
btnResult = new JButton("=");
btnResult.setBounds(120, 230, 45, 45);
btnResult.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
double soma =0;
if(sinal == "+"){
soma=Double.valueOf(primeiro)+ Double.valueOf(segundo);
tbxPrincipal.setText(String.valueOf(soma));
cont = 1;
primeiro = "";
segundo ="";
} else if(sinal == "-"){
soma=Double.valueOf(primeiro)- Double.valueOf(segundo);
tbxPrincipal.setText(String.valueOf(soma));
cont = 1;
primeiro = "";
segundo ="";
} else if(sinal == "*"){
soma=Double.valueOf(primeiro)- Double.valueOf(segundo);
204 • capítulo 4
tbxPrincipal.setText(String.valueOf(soma));
cont = 1;
primeiro = "";
segundo ="";
} else if(sinal == "*"){
soma=Double.valueOf(primeiro)* Double.valueOf(segundo);
tbxPrincipal.setText(String.valueOf(soma));
cont = 1;
primeiro = "";
segundo ="";
}else if(sinal == "/"){
soma=Double.valueOf(primeiro)/ Double.valueOf(segundo);
tbxPrincipal.setText(String.valueOf(soma));
cont = 1;
primeiro = "";
segundo ="";
} else {
tbxPrincipal.setText("Sem valores para efetuar funções");
}
}
});
c.add(btnResult);
btndivide = new JButton("/");
btndivide.setBounds(170, 80, 45, 45);
btndivide.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String valor = tbxPrincipal.getText();
tbxPrincipal.setText(valor + "/");
sinal ="/";
cont =2;
}
});
c.add(btndivide);
btnmult = new JButton("*");
btnmult.setBounds(170, 130, 45, 45);
btnmult.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
capítulo 4 • 205
String valor = tbxPrincipal.getText();
tbxPrincipal.setText(valor + "*");
sinal ="*";
cont =2;
}
});
c.add(btnmult);
btnmenos = new JButton("-");
btnmenos.setBounds(170, 180, 45, 45);
btnmenos.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String valor = tbxPrincipal.getText();
tbxPrincipal.setText(valor + "-");
sinal ="-";
cont =2;
}
});
c.add(btnmenos);
btnmais = new JButton("+");
btnmais.setBounds(170, 230, 45, 45);
btnmais.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String valor = tbxPrincipal.getText();
tbxPrincipal.setText(valor + "+");
sinal ="+";
cont =2;
}
});
c.add(btnmais);
btnLimpar = new JButton("CEE");
btnLimpar.setBounds(20, 280, 85, 45);
btnLimpar.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String valor = tbxPrincipal.getText();
tbxPrincipal.setText("");
206 • capítulo 4
sinal ="CEE";
cont =1;
}
});
c.add(btnLimpar);
}
02.
Feito no Netbeans
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
capítulo 4 • 207
jTextField2 = new javax.swing.JTextField();
jTextField3 = new javax.swing.JTextField();
jTextField4 = new javax.swing.JTextField();
jTextField5 = new javax.swing.JTextField();
jTextField6 = new javax.swing.JTextField();
jTextField7 = new javax.swing.JTextField();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jButton4 = new javax.swing.JButton();
jButton5 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTextField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField1ActionPerformed(evt);
}
});
jButton1.setText("Pesquisar");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jButton2.setText("Novo");
208 • capítulo 4
jButton3.setText("Inserir");
jButton4.setText("Alterar");
jButton5.setText("Apagar");
javax.swing.GroupLayout layout = new javax.swing.
GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(79, 79, 79)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.TRAILING)
.addComponent(jLabel4)
.addComponent(jLabel3)
.addComponent(jLabel5)
.addComponent(jLabel6)
.addComponent(jLabel7)
.addComponent(jLabel8))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING, false)
.addComponent(jTextField3)
.addComponent(jTextField4)
.addComponent(jTextField5)
.addComponent(jTextField6)
.addComponent(jTextField7)
.addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_
SIZE, 94, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
.addGap(42, 42, 42)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
capítulo 4 • 209
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_
SIZE, 156, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addComponent(jButton1))
.addGroup(layout.createSequentialGroup()
.addGap(99, 99, 99)
.addComponent(jLabel1))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jButton2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addComponent(jButton3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addComponent(jButton4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addComponent(jButton5)))
.addContainerGap(33, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addGap(36, 36, 36)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(jTextField1, javax.swing.GroupLayout.
PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.
PREFERRED_SIZE)
.addComponent(jButton1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
UNRELATED)
210 • capítulo 4
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(jTextField2,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_
SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(jTextField3,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_
SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(jTextField4, javax.swing.GroupLayout.
PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.
PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(jTextField5, javax.swing.GroupLayout.
PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.
PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel7)
.addComponent(jTextField6, javax.swing.GroupLayout.
PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.
PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.
UNRELATED)
capítulo 4 • 211
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel8)
.addComponent(jTextField7, javax.swing.GroupLayout.
PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.
PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jButton2)
.addComponent(jButton3)
.addComponent(jButton4)
.addComponent(jButton5))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.
MAX_VALUE))
);
pack();
}// </editor-fold>
212 • capítulo 4
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Cadastro.class.getName()).log(-
java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Cadastro.class.getName()).log(-
java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Cadastro.class.getName()).log(-
java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Cadastro.class.getName()).log(-
java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
capítulo 4 • 213
private javax.swing.JTextField jTextField4;
private javax.swing.JTextField jTextField5;
private javax.swing.JTextField jTextField6;
private javax.swing.JTextField jTextField7;
// End of variables declaration
}
03.
import javax.swing.JOptionPane;
Capítulo 5
01.
IOException
SQLException
RunTimeException
IllegalArgumentException
NullPointerException
214 • capítulo 4
02.
O bloco finally sempre executa seu bloco de dados mesmo que uma exceção seja lan-
çada. É útil para liberar recursos do sistema quando utilizamos, por exemplo, conexões de
banco de dados e abertura de buffer para leitura ou escrita de arquivos.
03.
Sim, está correto. Um try não precisa ter um bloco catch se existir um finally. Se o código
no tryu tiver vários pontos de saída e não há catch associado, o código no bloco finally é
executado independente da forma que o bloco try sai.
04.
Este tratador pega exceções do tipo Exception, ou seja, qualquer tipo de exceção. Isto
não é muito aconselhável porque o usuário fica sem saber qual foi o erro na execução do
programa.
05.
O primeiro tratador pega exceções do tipo Exception, incluindo as ArithmeticException.
O segundo tratador nunca será executado e portanto o código não será compilado.
capítulo 4 • 215
ANOTAÇÕES
216 • capítulo 4