Escolar Documentos
Profissional Documentos
Cultura Documentos
LOUCADEMIA
DE JAVA
J2SE
OU
ENCICLOPEDIAE JAVALISTICUS UNIVERSALIS
Luisius
WWW.FABIOSALVADOR.COM.BR - Pgina 2
Fbio Burch Salvador
Prefcio
Este livro serve para as pessoas aprenderem a programar em Java. Especificamente, J2SE,
programao para desktop. No um livro para ser lido na cama ou no banheiro. No um livro para
ler no nibus. um livro que tem muitos cdigos e portanto preciso baixar uma IDE e testar os
exemplos. S se aprende a programar programando.
O contedo deste volume foi ordenado seguindo o critrio mais correto de todos - o critrio da prtica.
Ele apresenta as aulas de Java ministradas pelo autor, da maneira como ele gostaria de ter feito caso
tivesse tempo e o curso no fosse curto demais. As explicaes usam uma linguagem informal, solta, e
possivelmente possuem erros de concordncia em diversos pontos.
Este livro antes de mais nada um livro escrito s pressas, em horrios livres, de intervalos para o
lanche ou na madrugada antes do incio das aulas. Portanto, mancadas no portugus devem ser
perdoadas. o livro escrito por algum que passa o tempo todo na mais absoluta pressa. , na
verdade, o ltimo trabalho feito por mim sob estas condies. As prximas obras sero mais
calmamente escritas.
Espero que sirva para os iniciantes e at para quem j conhece alguma coisa de Java.
PreDifcil
Voc pode achar Java uma linguagem complicada. No . Voc pode achar que Orientao a Objetos
um bicho de sete cabeas. No . Tudo isso muito simples. Eu vou tentar fazer parecer ainda mais
simples. Trata-se de lgica natural.
Mas eu aviso: preciso abstrair algumas noes para compreender o que se vai ler aqui. No se pode
pensar em classes como salas ou como caixas. Em objetos como variveis, como valores ou sei l o
que. preciso compreender que estamos lidando com coisas abstratas, que a princpio representam
coisas reais, mas no SO reais. Portanto, comportam-se como aquilo que so: idias. Uma classe
uma idia de um tipo de coisa. Um objeto a idia de um objeto. E uma instncia de sua classe. Um
mtodo, o qu? Uma funo? Mais ou menos. Mas tambm uma o em potencial do objeto. Ou da
classe, se for esttico.
Pode parecer difcil mas no . Poderia ser pior. Os comandos, todos palavras em ingls, poderiam ser
escritos em alemo. A sim a cobra iria fumar!
Pgina 3 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
O autor quem esse cara?
Fbio Burch Salvador nasceu em 1981, em Porto Alegre. viciado em
informtica desde guri, mais precisamente desde o dia em que colocou
as mos em um XT na firma onde o pai trabalhava. Programador desde
os 13 anos (o pai tinha um 286) comeou no Basic desenvolvendo
Games cabulosos tirando sarro de amigos e conhecidos. Mais tarde,
evoluiu, desenvolvendo ento outras coisas medonhas em outras
linguagens. Mas tambm desenvolveu muita coisa boa, sistemas
empresariais principalmente - e apostilas!
Programa Basic, VB, JavaScript, Pascal, PHP, Java. Monta sites
escrevendo HTML e CSS no Bloco de Notas. Aprendeu Flash sozinho. E
tambm Photoshop, Corel Draw, SQL, e tudo mais. Incrivelmente, tem apenas um curso - de AutoCAD (?) - ele que
rodou na stima srie exatamente por no saber nada de geometria e nem a Frmula de Bskhara (que ele alis no
domina at hoje).
formado em Jornalismo desde 2005 pela PUC de Porto Alegre. Por qu logo Jornalismo? Ningum sabe. Nem ele.
Apaixonado pelas cmeras, teve at uma curta carreira como cineasta, dirigindo 4 curtas-metragens, todos dignos de um
Cine Trash .
Defensor implacvel do DOS nos anos 90, acabou rendendo-se. Prdigo em criar bordes, Fbio criou frases de efeito
que ficaram na Histria de todos os lugares pode onde passou. Iniciou sua vida profissional "pegando" uma srie de
empregos variados, mais ou menos no estilo Seu Madruga. Foi, entre outras coisas, digitador de cadastro nas Lojas
Renner, tcnico de fiscalizao da Anatel, estagirio na Prefeitura de Porto Alegre, monitor de laboratrio na PUC, e s
no foi astronauta porque o Brasil no tinha programa espacial.
Em 2004, fundou um pasquim em Viamo/RS chamado "A Cidade". O jornal sagrou-se como o mais polmico no
municpio, tinha o desenho mais estiloso e foi o primeiro a ter um site. Bagunou a vida dos polticos locais e estampou
manchetes gritantes em capas surrealistas at seu fechamento no incio de 2006. Fbio ento passou a colaborar no "de-
vez-em-quandrio" Correio Viamonense, outro pasquim ainda mais meftico do que o primeiro. Virou sub-celebridade
local e passou a ser sistematicamente convidado pelos partidos polticos em tudo que eleio.
Ainda buscando uma carreira de comunicador, tentou a sorte na redao do site Terra, como redador temporrio. Em
seguida, cansou-se de nunca ter grana para nada e resolveu abandonar o jornalismo. Voltou a dedicar-se informtica.
Deu o arriscado passo da troca de carreira e acertou na mosca.
Como desenvolvedor de softwares, sua falta de instruo formal na rea foi facilmente esquecida por todos os que o
empregaram porque, afinal de contas, seus programas funcionam.
Agraciado com o Prmio McGyver da Programao, Fbio foi professor no Senac em So Leopoldo, ensinando sua arte
softwarstica e tornando seus alunos to pirados quanto ele. Acabou tambm ensinando design, liderana, oratria,
administrao e outras coisas mais. Saiu do Senac por vontade prpria em 2008 para dedicar-se a programar em turno
integral. No que no goste de dar aulas. Teve seu$ motivo$ pe$$oai$.
Desde o comeo e sempre, teve principalmente a ajuda indispensvel de seus pais, que sempre o incentivaram a ir em
frente e at a levantar nas inmeras vezes em que caiu. Mais tarde, iria somar-se neste esforo de apoio sua namorada
que virou esposa. Apesar de serem todos pessoas bem mais "normais" e discretas do que o autor deste livro, sempre
tentaram compreend-lo. Ele que por vezes incompreensvel. E que incompreensivelmente conseguiu achar seu
caminho na vida.
Fbio casado, tem uma filha, um gacho urbano criado na Capital e nunca andou a cavalo. No sabe tocar gaita. E
no usa pilcha. Mas sabe assar churrasco, provando mais uma vez que a convenincia a me da sabedoria.
Continua programando, atuando na rea do ensino e dedica-se tambm a escrever. E ainda por cima mantm seu "lado
jornalista" vivo no site que mantm na Internet e cujo jab j foi feito neste livro. Projeta carros espalhafatosos em
AutoCAD 3D (e publica os projetos na Internet). s vezes, filosofa. Tambm mete-se na poltica. E at escreve sobre
teologia.
Ainda no plantou uma rvore. Mas j teve um filho. E agora acaba de escrever um livro.
WWW.FABIOSALVADOR.COM.BR - Pgina 4
Fbio Burch Salvador
Agradecimentos
Este livro no teria sido escrito sem a ajuda de algumas pessoas. Em primeiro lugar, quero agradecer minha esposa Fabiana
por me aturar nos tempos em que passei concentrado escrevendo, minha filha Camila por me trazer bolachinhas e beijos
enquanto eu escrevo, aos meus pais que sempre me apoiaram e no final so os verdadeiros responsveis por eu estar aqui
hoje escrevendo. Ao meu cunhado Ismael por consertar meu PC nas vezes em que ele apresentou problemas. minha sogra
por me aturar. Ao meu sobrinho Raphael por me alegrar, e minha irm ngela por ter crescido ao meu lado e ter participado
de quase todos os momentos mais importantes da minha vida. Novamente minha me por sempre me dar fora e ao meu pai
por me incentivar a aprender Basic.
Tambm quero homenagear meus alunos do Senac, tanto a galera do Java e do PHP, sempre formando turmas de pessoas
divertidas, o que me estimulava a aprender mais para ensinar mais. E tambm gurizada da Aprendizagem Comercial: Manu,
Luan, Douglas, Alemo, Frajola, Tainara, Francine, Alisson, Elvis, Pri, e todo o resto da gurizada medonha. Ah, e claro, a Deize
que veio da capital tecnolgica do mundo Ocidental, Crissiumal. Essa gurizada, com seu jeito barulhento e impulsivo, acabou
tornando a mim mesmo mentalmente mais jovem (o papel de professor estava a envelhecer-me aos poucos) e me fez ver que
eu no poderia acomodar-me to cedo, que deveria ser mais confiante e construir meu futuro com ambies maiores e, no fim,
causaram eles mesmos a perda de seu professor de todas as tardes.
Tambm homenageio aos colegas do Senac, a Raquel, o Alexandre, o Antonio, o Alisson, a Pati, a Su, e todos os outros
malucos que dividiram comigo um ano absolutamente divertido e edificante. E, claro, ao Nelson e Carla, que na direo da
escola souberam lidar com pessoas como, por exemplo, eu o que sei ser uma misso casca-grossa.
Mando tambm um al especial para a galera do Espiral, da WaySys, da Memo e de todos os lugares onde eu pude
desenvolver sistemas, aprimorando-me no decorrer do caminho.
Tambm quero agradecer a Steve Wozniak, que inventou o computador pessoal. Ao Bill Gates, por ter criado um sistema
operacional simplesmente maravilhoso. E ao Linus Torvalds pelo mesmo motivo.
Quero agradecer a Jesus Cristo, sem o qual ns hoje seramos Zoroastristas ou mais provavelmente Mitrastas se no
fssemos uns tribais animistas danando seminus em vota de uma pedra e sacrificando virgens ao deus Dagon quando se
sabe que virgens tm outra utilidade bem melhor.
No posso tambm deixar de agradecer a mim mesmo, pessoa sem a qual este texto no se auto-escreveria sozinho.
E quero agradecer a vocs, que j leram umas quantas pginas e ainda no viram nada de Java. Mas vero, e no se
arrependero. Ento, vamos ao Java!
Dejair, Clauber,
Pozzebon e eu -
turma de
Java em 2007
Pgina 5 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Import java.livro.JIndice
class Livro_do_Java {
static JIndice ind;
public static void main (String[]args) {
ind = new JIndice();
ind.listar();
ndice
Prefcio....................................................................................................................................................3
PreDifcil...................................................................................................................................................3
O autor quem esse cara?..................................................................................................................4
Agradecimentos......................................................................................................................................5
ndice........................................................................................................................................................6
Nomenclaturas e badulaques.................................................................................................................8
Java a JavaScript.....................................................................................................................................................8
O que uma API......................................................................................................................................................8
J2SE, J2EE e J2ME.................................................................................................................................................8
Java Virtual Machine (JVM).....................................................................................................................................9
Java Developer Kit (JDK).........................................................................................................................................9
O que uma IDE......................................................................................................................................................9
Palavras Reservadas...............................................................................................................................................9
Coleta automtica de lixo.......................................................................................................................................10
Classes e objetos..................................................................................................................................11
Explicao Wikipdica............................................................................................................................................11
Explicao no popular..........................................................................................................................................12
Padres bsicos de programao Java..............................................................................................15
Principais tipos de dados.......................................................................................................................................15
Usando chaves.......................................................................................................................................................15
Fazendo clculos....................................................................................................................................................15
Comparaes.........................................................................................................................................................16
Concatenando condies.......................................................................................................................................16
Montando um programa simples.........................................................................................................17
Sintaxes principais................................................................................................................................18
Laos de repetio.................................................................................................................................................18
Estruturas condicionais..........................................................................................................................................19
Aplicando Orientao a Objetos..........................................................................................................21
Instanciando uma classe........................................................................................................................................21
Herana..................................................................................................................................................................23
Polimorfismo...........................................................................................................................................................25
Modificadores .......................................................................................................................................26
Static.......................................................................................................................................................................26
Public......................................................................................................................................................................26
Private.....................................................................................................................................................................26
Final........................................................................................................................................................................26
Protected................................................................................................................................................................27
Pacotes...................................................................................................................................................28
Tratamento de erros e excees..........................................................................................................29
Throw informado os erros classe que instanciou o objeto...............................................................................30
Tipos de Excesso.................................................................................................................................................31
Escrevendo dados em arquivos textos e lendo eles de volta............................................................32
Tokenizer (caracteres separadores)......................................................................................................................34
Mtodos da classe StringTokenizer:......................................................................................................................35
Tocando sons em Java.........................................................................................................................36
A classe Console...................................................................................................................................38
Sobrepondo mtodos uma tcnica essencial.....................................................................................................40
Interface grfica em Java......................................................................................................................41
Bibliotecas AWT e SWING.....................................................................................................................................41
Nossa primeira tela.................................................................................................................................................41
WWW.FABIOSALVADOR.COM.BR - Pgina 6
Fbio Burch Salvador
JLabel.....................................................................................................................................................................43
JButton....................................................................................................................................................................44
JTextField...............................................................................................................................................................45
JFormattedTextField...............................................................................................................................................46
JToggleButton........................................................................................................................................................47
Icon.........................................................................................................................................................................48
JOptionPane...........................................................................................................................................................49
Tipos de mensagem:..............................................................................................................................................50
showConfirmDialog................................................................................................................................................51
showOptionDialog..................................................................................................................................................52
showInputDialog.....................................................................................................................................................53
JMenuBar, JMenu e JMenuItem............................................................................................................................54
JCheckBox.............................................................................................................................................................55
JRadioButton..........................................................................................................................................................57
JComboBox............................................................................................................................................................59
JTabbedPane.........................................................................................................................................................60
JScrollPane............................................................................................................................................................61
JTables...................................................................................................................................................................62
JFileChooser..........................................................................................................................................................65
JInternalFrame.......................................................................................................................................................67
Tree........................................................................................................................................................................69
Eventos (Listeners)...............................................................................................................................70
ActionListener.........................................................................................................................................................70
FocusListener.........................................................................................................................................................71
KeyEvent................................................................................................................................................................72
MouseListener........................................................................................................................................................73
Uma coleo de pequenos comandos soltos.....................................................................................75
Leitura de dimenses de componentes grficos e da prpria tela........................................................................75
Converso de dados..............................................................................................................................................75
Fazendo uma JFrame sumir, morrer e derrubar o programa................................................................................76
Relaes com o setDefaultCloseOperation...........................................................................................................76
Ordenando a uma JFrame que abra em modo maximizado.................................................................................76
Redimensionando imagens para caberem dentro da JLabel................................................................................77
Colocando uma imagem de plano de fundo dentro do JDesktopPane.................................................................78
Conexo Java + Banco de Dados........................................................................................................81
Criando a aplicao integrada................................................................................................................................84
Consultando o Banco de Dados.............................................................................................................................86
Gravando no BD (Insert e Update).........................................................................................................................87
Java + MySQL........................................................................................................................................................88
A aplicao Java com MySQL integrado...............................................................................................................89
Nota sobre componentes de conexo baixados da Web......................................................................................90
Criando formulrios de impresso com IReport.................................................................................91
Colocando dados no Report...................................................................................................................................94
Montando grupos....................................................................................................................................................97
Testando o Report..................................................................................................................................................99
Botes do IReport...................................................................................................................................................99
Trabalhando com variveis..................................................................................................................................100
Como integrar o JasperReport ao programa Java............................................................................102
Compilando o projeto depois de pronto............................................................................................105
Extras...................................................................................................................................................108
Como chamar um outro programa EXE...............................................................................................................108
Usando impressoras matriciais diretamente........................................................................................................109
Gerando um relatrio com Cdigos de Barra......................................................................................................111
Como ler um cdigo de barras.............................................................................................................................112
Pgina 7 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Nomenclaturas e badulaques
Vamos ver agora um pequeno glossrio de coisas que precisamos saber antes de comear.
Java a JavaScript
A primeira confuso que existe no mundo Java entre a linguagem Java e o JavaScript. Vamos ver isso
de forma bem clara e objetiva:
JAVA uma linguagem completa, enorme e complexa utilizada para montar aplicaes completas com
acesso a Bancos de Dados constante e fins mais completos. Programar Java exige alguma prtica, e
exatamente para ensinar Java que eu escrevi este livro.
O cdigo JAVA deve ser desenvolvido, testado e depois convertido em Byte-Code, em uma operao
de compilao. O cdigo torna-se ento ilegvel e o usurio no tem acesso s fontes que deram
origem s funcionalidaes.
JAVASCRIPT uma pequena linguagem de scripts usados dentro do cdigo HTML de um site e que
executam pequenas tarefas a serem executadas do lado do cliente na conexo via Internet. O cdigo
aberto e as funcionalidades raramente passam de pequenas validaes de campos em formulrios
HTML ou efeitos de animao limitados.
A nica coisa legal sobre o JavaScript, do ponto de vista do programador Java, que as sintaxes dos
comandos so iguais. Laos de repetio, funes e outros badulaques tm a mesma forma de
escrever que os da linguagem Java.
WWW.FABIOSALVADOR.COM.BR - Pgina 8
Fbio Burch Salvador
funcionalidades, especialmente no que se refere rea de interface grfica. Serve para desenvolver
aplicaes para telefones celulares, palmtops e outros dispositivos mveis.
Palavras Reservadas
Existem algumas palavras em Java que no poderemos usar para designar classes, variveis ou
qualquer outro tipo de coisa. Essas palavras so comandos nativos da linguagem:
abstract continue for new assert default goto package boolean do if private break double implements
protected byte else import public case enum instanceof return catch extends int short char final
interface static class finally long strictfp const float native super true false null
Pgina 9 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Coleta automtica de lixo
Java uma linguagem para l de inteligente. Surgiu em 1995, e veio com essa histria de lixo. O que
isso?
Simples! Nas linguagens de antigamente, ns crivamos a varivel X e precisvamos, quando no mais
a quisssemos usar, destru-la para desocupar memria. No Java, isso no acontece. Quando X deve
cair fora, ela cai.
E mais: se antes a varivel X ficava com lixo das atribuies de valor anteriores, hoje ao colocar um
valor novo nela, ela automaticamente limpa.
No fim, ficou muito mais fcil gerenciar memria.
No precisa se preocupar
com suas variveis
fantasmas. Eu guardo elas
para voc!
WWW.FABIOSALVADOR.COM.BR - Pgina 10
Fbio Burch Salvador
Classes e objetos
O que vem a ser uma classe? Uma classe aquilo que ser instanciado para a criao de objetos. No
entendeu nada? Vamos ento explicao acadmica para essa coisa toda:
Explicao Wikipdica
Em orientao a objeto, uma classe abstrai um conjunto de objetos com caractersticas similares. Uma
classe define o comportamento de seus objetos atravs de mtodos e os estados possveis destes
objetos atravs de atributos. Em outros termos, uma classe descreve os servios providos por seus
objetos e quais informaes eles podem armazenar.
Classes no so diretamente suportadas em todas as linguagens, e so necessrias para que uma
linguagem seja orientada a objetos. Classes so os elementos primordiais de um diagrama de classes.
Estrutura da classe
Uma classe define estado e comportamento de um Objeto geralmente implementando mtodos e
atributos (nomes utilizados na maioria das linguagens modernas). Os atributos, tambm chamados de
campos (do ingls fields), indicam as possveis informaes armazenadas por um objeto de uma classe,
representando o estado de cada objeto. Os mtodos so procedimentos que formam os
comportamentos e servios oferecidos por objetos de uma classe.
Outros possveis membros de uma classe so:
* Construtores - definem o comportamento no momento da criao de um objeto de uma classe.
* Destrutor - define o comportamento no momento da destruio do objeto de uma classe.
Normalmente, como em C++, utilizado para liberar recursos do sistema (como memria).
* Propriedades - define o acesso a um estado do objeto.
* Eventos - define um ponto em que o objeto pode chamar outros procedimentos de acordo com seu
comportamento e estado interno.
Encapsulamento
Em linguagens orientadas a objetos, possvel encapsular o estado de um objeto. Em termos prticos,
isso se realiza limitando o acesso a atributos de uma classe exclusivamente atravs de seus mtodos.
Para isso, as linguagens orientadas a objeto oferecem limitadores de acesso para cada membro de uma
classe.
Tipicamente os limitadores de acesso so:
* pblico (public) - o membro pode ser acessado por qualquer classe. Os membros pblicos de uma
classe definem sua interface.
* protegido (protected) - o membro pode ser acessado apenas pela prpria classe e suas sub-classes.
* privado (private) - o membro pode ser acessado apenas pela prpria classe.
Cada linguagem de programao pode possuir limitadores de acesso prprios. Por exemplo, em Java, o
nvel de acesso padro de um membro permite que qualquer classe de seu pacote (package) possa ser
acessado. Em C#, o limitador de acesso interno (internal) permite que o membro seja acessado por
qualquer classe do Assembly (isto , da biblioteca ou executvel).
Pgina 11 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
No exemplo abaixo, implementado em Java, a classe Pessoa permite o acesso ao atributo nome
somente atravs dos mtodos setNome e getNome.
public class Pessoa {
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
private String nome;
}
Herana
A herana um relacionamento pelo qual uma classe, chamada de sub-classe, herda todos
comportamentos e estados possveis de outra classe, chamada de super-classe ou classe base.
permitido que a sub-classe estenda os comportamentos e estados possveis da super-classe (por isso
este relacionamento tambm chamado de extenso). Essa extenso ocorre adicionando novos
membros a sub-classe, como novos mtodos e atributos. tambm possvel que a sub-classe altere os
comportamentos e estados possveis da super-classe. Neste caso, a sub-classe sobrescreve membros
da super-classe, tipicamente mtodos.
Quando uma classe herda de mais de uma super-classe, ocorre uma herana mltipla. Esta tcnica
possvel em C++ e em Python, mas no possvel em Java e C#, no entanto estas linguagens
permitem mltipla tipagem atravs do uso de interfaces.
Explicao no popular
Uma classe um pedao de cdigo que vai definir um molde para a gente construir objetos.
Uma classe tem, basicamente, mtodos e atributos. Atributos so como variveis. Mtodos so como
funes. Se voc no sabe o que so Variveis e Funes, volte a ler o material sobre Lgica da
Programao.
Um exemplo prtico:
Vamos construir a classe PESSOA.
ATRIBUTOS ==> NOME (texto), IDADE (nmero inteiro) e SEXO (texto)
MTODOS ==>
Mtodo ANIVERSARIO A idade da pessoa igual idade +1 (se era 20, passa a ser 21).
Mtodo CIRGURGIA_NO_MARROCOS O sexo muda para Transexual
timo, Agora, temos, uma classe com 3 atributos e 2 mtodos. Ento, eu vou escrever o cdigo
principal do programa, aquele que ser executado linearmente (como acontecia nas linguagens Pascal,
Clipper, Cobol, Basic, e todas as antigas).
No cdigo principal, eu vou colocar uma instruo:
A Varivel P armazenar um objeto do tipo PESSOA.
P = Nova PESSOA;
P.NOME = Joozinho;
P.IDADE = 30;
P.SEXO = Homem;
WWW.FABIOSALVADOR.COM.BR - Pgina 12
Fbio Burch Salvador
Bom. Temos ento a varivel P, armazenando nossa PESSOA, o Joozinho, com 30 anos, Homem.
Agora, vamos fazer o programa executar um mtodo do objeto P:
P.ANIVERSARIO();
Ao executar este mtodo, o P vai auto-aumentar sua idade em 1 ano, ficando com 31 anos.
Acontece que P um OBJETO do tipo PESSOA. Ele no est armazenado dentro da CLASSE
PESSOA, ele foi gerado a partir dela, mas existe de forma independente.
Depois disso, vou criar outro objeto, o P2, que tambm uma PESSOA:
P2 = Nova PESSOA;
P2.NOME = Claudinei;
P2.IDADE = 20;
P2.SEXO = Homem;
E se eu ordenar que:
P2.CIRURGIA_NO_MARROCOS();
Ento P2 mudar seu sexo para Transexual, embora P no sofra conseqncia alguma.
Para entender:
P e P2 so independentes. Eles podem fazer aniversrio em pocas diferentes, um deles pde trocar
de sexo, e as funes executadas por um no vo afetar o outro. Eles so, contudo, semelhantes
porque ambos tm os mesmos 3 atributos e 2 mtodos, embora cada um armazene atributos com
valores diferentes e execute seus mtodos de forma completamente independente.
Pgina 13 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
E assim por diante...
Alis, este o mecanismo usado pelos carrinhos de compras dos sites de e-commerce: existe uma
classe PRODUTO que determina que todo produto vai ter certos atributos (preo, tipo, descrio, etc.),
e ter alguns mtodos (somar_frete, adicionar_ao_carrinho, e assim por diante). E da o programa
alimenta um Vetor de PRODUTOs e vai guardando na memria, sem envolver gravao de Banco de
Dados.
No final, quando o usurio resolve efetivar a compra, h a gravao de um dado efetivamente, sendo
ento os dados armazenados no vetor de objetos dentro da base de dados.
WWW.FABIOSALVADOR.COM.BR - Pgina 14
Fbio Burch Salvador
Padres bsicos de programao Java
Primeiro, preciso saber que Java uma linguagem case sensitive, ou seja, faz diferena digitar
alguma coisa em letras maisculas ou minsculas. Ento, se quisermos usar uma JFrame e
escrevermos ali JFRAME, nada vai dar certo.
Usando chaves
Segundo, preciso saber como delimitamos blocos. Blocos so coisas, como por exemplo, o conteo
de uma expresso condicional.
Linguagens como o Pascal e o Basic utilizam palavras-chave para abrir e fechar blocos. Assim, um IF
em Basic fica:
IF X = 1 THEN
// ALGUMA COISA ACONTECE
END IF
No java, porm, usamos chaves. Exatamente, chaves, aquelas que ns aprendemos a usar na quarta
srie para delimitar clculos.
If (x == 1) {
// ALGUMA COISA ACONTECE
}
Fazendo clculos
Depois, precisamos saber como fazer clculos. Os sinais matemticos so os seguintes:
+ Soma
- Subtrao
/ Diviso
* Multiplicao
S que para fazer clculos envolvendo uma certa hierarquia, no usamos parnteses, colchetes e
chaves. Usamos apenas parnteses, uns dentro dos outros.
Pgina 15 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Comparaes
Em Java, faremos algumas comparaes de valores entre variveis. Ento, devemos conhecer os
sinais usados:
X == Y X igual a Y
X != Y X diferente de Y
X<Y X menor que Y
X>Y X maior que Y
X <= Y X menor ou igual a Y
X >=Y X igual ou maior do que Y
Concatenando condies
Eu posso exigir que, para alguma coisa ser executada, duas ou mais condies sejam verdadeiras.
Para isso, uso a concatenao das condies utilizando principalmente trs sinais:
&& If ((Condio1) && (Condio2)) { Ser verdadeiro se a primeira condio for verdadeira e a
segunda tambm for. Caso alguma delas falhe, toda a expresso
ser FALSE.
Exemplo:
SE ((TIVER SOL) && (EU ESTIVER COM GRANA)) {
VOU PRAIA
}
WWW.FABIOSALVADOR.COM.BR - Pgina 16
Fbio Burch Salvador
Agora, vamos montar um programa finalmente. Abra a sua IDE e vamos comear a escrever.
Desde os anos 80, h uma tradio que diz que o primeiro software desenvolvido por qualquer pessoa
o famoso Ol Mundo. Ns vamos fazer um pouco diferente. Nosso primeiro programa exibir na tela
uma frase que no seja essa tradicional, pois j est muito manjada.
Ento, vamos l:
public class prog {
public static void main (String[]args) {
System.out.println("Minha vingana ser maligna!");
}
}
O programa acima simplssimo. Na primeira linha, eu crio a classe PROG. Na segunda, inicio o
mtodo MAIN, que ser o principal do nosso programa. No se preocupe em entender as palavras
PUBLIC, STATIC e VOID pois h um farto material sobre isso mais adiante neste mesmo livro (ver
Modificadores). O mtodo chamado MAIN sempre rodado como principal, por um padro existente na
linguagem Java.
Depois, eu tenho uma chamada classe SYSTEM.OUT, que lida com sadas de dados para o sistema.
Eu rodo o mtodo PRINTLN, que significa mande essa frase para o prompt e quebre a linha, sendo
que eu passei uma frase para ele exibir. Pronto! Temos um programa funcional!
Pgina 17 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Sintaxes principais
Laos de repetio
Os principais laos de repetio usados em Java so o FOR e o WHILE. Se voc no faz a mnima
idia do que seja um Lao de Repetio, por favor reveja a matria de Lgica da Programao.
FOR
O FOR roda um determinado cdigo por um nmero limitado de vezes. A sintaxe de sua declarao
um pouco confusa para quem nunca programou em Java, C ou PHP, mas bem simples. Ela
composta de 3 elementos separados por ponto-e-vrgula.
O primeiro elemento a criao e atribuio de valor iniciar a uma varivel que servir de contador.
O segundo elemento a condio que precisa ser verdadeira para o lao continuar rodando.
O terceiro elemento o comando de incremento da varivel.
public class prog {
public static void main (String[]args) {
for (int x = 0; x<10; x++) {
System.out.println("Estou rodando pela " + x + " vez!");
}
}
}
O resultado ser:
Estou rodando pela 0 vez!
Estou rodando pela 1 vez!
Estou rodando pela 2 vez!
Estou rodando pela 3 vez!
Estou rodando pela 4 vez!
Estou rodando pela 5 vez!
Estou rodando pela 6 vez!
Estou rodando pela 7 vez!
Estou rodando pela 8 vez!
Estou rodando pela 9 vez!
WHILE
A instruo WHILE simplesmente a imposio de uma condio para que o lao continue a repetir-se
por um nmero infinito de vezes at que aquela condio no seja mais cumprida. Trata-se de algo bem
mais simples do que o FOR.
Vamos pegar como exemplo o seguinte: eu vou ficar perguntando ao usurio, pedindo que ele digite um
nmero. Ele vai ficar digitando nmeros at o momento em que ele digitar um 9, que o nmero de
SAIR DO SISTEMA, porque eu vou definir isso no WHILE.
public class prog {
public static void main (String[]args) {
int x = 0;
while (x != 9) {
// Aqui dentro vai ter uma rotina para o usurio digitar um nmero
}
}
}
Eu no coloquei o cdigo responsvel pela interao do usurio porque ele contm muitos comandos
que ns no vimos ainda e isso iria embaralhar a cabea dos leitores.
WWW.FABIOSALVADOR.COM.BR - Pgina 18
Fbio Burch Salvador
Estruturas condicionais
IF
O uso da instruo IF nos permite fazer algumas escolhas, o que bem interessante. Estruturas
condicionais equivalem instruo SE do Portugus Estruturado que voc deve ter visto em Lgica da
Programao.
Um IF funciona de forma simples. Eu coloco dentro de parnteses a condio que deve ser verdadeira
para que eu execute o cdigo que est dentro do bloco IF.
Um exemplo de cdigo que, executando, no satisfar condio do IF e portanto no far nada:
public class prog {
public static void main (String[]args) {
int x = 5;
if (x == 4) {
System.out.println("Se esta linha aparecer, algo muito errado foi digitado!");
}
}
}
ELSE
O Else significa seno, e usado em um IF para dar comandos que acontecero caso a condio do
IF no seja atendida.
No programa de exemplo, eu coloquei o valor FALSE em uma varivel boolean que determina se um
sujeito viado ou no. Se ele for, uma mensagem exibida. SENO, outra dizendo Muy Macho
aparecer.
public class prog {
public static void main (String[]args) { TRUE ou
boolean viado = false;
if (viado == true) { FALSE, eis a
System.out.println("Ah, viado!");
} questo!
else {
System.out.println("HUm, muy macho!");
}
}
}
Pgina 19 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
ELSE IF
O Else If usado para colocarmos uma alternativa dirigida dentro de uma estrutura condicional. o
caso, por exemplo, do seguinte sistema:
Eu vou cadastrar ali, em uma String, que tipo de poltico um determinado deputado . Vou ter vrias
opes listadas com ELSEIF, e finalmente, no finalzinho, um ELSE para servir caso a opo marcada
seja Nenhuma das Anteriores.
public class prog {
public static void main (String[]args) {
String falcatrua = "Dossi";
if (falcatrua == "Mensalo") {
System.out.println("Esse do Mensalo!");
}
else if (falcatrua == "Dossi") {
System.out.println("Esse da turma do Dossi!");
}
else if (falcatrua == "Bolsa-Esmola") {
System.out.println("Esse Populisto!");
}
else {
System.out.println ("Ainda no descobriram o que o cara faz");
}
}
}
SWITCH
O SWITCH um comando usado para descobrir dentre vrias opes o que deve acontecer. Um
exemplo:
// Antes, o programa pergunta ao usurio qual opo, entre 1 e 3, ele quer ver.
Int x = // A escolha do usurio
Switch (x) {
case 1:
System.out.println(Voc escolheu 1);
break;
case 2:
System.out.println(Voc escolheu 2);
break;
case 3:
System.out.println(Voc escolheu 3);
break;
default:
System.out.println(Nenhuma das anteriores);
}
Onde os Breaks fazem a execuo parar e o programa passa a executar o que vem imediatamente
aps o Switch. J o Default o que acontece se nenhuma das opes vlidas for escolhida.
WWW.FABIOSALVADOR.COM.BR - Pgina 20
Fbio Burch Salvador
Pgina 21 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Veja que eu criei uma classe principal que tem o mtodo MAIN este que ser rodado como mtodo
principal do programa.
O que que eu fao primeiro? Eu crio uma varivel X que vai receber um objeto do tipo PESSOA.
Depois, eu atribuo varivel X um objeto PESSOA. Bom. Mas como eu disse que, ao criar um objeto, o
programa rodar tambm seu mtodo construtor, eu j passei no prprio ato de criao do objeto os
parmetros que vo preencher as variveis N e I do mtodo construtor de PESSOA passando o nome
e a idade do sujeito.
Depois disso, eu criei uma varivel texto que String, e fiz ela receber o RETORNO de dados
fornecido pelo mtodo DADOS() do objeto X, que uma Pessoa. O retorno foi aquela frase Joo tem
25 anos. Em seguida, mandei mostrar a varivel TEXTO na tela com o comando System.out.println.
Ento, a frase apareceu na tela.
S que em seguida, eu mandei o X fazer aniversrio. Ento, Joo agora tem 26 anos e no mais 25.
Depois disso, mandei exibir os dados novamente.
O resultado ser o seguinte:
Este meu cdigo ficou meio longo. Eu poderia encurt-lo, fazendo o seguinte:
pessoa x;
x = new pessoa("Joo", 25);
Esta frase s faz sentido se notarmos que ela resulta da justaposio de trs instrues.
PESSOA X Cria a varivel X, para guardar objeto do tipo PESSOA.
X = NEW PESSOA Cria um objeto PESSOA dentro da varivel X.
PESSOA (Joo, 25) Roda o mtodo PESSOA, de dentro da classe PESSOA, especificando dados.
Eu poderia nem usar a String TEXTO, colocando diretamente o retorno do mtodo DADOS para ser
exibido na tela.
System.out.println(x.dados());
WWW.FABIOSALVADOR.COM.BR - Pgina 22
Fbio Burch Salvador
Herana
Herana uma coisa que ocorre em linguagens orientadas a objeto como o Java. Ns podemos criar
uma classe que como um filhote de outra, e que herda todos os seus atributos e mtodos, podendo
ento ter seus prprios mtodos e atributos que apenas servem para somar aos que foram herdados.
Vamos ver um exemplo. Eu vou criar uma classe chamada Veiculo, que ter duas sub-classes:
Tanque e Carro.
public class veiculo {
String modelo;
int ano_fabricacao;
String estado_funcionamento;
veiculo (String m, int a) {
this.modelo = m;
this.ano_fabricacao = a;
this.estado_funcionamento = "Perfeito";
}
void levar_tiro() {
this.estado_funcionamento = "Estragado";
}
}
Agora, d uma olhada nesta classe Carro. Ela EXTENDS a classe Veculo. Isso quer dizer que ela
herda tudo atributos e mtodos da sua superclasse (veculos). Um Carro um tipo de veculo
especfico.
Aps herdar as caractersticas de veculo, a Carro ainda adiciona um atributo a mais, o categoria,
usado para dizer se de luxo, se popular, etc. Ento, um Carro tem tudo o que um Veculo tem: ano,
modelo, estado de funcionamento, e... CATEGORIA!
D tambm uma olhada no mtodo construtor desta classe. Ela tem um comando SUPER este
comando faz com que o objeto, pertencente subclasse, rode o mtodo construtor da superclasse ou
seja, que rode o mtodo construtor de Veculo. Depois de o mtodo da superclasse atribuir nome, ano
de fabricao e estado de funcionamento ao Carro, o mtodo da prpria subclasse atribui a ele uma
Pgina 23 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Categoria. E da temos um carro completo!
Isso acontece porque quando criamos um Carro, estamos criando um Veculo ao mesmo tempo. Mas
no em dois objetos diferentes, e sim em um s. Se Carro uma subclasse de Veculo, e se X um
Carro, ento ao mesmo tempo X um Veculo.
como dizer que temos uma superclasse Pessoas e uma subclasse Programador. Se eu digo que Joo
um Programador, por extenso ele uma Pessoa.
Depois, para continuar nosso exemplo, eu vou criar uma outra subclasse de veculo, e esta ser
chamada de Tanque, para produzir tanques de guerra.
public class Tanque extends veiculo{
int calibre_canhao;
Tanque (String m, int a, int cal){
super(m, a);
this.calibre_canhao = cal;
}
void levar_tiro() {
this.estado_funcionamento = "Meio avariado";
System.out.println (Haha! Otrio! Nem doeu!);
}
}
Aqui, eu fiz quase o mesmo que tinha feito na classe Carro. A classe Tanque extends Veculo, e por
isso tem um Modelo, um Ano_fabricacao e um Estado_funcionamento. Eu adicionei mais um atributo,
que o Calibre_canhao, usado para guardar a informao sobre a arma de ataque que o tanque de
guerra possui.
Note que a outra subclasse de Veculo, a classe Carro, no possui um calibre de canho. E que a
prpria superclasse Veculo no possui um calibre tambm. Isso um dado especfico, que s os
tanques de guerra possuem.
Eu fiz um mtodo construtor, assim como havia feito na classe Carro.
S que depois disso eu fiz algo novo. Eu criei um mtodo chamado levar_tiro, mudando sua funo
ele agora no deixa o carro totalmente estragado. Apenas muda o estado de funcionamento do Tanque
de Perfeito para Meio avariado, e ainda exibe uma mensagem tirando sarro da cara do inimigo.
Bom. Agora, eu tenho o dilema: todo Veculo, ao ser atingido, fica Estragado. Mas o Tanque diz que
ele s fica Meio Avariado.
Isso o que chamamos de sobreposio de mtodos, uma das caractersticas principais da Herana.
Eu tenho uma superclasse Veculo que determina que todo veculo atingido por uma bala fica
estragado. Mas, na subclasse Tanque, eu especifico outra coisa. O mtodo da subclasse sobrepe o da
superclasse.
Ento, se eu criar agora as subclasses Moto, Trator e Barco, todas elas herdando diretamente de
Veculo, ento ns teremos Carros, Motos, Tratores e Barcos que, ao serem atingidos por um tiro,
ficaro Estragados. Mas teremos Tanques que, atingidos, ficam apenas Meio avariados.
como dizer que no Brasil h uma superclasse Pessoa, e que ela possui um mtodo aposentar-se.
Todas as subclasses da classe Pessoa herdam este mtodo sem sobrep-lo. A no ser a subclasse
Poltico, que sobrepe este mtodo e tem um clculo completamente diferente de aposentadoria do
resto das pessoas.
WWW.FABIOSALVADOR.COM.BR - Pgina 24
Fbio Burch Salvador
Polimorfismo
O fenmeno conhecido como Polimorfismo assim: quando eu crio uma classe e depois crio diversas
sub-classes para ela, eu estou na verdade criando tipos especficos da coisa que representada pela
superclasse.
Ento, por exemplo, eu crio a classe Pessoa, e depois as sub-classes Milico e Poltico, que so tipos
especficos de pessoas.
O caso que, depois, eu posso criar uma varivel X que declarada como sendo do tipo genrico
Pessoa, e X capaz de receber um milico ou um poltico (tanto faz), da a palavra Polimorfismo (Poli =
Muitos e Morfos = Forma).
Isso parece bastante intil primeira vista. Mas torna-se til no momento em que eu crio um vetor
declarado como sendo de Pessoas e ento preencho as posies dele com milicos, polticos ou
quaisquer objetos de qualquer sub-classe de Pessoa.
abstract class pessoa {
int idade;
String nome;
pessoa (int i, String n) {
this.idade = i;
this.nome = n;
}
abstract void mostrar();
}
class milico extends pessoa {
String patente;
milico (int i, String n, String p) {
super(i,n);
this.patente = p;
}
void mostrar () {
System.out.println(nome + " um " + patente + " cuja idade " + idade + " anos.");
}
}
class politico extends pessoa {
String partido;
politico (int i, String n, String p) {
super(i,n);
this.partido = p;
}
void mostrar () {
System.out.println(nome + " um poltico de " + idade + " anos de idade, filiado ao " + partido);
}
}
class prog {
public static void main(String[]args) {
pessoa[]m = new pessoa[3];
m[0] = new milico (23, "Juca", "Cabo");
m[1] = new politico (31, "Joao", "PMDB");
m[2] = new milico (56, "Fernandinho", "PTB");
m[0].mostrar();
m[1].mostrar();
m[2].mostrar();
}
}
Pgina 25 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Modificadores
Modificadores so argumentos que so colocados antes do nome no ato de criao de mtodos ou
variveis, dando a estes mtodos ou variveis caractersticas especiais, mudando seu escopo de
atuao ou impedindo-os de fazer algum tipo de coisa que ns precisamos ter certeza de que no
acontecer.
Vejamos ento os principais modificadores que existem na linguagem Java.
Static
Quando criamos uma classe, e queremos ativar seus mtodos ou pegar o valor de um atributo a partir
de outra classe, precisamos instanciar a primeira classe. Porque a classe em si no tem mtodos
funcionais e nem valor nos atributos. O objeto criado a partir desta classe que os tem.
Mas se o atributo ou o mtodo recebe o modificador static, ento este atributo ou mtodo passa a ser
ligado diretamente classe, no aos seus objetos.
Com isso, eu posso muito bem executar um mtodo static sem criar objeto algum da classe onde ele foi
escrito, bastando para isso colocar a forma nomedaclasse.nomedometodo().
Uma outra coisa que ocorre que, se eu crio a classe carro, com o atributo static cor, e eu mudo a
cor de um carro, o mesmo valor no mesmo atributo ocorre em todos os outros carros. Assim, se eu
deixar o carro que est na varivel X com a cor azul, todos os outros carros, Y, Z, ou qualquer outro,
ficaro azuis.
Public
Um atributo ou mtodo PUBLIC pode ser acessado e visto a partir de qualquer classe, de qualquer
ponto do programa, abertamente, atravs da frmula NomeDoObjeto.NomeDoAtributo ou ento
NomeDoObjeto.NomeDoMtodo(argumentos).
Private
Um mtodo que PRIVATE no poder ser acessado atravs de nenhuma outra classe a no ser os
objetos daquela classe na qual foi criado. Assim, se eu crio o mtodo PRIVATE ACELERAR, dentro da
classe Carro, eu no posso simplesmente criar o objeto Carro X e querer usar X.ACELERAR(). Eu
precisarei de outro mtodo, dentro de Carro, que ative ACELERAR por dentro.
Existem tambm atributos PRIVATE, e variveis tambm. Estes, s podem ser acessados por dentro da
classe ou mtodo onde foram criados, e servem para guardar valores de uso exclusivo naquele escopo.
Os mtodos ou atributos PRIVATE no so vistos por ningum de fora da classe de origem, nem
mesmo pelas sub-classes.
Final
O modificador Final, utilizado em alguns objetos, mtodos e variveis, faz com que estes no possam
ser reutilizados ou sobrescritos por subclasses no futuro (ou seja, mais adiante no cdigo). Algumas
funcionalidades, como as do ActionListener, s podem ser associadas a um componente qualquer (no
caso do ActionListener, botes e menus), quando existe a certeza absoluta de que estes componentes
no iro mudar ou evaporar-se por ao do programador em algum momento do cdigo. Por isso,
exige-se o uso do modificador final nestes componentes.
WWW.FABIOSALVADOR.COM.BR - Pgina 26
Fbio Burch Salvador
Protected
O Protected funciona como uma espcie de PRIVATE, mas sem ser to radical. Os atributos ou
mtodos daquilo que PROTECTED s sero enxergados por classes que estejam no mesmo pacote
(package). Um pequeno exemplo:
Pgina 27 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Pacotes
O uso de PACKAGES (pacotes) tem como funo organizar as classes criadas em Java de forma muito
semelhante ao que fazemos com os Mdulos no Modula. Mas para quem s conhece Java, aqui vo as
utilizaes deste mecanismo:
1 Criar um JAR
Pode-se criar um JAR com apenas as classes que esto no mesmo pacote, e isso especialmente fcil
de fazer no Eclipse. Com isso, podemos disponibilizar nossos programas em pacotes para o usurio
baixar apenas alguns. Ou ento, disponibilizar nossas classes prontas como um pacote.
Esta ltima utilidade a mais legal de todas. Porque se eu criar um package chamado utilidades, e
dentro dele colocar classes com funes variadas, outro programador poder apenas anexar meu
pacote JAR ao seu projeto e utilizar a frmula IMPORT para puxar uma de minhas classes.
Como que ele anexa meu JAR ao seu programa? Usando o comando Build Path, do Eclipse, que
veremos mais adiante e no vem ao caso agora.
Digamos que ele queira importar a classe apetrechos, ele executar:
import utilidades.apetrechos;
import utilidades.*;
WWW.FABIOSALVADOR.COM.BR - Pgina 28
Fbio Burch Salvador
class errada {
public static void main (String[]args) {
int[]x = new int[4];
for (int c = 0; c<10; c++) {
try {
x[c] = c;
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println (e);
}
finally {
System.out.println ("Terminou um ciclo.");
}
}
}
}
Pgina 29 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Throw informado os erros classe que instanciou o objeto
A palavra Throw em ingls significa jogar, atirar alguma coisa. E Throws, o verbo arremessar atribudo
como se fosse na frase Ele joga a pedra longe. Utiliza-se isso para jogar o erro para cima, fazendo-
o atingir a rotina que chamou o procedimento errado, no a prpria rotina onde ocorre o erro.
Para que tudo fique mais claro, imagine a seguinte situao: Eu acabo de criar um programa que tem
uma classe centralizando todo o trabalho lgico e os menus. E criei uma pequena classe que no faz
nada, a no ser abrir um banco de dados.
Eu vou reutilizar a classe que abre banco de dados em todos os meus programas, para manter o
padro. Mas as mensagens de erro devem ser emitidas pela classe principal do programa, para que
cada programa possa ter suas prprias mensagens.
Eu, ento, fao como? Simples: a classe que abre banco de dados no vai tratar os erros que
ocorrerem. Ela vai simplesmente arremessar esses erros para cima, deixando nas mos da classe
principal o tratamento do erro. E ela que trate-o como quiser.
A declarao do THROWS vai na classe onde o erro pode ocorrer, obrigando a classe que est acima
a tratar o erro com um TRY e um CATCH.
class errada2 {
void rodar() throws ArrayIndexOutOfBoundsException {
int[]x = new int[4];
for (int c = 0; c<10; c++) {
x[c] = c;
}
}
}
class progerrado {
public static void main (String[]args) {
errada2 x = new errada2();
try {
x.rodar();
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Deu um erro");
}
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 30
Fbio Burch Salvador
Tipos de Excesso
Nos nossos exemplos acima, temos apenas um tipo de erro, o ArrayIndexOutOfBoundsException, que
bastante comum e familiar (e fcil de entender o vetor est recebendo dados que esto alm do seu
tamanho). Mas temos inmeros outros tipos de erro possveis, o IOException, o SQLException, e por a
vai.
Se ns realmente no sabemos que tipo de erro uma determinada rotina poder apresentar, podemos
ter duas grandes certezas:
1) Estamos em apuros;
2) Precisamos tratar o erro mesmo assim.
Pensando no ponto nmero 2 da lista, usamos o tipo de erro Exception, que a superclasse de todas
as que falam sobre erros possveis, provveis ou imaginveis em Java.
Assim: catch (Exception e) {
Pgina 31 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
import java.io.*;
class escritor {
public static void main(String[]args) {
try {
FileWriter gravador = new FileWriter("arquivo.txt");
A primeira coisa que fazemos instanciar a classe FileWriter, e declarar um nome de arquivo para o
objeto dela (no caso, o gravador, com o arquivo arquivo.txt). Com isso, o programa cria um novo
arquivo com o nome especificado. Eu poderia ter especificado um local (o nome de arquivo como uma
URL), mas no o fiz, portanto, o arquivo surgir na prpria pasta onde roda o programa.
A segunda coisa crier o BufferedWriter. Esta pequena maravilha, evoluo de quase tudo o que havia
anteriormente sobre leitura e gravao, nos permite gravar textos inteiros no arquivo aberto pelo
FileWriter. Antigamente, usava-se escrever caracter por caracter, mas no com o Buffered.
Os trs comandos acima fazem o trabalho de graver um texto no arquivo aberto. Os sada.write
escrevem texto em uma espcie de fila de gravao, daquilo que ir para o arquivo assim que eu
executar o comando FLUSH, alis, mostrado na ltima das trs linhas.
Alguns podero perguntar: por qu ele usou o a expresso \n no final da primeira linha? Este sinal,
chamado de caracter de escape (o que meio bizarro, pois na verdade so dois caracteres) equivale
ao sinal de nova linha. isso o que fica no arquivo quando algum usa o ENTER em um programa
WWW.FABIOSALVADOR.COM.BR - Pgina 32
Fbio Burch Salvador
como, por exemplo, o EDIT do DOS ou os editores de texto mais simples para Windows.
}
catch(IOException e) {
System.out.println("No deu para escrever o arquivo");
}
}
}
import java.io.*;
class leitor {
public static void main(String[]args) {
try {
FileReader gravador = new FileReader("arquivo.txt");
O File Reader a classe que faz a leitura de arquivo, uma espcie de irm da FileWriter, que vimos h
pouco.
String linha;
while ((linha = entrada.readLine())!=null) {
Aqui, vemos um momento de maior complexidade no programa (mas no muita). Vamos observar a
condio contida neste WHILE: eu tenho uma operao, que o linha = entrada.readLine(), no qual eu
digo que a varivel linha recebe uma linha do texto do arquivo que est aberto em entrada a cada
vez que esta rotina for rodada, o programa vai ler uma nova linha. Como eu usei um WHILE, ele vai
percorrer o arquivo da primeira ltima linha.
Depois, eu peo que o clico se repita enquanto o resultado desta operao no for NULL a operao
em si retorna um valor que sempre positivo, mas quando no d mais para ler o arquivo (porque ele
chegou ao fim), retorna NULL, encerrando o clico do WHILE.
System.out.println(linha);
}
}
catch(IOException e) {
System.out.println("No deu para ler o arquivo");
}
}
}
Pgina 33 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Tokenizer (caracteres separadores)
Para podermos criar uma espcie de banco de dados no arquivo-texto, precisamos de separadores
para distinguir os dados entre si. Para isso, usamos a classe StringTokenizer, com a qual determinamos
um token (que pode ser uma vrgula, um ponto, dois caracteres, o que eu quiser) e este token vai
separar os campos de dados.
No caso, imaginemos que eu criei um arquivo-texto (no Bloco de Notas) contendo apenas o seguinte
texto:
Vodka; Russia; Forte
Canha; Brasil; Forte
Vinho; Egito; Medio
Cerveja; Sumeria; Fraca
O nome do arquivo arquivo.txt. Agora, vou fazer um programinha que l estes dados e os exibe na
tela:
import java.io.*;
import java.util.*;
class leitor {
public static void main(String[]args) {
try {
FileReader gravador = new FileReader("arquivo.txt");
BufferedReader entrada = new BufferedReader(gravador);
String linha;
while ((linha = entrada.readLine())!=null) {
At aqui, eu operei apenas com o que j vimos anteriormente: um Reader e nada mais.
Agora, eu estou pegando a linha de texto que havia sido capturada na varivel linha e estou
quebrando ela em pedaos, usando o ponto-e-vrgula como sinal de quebra. Logo abaixo, eu vou usar o
mtodo nextToken() para fazer o meu sistema percorrer todos os tokens que existem nesta linha de
texto.
WWW.FABIOSALVADOR.COM.BR - Pgina 34
Fbio Burch Salvador
Mtodos da classe StringTokenizer:
boolean hasMoreTokens() // retorna true se existe mais tokens
String nextToken() // retorna prximo token; lana um NoSuchElementException se no houver mais
tokens.
String nextToken(String delim) // o novo grupo de delimitador usado
int countTokens() // retorna o nmero de tokens
Pgina 35 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
try {
InputStream arq = new FileInputStream("aha.wav");
Depois, vem a novidade: abrir um
AudioStream som = new AudioStream(arq); objeto da classe AudioStream
usando o arquivo.
}
catch(Exception e) {
System.out.println(Deu pau);
}
}
}
Uma outra grande jogada deste sistema que possvel tocar dois sons ao mesmo tempo. Basta criar
dois objetos do tipo InputStream e dois AudioStream. Com isso, podemos colocar uma msica e uma
batida de fundo para tocarem juntas.
Ou ainda, criar:
WWW.FABIOSALVADOR.COM.BR - Pgina 36
Fbio Burch Salvador
Um conjunto de InputStream e AudioStream com uma msica ambiente.
Um conjunto de InputStream e AudioStream com o barulho de espadas se batendo.
Um conjunto de InputStream e AudioStream com o grito de um monstro.
Um conjunto de InputStream e AudioStream com o som de uma flecha voando.
E no final, criar um jogo de RPG com msica de fundo, espadas e flechas que fazem barulho, e
monstros que rosnam.
Ou ainda...
Pode animar o trabalho da Contabilidade, que muito montono, fazendo o primeiro sistema contbil
Ou melhor ainda...
Faa uma juno de msicas e coloque uma banda impensvel para tocar: por qu escolher? Bote
Pgina 37 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
A classe Console
Bom. Pessoal, eu sei que est ficando difcil de programar em Java, no modo texto, sem ter como
digitar nada na tela.
Ento, eu tenho aqui uma classe que ns sempre usamos dentro dos projetos e que se chama Console.
Ela tem uns mtodos estticos que lidam com possibilidades de erro e tudo mais, permitindo uma
integrao bem legal do teclado com um programa.
/**
An easy interface to read numbers and strings from
standard input
@version 1.10 10 Mar 1997
@author Cay Horstmann
*/
/**
read a string from the console. The string is
terminated by a newline
WWW.FABIOSALVADOR.COM.BR - Pgina 38
Fbio Burch Salvador
public static int readInt(String prompt)
{ while(true)
{ printPrompt(prompt);
try
{ return Integer.valueOf
(readLine().trim()).intValue();
} catch(NumberFormatException e)
{ System.out.println
("Not an integer. Please try again!");
}
}
}
Para usar esta classe no seu cdigo, fcil. Basta adicion-la ao seu projeto e ento usar seus
mtodos para carregar variveis.
Exemplos:
Sendo que o argumento passado o prompt que o usurio v. Usando este mtodo, seu programa em
modo texto vai parar neste ponto, aguardando a digitao por parte do usurio.
De forma semelhante, use os mtodos:
double x = Console.readDouble();
int x = Console.readInt();
E por a vai.
Pgina 39 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Sobrepondo mtodos uma tcnica essencial
Uma das coisas fundamentais sobre Java que tudo o que existe na linguagem, ou quase tudo, so
classes das quais criamos mtodos. No existe, portanto, nenhuma sada para quem no sabe
trabalhar com classes.
Uma das coisas mais legais que h no Java que ns podemos pegar uma classe que existe com
certos mtodos, e podemos criar objetos que no obedecem a estes mtodos mas os sobrepe, no
criando uma nova classe com a modificao, e sim criando um objeto que tem a modificao em si.
Eu vou dar um exemplo, Vou criar uma classe Pessoa que s vai possuir um mtodo, para fins de
exemplo.
class Pessoa {
void gritar() {
System.out.println(Socorro!);
}
}
Agora, eu vou criar uma classe principal que vai criar uma Pessoa e ento pedir que ela grite.
class prog {
public static void main(String[]args) {
Pessoa P1 = new Pessoa();
P1.gritar();
}
}
A pessoa P1 vai gritar Socorro!, e at a morreu Neves, porque ns j vimos isso antes. Mas agora eu
vou criar uma segunda pessoa, que ter seu prprio mtodo gritar(), diferente do padro das outras
pessoas.
class prog {
public static void main(String[]args) {
Pessoa P1 = new Pessoa();
P1.gritar();
Pessoa P2 = new Pessoa () {
void gritar() {
System.out.println("Shoryuken!");
}
};
P2.gritar();
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 40
Fbio Burch Salvador
SEUS PROBLEMAS
ACABARAM!
Vamos trabalhar agora a interface grfica do
seu programa em Java! Leia as prximas
pginas e sua vida ser iluminada!
O mtodo SetBounds trabalha com a localizao e tamanho da tela, sendo a seguinte ordem: distncia
do canto esquerdo da tela, distncia do topo da tela, largula e altura.
Pgina 41 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
tela.getContentPane().setBackground(Color.RED);
Aqui, invocamos o mtodo que verifica qual o campo de Content do JFrame, ou seja, a regio onde
no est o menu nem as bordas, e muda sua cor a partir do mtodo set Background. Eu usei uma
biblioteca de cores, a Color, e defini a janela como vermelha; Poderia ter usado azul, cinza, verde, etc.
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Aqui, eu determino qual a ao a executar quando este JFrame for fechado. No caso, ele fecha o
programa todo, num efeito de BREAK. A instruo DISPOSE_ON_CLOSE apenas levar o JFrame a
fechar sem derrubar o programa todo.
tela.setLayout(null);
Aqui, escolhi um Layout para o meu JFrame. Ou melhor, escolhi que seja nenhum. Existem Layouts
prontos para JFrames, onde os botes ficam dispostos em forma de fileira, ou nos cantos, ou
expandidos. A maioria tem um resultado grotesco. Se quisermos desenhar nossa tela com liberdade
para faz-la bonita, temos que escolher o NULL;
tela.setVisible(true);
Depois de preparado, o JFrame pode j ficar visvel. Este passo vem no final de toda a sua montagem.
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 42
Fbio Burch Salvador
JLabel
um pequeno componente com o qual colocamos pedaos de texto sem nenhuma funo, a no ser a
de indicar para qu servem os campos de uma tela qualquer.
import javax.swing.*;
import java.awt.*;
class classetela {
public static void main (String[]args) {
JFrame tela = new JFrame("Primeira tela");
JLabel texto = new JLabel("Frase indicativa");
tela.setBounds(100,100,600,400);
tela.getContentPane().setBackground(Color.RED);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
texto.setBounds(100,100,200,30);
tela.setLayout(null);
tela.add(texto);
tela.setVisible(true);
}
}
O cdigo acima no apresenta grandes novidades. Apenas instanciamos o JLabel, dando-lhe um texto
qualquer para exibir. Depois, demos o mesmo setBounds nele, e em seguida fizemos a ao realmente
revolucionria:
tela.add(texto);
Adicionamos o objeto texto ao objeto tela. Note que o setBounds do texto passa a usar como
bordas as bordas do JFrame. E fica contido nele.
O JLabel pode ter desenhos por dentro, mas veremos isso mais adiante, quando tratarmos do Icon,
outro tipo de objeto Java.
Pgina 43 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
JButton
O JButton , finalmente, o boto. Colocamos ele nas telas com inmeras funes. Estas funes sero
tratadas mais adiante, quando chegarmos s aulas sobre Eventos. Por enquanto, basta-nos desenhar
os botes.
O JButton poder ser instanciado de trs formas diferentes:
JButton() aqui, teremos depois que rodar um mtodo setText(algum texto) para dar-lhe um contedo
(um contedo que aparece para o usurio).
JButton(String) aqui, escrevemos algum texto para aparecer no boto e o usurio saber do que se
trata.
JButton(icon) neste caso, adicionamos uma figura ao boto para dar-lhe uma aparncia
personalizada.
Veja este cdigo:
import javax.swing.*;
import java.awt.*;
class classetela {
public static void main (String[]args) {
JFrame tela = new JFrame("Primeira tela");
JLabel texto = new JLabel("Frase indicativa");
tela.setBounds(100,100,600,400);
tela.getContentPane().setBackground(Color.YELLOW);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
texto.setBounds(100,100,200,30);
tela.setLayout(null);
tela.add(texto);
tela.setVisible(true);
}
}
No exemplo acima, eu usei praticamente a mesma tela criada antes, mas adicionei as rotinas de criao
de um boto. Primeiro, instanciei a classe, e usei os mtodos j conhecidos setBounds e
setBackground.
Em seguida, usei o setForeground, com o qual determino a cor da letra do texto do boto. E logo
abaixo, determinei o texto da ToolTipText, ou seja, o texto que aparece na caixinha amarela de ajuda
quando passamos o mouse sobre o boto.
Na seqncia, apenas usei o ADD para colocar o boto na tela e dei a tradicional ordem para que ela
ficasse visvel.
WWW.FABIOSALVADOR.COM.BR - Pgina 44
Fbio Burch Salvador
JTextField
O JTextField uma caixa utilizada para que o usurio possa escrever um texto de uma linha s. Trata-
se de um componente bastante simples, que tem basicamente as mesmas especificaes dos que
acabamos de ver: setBounds, setBackground, setForeground, e o ADD da tela sobre ele.
Um exemplo do cdigo anterior, enriquecido com um JTextField:
import javax.swing.*;
import java.awt.*;
class classetela {
public static void main (String[]args) {
JFrame tela = new JFrame("Primeira tela");
JLabel texto = new JLabel("Frase indicativa");
tela.setBounds(100,100,600,400);
tela.getContentPane().setBackground(Color.YELLOW);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
texto.setBounds(100,100,200,30);
tela.setLayout(null);
tela.add(texto);
tela.setVisible(true);
}
}
O tratamento do texto de um JTextField dar-se- por meio de dois mtodos bastante simples:
getText() servir para capturar o qu o usurio digitou no campo.
setText() servir para determinarmos que texto deve ir no campo. Muito til quando se abre um
registro de um banco de dados e o campo JTextField deve receber um campo de registro para
alterao.
Pgina 45 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
JFormattedTextField
So campos parecidos com a JTextField - o usurio pode escrever dentro normalmente. S que agora o
nmero de caracteres digitveis limitado, pode-se limitar o tipo de catacter digitado, e pode-se fazer o
campo j esperar com alguns sinais prontos. isso o que se usa nos campos onde uma pessoa deve
digitar seu CPF e a caixinha de texto j vem com os pontos e o trao, por exemplo. Vamos ver como se
faz, bem fcil.
package Componentes;
import java.awt.event.*;
import javax.swing.*;
try{
txtCPF = new JFormattedTextField(new MaskFormatter("###.###.###-##"));
txtData = new JFormattedTextField(new MaskFormatter("##/##/####"));
txtCNPJ = new JFormattedTextField(new MaskFormatter("###.###.###/####-##"));
}
catch (Exception erro){
JOptionPane.showMessageDialog(null,"Essa porcaria deu problema");
}
Este programa comea normalmente com a criao da JFrame e tudo mais. E ele termina normalmente.
Na verdade, seria mais um programa banal, desses que desenvolvemos todos os dias, no fosse pelo
fato de eu ter adicionado uns objeto novos tela. Esses objetos novos so como JTextFields. S que
com uma mscara.
A mscara, no caso um MakFormatter, um objeto de uma classe criada apenas com o fim de
associar-se a JFormattedTextFields e formar um campo com parmetros para digitao.
No caso, o formato da Dat, por exemplo, j mostrar a TextField com as barras. J os sinais de
sustenido ficaro em branco, aguardando que o usurio digite nmeros - EU DISSE NMEROS! NO
LETRAS!
Se voc quiser que o usurio possa digitar o que quiser em uma determinada posio, basta colocar um
asterisco ao invs do sustenido.
Assim como a JTextField, sua variante Formatted precis ser adicionada tela. Ento, vamos acabar
logo esse programa.
tela.add(txtCPF);
tela.add(txtData);
tela.add(txtCNPJ);
tela.setLayout(null);
tela.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
tela.setVisible(true);
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 46
Fbio Burch Salvador
JToggleButton
uma variao bem bsica do JButton. Trata-se de um boto que, uma vez pressionado, fica
afundado, demonstrando que tal opo est selecionada ou que tal funcionalidade est ativada.
import javax.swing.*;
import java.awt.*;
class classetela {
public static void main (String[]args) {
JFrame tela = new JFrame("Primeira tela");
JLabel texto = new JLabel("Frase indicativa");
tela.setBounds(100,100,600,400);
tela.getContentPane().setBackground(Color.YELLOW);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
texto.setBounds(100,100,200,30);
tela.setLayout(null);
tela.add(texto);
tela.setVisible(true);
}
}
O uso do JToggleButton torna-se possvel por causa do mtodo isSelected(), que retorna True ou False
e nos diz se o boto est afundado ou no.
Pgina 47 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Icon
A classe Icon tem um uso bastante simples, mas muito importante. Com ela, podemos carregar uma
imagem (devidamente criada em um arquivo JPG ou PNG), para dentro do programa, utilizando esta
imagem como quisermos. O comando para isso bastante simples. Basta instanciar a classe Icon
criando uma ImageIcon que carregar o arquivo, cujo nome ou localizao completa
Comando assim:
Icon imagem = new ImageIcon(arquivo.jpg);
Existe ainda uma funcionalidade que muita gente desconhece: O formato de imagem PNG, que capaz
de armazenar instrues sobre transparncias, quando lido, acaba numa imagem com transparncias,
pois o Java consegue respeitar bem estes parmetros.
Depois de carregarmos uma imagem para dentro de uma varivel, podemos atribu-la a uma srie de
objetos atravs do mtodo setIcon.
Exemplos:
JButton botao = new JButton();
boto.setIcon(imagem);
Um detalhe importante a notar que, quando atribumos o Icon a um JButton, o boto ganha o desenho
mas permanece com o aspecto de boto, mudando a cor da borda quando colocamos o mouse sobre
ele.
J quando atribumos o Icon a uma JLabel, a imagem fica parecendo solta no ar entro da tela. E a, a
transparncia tem realmente sua funo efetiva, uma vez que o fundo atrs da JLabel aparece
plenamente.
possvel fazer botes redondos, triangulares ou com qualquer forma, usando JLabel, simplesmente
desenhando o boto, colocando em uma JLabel e, na funo do boto, incluir um comando para mudar
o Icon da JLabel, trocando-o por uma figura do mesmo boto, mas com aparncia de pressionado.
WWW.FABIOSALVADOR.COM.BR - Pgina 48
Fbio Burch Salvador
JOptionPane
JOptionPane o componente que cria as famosas caixinhas de mensagem para o usurio. Com ele,
possvel fazer no apenas mensagens na tela mas tambm pedir dados, dar opes (do tipo Ok,
Cancel), e fazer algumas outras operaes.
Uma das facilidades de se usar o JOptionPane que seus mtodos so estticos (static), ento nem
precisamos criar um objeto para executar nada. Usamos a classe, direto.
Um exemplo bem simples:
import javax.swing.*;
import java.awt.*;
class optiones {
public static void main(String[]args) {
JOptionPane.showMessageDialog(null, "Uma mensagem!", "Titulo", JOptionPane.ERROR_MESSAGE);
}
}
No exemplo acima, chamamos o mtodo showMessageDialog, que mostra apenas uma mensagem
simples com um boto de OK embaixo. Os argumentos utilizados so:
NULL, colocado num campo onde devemos informar o objeto pai do JOptionPane. Este objeto pai
(parent) ficar congelado embaixo da caixa de mensagem at que o usurio clique no OK.
J o segundo argumento, fcil de entender, a mensagem em si, uma String sem grande mistrio.
O terceiro o ttulo da caixa de mensagem, aquele que vai no alto da caixa em sua barra superior, ao
lado do boto de Fechar.
O ltimo argumento o tipo de mensagem que queremos exibir. Conforme o tipo, aparecer um cone
ao lado do nosso texto.
Pgina 49 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Tipos de mensagem:
JOptionPane.ERROR_MESSAGE Mensagem de Erro, do tipo com o X na bolinha
vermelha. Usando em caso de erros,
normalmente, tratamento de excees.
JOptionPane.INFORMATION_MESSAGE Usado em mensagens do tipo Help, aparece
com um pequeno I tpico de placa da
informaes.
JOptionPane.WARNING_MESSAGE Mensagens de aviso. Aparece um tringulo
com um ponto de exclamao dentro.
JOptionPane.QUESTION_MESSAGE Vem com um ponto de interrogao.
JOptionPane.PLAIN_MESSAGE Aqui, no tem nada desenhado. Usado para
casos nos quais queremos uma mensagem s
com texto.
WWW.FABIOSALVADOR.COM.BR - Pgina 50
Fbio Burch Salvador
showConfirmDialog
Muito utilizado para operaes do tipo confirme ou cancele o que acabou de pedir, o melhor remdio
contra usurios desavisados que clicam nas opes da tela a esmo.
import javax.swing.*;
import java.awt.*;
class optiones {
public static void main(String[]args) {
int opcao = JOptionPane.showConfirmDialog(null, "Voc quer mesmo ler minha mensagem?", "Pergunta besta",
JOptionPane.YES_NO_CANCEL_OPTION);
if (opcao == JOptionPane.OK_OPTION) {
JOptionPane.showMessageDialog(null, "Voc escolheu ler a mensagem!", "Parabns!",
JOptionPane.INFORMATION_MESSAGE);
}
}
}
}
Pgina 51 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
showOptionDialog
Este mtodo , sem sombra de dvidas, o mais legal de todos da coleo JOptionPane. Com ele,
podemos fazer nossos prprios botes, em nmero indeterminado.
import javax.swing.*;
import java.awt.*;
class optiones {
public static void main(String[]args) {
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 52
Fbio Burch Salvador
showInputDialog
Este mtodo simplssimo. Ele exibe na tela uma
caixinha de mensagem com um campo de texto
para o usurio colocar alguma coisa. Esta texto
ser carregado em uma String, que deve ser logo
colocada como varivel para a qual vamos atribuir
o resultado.
Um cdigo de exemplo:
import javax.swing.*;
import java.awt.*;
class optiones {
public static void main(String[]args) {
}
}
Este cdigo simplssimo apenas pega o nome do usurio e depois o exibe como o otrio do ano, numa
premiao de mrito duvidoso.
Pgina 53 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
JMenuBar, JMenu e JMenuItem
Estas classes so utilizadas sempre em conjunto, para criar um menu na parte superior do JFrame, e
deixar seu software com aquela facilidade de uso que os usurios modernos exigem.
Aqui, comeamos a trabalhar uma modalidade de programao que costumo chamar informalmente de
empilhamento de objetos, pois os objetos s funcionam quando colocamos um dentro do outro em
uma espcie de pirmide.
O objeto que serve de base o JMenuBar, adicionado diretamente ao JFrame, e sobre ele vo todas as
coisas. Ele a barra clara no alto do JFrame, dentro da qual os menus ficaro. Depois, temos os
JMenu, que ficam dentro da MenuBar e podem, inclusive, ficar um dentro do outro. Dentro dos JMenu,
ficam os JMenuItem, que tm uma funo cada um. Para ativar suas funes, utilizaremos os Listeners,
mais adiante. Deixemos isso para outro captulo.
import java.awt.*;
import javax.swing.*;
class menus {
public static void main(String[]args) {
JFrame tela = new JFrame();
tela.setBounds(100,100,800,600);
menuarquivo.add(itemnovo);
menuarquivo.add(itemsalvar);
menuhelp.add(itemajuda);
menuhelp.add(itemsobre);
menudentro.add(itempanico);
menudentro.add(itemterror);
menuzao.add(menuarquivo);
menuzao.add(menuhelp);
menuarquivo.add(menudentro);
tela.setJMenuBar(menuzao);
tela.setVisible(true);
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 54
Fbio Burch Salvador
JCheckBox
Uma JCheckBox um daqueles componentes em que vemos uma caixinha quadrada com uma frase ao
lado, e podemos marcar ou desmarcar a caixinha quadrada. As CheckBoxes no so usadas para fazer
escolhas com apenas uma opo vlida, podendo ser todas marcadas ou todas desmarcadas
livremente, desde que o programador no coloque restries no prprio cdigo.
import java.awt.event.*;
import javax.swing.*;
public class checa { Nesta parte inicial nada de novo:
public static void main(String[]args) { criamos um JFrame comum para
JFrame tela = new JFrame("Checks!"); receber os novos componentes.
tela.setBounds(10,10,800,600);
tela.setLayout(null);
Depois, para termos um retorno do valor de cada JCheckBox, utilizamos o mtodo isSelected(), que
retorna um valor boolean. Assim:
boolean x = pizza.isSelected();
Ou ainda:
If (pizza.isSelected()) {
- Funes a serem executadas.
}
Na pgina seguinte, temos um cdigo de exemplo sobre como utilizar a CheckBox e ter seu retorno
atravs de um boto ao qual foi adicionado um ActionListener.
Voc vai ver ActionListeners ao longo dos nossos exemplos, ento, para no ficar confuso demais, por
favor d uma lida no captulo que se chama Eventos (Listeners).
Pgina 55 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Exemplo de cdigo com uma JCheckBox retornando valor
import java.awt.event.*;
import javax.swing.*;
Voltamos a proceder com a criao da tela e
public class radio { dos JCheckBoxes como no exemplo anterior.
public static void main(String[]args) {
JFrame tela = new JFrame("Checks!");
tela.setBounds(10,10,800,600);
tela.setLayout(null);p
WWW.FABIOSALVADOR.COM.BR - Pgina 56
Fbio Burch Salvador
JRadioButton
O JRadioButton funciona apenas quando pensamos nele inserido em um grupo. Eu posso colocar
quantas opes quiser, formando um menu, e se todos os meus JRadioButtons estiverem no mesmo
grupo, o usurio s poder marcar um deles. Ao marcar um, os outros perdem a marcao.
import java.awt.event.*;
Eu comeo como quem no quer nada: criando
import javax.swing.*;
um JFrame sem nenhuma novidade. Nenhuma,
mesmo.
public class radio {
public static void main(String[]args) {
JFrame tela = new JFrame("Radios!"); Logo depois, instancio os JRadioButton, j
tela.setBounds(10,10,800,600); determinando seu texto de apresentao.
tela.setLayout(null); Abaixo, uso o tradicional setBounds para
posicionar e dimensionar cada um deles.
JRadioButton designer = new JRadioButton("Eu sou WebDesigner!");
JRadioButton programador = new JRadioButton("Eu sou programador Java!");
designer.setBounds(20,20,250,35);
programador.setBounds(20,60,250,35); Mais abaixo, vem a verdadeira novidade: eu sou
obrigado a criar um ButtonGroup para que os
ButtonGroup grupo = new ButtonGroup(); JRadioButtons saibam que so irmos e
grupo.add(designer); comportem-se como tal, tendo sempre somente
grupo.add(programador); um deles selecionado.
Este ButtonGroup tem fins apenas lgicos, e no
tela.add(designer); grficos. Portanto, eu ainda preciso dar um ADD
tela.add(programador); em cada boto para dentro da tela.
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setVisible(true);
}
Na prxima pgina, teremos um exemplo de como funciona o retorno dos valores (novamente, assim
como o JCheckBox, o JRadioButton retorna um BOOLEAN atravs do mtodo isSelected()).
Pgina 57 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Exemplo funcional de uso do JRadioButton
import java.awt.event.*;
Nesta primeira parte, eu fao tudo o que fiz
no exemplo anterior: criar a tela e criar os
import javax.swing.*;
JRadioButtons. S que eu usei o mtodo
setSelected para dizer que a opo
public class radio {
public static void main(String[]args) { programador j vem marcada como TRUE
JFrame tela = new JFrame("Radios!"); desde o comeo, ficando como opo
tela.setBounds(10,10,800,600); default.
tela.setLayout(null);
}
});
tela.add(botao);
tela.add(designer);
tela.add(programador);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setVisible(true);
}
WWW.FABIOSALVADOR.COM.BR - Pgina 58
Fbio Burch Salvador
JComboBox
A JComboBox desenha uma caixinha parecida com a JTextField, s que ao invs de termos um texto a
escrever, temos uma seta com a qual abrimos uma fileira de possibilidades de preenchimento para a
caixa.
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
tela.setLayout(null);
tela.add(comb);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setVisible(true);
Para obter o retorno das informaes, temos uma srie de mtodos que nos dizem o que, afinal, o
usurio escolheu. Os mais usados so os seguintes:
comb.getSelectedItem()
Este retorna o texto que est na caixa do Combo. Poder ser usado especialmente para quando
colocamos o setEditable em TRUE, ou seja, quando o usurio pode escrever na caixa. O retorno deste
mtodo uma String, com o texto da caixa.
comb.getSelectedIndex();
Este mtodo retorna o ndice do item selecionado (como se as opes fossem um vetor). Caso o
usurio possa escrever algo na caixa de texto, e escreva alguma coisa que no consta das opes
fornecidas, ento o ndice que retorna o -1. Portanto, s use se o setEditable for FALSE.
Pgina 59 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
JTabbedPane
Este componente utilizado para criarmos um daqueles menus separados em abas, as quais podem
ser alternadas na parte superior da tela.
Uma TabbedPane funciona de maneira bem simples: primeiro, criamos nossas JTextFields, JLabels,
Combos, Radios, Checks e o que mais quisermos. Depois, colocamos tudo isso dentro de JPanels.
Em seguida, dizemos ao Java que cada JPanel uma das abas da JTabbedPane.
import javax.swing.*; No incio, nada de novo: criamos os objetos e s. Mas
note que o argumento da criao da JTabbedPane
import java.awt.*; JTabbedPane.TOP no meu tabbed de exemplo,
teremos os nomes das abas no topo. Pode-se usar
public class table { ainda LEFT, RIGHT e BOTTOM.
public static void main(String[]args) {
JFrame tela = new JFrame("Telex");
JTabbedPane tabs = new JTabbedPane(JTabbedPane.TOP);
tela.setBounds(100,100,800,600);
tabs.setBounds(10,10,770,550);
Depois de criar os JPanels, inserimos eles
JPanel painel1 = new JPanel(); com o mtodo ADD da JTabbedPane,
painel1.setBackground(Color.RED); especificando qual a palavra que os
representar no menu das abas.
JPanel painel2 = new JPanel();
painel2.setBackground(Color.BLUE);
tabs.add("Primeiro",painel1);
tabs.add("Segundo",painel2);
tela.add(tabs);
tela.setLayout(null);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setVisible(true);
}
}
possvel iniciar o programa com uma aba especfica j selecionada, atravs do mtodo:
tabs.setSelectedIndex(X) onde X o ndice da tab que queremos ver selecionada os ndices
atribuem-se por ordem de adio das abas JTabbedPane, comportando-se como um vetor.
possvel tambm atribuir cones s Tabs, usando o mtodo:
tabs.seiIconAt(I) onde I um objeto do tipo Icon, j com uma imagem carregada.
WWW.FABIOSALVADOR.COM.BR - Pgina 60
Fbio Burch Salvador
JScrollPane
Uma JScrollPane apenas um objeto que, associado a outras coisas (caixas de texto, tabelas, etc.)
confere-lhes o poder de ter uma barra de Scroll.
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class scroler {
Este programa em si no
public static void main(String[]args) {
tem quase nada de novo:
criamos uma JFrame, um
JTextField tex = new JTextField();
JTextField, e damos
tex.setBounds(0,0,300,700);
setBounds em tudo.
JFrame tela = new JFrame();
tela.setBounds(0,0,800,600);
A nica novidade que criamos um
JScrollPane scrots = new JScrollPane(tex); JScrollPane associado JTextField. E
scrots.setBounds(100,100,300,300); depois o colocamos na tela. Note que a
JTextField vai parar dentro do JScrollPane.
tela.add(scrots); Tente agora escrever um texto longo na
caixa de texto e veja o que acontece.
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setLayout(null);
tela.setVisible(true);
}
}
Pgina 61 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
JTables
As tabelas que usamos para exibir dados no Java so o componente mais complexo que temos na rea
da interface grfica.
Em primeiro lugar, uma tabela serve para demonstrar os dados de uma forma esttica, sendo depois
muito difcil de mudar seus dados durante a execuo do programa. Por isso, usamos um modelo
(DefaultTableModel), que malevel, e atribumos JTable este modelo depois de modificarmos seus
dados.
O exemplo abaixo um cdigo no qual nossa tabela no tem barras de rolagem. Se tivermos mais
dados do que espao para exibi-los no espao da tabela, no veremos os de baixo.
import java.awt.*;
public class tabelas {
public static void main(String[]args) {
JFrame tela = new JFrame("Tabelas");
tela.setBounds(0,0,1024,768);
Aqui, eu crio a JTable e dou-lhe
JTable tabela = new JTable(); uma dimenso, adicionando-a
tabela.setBounds(10,10,200,400); tela logo em seguida.
tela.add(tabela);
WWW.FABIOSALVADOR.COM.BR - Pgina 62
Fbio Burch Salvador
O prximo passo consiste em carregar este vetor objetos
objetos[0] = "Z das Couves";
no caso, com Strings. Em seguida, uso o mtodo
objetos[1] = "1000";
addRows do DefaultTableModel para adicionar o vetor
modelo.addRow(objetos);
objetos como uma linha de dados no modelo de tabela.
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setLayout(null);
tela.setVisible(true); O resto apenas a perfumaria de sempre: tirar o
Layout, especificar o DefaultCloreOperation, e dar um
} setVisible na tela.
}
Depois, eu posso conseguir o retorno de dados da tabela, por exemplo, quando o usurio clicar duas
vezes na minha tabela. Para isso, bastaria adicionar aps o tela.setVisible(true) um MouseListener
A instruo acima a nica novidade deste cdigo: temos um mtodo chamado getSelectedRow,
que vai descobrir qual o ndice da linha selecionada. Depois, temos o mtodo tabela.getValueAt,
no qual passamos como argumento uma coordenada parecida com as que usvamos para as
matrizes. Assim, no caso, eu coloquei o nmero da linha, vrgula, o ndice da coluna (zero e um,
porque s temos essas duas).
Pgina 63 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
});
JTables e a interao com outros objetos - Uma JTable o objeto perfeito para associar a um
JScrollPane.Tambm podemos criar JTables carregadas com imagens.
WWW.FABIOSALVADOR.COM.BR - Pgina 64
Fbio Burch Salvador
JFileChooser
O JFileChooser o componente que nos exibe uma caixinha para selecionar um arquivo no sistema de
pastas do Windows ou do Linux (ou, de seja l o que estivermos usando).
import javax.swing.*;
import sun.audio.*;
import com.sun.java.util.*;
import java.awt.*;
import java.awt.Event.*; criao de objetos, no caso, do JFrame
import java.io.*; e do JFileChooser.
public class filechus {
public static void main(String[]args) {
try {
InputStream arq = new FileInputStream(nomearquivo);
AudioStream som = new AudioStream(arq);
AudioPlayer.player.start(som);
O resto do cdigo no faz parte realmente
System.out.println("Tocando");
do JFileChooser trata-se do cdigo j
}
visto para tocar msica. O usurio dever
catch(Exception e) {
selecionar um arquivo WAV para tocar.
System.out.println("Deu merda");
}
O resto do cdigo so nossos conhecidos
comandos de exibir o JFrame (quando o
JFrame for fechado, o programa cair fora
do ar e a msica cessar).
}
tela.setBounds(10,10,800,600);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setVisible(true);
}
}
Pgina 65 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Mtodos de retorno de dados mais usados do JFileChooser:
WWW.FABIOSALVADOR.COM.BR - Pgina 66
Fbio Burch Salvador
JInternalFrame
Finalmente, estamos chegando ao ponto no qual podemos criar uma aplicao funcional. Agora,
criaremos as famosas telinhas internas do programa. Voc j deve ter observado que, quando usamos
o Microsoft Word, por exemplo, o programa em si tem uma grande tela com uma rea dentro da qual
fica apenas o JFrame com o texto que estamos trabalhando.
Aqui, faremos isso e no nada muito complicado. A lgica a seguinte: primeiro, precisamos ter um
JDesktopPane, que uma rea, dentro de uma grande JFrame. Dentro desta JDesktopPane, teremos
nossas JInternalFrame, que nada mais so do que pequenas telas internas.
import javax.swing.*;
import sun.audio.*;
import com.sun.java.util.*; Comeamos o programa como sempre: imports e criao da
import java.awt.*; JFrame. Mas note que eu instanciei a classe JDesktopPane.
import java.awt.Event.*; Ela servir apenas para fazer a acomodao dos
import java.awt.event.*; JInternalFrame dentro da JFrame maior.
import java.io.*;
public class filechus {
public static void main(String[]args) {
final JInternalFrame telinha1 = new JInternalFrame("Tela Interna 1", true, true, true, true);
final JInternalFrame telinha2 = new JInternalFrame("Tela Interna 2", true, true, true, true);
telinha1.setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
telinha2.setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
Pgina 67 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
JMenuItem t1= new JMenuItem ("Tela 1");
JMenuItem t2 = new JMenuItem ("Tela 2");
JMenuBar barra = new JMenuBar();
JMenu menu = new JMenu("Opes");
t1.addActionListener(new ActionListener() {
Aqui, eu simplesmente adicionei
public void actionPerformed(ActionEvent e) {
ActionListeners aos meus itens de
telinha1.show();
menu. A ao de cada um deles
}
simplesmente ativar o mtodo
});
show() de uma das telinhas, o que
as far ficar visveis.
t2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
telinha2.show();
}
});
Agora, aqui importante notar como as coisas so
estruturadas umas dentro das outras. Eu tenho minhas
JInternalFrames (telinha e telinha2) presas dentro de um
deska.add(telinha1);
JDesktopPane (deska). E o JDesktopPane preso dentro da
deska.add(telinha2);
JFrame (tela).
tela.add(deska);
As instrues que vm logo em seguida so antigas para ns:
a insero da JMenuBar dentro da JFrame, e as instrues
tela.setJMenuBar(barra);
finais de exibio da tela.
tela.setBounds(10,10,800,600);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setVisible(true);
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 68
Fbio Burch Salvador
Tree
Vamos ver agora um componente que d um certo estilo a qualquer projeto. Trata-
se do Tree. Com ele, podemos criar aqueles menus em que as opes ficam umas
dentro das outras e vo se abrindo medida que o usurio clica nelas.
A aplicao de um Tree segue um esquema parecido com o das Jtables ns temos
uma modelagem toda feita em um objeto que no visvel, e no final temos a encarnao deste
modelo em um objeto que passvel de adio na tela.
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
tela.setLayout(null);
tela.setVisible(true);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Depois de adicionar todos os ns filhotes, a varivel child torna-se intil. Mas a varivel nos
agora guarda o n que tem a palavra Opes e mais todos os sub-ns adicionados no processo
que rodamos no FOR. Assim, temos o menu completinho.
Pgina 69 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Eventos (Listeners)
ActionListener
Hoje, vamos ver algo muito interessante: o ActionListener. Trata-se de uma classe que detecta se
houve uma ao no objeto a que ela est associada (um boto, por exemplo), e que, dependendo da
ao executada, rodar uma funo qualquer. Vejamos um exemplo de cdigo usando o ActionListener:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class mongol {
public static void main(String[]args) {
JFrame tela = new JFrame("Teste");
JButton botao = new JButton("Aperte aqui");
tela.setBounds(10,10,600,400);
botao.setBounds(100,100,150,35);
A declarao acima um mtodo, o mesmo que citamos antes. O argumento dele um evento ocorrido
que fica em uma lista de eventos possveis determinados pelo usurio, como veremos mais adiante.
if ("botao1".equals(e.getActionCommand())) {
Aqui, a coisa simples: caso o ActionCommand do evento e seja igual a botao1, uma caixa com
uma mensagem aparecer na tela.
}
};
Quando alteramos um mtodo da classe no momento de sua instanciao, terminamos com chaves e
ponto-e-vrgula; Agora, vem o final, montar a tela e colocar este ActionListener para funcionar.
botao.setActionCommand("botao1");
botao.addActionListener(ac);
Acima, eu determinei qual o ActionCommand do boto (no caso botao1), e depois adicionei o
ActionListener ao boto, fazendo com que ele passe a detectar quando o usurio clica no boto,
acionando o mtodo ActionPerformed.
tela.setLayout(null);
tela.add(botao);
tela.setVisible(true);
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 70
Fbio Burch Salvador
FocusListener
O FocusListener se parece com o ActionListener em seu modo de construo, mas serve para detectar
quando o foco (ou seja, o cursor, a seleo, no o ponteiro do mouse) est sobre um objeto ou no.
Ele possui dois mtodos que precisam ser implementados: o focusGained e o focusLost, um para
quando o objeto ganha foco e outro para quando perde.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class mongol {
public static void main(String[]args) {
final JFrame tela = new JFrame("Teste");
final JTextField tex = new JTextField();
final JTextField tex2 = new JTextField();
tela.setBounds(20,20,800,600);
tex.setBounds(50,50,300,35);
tex2.setBounds(50,150,300,35);
Pgina 71 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
KeyEvent
O KeyEvent serve para que eu possa coordenar as aes do usurio com o teclado quando ele est
escrevendo em algum espao ou utilizando alguma funo. Posso atribuir KeyListener a qualquer objeto
grfico do Java QUALQUER! e detectar o que, afinal, o meu usurio est apertando no teclado.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
Acima, defini a ao do mtodo keyPressed, ou seja, quando o usurio enfia o dedo no boto.
public void keyReleased(KeyEvent e) {
tex.setBackground(Color.BLACK);
tex.setForeground(Color.YELLOW);
}
Acima, defini a ao a executar para quando o usurio tira o dedo do boto que havia pressionado.
public void keyTyped(KeyEvent e) {
JOptionPane.showMessageDialog(null, "Typou rapaz", "Obviedades",
JOptionPane.INFORMATION_MESSAGE);
}
O mtodo keyTyped funciona quando o aperto da tecla faz efeito. Isso quer dizer que se eu botar o
dedo numa letra do teclado, e no tirar mais, e esta letra ficar se repetindo, o evento keyTyped tambm
ficar.
};
tex.addKeyListener(key);
tela.setLayout(null);
tela.add(tex);
tela.add(tex2);
tela.setVisible(true);
}
}
NOTA: Pode-se detectar qual o boto apertado pelo usurio explorando a varivel KeyEvent e, que
retornar o cdigo da tecla apertada.
WWW.FABIOSALVADOR.COM.BR - Pgina 72
Fbio Burch Salvador
MouseListener
O MouseListener, como seu nome obviamente revela, serve para tratarmos eventos relacionados ao
uso do mouse.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
No mtodo acima, o mouseClicked, ou detecto que o usurio deu um ou mais cliques no meu
componente que possui o MouseListener. Bom. Uma vez definido que isto ocorre, eu resolvi dificultar
um pouco as coisas, colocando em prtica o mtodo getClickCount, que detecta quantas clicadas
rpidas o usurio deu sobre o objeto. Com isso, posso definir aes para o clique, o duplo clique, o
triplo clique, at o milhonsimo clique (os usurios que ficariam cansados, mas tudo bem).
public void mouseEntered(MouseEvent e) {
tex.setText("O mouse entrou!");
}
O mtodo mouseEntered ocorre quando o mouse adentra, quando o ponteiro passar por cima.
public void mouseExited(MouseEvent e) {
tex.setText("O mouse saiu!");
}
Pgina 73 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
public void mouseReleased(MouseEvent e) {
tex.setBackground(Color.WHITE);
}
};
tex.addMouseListener(mickey);
tela.setLayout(null);
tela.add(tex);
tela.add(tex2);
tela.setVisible(true);
}
}
WWW.FABIOSALVADOR.COM.BR - Pgina 74
Fbio Burch Salvador
Converso de dados
Pgina 75 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Fazendo uma JFrame sumir, morrer e derrubar o programa
J estudamos a JFrame em diversos exemplos, mas vale a pena dar uma olhada na relao que existe
entre o setDefaultCloseOperation e os modos de fechamento da JFrame.
Existem trs formas de uma JFrame desaparecer da tela:
HIDE Apenas esconde a JFrame, mas o objeto continua na memria, podendo ser recuperada a
qualquer momento pelo mtodo SHOW (tela.hide() e tela.show()).
DISPOSE O objeto JFrame destrudo completamente. Para faz-lo reaparecer na tela, preciso
usar o NEW e criar um objeto novo, re-declarar a varivel, e tudo mais. Este o mtodo mais utilizado
para operar com JInternalFrames, onde utilizar-se- a sintaxe tela.dispose().
EXIT Na verdade, no uma operao associada JFrame, e sim, uma ordem de fechamento do
programa inteiro.
Ringo no minimiza!
MATA!
Ordenando a uma JFrame que abra em modo
maximizado
Existe um mtodo, o setExtendedState, no qual podemos colocar como valor MAXIMIZED_BOTH, o
que nos trar a JFrame maximizada. Se for um JInternalFrame, ele vir maximizado dentro do
JDesktopPane ao qual pertence.
Sintaxe:
tela.setExtendedState(JFrame.MAXIMIZED_BOTH);
Existe uma grande diferena entre maximizar e simplesmente descobrir o tamanho da tela,
redimensionando o JFrame para o tamanho da tela. Quando usamos redimensionamento com
setBounds ou setSize, o programa continua tendo o boto de MAXIMIZAR, o que no acontece com o
caso explicado acima.
WWW.FABIOSALVADOR.COM.BR - Pgina 76
Fbio Burch Salvador
Redimensionando imagens para caberem dentro da JLabel
Para realizar esta tarefa, vamos explorar mais a fundo a classe ImageIcon, que at agora utilizamos
apenas de forma secundria, para carregar arquivos dentro de Icons, conforme todos devem j ter
testado algumas vezes. Esta classe possui uma funo bem interessante, na qual as imagens podem
ser lidas e redimensionadas (na tela, no no seu respectivo arquivo JPG ou PNG, claro).
Pgina 77 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Colocando uma imagem de plano de fundo dentro do JDesktopPane
Na verdade, colocar uma imagem de fundo no JDesktopPane igualzinho a colocar uma imagem em
qualquer lugar: usamos o JLabel, e colocamos ele dentro do JDesktopPane. Porm, ficam no ar
algumas questes, como o dimensionamento desta JLabel. Ora, acabamos de ver comandos que
descobrem a largura da tela, comandos de converso de dados em tipos diferentes, comandos de
redimensionamento de imagem. Chegou a hora de usar tudo isso ao mesmo tempo.
Um cdigo de exemplo:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
abreinterna.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JInternalFrame interna = new JInternalFrame("Tela menor", true, true, true, true);
interna.setBounds(10,10,400,400);
interna.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
deska.add(interna);
interna.setVisible(true); Dentro do ActionListener, eu coloquei toda a
}}); rotina de criao da JInternalFrame.
Inclusive, note que seu mtodo ao fechar o
DISPOSE_ON_CLOSE. Ou seja, a telinha
opcoes.add(abreinterna); interna ser criada para uso, e destruda
barra.add(opcoes); (liberando memria) quando no se quiser
tela.setJMenuBar(barra); usar.
tela.getContentPane().add(deska);
WWW.FABIOSALVADOR.COM.BR - Pgina 78
Fbio Burch Salvador
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setExtendedState(JFrame.MAXIMIZED_BOTH);
tela.setVisible(true);
} Os comandos finais so a adio do JDesktopPane dentro da tela,
} e os tradicionais comandos que colocam a tela no ar. Ou seja,
nosso habitual final de cdigo de todos os exemplos. S que aqui a
tela abre maximizada.
Pgina 79 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Ateno!
No passe deste ponto sem ler algum material sobre SQL!
NO PROSSIGA!
Eu avisei! Os incrdulos iro pagar!!!! h h h ha!!
WWW.FABIOSALVADOR.COM.BR - Pgina 80
Fbio Burch Salvador
Pgina 81 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Depois, escolha as Fontes de Dados (ODBC).
Depois, v ao boto Adicionar e escolha o tipo de base de dados. No caso, eu escolho neste exemplo
a do Access.
Da, aparecer a caixinha abaixo. Voc precisar encontrar o arquivo do banco de dados Access, que
WWW.FABIOSALVADOR.COM.BR - Pgina 82
Fbio Burch Salvador
voc gravou ao cria-lo. Para isso, use o boto Selecionar e v navegando pelas pastas at achar seu
arquivo.
No campo Descrio, escreva um nome (um Alias) para o seu banco de dados. Nada muito
complicado. Opte por nomes curtos. Coisas como bd_compras ou algo assim.
O uso de ODBC para conectar base de dados serve para a maior parte dos SGBD (Sistemas
Gerenciadores de Banco de Dados) existentes na face da Terra. Voc pode implementar nos seus
clientes se quiser. S que h outras maneiras de ligar um Banco de Dados a um programa.
Em seguida, voc dever criar sua aplicao Java com interao com o Banco de Dados. Vamos em
frente ento.
Pgina 83 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Criando a aplicao integrada
Eu vou comear construindo uma classe bem simples cuja nica funo criar uma conexo com o
banco de dados, que ser armazenada no objeto CON, que recebeu este nome por preferncia minha
(ele poderia se chamar CONECTA, CHUMBINHO ou MARIOLA, tanto faz).
import java.sql.*;
public class conecta{
static Connection con;
static void getConexao () {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e) {
System.out.println("Classe do driver nao encontrada:");
System.out.println(e.getMessage());
System.exit(1);
}
try {
String url = "jdbc:odbc:dbase";
con = DriverManager.getConnection(url, "username", "senha");
} catch (SQLException e) {
// TODO Auto-generated catch block
}
}
}
Aqui, dei incio ao meu mtodo getConexao, que recebeu este nome tambm de forma casual o
mtodo que conecta pode ter qualquer nome. Aqui, usei um comando que talvez seja novidade para
alguns: o Class.forName. O Java tem dessas: aqui eu mando ele tentar achar essa classe pelo nome
dela e carregar. Na hora que eu fiz isso, comecei a ter acesso a umas coisas novas, como o
DriverManager, associada a esse driver que eu acabei de carregar (no caso, o JDBC-ODBC).
interessante notar que, quando usamos a classe SUN.JDBC.ODBC, dificilmente teremos como resposta
um erro de ausncia da classe, a no ser que o usurio esteja usando uma JRE do tempo das Grandes
Navegaes. S que esta verificao ser ainda muito til, quando importarmos uma classe que faz, por
exemplo, o trabalho de conexo do Java com uma base de dados MySQL esta classe dever ser
anexada ao projeto, de modo que pode ou no estar disponvel e se no estiver, gerar um erro,
visto logo no Catch.
catch(ClassNotFoundException e) {
System.out.println("Classe do driver nao encontrada!");
WWW.FABIOSALVADOR.COM.BR - Pgina 84
Fbio Burch Salvador
System.exit(1);
}
Bom, aqui eu tratei o erro, caso o programa no ache a classe a partir do forName. O negcio aqui
derrubar o programa. No caso dos programas que fazemos na prtica, do dia a dia das empresas, a
idia nunca ser derrubar o programa, e sim avisar ao usurio que deu algum problema e mand-lo
entrar em contato com o fabricante.
Um erro desses jamais acontece em condies normais, porque a classe que tem o driver sempre ser
compactada dentro do JAR junto com o programa. Se o usurio tiver esta surpresa desagradvel, de o
programa no achar a classe, ento o software no deveria nem ter sado da fase de testes, porque o
defeito vem desde a mesa do desenvolvedor e por alguma razo jamais foi detectado.
try {
String url = "jdbc:odbc:banco";
con = DriverManager.getConnection(url, "username", "senha");
Agora, olhem que legal: a classe DriverManager tem um mtodo que o getConnection, e ele retorna
uma conexo com banco de dados no uma String ou coisa assim, mas a conexo. E joga ela para a
varivel CON, que j uma Connection. Notem que eu usei ali trs argumentos: COM, USERNAME e
SENHA. O Con necessariamente sempre uma Connection que j tenha uma conexo a banco de
dados guardada. J no lugar de USERNAME e SENHA, colocamos o nome de usurio e a senha para
aquela determinada base de dados.
} catch (SQLException e) {
// TODO Auto-generated catch block
}
}
}
Depois, tem o Catch do carregamento da conexo. Aqui, no tem segredo se o banco falhar, ele tem
que fazer alguma coisa. Eu no coloquei nada, deixei s o cdigo que o Eclipse gera. Mas vocs vo
colocar uma mensagem de erro ou coisa assim. Erros de conexo a banco de dados normalmente
ocorrem por queda da rede (caso o BD fique em um servidor) ou porque algum ser quase humano, de
inteligncia rara e formidvel, desligou o servidor. Ou ainda porque a filha do dono da empresa resolveu
limpar o servidor, removendo os vrus e acabou com a base de dados.
Pgina 85 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Consultando o Banco de Dados
Para carregar os dados, voc vai precisar usar o Connection em associao com um Statement, que
um tipo de ordem para a Connection retornar alguma coisa.
Depois de mandar a classe CONECTA rodar seu mtodo getConexao, eu fao assim:
Statement comandoSQL = conecta.con.createStatement();
Aqui, criei o Statement chamado comandoSQL ligado conexo CON da classe CONECTA.
Lembrando que estes nomes no so fixos, e eu poderia ter usado outro nome de objeto ao invs de
COM ELKEMARAVILHA, por exemplo. A classe Conecta tambm, poderia chamar-se CHURROS e
no faria a menor diferena.
String sql = Select * from tabela;;
ResultSet resultado = comandoSQL.executeQuery(sql);
Aqui, logo depois de criar o Statement, eu crio uma String armazenando um comando SQL qualquer.
Depois, eu crio uma varivel do tipo RESULTSET, que como um vetor de dados tipo OBJECT, e que
armazena os dados que retornam uma consulta SQL qualquer chamada pelo mtodo executeQuery. Ele
recebe como argumento uma String onde h o comando SQL. Eu bem poderia escrever a String ali
mesmo, dentro do argumento do ResultSet, mas decidi fazer isso antes porque fica mais fcil de
entender o cdigo mais tarde, quando eu fizer manuteno no sistema.
modelo.setRowCount(0);
while(resultado.next()){
Object[] objetos = new Object[3];
for(int i = 0; i < 3; i++) {
objetos[i] = resultado3.getObject(i+2);
}
modelo.addRow(objetos);
}
Bom, aqui eu usei os dados da tabela para carregar um DefaultTableModel, como ns j vimos l na
parte das JTables. No caso, o comando resultado.next faz rodar uma linha do ResultSet, e cada linha
dessas um pequeno vetor com os campos do registro. Da saiu a idia de usar um FOR e tudo mais.
Mas essa coisa de carregar um vetor de Objects e atirar para dentro do TableModel matria velha.
Ns tambm j vimos como se faz a leitura linha a linha de uma base de dados quando trabalhamos
com o BufferedReader, naquela parte da matria na qual escrevemos e lemos arquivos-texto.
WWW.FABIOSALVADOR.COM.BR - Pgina 86
Fbio Burch Salvador
Gravando no BD (Insert e Update)
Para gravar e dar um update ou um delete no banco de dados, enfim, para fazer qualquer coisa que no
seja um Select, ns fazemos assim: Comeamos por criar uma String com o comando SQL desejado.
String sql = "insert into pessoas values (" + codigo + ", '" + name + "', " + idade + ", '" + salario +"');";
T, nenhuma novidade.
Aqui temos as novidades do momento: Ns criamos o Statement igualzinho ao da consulta, mas depois,
ao invs de darmos um executeQuery, damos um executeUpdate, o que no significa que utilizamos
isso apenas para dar UPDATE, mas tambm INSERT e tudo o mais que eu j expliquei antes. A idia
aqui que ele vai executar, mas no vai retornar um ResultSet, tanto que o retorno disso um INT
esse INT nos diz quantas linhas foram afetadas pela nossa instruo. Ou seja, se retornar 0, podes crer
que quase sinnimo de erro. Ele vai retornar alguma coisa, isso certo. Da temos que tratar o retorno
de alguma forma.
Viram? No tem muito segredo. Colocar o banco de dados em MySQL exige umas pequenas mudanas
e a importao de umas classes diferentes, mas nada alm disso. Vejamos a seguir como se faz:
Pgina 87 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Java + MySQL
A primeira coisa que devemos fazer um download: vamos baixar o MySQL Connector/J, um
pequeno arquivo JAR com tudo o que precisamos. Ele faz uma converso do protocolo usado pelo
JDBC do Java para o de rede usado pelo MySQL.
Preste muita ateno porque voc poder incorporar Bancos de Dados Oracle, SQLServer, ou qualquer
outro que aparea por a usando o mesmo caminho. Cada empresa que desenvolve um banco de
dados prprio automaticamente cria um JAR com o conector para Java, para que os desenvolvedores
Java possam usar seus produtos. Ento, fique tranqilo!
O endereo para download : http://dev.mysql.com/downloads/connector/j/ - Este endereo poder
mudar no futuro. Caso isso acontea, recorra ao Google mesmo.
Depois de baixar o componente para
alguma pasta qualquer. Eu vou ao meu
projeto e clico nele com o boto direito.
Ento, escolho a opo Build Path e
ento entro em Add External Archive.
Ento, atravs do sistema de pastas do
Windows, ache o arquivo JAR do
Connector. Ele ser adicionado ao
Path do programa. Mais tarde veremos
como se faz para compilar o conector
MySQL junto com o JAR todo.
Veja como fica o projeto com o JAR
adicionado:
WWW.FABIOSALVADOR.COM.BR - Pgina 88
Fbio Burch Salvador
A aplicao Java com MySQL integrado
import java.awt.event.*;
import java.sql.*; Nesta parte inicial eu estou criando uma
import javax.swing.*; aplicao normal como j conhecemos h
muito tempo, com um boto que ativa o
public class teleca { mtodo conector() antes de fechar o
static Connection con; programa. A nica novidade so os imports
public static void main(String[]args) { novos e a instanciao da classe
final JFrame tela = new JFrame(); Connection. Mas isso j vimos no exemplo
tela.setBounds(10,10,600,400); anterior.
JButton botao = new JButton("Aperte");
botao.setBounds(10,10,170,30);
botao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, "Opa! Pidi-pra-par-parou!");
conector();
tela.dispose();
}
});
tela.add(botao);
tela.setLayout(null);
tela.setVisible(true);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
A primeira parte o uso do
forName que ns j usamos antes,
static void conector () { para colocar em operao a classe
try { que lida com o MySQL e a JDBC
Class.forName("com.mysql.jdbc.Driver"); veja que eu mudei essa linha em
} relao aplicao com ODBC.
catch(ClassNotFoundException err) {
System.out.println("Classe do driver nao encontrada:");
System.out.println(err.getMessage());
System.exit(1);
}
A seguir, eu vou construir um mtodo que realmente abre a base de dados e faz alguma coisa com ela:
A primeira coisa carregar alguma coisa para a Connection que aqui tem o nome de
con. Eu vou passar como parmetros uma URL formada pelo IP do servidor, barra,
nome da base de dados. E vou passar o username e a senha.
try {
String url = "jdbc:mysql://192.168.86.25/fabio";
con = DriverManager.getConnection(url, "root", "churros");
Pgina 89 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
String sql = "Select nome from personagens;";
ResultSet resultado = comandoSQL.executeQuery(sql);
A, eu criei o Statement, algo que ns j fizemos no exemplo com ODBC. Abaixo, temos
uma rotina bem simples que apenas roda um WHILE que vai rodar todo o ResultSet at o
final e exibir os dados levantados na consulta SQL da primeira ltima linha. Ele vai
exibir esses dados numa JOptionPane, o que deixa tudo mais espalhafatoso, mas para
fins de exemplo est bom.
while(resultado.next()){
JOptionPane.showMessageDialog(null, resultado.getObject(1).toString());
}
}
catch (SQLException err) {
// TODO Auto-generated catch block
}
}
}
Se eu quisesse gravar informaes, apagar ou dar um UPDATE, eu usaria as rotinas SQL dentro do
Statement como eu usei no exemplo da base de dados no ODBC, pois isso nunca muda.
Na verdade, o que muda o conector importado para o projeto e tambm a classe que usamos no
forName. Ah, e tambm os parmetros necessrios para a conexo (o MySQL exige o IP, j o ODBC
no, etc.). O resto do sistema continua igualzinho.
WWW.FABIOSALVADOR.COM.BR - Pgina 90
Fbio Burch Salvador
Criando formulrios de impresso com IReport
Existem inmeros editores de relatrios na Internet. Mas ns vamos ter que escolher um deles para
trabalhar. Eu escolhi, para este livro, usar o padro JasperReports, que gratuito. Um JasperReport
um arquivo XML com instrues sobre a montagem de um relatrio utilizando os dados de um banco de
dados qualquer.
D para escrever um JasperReport na unha, usando o Bloco de Notas. Mas mais fcil fazer isso com
o editor apropriado. No caso, estou falando do IReports, um programa de interface visual no qual
podemos desenhar nosso relatrio para impresso puxando os dados no lugar certo, sem grandes
esforos.
Vamos ento criar um relatrio no IReports.
Pgina 91 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Surge ento uma caixinha com configuraes de pgina. Aqui se escolhe o tipo de papel e as margens.
Para quem conhece Word e outros derivados, esta tela no tem nenhuma novidade.
Ao iniciar o novo projeto, surge para ns uma tela com uma folha de papel em branco. Esta folha est
separada em partes. Cada parte corresponde a um pedao do documento que vai sair impresso.
TITLE o ttulo do documento, e aparece apenas na primeira pgina. Serve para fazer capas e coisas
assim.
PAGEHEADER o cabealho do documento. Aparecer no topo de todas as pginas.
COLUMSNHEADER So os cabealhos das colunas. Aparecero sempre antes dos dados, mas ns
podemos fazer o IReport repetir estes cabealhos dentro dos grupos (veremos depois o que so grupos
de dados).
DETAIL Aqui vo os dados em si, empilhados, correndo uma tabela do banco de dados qualquer.
COLUMNFOOTER o rodap do espao iniciado com ColumnHeaders.
WWW.FABIOSALVADOR.COM.BR - Pgina 92
Fbio Burch Salvador
PAGEFOOTER o rodap da pgina, igual em todas as pginas.
LASTPAGEFOOTER o rodap da ltima pgina, uma espcie de antnimo para o Title.
SUMMARY um espao no final do documento utilizado para colocarmos sumrios ou resumos de
encerramento.
Podemos editar as propriedades de tamanho e setar se visvel ou no uma banda usando o
Gerenciador de Bandas. muito fcil abr-lo. Basta clicar sobre algum ponto vazio da folha com o boto
direito e escolher Properties. Da, veremos uma tela assim:
Aqui, no temos grande coisa. Vemos as bandas em uma lista na esquerda, e ao lado o Band Width. O
Band Width representa a altura de cada banda. Se colocarmos um zero ali, a banda desaparece.
J o campo Split Alowed, quando marcado, permite que uma determinada banda, ao no caber em
uma nica pgina, seja repartida. Se estiver desmarcada, ela fica presa primeira pgina e sai cortada
e a, azar!
Pgina 93 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Colocando dados no Report
Aps criarmos a pgina, nos falta ligar este relatrio base de dados. Para isso, usamos o menu Fonte
de Dados.
Dentro de Conexes, ns podemos criar conexes com o BD. Trata-se de um exerccio simples de
preencher campos. Se voc optar por escrever o endereo do servidor e o nome da base de dados nos
campos designados para tal, nunca se esquea de clicar em Wizard, para passar estes parmetros para
a string de conexo no segundo campo, de cima para baixo. ele quem vale na hora de conectar.
No confunda: Server Address um endereo IP ou domnio do servidor para encontra-lo em uma rede.
Se o prprio PC onde est sendo gerado o IReport for o portador do BD usado, ento ser preciso
escrever localhost.
No se preocupe com o fato de estarmos usando uma conexo com IP e tudo para ligar nosso IReport
a uma base de dados. Isso s vai ter validade para usarmos nos testes dos relatrios dos nossos
sistemas. Na hora de rodar o programa nos computadores de um cliente, por exemplo, ns podemos
dizer, atravs do programa em Java, qual o IP do Banco de Dados. Ento, crie seu Report com uma
base de dados que te sirva para os testes do programa, e depois quando ele for implementado nos
clientes, os Reports continuaro a funcionar numa boa.
Depois, no prprio menu Fonte de Dados, escolha a opo Consultas do Relatrio. Aqui, voc deve ir
Report SQL Query e escrever uma Query SQL que vai retornar dados, preenchendo o relatrio com
WWW.FABIOSALVADOR.COM.BR - Pgina 94
Fbio Burch Salvador
informaes a serem trabalhadas.
De volta tela principal do IReports, chegou a hora de dar uma olhada no menu da parte inferior
esquerda. L, vamos ativar a aba Objects Library, que contm os objetos que formam o nosso relatrio.
Os principais tipos de dados a colocar dentro do relatrio so os FIELDS, os VARIABLES e os
PARAMETERS.
FIELDS So campos tirados da base de dados. Colocar um Field faz o Report imprimir os dados que
aquele campo contm.
VARIABLES So variveis. Podemos cria-las para executar funes de soma ou outras coisas
parecidas.
PARAMETERS So utilizado para importar os valores passados pelo programa feito em Java. Estes
parmetros devem ser passados no momento de se chamar a impresso.
Eu posso criar variveis e parmetros, clicando com o boto direito sobre os menos da esquerda e
escolhendo ADD, e ento, o que eu quero adicionar.
Pgina 95 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Para fazer os campos, variveis e parmetros aparecerem no Report, eu devo arrasta-los para dentro
da folha branca, na sesso que eu quiser.
No meu exemplo, eu usei como banco de dados a base de dados do meu site, que alis, voc deveria
visitar. Mas isso outra histria. O fato que eu sei meu site, e com minha Query SQL, mandei retornar
os ttulos das colunas de opinio do site e o nome do autor de cada uma. Obviamente, aparecer uma
enorme lista de ttulos com nomes repetidos, pois eu mandei ordenar pelo cdigo do autor.
Ento, o resultado ser esse:
WWW.FABIOSALVADOR.COM.BR - Pgina 96
Fbio Burch Salvador
Montando grupos
No parece ser muito promissor. E no . Mas a, vamos ver uma coisa nova. Clique no boto Groups.
Aparecero os nomes dos grupos que ns temos no Report, mas como no temos nenhum ainda, no
aparecer nada disponvel a no ser o boto NEW, que ns vamos pressionar, claro.
Uma vez dentro do quadro de criao de grupos, precisamos definir duas coisas: o nome do nosso
grupo e qual ser a expresso agrupadora dele. O nome algo bem simples, basta escrever qualquer
coisa ali dentro.
Eu vou escrever Grupex.
J a expresso segue uma lgica mais complexa, mas no muito. preciso dizer que tipo de coisa se
est usando como parmetro de agrupamento se um campo do banco de dados, se um Parameter
ou se uma Variable. Para distinguir um do outro, usa-se uma letra (F para Field, campo; V para
Variable; P para Parameter).
Eu, no caso, estou agrupando as colunas dos meus articulistas de opinio dentro de grupos formados
pelas colunas de um mesmo autor. Ento, vou aproveitar o campo NOME, escrevendo a expresso
$F{nome}.
Existem umas caixinhas para eu marcar tambm. Vamos ver o que elas fazem.
Start on a New Column repete os ColumnHeaders dentro do grupo.
Start on a New Page Ele quebra a pgina a cada vez que um novo grupo vai se iniciar.
Reset Page Number A primeira pgina de cada grupo ser numerada como se fosse a primeira do
relatrio, caso usemos numerao de pginas (veremos isso adiante).
Print header on each Page Caso o grupo extenda-se por mais de uma pgina, o GroupHeader ser
repetido em cada uma delas.
Pgina 97 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
O que o GroupHeader?
um cabealho que existe para cada item de um determinado grupo. Seu nome no aparece como
GroupHeader, e sim como <nome_do_grupo>Header. Assim, se eu criei o grupo Grupex, eu terei
um GrupexHeader.
No se preocupe. Ao criar um grupo, o prprio IReport coloca um Header para ele.
No meu exemplo, veja que eu usei o GrupexHeader para colocar o NOME do colunista cujos textos
sero listados, e coloquei um retngulo meio cilndrico (ou sei l o que aquilo ali). Esse desenho se
repetir como cabealho de cada grupo formado pelos textos de um mesmo autor. O resultado fica
assim:
WWW.FABIOSALVADOR.COM.BR - Pgina 98
Fbio Burch Salvador
Claro, meu relatrio est uma porcaria, muito feio e sem planejamento grfico algum. Mas voc vai criar
relatrios bonitinho. Isso aqui apenas um exemplo. Mas j deu para ver como se faz, certo?
Bem, e se eu quiser colocar um grupo dentro do outro? Sem problemas! Basta criar mais grupos l no
botozinho Groups. Voc poder depois arrast-los com o mouse para dentro e para fora uns dos
outros, montando sua prpria hierarquia.
Testando o Report
Quando eu crio um Report, como sei que ele est ficando legal? Atravs da F? No! Eu uso botes
exatamente criados para testes. Este comando testa seu relatrio com
os dados do Banco de Dados, dando uma viso
realista do trabalho como ficar no fim.
Botes do IReport
J que viemos at aqui, vamos ver ento os botes do IReport e para que servem:
Uma das coisas mais legais, apesar de no parecerem, so os elementos grficos como o retngulo e o
crculo. Se voc clicar duas vezes sobre um objeto, ele lhe mostrar suas caractersticas. E se voc
manipular estas caractersticas, poder ento fazer grficos. Cada figura tem, por exemplo, Width e
Height, o que nos permite setar sua altura e largura com base em dados da base de dados ou clculos
dentro do Report mesmo!
Pgina 99 - WWW.FABIOSALVADOR.COM.BR
Loucademia de Java Verso 1.0
Trabalhando com variveis
Quando queremos criar uma varivel, usamos o seguinte mtodo: clicamos com o boto direito sobre as
Variables, Fields ou Parameters, e selecionamos ADD VARIABLE. Aparecer uma tela para nos
ajudar a fazer os clculos que queremos.
S para fins de demonstrao, veja que eu estou criando uma varivel que vai calcular quantas colunas
de opinio cada colunista escreveu. Eu defini o tipo dela como Java.lang.Integer, ou seja, um nmero
inteiro. Coloquei o tipo de clculo dela em COUNT, ou seja, contagem (ela vai ficar somando cada
rodada de Detail que rolar, ou seja, vai contar quantos registros ocorreram no Detail).
Eu preciso dizer o que, afinal de contas, esta varivel est calculando. Ento, eu defini isso em Variable
Expression, onde botei o campo titulo tirado da minha base de dados.
Veja que em Reset Type, eu marquei Group. Ou seja, a contagem ser reiniciada a cada grupo. Eu
preciso definir qual grupo, ento marquei o Grupex na ComboBox ao lado.
Por fim, eu preciso inicializar esta varivel com algum valor. Eu coloquei um New Integer, um novo
nmero Integer, que zero.
No final, eu vou colocar minha varivel logo no final da lista de cada colunista (em GrupexFooter), e
vejamos o resultado:
Depois, veremos como usar Parameters. No vem ao caso agora. Eu vou finalizar o processo salvando
o arquivo JRXML para dentro da pasta onde o meu programa Java est sendo desenvolvido. Mais
tarde, este JRXML dever acompanhar o resto do projeto tambm.
A acima, eu criei o mtodo MAIN que apenas instancia a prpria classe qual ele pertence e depois
roda o mtodo IMPRIME. Acontece que o mtodo MAIN Static. Toda varivel ou objeto dentro de um
mtodo Static tambm Static, ento, eu no posso rodar direto a impresso dentro do MAIN porque
diversos objetos utilizados neste processo no suportam ser Static. O jeito criar outro mtodo, no-
Static, e cham-lo a partir do MAIN.
void imprime() {
try {
Class.forName("com.mysql.jdbc.Driver");
}
A acima, temos o bom e velho Class.forName, que vai primeiro verificar a existncia da classe de
componentes que usamos para conextar base de dados MySQL. Se houver um erro, o problema
naquela pea de hardware que fica entre o teclado e o encosto da cadeira. Voc esqueceu de incluir no
Build Path a classe certa.
catch(ClassNotFoundException err) {
Bla bla bla Acabamos de repetir o cdigo que j usamos para incorporar o programa em Java a uma
base de dados MySQL. Nada de novo. Se voc ficou em dvida sobre o cdigo acima, por favor faa
uma pergunta ao instrutor (se voc no estiver estudando sozinho em casa, claro, mas neste caso
mande sua dvida ao autor da apostila). O cdigo que acabamos de ver deveria ser conhecido, porque
trata s da conexo a banco de dados. O JasperReport no tem como saber, dinamicamente, onde est
o BD do nosso programa e ns no vamos criar um grupo de relatrios para cada cliente em separado.
Ento, vamos deixar o papel de guia sobre a localizao do BD nas mos do programa.
try {
JasperReport jr = JasperManager.loadReport("exemplo.jasper");
JasperPrint jp = JasperManager.fillReport(jr, new HashMap(), con);
JasperExportManager.exportReportToPdfFile(jp, "arquivo.pdf");
Os trs commandos acima tm funes diferenciadas. O primeiro deles serve para instanciar um objeto
JasperReport, puxando o arquivo exemplo.jasper (que eu criei antes, no IReport), e deixando-o pronto
para eu fazer o que quiser dele. O arquivo externo na verdade o meu modelo de relatrio.
O segundo comando preenche o relatrio com dados. Mas quais dados? Bom. Ele tem como
argumentos o JasperReport JR (o nome foi escolha minha, pode ser qualquer coisa), depois tem um
HashMap com argumentos que ns no usaremos agora, e finalmente a conexo que dever ser usada
pelo JasperReport (a boa e velha CON). Se voc tiver feito direitinho o trabalho de criao das rotinas
SQL no IReport, ento tudo dever dar certo, e a varivel JP armazenar um relatrio preenchido.
O terceiro comando lida com exportao do relatrio preenchido. Eu no preciso us-lo pois posso usar
o relatrio pronto (que est no objeto JP) para visualizar e imprimir. S que, digamos, eu resolvi
exportar para um PDF o relatrio. O comando est aqui porque interessante que vocs aprendam
como se faz. Ele exporta o relatrio prontinho que est em JP para um arquivo (no caso, arquivo.pdf).
}
catch (JRException e) {
System.out.println("Deu pau");
e.printStackTrace();
}
}
}
Acima, temos apenas o tratamento do Catch daquele TRY no qual geramos o relatrio. Porque,
digamos que algum gnio pensador tenha deletado o arquivo JASPER, ou algo assim.
Depois de fazer tudo isso, podemos simplesmente visualizar nosso relatrio na tela e dar ao usurio a
possibilidade de imprimi-lo com o Jasper Report Viewer:
JRViewer jrv = new JRViewer(report);
viewer.getContentPane().add(jrv);
viewer.show();
Note que na linha acima eu usei a classe Runtime. Esta classe uma espcie de genrico
significando o sistema sobre o qual estou rodando seja qual for. Ento, dou um getRuntime() (o
programa descobre onde estamos rodando). E manda executar um programa (bem evidente no mtodo
EXEC).
Depois, eu dou um comando que bem poderia ser comparado com um comando no MS-DOS. Alis, a
mesma coisa. Eu mando ele rodar o componente que abre um arquivo descobrindo qual o programa-
padro para aquele tipo de arquivos. No caso, como eu mandei ele rodar o arquivo ARQUIVO.PDF, o
sistema vai certamente abrir o Adobe Reader e me mostrar o contedo do PDF.
Agora, eu vou criar o JAR em si. Primeiro, eu clico com o boto direito sobre o nome do meu projeto e
escolho EXPORT.
Em seguida, eu entro em uma tela na qual devo dar um BROWSE e escolher a pasta e nome de
arquivo para o meu projeto fechado. Vemos isso na figura abaixo.
Depois de clicar NEXT, eu passo por uma tela na qual devo dizer se quero fechar no JAR at mesmo
classes com erros ou Warnings. Warnings so avisos sobre criao de variveis que no sero usadas
e coisas do tipo. Nada que trave o programa.
Para que o seu programa funcione no computador do seu cliente, voc vai ter que instalar nele a JRE,
que pode ser baixada da Internet gratuitamente sem nenhum problema.
Agora, se o computador do cliente j tinha uma JRE, ou se est se confundindo na hora de abrir seus
JARs, o procedimento para consertar isso muito simples. Isso normalmente ocorre no Windows. Basta
desassociar os JARs de qualquer programa, que o Windows mesmo achar a maneira certa de abrir o
programa.
Para fazer isso, abra Meu Computador, v ao menu Ferramentas, abra Opes da pasta, v at a aba
Tipos de Arquivo e EXCLUA o formato JAR. Pronto! Seu Windows perdeu as configuraes que o
estavam confundindo e agora obedecer JRE bem bonitinho, abrindo seu JAR e rodando o programa.
Extras
Ao acabar o corpo principal desta apostila, percebi que algumas funes realmente interessantes
ficaram de fora. Por isso, resolvi fazer um apndice com extras interessantes para os desenvolvedores
novos em linguagem Java. Espero que alguma coisa disso seja til aos leitores.
Eu estou criando o mtodo como Static para que possamos cham-lo de uma foma rpida a partir de
qualquer ponto do sistema com o comando matricial.imprime(Texto a imprimir);
try {
DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
PrintService[ ] ps = PrintServiceLookup.lookupPrintServices(df, null);
for (PrintService p: ps) {
System.out.println("Impressora encontrada: " + p.getName());
if (p.getName().contains("Text") || p.getName().contains("Generic")) {
System.out.println("Impressora Selecionada: " + p.getName());
impressora = p;
break;
}
}
} catch (Exception e) {
System.out.println("J deu pau na hora de catar a impressora");
}
Este primeiro Try simplesmente abre os PrintServices (as impressoras disponveis no Sistema
Operacional) e tenta catar uma impressora. Ele roda um FOR que vai girar enquanto for possvel
carregar um PrintService para dentro da varivel PS. No se preocupe, este comando captura as
impressoras configuradas tanto no Windows como no Linux.
Dentro do FOR, ele faz uma verificao (veja o IF ali dentro). Se o nome da impressora contiver
(mtodo CONTAINS) a palavra Text ou Generic, ele vai carregar a varivel IMPRESSORA com o
nome da impressora. Esta verificao existe porque as impressoras matriciais, hoje em dia, so
normalmente cadastradas com nomes como Generic 9 Pins Text Only, e coisas parecidas. Mas se a
sua impressora matricial tiver outro nome, tipo Epson LX310, ento bom alterar o IF desta
Aqui, eu verifiquei se a impressora, aquela varivel que s seria carregada caso houvesse uma
impressora matricial instalada, NULL ou no. Se ela for NULL, ento o IF dentro do FOR no
procedimento anterior no encontrou nada que s possa usar.
No entanto, se ele encontrou, ento vamos para o ELSE, onde a impresso realmente acontece.
try {
DocPrintJob dpj = impressora.createPrintJob();
InputStream stream = new ByteArrayInputStream(texto.getBytes());
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc doc = new SimpleDoc(stream, flavor, null);
dpj.print(doc, null);
} catch (PrintException e) {
e.printStackTrace();
}
}
}
}
Aqui est o ncleo deste cdigo. Primeiro, eu uso a classe DocPrintJob, que vai armazenar um
documento para a impressora. Este documento permanece vazio at que eu mande ele imprimir alguma
coisa.
Depois, eu crio um InputStream para guardar um Array de bytes, formado pelo texto a ser impresso.
Agora, eu tenho um trabalho de impresso vazio e uma Array de bytes loucos para serem impressos.
S falta juntar tudo. E da que eu configuro o flavor do meu servio de impresso, programando-o
para auto-gerenciar os bytes que forem entrando nele.
Depois, eu instancio a classe Doc, criando um documento de impresso completo. Ele tem como
parmetros os dados que formam o documento, o Flavor (modo de trabalhar os dados) e os atributos
especiais, que eu coloquei como NULL, porque no precisamos usar eles (na verdade, eu jamais vi um
caso em que se usasse para alguma coisa, mas...).
No comando seguinte eu peo para o meu DocPrintJob fazer uma impresso, finalmente, recebendo os
dados j tratados do Stream. Novamente, eu tenho como colocar atributos que eu no vou colocar
no segundo argumento do comando.
Agora, o documento dever sair na impressora matricial numa boa. Se voc montou sua String Texto
com todos os dados com espaamentos corretos, ento seu contracheque dever sair bem impresso.
Espero que o valor tambm d prazer aos olhos no momento da leitura.
As quebras de linha devero ser feitas na prpria String Texto. Ao invs de usarmos o bom e velho
caracter \n, vamos usar outros. E h como enviar comandos de Negrito, Compressed e outras coisas
diretamente para a impressora. O nico problema que os comandos que precisamos passar variam de
impressora para impressora. Vale sempre consultar os manuais delas. A maioria das impressoras
fiscais quebra a linha quando mandamos a expresso \r\n.
Agora, eu vou criar o Report consultando nesta tabela para procurar dados. Para isso, sigo o
procedimento que j vimos criando um Report perfeitamente normal.
S que l pelas tantas, eu vou inserir um componente Cdigo de Barras ao lado do nome dos produtos
na banda Detail. E vou clicar duas vezes neste componente criado, fazendo ento uma edio de suas
Properties.
Ao atribuir dentro da Barcode Expression o valor de um campo, eu fao com que o Ireport desenhe o
cdigo de barras para aquele nmero. Assim, fica fcil criar boletos, controles de patrimnio e outras
utilidades que necessitem de cdigo de barras.
O resultado final o seguinte:
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
texto.addActionListener(new ActionListener() {
});
tela.add(texto);
tela.setLayout(null);
tela.setVisible(true);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Java By
Sun Microsystems
Soundtrack
"Blue Moon", by The Marcels
"La Vie en Rose", by Edith Piaf
Directed by
Fbio Burch Salvador
Produced by
Senac So Leopoldo
Printed by
ACCpias
}
}
2008 Fbio Burch Salvador All rights reserved by the Laws of Moldania
(qu? No sabe onde fica a Moldnia, imbecil? Fica entre a Eslovnia e a Sbrnia)