Você está na página 1de 107

Java bsico 2

Paulo Henrique Cayres

Rio de Janeiro

Escola Superior de Redes


2013
Java bsico 2

Java bsico 2
SUMRIO
1

Interfaces Grficas e seus elementos bsicos ................................................................ 1


Exerccio de nivelamento 1 Interfaces Grficas .................................................. 1
1.1
Introduo .................................................................................................. 2
1.2
Janelas ........................................................................................................ 3
1.3
Exibio de Informaes ............................................................................ 5
1.4
Objetos Grficos e o Mtodo paintComponent......................................... 5
1.5
Texto, Fontes e Cores ................................................................................. 7
1.6
Formas Geomtricas .................................................................................. 7
1.7
Imagens ...................................................................................................... 7
Gerenciamento de Eventos e POO ................................................................................. 9
2.1
Eventos ....................................................................................................... 9
2.1.1 Hierarquia de Eventos do AWT ............................................................ 10
2.1.2 Eventos de Foco ................................................................................... 10
2.1.3 Eventos de Teclado .............................................................................. 11
2.1.4 Eventos de Mouse ................................................................................ 11
O Pacote Swing ............................................................................................................. 13
3.1
Componentes visuais-grficos do pacote Swing ...................................... 13
3.1.1 Padro MVC .......................................................................................... 13
3.2
Gerenciamento de Layout de Visualizao .............................................. 15
3.2.1 Bordas................................................................................................... 16
3.2.2 Painis .................................................................................................. 17
3.2.3 Grade .................................................................................................... 17
3.2.4 Caixa ..................................................................................................... 18
3.2.5 Bolsa de Grade ..................................................................................... 19
3.2.6 No usar Gerenciador de Layout ......................................................... 21
Exerccios de Fixao 1 GUI em Java ................................................................. 22
Atividade 1 GUI em Java .................................................................................... 22
Atividade 2 GUI em Java (complementar) ......................................................... 22
3.3
Campos de Entrada de Texto ................................................................... 23
3.3.1 Campos de Texto .................................................................................. 23
3.3.2 Campos de Senha ................................................................................. 24
3.3.3 reas de Texto ...................................................................................... 24
3.3.4 Seleo de Texto .................................................................................. 25
3.4
Rtulos...................................................................................................... 25
3.5
Caixas de Seleo ..................................................................................... 26
3.6
Botes de Rdio........................................................................................ 26
3.7
Borda ........................................................................................................ 27
3.8
Listas ......................................................................................................... 28
3.9
Combos ..................................................................................................... 29
Exerccios de Fixao 2 GUI em Java ................................................................. 30
Atividade 1 GUI em Java .................................................................................... 30
i

Java bsico 2
Atividade 2 GUI em Java (complementar) ......................................................... 31
3.10 Menus ....................................................................................................... 31
3.11 Caixas de Dilogo...................................................................................... 34
3.12 Ordem de Travessia: Tab Order ............................................................... 34
Exerccios de Fixao 3 GUI em Java ................................................................. 35
Atividade 1 GUI em Java .................................................................................... 35
Atividade 2 GUI em Java (complementar) ......................................................... 36
4
Tratamento de Erros .................................................................................................... 37
Exerccio de nivelamento Tratamento de erros ................................................................ 37
4.1
Tipos de excees..................................................................................... 38
4.2
Descrever Excees em Mtodos ............................................................ 39
4.3
Levantar uma Exceo .............................................................................. 40
4.4
Criar Novas Excees ................................................................................ 41
4.5
Capturando Excees ............................................................................... 41
Exerccios de Fixao 4 Tratamento de Erros .................................................... 42
Atividade 1 GUI em Java .................................................................................... 43
Atividade 2 GUI em Java (complementar) ......................................................... 43
5
Controle de entrada (I/O)............................................................................................. 45
Exerccio de nivelamento I/O ............................................................................................ 45
5.1
Stream em Java ........................................................................................ 47
5.2
Entrada e Sada baseada em Bytes .......................................................... 48
5.3
Serializao de Objetos ............................................................................ 49
Exerccios de Fixao 5 Java I/O ........................................................................ 52
Atividade 1 Java I/O ........................................................................................... 52
Atividade 2 Java I/O (complementar) ................................................................ 52
6
Java Database Conectivity - JDBC ................................................................................. 55
Exerccio de nivelamento JDBC ......................................................................................... 55
6.1
O que JDBC ............................................................................................ 55
6.2
Componetes JDBC .................................................................................... 57
6.3
Driver JDBC ............................................................................................... 58
6.4
Classe Connection .................................................................................... 60
6.5
Classe DriverManager e URLs JDBC.......................................................... 60
6.6
Princpios das aplicaes JDBC ................................................................. 61
6.6.1 Operao Interativa: comandos SQL estticos .................................... 62
6.7
Statement ................................................................................................. 62
6.8
ResultSet ................................................................................................... 62
6.8.1 ResultSet rolvel e atualizvel.............................................................. 64
6.8.2 Fechando Recursos............................................................................... 66
Exerccios de Fixao 6 Java JDBC...................................................................... 66
Atividade 1 Java JDBC ........................................................................................ 66
Atividade 2 Java JDBC ........................................................................................ 67
7
Manipulando Resultados de Consultas ........................................................................ 67
7.1
Uso da classe Properties .......................................................................... 68
ii

Java bsico 2
7.2
DAO e Java Bean ....................................................................................... 69
7.3
Instrues Preparadas .............................................................................. 70
7.4
Executando atualizaes em fontes de dados ......................................... 71
7.5
Exemplo Java Bean ................................................................................... 72
7.6
Exemplo DAO............................................................................................ 73
7.7
Exemplo de Incluso................................................................................. 74
7.8
Exemplo Alterao ................................................................................... 74
7.9
Exemplo de Consulta ................................................................................ 75
7.10 Exemplo de Excluso ................................................................................ 75
Exerccios de Fixao 7 Java JDBC...................................................................... 76
Atividade 1 Java JDBC ........................................................................................ 76
Atividade 2 Java JDBC ........................................................................................ 77
8
Gerenciamento de Transaes .................................................................................... 79
8.1
Stored Procedures .................................................................................... 79
8.2
Transaes ................................................................................................ 80
8.3
Execuo em Batch................................................................................... 81
Exerccios de Fixao 8 Java JDBC...................................................................... 82
Atividade 1 Java JDBC ........................................................................................ 83
Atividade 2 Java JDBC ........................................................................................ 84
9
Biblioteca Jasper Relatrios ...................................................................................... 85
9.1
Biblioteca JasperReport............................................................................ 85
9.2
Exemplo de utilizao das etapas para criao de relatrios .................. 86
9.2.1 1 Etapa Criao da conexo ............................................................. 86
9.2.2 2 Etapa Criao da conexo ............................................................. 88
9.2.3 3 Etapa Visualizao do relatrio .................................................... 94
9.3
Incluindo relatrio na aplicao Java ....................................................... 95
9.4
Classe java para gerao de relatrio ...................................................... 95
9.5
Gerando um relatrio na interface grfica .............................................. 96
9.6
Relatrio com Passagem de Parmetros ................................................. 97
Exerccios de Fixao 9 Java JDBC...................................................................... 99
Atividade 1 Java JDBC ........................................................................................ 99
Atividade 2 Java JDBC ...................................................................................... 100
10 Bibliografia ................................................................................................................. 101

iii

Java bsico 2

1 Interfaces Grficas e seus elementos bsicos


Exerccio de nivelamento 1 Interfaces Grficas
Voc j desenvolveu aplicaes desktop que utilizaram Interfaces Grficas com Usurios? Com qual
linguagem de programao?

Voc poderia descrever alguns componentes visuais grficos que utilizou para desenvolvimento destas
interfaces?

Breve Histrico:

AWT (Abstract Window Toolkit)

Java Foundation Classes (JFC)-Swing

Principais componentes visuais grficos GUI


Desenvolvimento de GUIs Java

Java bsico 2

1.1 Introduo
Quando a linguagem Java 1.0 foi lanada, ela continha somente a biblioteca de
classes AWT (Abstract Window Toolkit) para programao GUI (Graphical User
Interface) bsica. A maneira que o AWT funciona a delegao de criao de seus
componentes GUI nativos. Na verdade, quando a criao de uma caixa de texto era feita, a
linguagem criava por trs uma caixa semelhante (peer) que fazia todos os tratamentos.
Dessa maneira conseguia-se rodar os programas em vrias plataformas, tendo o programa
com o mesmo aspecto (HORSTMANN, 2003).
Em aplicaes mais complexas, essa metodologia no era muito produtiva, pois era
realmente difcil escrever determinados cdigos. Outro problema era que o comportamento
de determinados componentes mudava de plataforma para plataforma, ou determinados
ambientes no tinham uma vasta biblioteca de componentes grficos, o que levava a um
esforo muito grande para a padronizao das aplicaes.
Em 1996 a Netscape criou a biblioteca GUI chamada IFC Internet Foundation
Classes que usava uma metodologia completamente diferente. Aqui, todos os
componentes eram desenhados numa tela em branco. Assim, os componentes grficos se
tornavam parecidos com os nativos das plataformas. A Sun trabalhou junto com a Netscape
para aprimorar essa biblioteca, e criaram a biblioteca Swing.
Assim, o conjunto swing foi tornado o kit de ferramentas GUI oficial da JFC (Java
Foundation Classes).
Evidentemente, os componentes do swing so um tanto quanto mais lentos que os
criados usando AWT, mas o uso em mquinas mais modernas mostrou que a diferena no
mais to problemtica.
O problema da aparncia em relao ao sistema nativo foi resolvido, usando o
conceito de look and feel, onde se pode escolher a aparncia que se quer que o sistema
tenha. Mesmo assim, a Sun desenvolveu uma aparncia independente de plataforma,
chamada Metal. A biblioteca swing se encontra em: javax.swing.*.
Na verso atual a linguagem Java suporta duas bibliotecas grficas: a AWT e a
Swing. A biblioteca AWT foi a primeira API voltada para interfaces grficas a surgir no
Java. Posteriormente surgiu a biblioteca Swing (a partir do Java 1.2), que possui algumas
melhorias com relao antecessora. De uma forma geral, apesar do reza o senso comum,
as bibliotecas grficas so bastante simples no que diz respeito a conceitos necessrios para
us-las.
Os sentimentos de complexidade e dificuldade visualizados no aprendizado de
interfaces grficas em Java so devidos ao tamanho das bibliotecas e enorme gama de
possibilidades, as quais certamente assustaro o desenvolvedor de primeira viagem. As
bibliotecas AWT e Swing as bibliotecas grficas oficiais, sempre inclusas em qualquer
pacote distribudo pela Sun. Porm, alm destas, existem algumas outras bibliotecas de
terceiros, sendo a mais famosa o SWT, desenvolvido pela IBM.
2

Java bsico 2
Outra questo que vale a pensa ser ressaltada o fato que a linguagem Java, antes
de tudo prima pelo lema da portabilidade e as API de interface grfica do Java no
poderiam ser diferentes. A aparncia das janelas construdas com a API Swing nica em
todas as plataformas onde roda (Windows, KDE, Gnome). Com isso pode-se afirmar que a
aplicao ter exatamente a mesma interface e aparncia com pequenas variaes geradas
por peculiaridades dos sistemas operacionais, como por exemplo, as fontes utilizadas nas
janelas. Grande parte da complexidade das classes e mtodos do Swing est no fato da API
ter sido desenvolvida tendo em mente o mximo de portabilidade possvel. Favorece-se,
por exemplo, o posicionamento relativo de componentes em detrimento do uso de
posicionamento relativo que poderia prejudicar usurios comresolues de tela diferentes
da prevista.

1.2 Janelas
Uma janela de mais alto nvel, que no est contida em nenhum outro componente,
chamada quadro (frame). Em AWT a classe Frame. Em Swing JFrame. Essa classe
no desenhada dentro de uma tela de desenho (canvas), portanto a moldura toda
desenha pelo gerenciador de janelas nativo.
Os quadros so exemplos de contineres, isto , podem conter componentes de
interface de usurio dentro deles. Por exemplo:
import javax.swing.*;
class FirstFrame extends JFrame {
public FirstFrame() {
setTitle("FirstFrame");
setSize(300, 200);
}
}
public class FirstTest {
public static void main(String[] args) {
JFrame frame = new FirstFrame();
frame.show();
}
}

Java bsico 2

Figura 01 Exemplo JFrame.

Nesse exemplo, a classe FirstFrame estende a classe JFrame. Quando a classe


FirstTest instancia um FirstFrame (new FirstFrame()) e chama show(), esse frame
ser mostrado, fazendo com que seja aberta uma nova janela.
No construtor de FirstFrame, a chamada de setTitle() seta o ttulo da janela. A
chamada de setSize() seta o tamanho da janela, em pixels. Quando se quiser setar a
localizao dessa janela, pode-se chamar o mtodo setLocation().
Para se encerrar um programa, no adianta somente fechar a janela, deve-se sair do
programa e desligar a virtual machine. Para isso, deve-se tratar o evento de sada do
programa. Eventos sero vistos com mais cuidado mais adiante, mas por agora temos que
saber como tratar com esse evento bsico, o de fechamento de aplicativo.
No modelo de eventos do AWT, deve-se informar ao frame qual o objeto que
quer saber quando ele for fechar. Esse objeto (o ouvinte, o que tratar o evento) deve ser
uma instncia de uma classe que implementa a interface WindowsListener. No nosso
exemplo, essa classe ser chamada Terminator. Em seguida, precisa-se adicionar um
objeto da classe Terminator ao frame, para que ele seja ouvinte da janela.
class FirstFrame extends JFrame {
public FirstFrame() {
Terminator exitOnClose = new Terminator();
AddWindowListener(exitOnClose);
...

Mas se for analisada a interface WindowListener, percebe-se que existem sete


mtodos que devem ser sobrepostos:
public
public
public
public
public
public
public

void
void
void
void
void
void
void

windowActivated(WindowEvent e)
windowClosed(WindowEvent e)
windowClosing(WindowEvent e)
windowDeactivated(WindowEvent e)
windowDeiconified(WindowEvent e)
windowIconified(WindowEvent e)
windowOpened(WindowEvent e)

Java bsico 2
No nosso caso, s precisamos tratar o mtodo windowClosing. Fica incmodo ter
que implementar seis mtodos vazios. Para isso existe a classe WindowAdapter, que
implementa todos esses sete mtodos como sendo vazios. Com isso, pode-se s sobrepor
os mtodos que se quer tratar:
class Terminator extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

No modelo de eventos do Swing, deve-se definir a constante pertencente a classe


WindowsConstantis como parmetro do mtodo setDefaultCloseOperation() para que a
instncia de JFrame consiga tratar o evento que correspondente ao fechamento da janela da
aplicao em desenvolvimento. A configurao da chamada do mtodo seria
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);.

1.3 Exibio de Informaes


Desenhar uma string diretamente num quadro no considerada uma boa tcnica de
programao, apesar de possvel. Mas esse componente projetado para ser um continer
de outros componentes, estes sim podendo possuir dados.
A estrutura de um JFrame complexa, mas o que nos interessa a rea de
contedo. Essa a rea onde os componentes sero adicionados.
Suponha que se queira inserir no frame um painel (JPanel) para se imprimir uma
string dentro. O cdigo seria:
// obteno da rea de contedo
Container painelConteudo = frame.getContentPane();
// criao do componente
JPanel p = new JPanel();
// adio do componente ao frame
painelConteudo.add(p);

1.4 Objetos Grficos e o Mtodo paintComponent


Sempre que se precisa de um componente grfico parecido com um componente do
swing, pode-se usar herana para criar uma nova classe e depois sobrepor ou adicionar
mtodos para satisfazer as necessidades.
Para desenhar um painel, deve-se:

Definir uma classe que estenda JPanel;

Sobrepor o mtodo paintComponent dessa classe.

Java bsico 2
Por exemplo:
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
// o cdigo de desenho vem aqui
}
}

Um detalhe importante nunca chamar o mtodo paintComponent diretamente.


Ele chamado automaticamente toda vez que uma parte do sistema tenha que ser refeita,
redesenhada. Ao invs, deve-se chamar o mtodo repaint.
A exibio do texto se d por:
g.drawString(Hello World, 75, 100);

Que deve ser colocado dentro do paintComponent. Por exemplo:


class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(Hello World, 75, 100);
}
}

A classe Graphics a responsvel por fazer desenhos de texto e imagens, com


fontes e cores.
O exemplo acima completo fica:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class HelloWorldPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawstring(Hello World, 75, 100);
}
}
public class HelloWorldFrame extends JFrame {
public HelloWorldFrame() {
setTitle(Hello World);
setSize(300, 200);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
});
Conteiner contentPane = getContentPane();
contentPane.add(new HelloWorldPanel());
}
}
public class HelloWorld {
public static void main(String[] args) {
JFrame frame = new HelloWorldFrame();
frame.show();
}
}

Java bsico 2

1.5 Texto, Fontes e Cores


Pode-se selecionar fontes diferentes deve-se informar ao objeto Graphics qual
fonte usar. A classe responsvel por criar fontes Font. Por exemplo:
Font sans = new Font(SansSerif, Font.BOLD, 14);

Onde 14 o tamanho da fonte. Para setar uma fonte dentro do paintComponent,


antes de imprimir faz-se:
Font sans = new Font(SansSerif, Font.BOLD, 14);
g.setFont(f);
g.drawString(Hello World, 75, 100);

Um detalhe importante que atravs da classe FontMetrics se consegue saber qual


a altura de uma determinada fonte (Font) e tambm o comprimento de uma string usando
uma determinada fonte (Font). Isso muito til quando se quer imprimir vrias strings na
tela, alinhado, e tambm no to dispersos.
Cores tambm so facilmente alteradas atravs da classe Color. Por exemplo:
g.setColor(Color.pink);
g.drawString(Hello, 75, 100);
g.setColor(new Color(0, 128, 128));
g.drawString(World, 75, 125);

Para especificar a cor de fundo de um painel, pode-se usar o seguinte exemplo:


JPanel p = new MeuPainel();
p.setBackGround(Color.white);
contexPane.add(p. Center);

1.6 Formas Geomtricas


Para desenhar formas geomtricas, usam-se os mtodos drawLine, drawArc e
drawPolygon, do pacote java.lang.Graphics. Por exemplo, um polgono:
Polygon p = new Polygon();
p.addPoint(10, 10);
p.addPoint(10, 30);
p.addPoint(20, 20);
g.drawPolygon(p);

Para retngulos e elipses usa-se drawRect, drawRoundRect, draw3DRect e


drawOval. Para preencher as formas geomtricas uma srie de funes disponibilizada:
fillRect, fillOval, fillPolygon, etc.

1.7 Imagens
Para mostrar um grfico num aplicativo, usa-se a classe Toolkit. Por exemplo:
String nome = blue-ball.gif;
Image img = Toolkit.getDefaultToolkit().getImage(nome);
g.drawImage(img, 10, 10, null);

Java bsico 2

Java bsico 2

2 Gerenciamento de Eventos e POO


2.1 Eventos
A manipulao de eventos ponto imprescindvel no desenvolvimento de
aplicativos com interface grfica para o usurio. Frequentemente dito que a aplicao
Orientada a Eventos.
Exemplos de eventos so teclas pressionadas, recebimento de mensagens pela rede,
cliques no mouse, etc.
Em Java pode-se controlar totalmente como os eventos so transmitidos desde as
origens dos eventos (como barras de rolagem ou botes) at os ouvintes de eventos. Podese designar qualquer objeto para ser um ouvinte de um evento, desde que ele o trate
convenientemente.
Existem subclasses para cada tipo de eventos, como ActionEvent e WindowEvent.
Uma viso geral da manipulao de eventos :

Um objeto ouvinte uma instncia de uma classe que implementa uma


interface especial, chamada naturalmente de interface ouvinte;

Uma origem do evento um objeto que pode registrar objetos ouvintes e


envia a estes os objetos eventos;

A origem do evento envia objetos eventos para todos os ouvintes registrados


quando esse evento ocorre;

Os objetos ouvintes vo ento usar a informao do objeto evento recebido


para determinar sua reao ao evento.

O objeto ouvinte registrado no objeto de origem com um cdigo que segue o


modelo a seguir:
objetoFonteEvento.addEventListener(objetoOuvinteEvento);

Por exemplo:
MeuPanel painel = new MeuPanel();
JButton botao = new JButton(Limpar);
botao.addActionListener(painel);

Aqui, o objeto painel ser notificado sempre que um evento ocorrer em boto. A
classe MeuPainel deve possuir uma construo parecida com:
public class MeuPainel extends JPanel implements ActionListener {
public void actionPerformed(ActionEvent evt) {
...
}

Java bsico 2
}

Sempre que o usurio clicar no boto, o objeto JButton cria um objeto

ActionEvent e chama painel.actionPerformed.

Quando se tem muitos botes, que possuem o mesmo ouvinte, se torna necessrio
saber qual objeto fonte gerou o evento. Existem duas maneiras fceis de se tratar isso,
dentro do mtodo actionPerformed:
String command = evt.getActionCommand();
if (command.equals(OK)) ...

Que retorna o label, o texto do boto que foi impresso. Ou:


Object source = evt.getSource();
if (source == btnOk) ...

Que retorna o objeto que gerou o evento.

2.1.1 Hierarquia de Eventos do AWT

Figura 02 Hierarquia de eventos AWT.

Vendo a hierarquia percebe-se que o AWT faz distino entre eventos semnticos,
que expressam o que o usurio est fazendo, e de baixo nvel, que tornam os eventos
semnticos possveis. Por exemplo, um clique de um boto, na verdade uma sequncia de
outros pequenos eventos, como pressionamento do boto, movimentao do mouse
enquanto pressionado e liberao do boto.

2.1.2 Eventos de Foco


Na linguagem Java, um componente tem o foco se pode receber pressionamento de
teclas. Esse componente pode receber o foco ou perder o foco. Tambm pode-se

10

Java bsico 2
pressionar TAB para mover o foco sequencialmente componente a componente, de cima
para baixo, da esquerda para direita.
Pode-se evitar que um componente receba o foco simplesmente sobrepondo o
mtodo isFocusTransversable para que retorne false.
Um ouvinte de foco precisa implementar dois mtodos: focusGained e focusLost.
Esses eventos so acionados quando a origem ganhar ou perder o foco, respectivamente.
Cada um esses mtodos tem um parmetro FocusEvent. H dois mtodos teis nessa
classe: getComponent que retorna o componente que recebeu ou perdeu o foco, e
isTemporary que retorna true se a mudana do foco foi temporria. Uma mudana
temporria do foco acontece quando um componente perde o controle temporariamente
para depois recupera-lo automaticamente.
Exemplo:
public void focusLost(FocusEvent evt) {
if (evt.getComponent()==ccField && !!evt.isTemporary()) {
If (!checarFormato(ccField.getText()))
ccField.requestFocus();
}
}

Onde o mtodo requestFocus coloca o foco num controle especfico.

2.1.3 Eventos de Teclado


Eventos de teclado so ouvidos por classes que implementam a interface

KeyListener. O evento keyPressed informa a tecla pressionada:


public void keyPressed(KeyEvent evt) {
int keyCode = evt.getKeyCode();

Outros mtodos podem ser sobrepostos como keyReleased, que diz quando uma
tecla foi liberada.

2.1.4 Eventos de Mouse


No necessrio processar explicitamente os eventos de mouse caso se queira tratar
cliques em botes ou menus. Essas so tratadas internamente.
Para o tratamento de eventos de mouse, a classe ouvinte deve implementar a
interface de MouseMotionListener. Para os eventos de pressionamento dos botes do
mouse, deve-se usar um MouseAdapter. Por exemplo:
public MousePanel(){
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();

11

Java bsico 2
current = find(x, y);
if (current < 0) // not inside a square
add(x, y);
}
public void mouseClicked(MouseEvent evt) {
int x = evt.getX();
int y = evt.getY();
if (evt.getClickCount() >= 2) {
remove(current);
}
}
});
addMouseMotionListener(this);
}

12

Java bsico 2

3 O Pacote Swing
3.1 Componentes visuais e grficos do pacote Swing

Figura 03 Componentes Swing.

3.1.1 Padro MVC


O MVC um padro de projeto (Modelo-Visualizao-Controlador ou ModelView-Controler), que se baseia nos princpios de projetos orientados a objetos: no
construir um objeto responsvel por tarefas em demasia. Isto , num exemplo de
componente de boto, no se deve criar um boto como uma nica classe que cuida da
aparncia visual e das particularidades de como um boto funciona.
O padro de projeto MVC ensina como realizar isso. Deve-se implementar trs
classes separadas:

Mode: o modelo, que armazena o contedo;


13

Java bsico 2

View: a visualizao, que exibe o contedo;

Controller: o controlador, que processa entrada de dados do usurio.

O padro especifica precisamente como os trs objetos interagem. O Modelo


armazena o contedo e no tem interface. Para um boto, o contedo bem trivial,
contm apenas um conjunto de flags indicando se est pressionado ou no, ativo ou no. O
modelo precisa implementar mtodos para alterar e ler o contedo. Deve-se ter em mente
que ele totalmente abstrato, no possui representao visual.
Uma das grandes vantagens do padro MVC que um modelo pode ter vrias
visualizaes, cada uma mostrando partes ou aspectos diferentes do contedo. Por
exemplo, um editor HTML pode mostrar o contedo de duas formas, uma como a pgina
aparece no browser, com opo de edio (WYSIWYG) e outra mostrando as tags todas do
arquivo html para edio.
O controlador manipula os eventos de entrada do usurio, como cliques do mouse e
pressionamento de teclas. Ele decide se deve traduzir ou no esses eventos em alteraes
do modelo ou na visualizao. Por exemplo, numa caixa de edio de texto, quando um
caractere pressionado, o controlador deve informar ao modelo que este foi alterado.
Ento o modelo avisa a visualizao para atualizar a interface. Mas quando uma tecla de
navegao pressionada, ento o controlador somente avisa a visualizao, j que o
modelo no foi alterado.

Figura 04 Interao do padro MVC.

14

Java bsico 2

3.2 Gerenciamento de Layout de Visualizao


At agora utilizamos componentes para desenvolvimento de interfaces grficas sem
se preocupar com o modelo de visualizao. Isto , a maneira como estes esto distribudos
e como se apresentam seus controles dentro de um frame.
Usaremos o boto (JButton) por ser um componente visual grfico comumente
utilizado para interao com usurios de programas e tambm por ser simples de controlar,
ser usado nos exemplos.
Por exemplo, podemos desenvolver um programa que imprime trs botes que
alteram as cores de fundo de um frame, quanto clicados pelo usurio. Veja o cdigo java
abaixo que pode ser utilizado para implementar esta funcionalidade:
// pega o panel
Container contentPane = getContentPane();
// adiciona controles
aux = new JButton("Amarelo");
contentPane.add(aux);
aux.addActionListener(this);
aux = new JButton("Azul");
contentPane.add(aux);
aux.addActionListener(this);
aux = new JButton("Vermelho");
contentPane.add(aux);
aux.addActionListener(this);
contentPane.setLayout(new FlowLayout(FlowLayout.CENTER));

Neste exemplo, a ltima linha seta o layout que ser usado na impresso dos
controles na tela. Nesse caso, os controles sero centralizados:
contentPane.setLayout(new FlowLayout(FlowLayout.CENTER));

A funo setLayout um mtodo do continer, que pode receber qualquer uns dos
layouts definidos. Em particular, o FlowLayout usado para alinhar os controles,
centralizado, esquerda ou direita.

15

Java bsico 2

Figura 05 Exemplo de uso de botes em interfaces grficas.

3.2.1 Bordas
O gerenciador de layout de visualizao de bordas (BorderLayout) o gerenciador
padro do JFrame. Este gerenciador permite escolher em que posio se deseja colocar o
controle.

Figura 06 Exemplo BorderLayout.

16

Java bsico 2
Por exemplo:
Class MyPanel extends Jpanel {
...
jButton1.setText("Norte");
getContentPane().add(jButton1, java.awt.BorderLayout.PAGE_START);
jButton2.setText("Sul");
getContentPane().add(jButton2, java.awt.BorderLayout.PAGE_END);
jButton3.setText("Oeste");
getContentPane().add(jButton3, java.awt.BorderLayout.LINE_START);
jButton4.setText("Leste");
getContentPane().add(jButton4, java.awt.BorderLayout.LINE_END);
jButton5.setText("Centro");
getContentPane().add(jButton5, java.awt.BorderLayout.CENTER);
...
}

Os componentes das bordas so colocados primeiro. O que sobra ocupado pelo


centro. Pode-se posicionar como North, South, East, West e Center. O Layout
de borda aumenta todos os componentes para que ocupem todo o espao disponvel. O
Layout de Fluxo deixa todos os componentes com seu tamanho preferencial.

3.2.2 Painis
O problema do Layout de Borda, quanto ao redimensionamento dos componentes
para que ocupem o espao disponvel em cada uma das regies disponveis, pode ser
contornado atravs do uso de painis adicionais. Esses painis agem como continers para
controles. Dentro desses painis pode-se utilizar outro layout, podendo assim fazer uma
mescla de vrios tipos.
Por exemplo:
Conteiner contentPane = getContentPane();
Jpanel panel = new JPanel();
panel.add(yellowButton);
panel.add(blueButton);
panel.add(redButton);
contentPane.add(panel, South);

3.2.3 Grade
O gerenciador de layout de visualizao de grade (GridLayout) organiza todos os
componentes em linhas e colunas como uma planilha. Neste layout as clulas so todas do
mesmo tamanho.
No construtor do objeto layout de grande, deve-se especificar quantas linhas e
colunas se quer:
panel.setLayout(new GridLayout(5, 4);

17

Java bsico 2
Pode-se tambm especificar os espaamentos horizontal e vertical (respectivamente
e em pixels) desejados:
panel.setLayout(new GridLayout(5, 4, 3, 3);

Adicionam-se componentes comeando com a primeira entrada da primeira linha,


depois a segunda entrada da primeira linha e assim sucessivamente.

Figura 07 Exemplo GridLayout.

3.2.4 Caixa
O gerenciador de layout de visualizao de Caixa (BoxLayout) permite colocar
uma nica linha ou coluna de componentes com mais flexibilidade de que o layout de
grade. Existe um continer (Box) cujo gerenciador padro de layout o BoxLayout,
diferentemente da classe Panel, cujo gerenciador o FlowLayout.
Exemplos. Para criar um novo continer com layout de caixa, faz-se:
Box b = Box.createHorizontalBox();

ou
Box b = Box.createVerticalBox();

Depois, adicionam-se elementos de maneira usual:


b.add(okButton);
b.add(cancelButton);

Na caixa horizontal, os componentes so organizados da esquerda para a direita. Na


vertical de cima para baixo.

18

Java bsico 2
Para no se ter problemas com um controle que dentro de um layout de caixa fique
com uma altura no desejada, faz-se com que seu tamanho mximo seja o tamanho
preferencial. Por exemplo:
textField.setMaximumSize(textField.getPreferredSize());

Para se adicionar algum espao entre, por exemplo, botes OK e Cancel numa tela,
pode-se fazer:
b.add(okButton);
b.add(Box.createHorizontalStrut(5));
b.add(cancelButton);

Que adiciona uma escora vertical, numa caixa vertical, ou uma escora horizontal
numa caixa vertical, separando os componentes em exatamente 5 pixels (no exemplo).
Pode-se usar tambm uma rea rgida invisvel, sendo similar a um par de escoras,
separando os componentes adjacentes, mas tambm adicionando uma altura ou largura
mnima na outra direo. Por exemplo:
b.add(Box.createRigidArea(new Dimension(5, 20)));

Adiciona uma rea invisvel com largura mnima, preferencial e mxima de 5 pixels
e altura de 20 pixels, mas alinhamento centralizado.
Adicionar cola faz o contrrio que uma espora, separa os componentes tanto quanto
possvel.
b.add(okButton);
b.add(Box.createGlue());
b.add(cancelButton);

Figura 08 Exemplo BoxLayout.

3.2.5 Bolsa de Grade


O gerenciador de layout de visualizao de Caixa (GridBagLayout) a me de
todos os gerenciadores de layouts. um layout de grade sem limitaes. Pode-se unir
clulas adjacentes para abrir espao para componentes maiores, etc. Os componentes no
precisam preencher toda a rea da clula e pode-se especificar seu alinhamento dentro
delas.
Mas a sua utilizao pode ser bem complexa. o preo que se paga pela
flexibilidade mxima e possibilidade de se trabalhar com vrios tipos de situaes
diferentes.
19

Java bsico 2
Para descrever o layout do gerenciador de bolsa de grade, necessrio percorrer o
seguinte procedimento:

Criar um objeto do tipo GridBagLayout. No se informa quantas linhas e


colunas a grade tem. Em vez disso, o gerenciador de layout ir tentar
descobrir isso a partir das informaes fornecidas mais tarde;

Especificar esse objeto GridBagLayout como sendo o gerenciador de layout


do componente;

Criar um objeto do tipo GridBagConstraints. Esse objeto ir especificar


como os componentes so colocados dentro da bolsa de grade;

Para cada componente, preencher o objeto GridBagConstraints. Depois,


adicionar o componente com as restries.

Por exemplo:
GridBagLayout layout = new GridBagLayout();
panel.setLayout(layout);
GridBagConstraints restricoes = new GridBagConstraints();
restricoes.weightx = 100;
restricoes.weighty = 100;
restricoes.gridx = 100;
restricoes.gridy = 100;
restricoes.gridwidth = 100;
restricoes.gridheight = 100;
JList estilo = new JList();
panel.add(estilo, restricoes);

Os parmetros gridx, gridy especificam a posio (linha e coluna) do componente


em relao ao canto superior esquerdo. Os valores gridWidth e gridHeight determinam
quantas colunas e linhas o componente ocupa.
Os campos weightx e weighty especificam se os campos podem ou no ser
ampliados. Se o peso for 0, ento o campo ter seu tamanho fixo, nunca ser ampliado ou
reduzido. Isso quando a janela for redimensionada. Eles no definem tamanho, mas
definem a folga que um campo pode ter para ser ampliado.
Os parmetros fill e anchor so usados para que um componente no se estenda
toda a rea. Para fill, tem-se quatro possibilidades: GridBagConstraints.NONE,
GridBagConstraints.HORIZONTAL,
GridBagConstraints.VERTICAL,
GridBagConstraints.BOTH.

20

Java bsico 2
O campo anchor usado quando o componente no ocupa o espao todo da rea.
Pode-se ancor-lo em algum espao dentro do campo. Pode ser:
GridBagConstraints.CENTER,
GridBagConstraints.NORTH,
GridBagConstraints.NORTHEAST, GridBagConstraints.EAST, etc.
Para tornar a confeco desse layout mais tranquilo, pode-se usar a seguinte receita:
1. Esboar o layout do componente numa folha de papel;
2. Encontrar uma grade tal que os pequenos componentes fiquem contidos,
cada um, em uma clula, e os componentes grandes ocupem diversas
clulas;
3. Rotular as linhas e as colunas da grade com 0, 1, 2, 3, .... Com isso,
consegue-se os calores de gridx, gridy, gridwidth e gridheight;
4. Para cada componente, deve-se saber se ele precisa preencher sua clula
horizontalmente ou verticalmente. Caso no, como fica alinhado? Isso
determina fill e anchor;
5. Fazer todos os pesos iguais a 100. Contudo, se for preciso que uma linha ou
coluna fique no tamanho padro, deve-se fazer weightx ou weighty iguais
a 0 em todos os componentes que pertenam a essa linha ou coluna;
6. Escrever

cdigo.

Conferir
cuidadosamente
os
valores
de
GridBagConstraints, pois um nico valor errado poder arruinar todo o
layout.

3.2.6 No usar Gerenciador de Layout


Para no usar o gerenciador de layout, ou para usar posicionamento absoluto devese setar o gerenciador de layout para null e posicionar os controles manualmente:
panel.setLayout(null);
panel.add(ok);
ok.setBounds(10, 10, 30, 15);

21

Java bsico 2

Exerccios de Fixao 1 GUI em Java


O que so gerenciadores de layout? Quais so os gerenciadores de layout do Java?

Atividade 1 GUI em Java


1. Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de
trs nmeros e que mostre em uma mensagem (JOptionPane) apenas o maior dentre
estes. A mensagem ser visualizada atravs de um clique num boto.
2. Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de
nome e sobrenome de uma pessoa, separadamente. O programa dever produzir como
mensagem (JOptionPane) com o resultado da concatenao dessas duas cadeias de
caracteres.
3. Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de
dois nmeros inteiros e depois exiba uma mensagem (JOptionPane) com o somatrio
de todos os nmeros inteiros existentes entre os nmeros digitados, inclusive.
4. Escreva uma aplicao Swing Java com uma interface que possibilite a digitao de um
nmero inteiro e depois exiba uma mensagem (JOptionPane) com o resultado
informando se este nmero par ou impar.

Atividade 2 GUI em Java (complementar)


1. Escreva uma aplicao Swing Java com uma interface que possibilite a digitao do
nome e idade de uma pessoa. Estas informaes sero utilizadas para instanciar um
objeto da classe Pessoa atravs do clique do mouse em um boto. Um segundo boto
dever retornar uma mensagem (JOptionPane) se esta pessoa maior ou menor de
idade.
2. Escreva uma aplicao Swing Java que, data uma palavra ou frase fornecida pelo
usurio em uma caixa de texto JTextField, determine as seguintes informaes que
devero ser exibidas numa rea de texto (JTextArea): nmero de caracteres, quantidade
de vogais, quantidade de constantes, quantidade de dgitos. A operao dever ser
acionada por meio de um clique num boto (JButton).
22

Java bsico 2

3.3 Campos de Entrada de Texto


Em Java existem dois tipos de controle para tratamento de texto: campo de texto e
rea de texto. A diferena que campos de texto admitem uma s linha, enquanto reas de
texto admitem vrias linhas. As classes so JTextField e JTextArea.
Mtodos mais usados:

void setText(String t);: seta o texto do controle;

String getText();: retorna o texto dentro do controle;

void setEditable(boolean b);: seta se o controle editvel.

Figura 09 Exemplo jTextField e jTextArea.

3.3.1 Campos de Texto


painel.

A maneira usual de inserir um campo de texto adicion-lo a um continer ou a um


JPanel panel = new JPanel();
JTextField textField = new JTextField(Entrada Padro, 20);
panel.add(textField);

O segundo parmetro do construtor do JTextField o tamanho, no caso 20


colunas. Pode-se alterar o tamanho depois de criado, usando setColumns(15), por
exemplo. Logo aps, deve-se executar um validate().
Para adicionar um campo em branco:
JTextField textField = new JTextField(20);

Para alterar a fonte, usa-se setFont.


23

Java bsico 2
O tratamento de eventos de alterao de texto pode ser feito atravs da instalao de
um ouvinte na interface Document.
textField.getDocument().addDocumentListener(ouvinte);

Quando um texto alterado, um dos trs mtodos a seguir chamado:


void insertUpdate(DocumentEvent e);
void removeUpdate(DocumentEvent e);
void changeUpdate(DocumentEvent e);

Os dois primeiros mtodos so chamados quando caracteres tiverem sido inseridos


ou removidos. O terceiro mtodo chamado quando mudanas como formatao, ocorrem,
e tambm quando alteraes no texto so feitas.

3.3.2 Campos de Senha


Para que ningum veja o que est sendo digitado, usa-se um campo de senha, que
no Java implementado atravs de JPasswordField. Usam-se as seguintes funes:

void setEchoChar(char eco);:

char[] getPassword();:

quando algo foi digitado;

informa qual o caractere que ser mostrado

retorna o texto digitado.

Figura 10 Exemplo jPasswordField.

3.3.3 reas de Texto


reas de texto podem ser criadas atravs do seguinte exemplo:
JTextArea textArea = new JTextArea(8, 40);
GetContentePane().add(textArea);

// 8 linhas e 40 colunas

Pode-se setar as linhas e colunas atravs de setColumns e setRows. Se houver mais


texto a ser mostrado, ele ser truncado.

24

Java bsico 2
Quando

se

quer

que as linhas maiores sejam quebradas, usa-se


textArea.setLineWrap(true). Essa quebra de linha completamente visual, o texto
continua inalterado.
No Swing rea de texto no possui barra de rolagem, se a quiser, deve-se usar um
ScrollPane, como a seguir:
TextArea = new JTextArea(8, 40);
JScrollPane scrollPane = new JScrollPane(textArea);
getContentPane().add(scrollPane, Center);

Figura 11 Exemplo jTextArea com JScrollPane e setTollTip.

3.3.4 Seleo de Texto


Usam-se os mtodos da superclasse JTextComponent.

void selectAll();:

seleciona todo o texto;

void select(int inicio, int fim);:

int getSelectionStart();:

int getSelectionEnd();:

String getSelectedText();:

especificados;

seleciona o texto com incio e fim

retorna incio da seleo;

retorna o fim da seleo;


retorna o texto selecionado.

3.4 Rtulos
So componentes que possuem uma linha de texto simples, que no reagem s
opes do usurio. So usados como informativos, ou como nome de campos na tela, etc.
JLabel label = new JLabel(Nome: , JLabel.LEFT);

Onde JLabel.LEFT o alinhamento do texto.

25

Java bsico 2

Figura 12 Exemplo jLabel.

3.5 Caixas de Seleo


usado quando se quer uma seleo do tipo Sim ou No. As caixas de seleo
precisam de um Label para descrever sua finalidade. Por exemplo:
JPanel p = new JPanel();
JCheckBox bold = new JCheckBox(Bold);
bold.addActionListener(this);
p.add(bold);
JCheckBox italic = new JCheckBox(Italic);
italic.addActionListener(this);
p.add(italic);

Usa-se o mtodo setSelected para marcar ou desmarcar uma caixa de seleo.


Quando o usurio clica no check box um evento de ao gerado.Com o mtodo
isSelected consegue-se descobrir se o controle est ou no selecionado. Por exemplo:
public void actionPerformed(ActionEvent evt) {
Int m = (bold.isSelected() ? Font.BOLD : 0) +
(italic.isSelected() ? Font.ITALIC : 0);
panel.setFont(m);
}

Figura 13 Exemplo jCheckBox.

3.6 Botes de Rdio


Nas caixas de seleo pode-se selecionar nenhuma, uma ou vrias opes. Em
vrias situaes necessrio que o usurio escolha uma dentre vrias opes. E quando
uma opo selecionada, as outras so desmarcadas automaticamente. Para isso so
usados botes de rdio. Para que isso funcione, usam-se grupos. Isso conseguido criandose um controle de grupo e adicionando-se todos os botes de radio.
26

Java bsico 2
smallButton = new JRadioButton(Small, true);
mediumButton = new JRadioButton(Medium, false);
...
ButttonGroup group = new ButtonGroup();
group.add(smallButton);
group.add(mediumButton);
...

Novamente, quando o radio pressionado, um evento de ao gerado. Por


exemplo:
public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
If (source == smallButton)
panel.setSize(8);
Else if(source == mediumButton)
panel.setSize(12);
...
}

Para saber se um boto de rdio est ou no selecionado pode-se usar isSelected.

Figura 14 Exemplo jRadioButton e buttonGroup.

3.7 Borda
So usados para delimitar partes da interface, como diferentes grupos de rdio. Para
isso, pode-se seguir os seguintes passos:
1. Chame um mtodo esttico de BorderFactory para criar uma borda. Podese escolher entre os seguintes estilos:
a. Relevo abaixado (lowered bevel)
b. Relevo destacado (raised bevel)
c. Entalhe (etched)
d. Linha (line)
e. Fosco (matte)
f. Vazio (empty)

27

Java bsico 2
2. Se quiser, adicione um ttulo borda, passando-o ao mtodo
BorderFactory.createTitledBorder(String).
3. Se voc quiser experimentar de tudo, pode-se combinar bordas com
BorderFactory.createCompoundBorder().
4. Adicione a borda resultante ao componente usando o mtodo setBorder da
classe JComponent.
Por exemplo:
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, Titulo);
Panel.setBorder(titled);

Figura 15 Exemplo jPanel e BorderFactory.

3.8 Listas
Listas so usadas para escolhas com vrias opes. O Swing oferece um objeto
muito completo para se gerenciar esse tipo de lista, permitindo tanto strings quanto objetos
quaisquer.
O componente JList usado para manter um conjunto de valores dentro de uma s
caixa para seleo, permitindo tanto selees nicas quanto mltiplas. Exemplo:
String[] words = {quick, brown, hungry, wild};
JList wordList = new JList(words);

As listas no possuem barra de rolagem automaticamente, para isso deve-se


adicion-la dentro de um painel de rolagem:
JScrollPane scrollPane = new JScrollPane(wordList);

Depois, deve-se adicionar o painel de rolagem, e no a lista, no painel que a


conter.
Para fazer com que um nmero definido de elementos seja mostrado a cada
momento, usa-se:
wordList.setVisibleRowCount(10);

// mostra 10 itens

Por default a lista permite mltipla seleo, para usar seleo nica, usa-se:
wordList.setSelectionModel(ListSelectionModel.SINGLE_SELECTION);

28

Java bsico 2
O mtodo de notificao, tratamento de eventos, no se d atravs do
monitoramento de eventos de ao, mas sim eventos de seleo de lista. Deve-se
implementar o mtodo:
public void valueChanged(ListSelectionEvent evt)

no ouvinte, e a interface ListSelectionListener.


Por exemplo:
class ListFrame extends JFrame implements ListSelectionListener {
public ListFrame() {
...
JList wordList = new JList(words);
wordlist.addListSelectionListener(this);
}
public void valueChanged(ListSelectionEvent evt) {
JList source = (JList)evt.getSource();
Object[] values = source.getSelectedValues();
String text=;
for (int i=0; i<values.length; i++)
text += (String)values[i] + ;
}
}

Figura 16 Exemplo jList.

3.9 Combos
uma lista que fica escondida, e quando o usurio clica no campo, a lista se abre.
Se a caixa estiver configurada para ser editvel, pode-se editar a seleo como se fosse
uma caixa de texto.
style = new JComboBox();
style.setEditable(true);
style.addItem(Serif);
style.addItem(SansSerif);
...

29

Java bsico 2
Esse mtodo (addItem) adiciona a string no final da lista; pode-se tambm inserir
em qualquer lugar:
style.insertItemAt(Monospaced, 0);

Para remover itens usa-se:


style.removeItem(Monospaced);
style.removeItemAt(0);
// remove o primeiro item
style.removeAllItems();

Para tratar dos eventos, captura-se um evento de ao, logo, tratando-se o mtodo
actionPerformed:
public void actionPerformed(ActionEvent evt) {
JComboBox source (JComboBox)evt.getSource();
String item = (String)source.getSelectedItem();
panel.setStyle(item);
}

Figura 17 Exemplo jList.

Exerccios de Fixao 2 GUI em Java


Liste os recursos que o pacote swing do Java disponibiliza para desenvolvimento de
interfaces grficas que voc aprendeu at o momento.

Atividade 1 GUI em Java


1. Escreva uma aplicao Swing Java com uma interface que tenha duas caixas de listas
JList, do mesmo tamanho, uma ao lado da outra, denominadas lista 01 (a esquerda) e
lista 02 (a direita). Implemente uma entrada de texto (JTextField) que permitir a
digitao de palavras que sero adicionadas apenas lista 01. Por meio de botes
JButton deve ser possvel: mover os itens selecionados da lista 01 para a lista 02;
30

Java bsico 2
mover todos os itens da lista 01 para a lista 02; mover os itens selecionados da lista 02
para a lista 01; e mover todos os itens da lista 02 para lista 01. Por fim, implemente um
boto que possibilidade remover os itens selecionados de cada uma das listas (um
boto para cada lista).
2. Escreva uma aplicao Swing Java com uma interface que permita a seleo
(JComboBox) de uma entre 5 opes de cores que sero utilizadas para preencher a cor
de fundo do JFrame onde a caixa de seleo foi disponibilizada.
3. Escreva uma janela JDialog que exiba uma pergunta (em um rtulo JLabel) e cinco
alternativas de resposta (usando botes de opes de JRadioButton). A pergunta e suas
alternativas devem ser especificadas por mtodos prprios, bem como a resposta
correta. Apenas uma alternativa poder ser selecionada. Por meio de um boto JButton,
a aplicao dever avaliar se a resposta est ou no correta, impedindo a partir de seu
acionamento a alterao da resposta. Como opo ajustvel, a janela deve exibir uma
mensagem de dilogo (com JOptionPane) com a indicao de acerto ou erro.
4. Escreva uma aplicao Swing Java que implemente uma sequncia de questes a serem
apresentadas pela janela implementada no exerccio 3. Esta aplicao dever calcular e
escrever uma mensagem (JOptionPane) com o total de acertos e erros obtidos.

Atividade 2 GUI em Java (complementar)


1. Escreva uma aplicao Swing Java que implemente implemente uma interface onde o
usurio dever informar seu usurio (JTextField) e senha (JPasswordField) e, ao clicar
no boto de acesso (JButton), seja feita uma verificao um array com a lista de
usurios e senhas que tenham acesso ao sistema. A mensagem ACESSO
PERMITIDO dever ser exibida caso seja encontrado um usurio com a senha
informada. Exiba a mensagem ACESSO NEGADO caso no seja encontrado o
usurio e senha informados no array de usurios.

3.10 Menus
No necessrio um gerenciador de layout para se colocar um menu numa janela.
Sua elaborao direta:
JMenuBar menuBar = new JMenuBar();

Uma barra de menu pode ser colocada onde se queira, mas normalmente aparece na
parte superior do frame. Usa-se:
frame.setJMenuBar(menuBar);

Para cada menu cria-se um objeto menu:


JMenu editMenu = new JMenu(Edit);

Ento se adicionam os itens, separadores e submenus:


JMenuItem pasteItem = new JMenuItem(Paste);
editMenu.add(pasteItem);

31

Java bsico 2
editMenu.addSeparator();
...

Tambm se adiciona menus de nvel mais alto barra de menus:


menuBar.addMenu(editMenu);

Quando o usurio seleciona um menu ocorre um evento de ao. necessrio


instalar um ouvinte de evento de ao para cada item do menu:
pasteItem.addActionListener(this);

A gerao desse cdigo todo um tanto quanto trabalhosa, por exemplo:


JMenu menu = new JMenu(Edit);
item = new JMenuItem(Cut);
item.addActionListener(this);
menu.add(item);
item = new JMenuItem(Copy);
item.addActionListener(this);
menu.add(item);
item = new JMenuItem(Paste);
item.addActionListener(this);
menu.add(item);
menuBar.add(menu);

Para responder a eventos de menu usa-se actionPerformed:


public void actionPerformed(ActionEvent evt) {
if (evt.getSource() instanceof JmenuItem) {
String arg = evt.getActionCommand();
if (arg.equals(Open)) ...
else if (arg.equals(Save)) ...
...
}
}

As teclas de atalho podem ser especificadas no construtor dos itens de menu:


JMenuItem cutItem = new JMenuItem(Cut, T);

Para teclas de atalho para o menu principal, deve-se usar o seguinte:


JMenu helpMenu = new JMenu(Help);
HelpMenu.setMnemonic(H);

Para acessar as teclas de atalho usa-se ALT+ letra.


Quando se quer teclas de atalho, do tipo CTRL+S para salvar, isto , para que itens
de menu sejam chamados, sem sequer abrir o menu onde esto, ento usa-se
setAccelerator.
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));

Para inserir cones nos itens de menu, usa-se o seguinte construtor:


JMenuItem cutItem = new JMenuItem(Cut, new ImageIcon(cut.gif));

Para criar itens de menu usando botes de rdio e check boxes, usa-se outros
objetos:
JCheckBoxMenuItem readOnlyItem = new JCheckBoxMenuItem(Read-only);
OptionsMenu.add(readOnlyItem);

32

Java bsico 2
Os itens de menu em forma de botes de rdio funcionam exatamente como
controles comuns, isto , deve-se criar um grupo para eles, para possuam o efeito esperado:
ButtonGroup group = new ButtonGroup();
JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem(Insert);
insertItem.setSelected(true);
JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem(Overtype);
group.add(insertItem);
group.add(overtypeItem);
optionsMenu.add(insertItem);
optionsMenu.add(overtypeItem);

Menus flutuantes so facilmente implementados tambm:


JPopupMenu popup = new JPopupMenu();

Os itens so adicionados da forma usual:


JMenuItem item = new JMenuItem(Cut);
item.addActionListener(this);
popup.add(item);

Para abrir explicitamente um menu flutuante usa-se o mtodo show.


popup.show(painel, x, y);

Onde painel o controle que ser pai no menu, x e y a localizao.


Os menus flutuantes normalmente esto associados ao pressionamento de um boto
particular do mouse, como no Windows. Para que isso acontea, deve-se:
public void mouseReleased(MouseEvent evt) {
if (evt.isPopupTrigger())
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}

Para habilitar e desabilitar itens de menu, pode-se usar:


saveItem.setEnabled(false);

Mas isso pode levar o cdigo a ficar cheio de instrues lidando com os menus.
Ento pode-se usar um tratador de eventos de menu. Existe o MenuListener, com trs
mtodos:
void menuSelected(MenuEvent evt); // chamado antes do menu ser exibido
void menuDeselected(MenuEvent evt);// depois que o menu removido da tela
void menuCanceled(MenuEvent evt); // qdo a seleo cancelada

Figura 18 Exemplo jList.

33

Java bsico 2

3.11 Caixas de Dilogo


So janelas pr-definidas que so usadas para informao para o usurio. Existem
dois tipos: modais que quando aparecem, o usurio no pode fazer mais nada antes de
fech-la e as no modais que o usurio pode continuar o que est fazendo.
Algumas janelas pr-definidas so:

JOptionPane.showMessageDialog : Exibe uma mensagem e espera o

JOptionPane.showConfirmDialog : Exibe uma mensagem e obtm

JOptionPane.showOptionDialog : Exibe uma mensagem e obtm uma

JOptionPane.showInputDialog : Exibe uma mensagem e obtm uma

usurio clicar OK;

confirmao (OK/Cancelar);

opo do usurio dentre vrias;


linha digitada pelo usurio.

Para se criar uma janela de dilogo prpria, como a janela sobre, deve-se derivar
uma classe de JDialog.

Figura 18 Exemplo JOptionPane.

3.12 Ordem de Travessia: Tab Order


Quando uma janela possui muitos componentes, deve-se pensar na ordem de
travessia desses componentes, isto , a ordem na qual os componentes perdem e ganham o
foco enquanto o usurio pressiona TAB.
O Swing tenta percorrer esses elementos de uma forma coerente, de cima para
baixo, da esquerda para direita, pulando os rtulos. No Swing, a ordem de insero dos
elementos no influencia no tab order, mas sim o layout usado.

34

Java bsico 2
O problema ocorre quando um continer contiver outros contineres e assim por
diante. Quando o foco vai para outro continer, automaticamente ele colocado no
componente mais acima e mais esquerda desse continer, para depois percorrer os outros
componentes.
Para alterar essa ordem pode-se usar duas formas. A primeira chamando:
okButton.requestFocus();

Mas s funciona como resposta a um dado evento, isto , no tem efeito


permanente na ordem de travessia.
A segunda explicitamente mudar a ordem de travessia, chamando:
style.setNextFocusableComponent(size);

size.

Que faz com que o prximo componente a receber o foco, depois do style seja o

Exerccios de Fixao 3 GUI em Java


O que so componentes e o que so os event listeners?

Atividade 1 GUI em Java


1. Construa uma aplicao que permita efetuar um teste de cor, por meio de trs controles
deslizantes JSlider, onde o usurio poder ajustar uma cor por meio de seus
componentes RGB expressos com valores inteiros entre 0 e 255. A cor a ser ajustada
deve ser visualizada por meio de um JPanel sem contedo.
2. Escreva uma aplicao Swing Java que permita a construo de uma rvore com o
componente JTree. Uma caixa de texto JTextField deve fornecer os valores para os ns
da rvore. O primeiro n adicionado constituir sua raiz. A partir da, os novos ns
devero ser adicionados como filhos do n que esteja selecionado na rvore no
momento da nova insero. A insero de um novo n ser feita por meio do clique
num boto JButton. Implemente tambm um boto para remover um n que esteja
selecionado. A excluso dever excluir todos os ns filhos pertencentes ao n
selecionado quando do clique no boto de excluso.

35

Java bsico 2

Atividade 2 GUI em Java (complementar)


3. Construa uma aplicao Java que permita a seleo (JFileChooser) e visualizao de
uma imagem em formato GIF, JPG ou PNG. A seleo do arquivo e o encerramento da
aplicao devem constituir opes de um menu suspenso (JMenu) denominado arquivo
e uma barra de menus (JMenuBar).

36

Java bsico 2

4 Tratamento de Erros
Exerccio de nivelamento Tratamento de erros
Voc j desenvolveu alguma aplicao que utilizou tratamento de erros? Em que linguagem?

Tratamento de erros
Detectar e tratar erros ou falhas
Durante a execuo de mtodos
Erro de lgica
Uso inadequado da API
Uso de classes especializadas
No compromete a inteligibilidade do cdigo
Implementadas por meio de interfaces

Os erros em Java so tratados como em C++, atravs de excees. Em Java, todas


as excees descendem de Throwable, mas a hierarquia se divide em Error e Exception.
Os erros da classe Error descrevem erros internos e de exausto de recursos. Pouco
se pode fazer numa situao dessas, alm de informar ao usurio e deixar o programa de
forma segura. Essas situaes so raras.
Ao programar em Java, deve-se focalizar a hierarquia Exception. Esta tambm se
divide em excees que derivam de RuntimeException e as que no. A regra geral a
seguinte:

Uma RuntimeError ocorre porque houve um erro de programao.


Qualquer outra exceo ocorre devido a algo errado, como erro de I/O que
tenha ocorrido no programa.
37

Java bsico 2
As excees que derivam da RuntimeError incluem problemas como:

Converso explcita de tipo (cast);

Acesso a elemento de array alm dos limites;

Acesso de ponteiro nulo.

As excees que no derivam do RuntimeError incluem:

Tentar ler alm do final de um arquivo;

Tentar abrir uma URL incorreta;

Tentar encontrar um objeto Class atravs de uma string que no denota


uma classe existente.

Figura 19 Hierarquia de excees.

4.1 Tipos de excees


Em java temos dois tipos de excees que podem ser tratadas, as checked e as
unchecked. Entende-se por checked exceptions, aquelas excees que devem ser tratadas
pelo programa usando try..catch ou delegadas por meio da clausula throws. Uma exceo
checked a forma que o mtodo chamado tem para avis-lo de que algo errado ocorreu e
deve ser tratado para dar continuidade na execuo do programa.

38

Java bsico 2

J as unchecked exceptions no exigem nenhum tratamento por parte do programador


(apesar de deixar trat-las). A abordagem destes tipos de exceo para informar que algo
ocorreu, mas que o programador no tem como corrigir por se tratar de um fator externo
sua aplicao.

4.2 Descrever Excees em Mtodos


Para que um mtodo possa gerar uma exceo tratvel pelo usurio, deve-se
descrever quais ele pode levantar. Isto , alm das informaes que um mtodo pode
retornar, tambm se informa o que pode dar errado.
Essa informao das excees feita no cabealho dos mtodos, por exemplo:
public String readLine() throws IOException

Se dentro do mtodo readLine ocorrer uma exceo IOException, essa poder


facilmente ser tratada no mtodo que chamou essa funo. Mas no h necessidade de se
tratar todo e qualquer tipo de exceo. Basta ter em mente as ocasies em que uma exceo
levantada:

Na chamada de um mtodo que lana (throws) uma exceo;

Se um erro for detectado e for lanada uma exceo (throw);


39

Java bsico 2

Em um erro de programao;

Em um erro interno do Java.

Se ocorrer um dos dois primeiros casos, ento o programador dever informar a


quem usar o mtodo que ele levanta uma exceo. Caso contrrio, se no tiver nenhum
mecanismo para tratar essas excees, o programa termina a execuo.
class Animation {
...
public Image loadImage(String s) throws IOException {
...
}
}

Se o mtodo pode lanar mais de uma exceo, separa-se por vrgula:


class Animation {
...
public Image loadImage(String s) throws EOFException,
MalFormedURLException {
...
}
}

No se deve anunciar (throws) erros internos do Java (derivadas de Error) nem


erros em tempo de execuo (RuntimeException), porque esto fora do alcance do
programador. Essas excees so chamadas no verificadas (unchecked).
As excees no verificadas no podem ser tratadas, e devem ser evitadas no
programa, atravs de verificaes. Um mtodo precisa declarar todas as excees
verificadas que ele pode levantar.

4.3 Levantar uma Exceo


Para um mtodo levantar uma exceo, usado o comando throw. S se pode
levantar uma exceo se ela foi declarada no cabealho do mtodo (ou uma superclasse).
Exemplo:
throw new EOFException();

Ou, se preferir:
EOFException e = new EOFException();
throw e;

E para juntar tudo que foi visto nesta sesso:


String lerDados(BufferedReader ent) throws EOFException {
...
while (...) {
if (ch == -1)
// encontrou EOF
throw new EOFException();
}
}

40

Java bsico 2
A EOFException tambm tem um outro construtor, que recebe uma string, que
serve para descrever a condio do erro mais detalhadamente. Exemplo:
throw new EOFException(Contedo completo recebido.);

4.4 Criar Novas Excees


Para criar uma nova classe de exceo basta criar a classe e deriv-la de Exception
ou de qualquer uma de suas subclasses.
class ExecucaoTamanhoArquivo extends IOException {
public ExecucaoTamanhoArquivo() { }
public ExecucaoTamanhoArquivo(String str) {
super(str);
}
}

Agora pode-se us-la normalmente nos programas:


String lerDados(BufferedReader ent) throws ExecucaoTamanhoArquivo {
...
while (...) {
if (ch == -1)
// encontrou EOF
throw new ExecucaoTamanhoArquivo();
}
}

4.5 Capturando Excees


Para capturar excees usa-se um bloco try...cath, com a seguinte construo:
try {
<Cdigo que pode gerar erro>
}
catch(TipoExceo_1 e) {
<Manipulador da exceo tipo 1>
}
...
catch(TipoExceo_n e) {
<Manipulador da exceo tipo n>
}
finally {
<Cdigo finalizador>
}

Dentro do trecho try coloca-se o cdigo que ser executado e verificado por um
determinado erro. Se uma exceo ocorrer, ela ser de um determinado tipo, e conforme o
tipo, a execuo ser desviada para um trecho catch que trata esse tipo de exceo. Podese ter um ou mais trechos catch, conforme a necessidade.

41

Java bsico 2

O trecho finally usado quando se deseja, por exemplo, liberar um recurso


reservado por um cdigo que gerou exceo. O trecho de cdigo que estiver a dentro
sempre ser executado, seja uma exceo tratada (catch) ou no. A clusula finally
pode ser usada mesmo sem o catch, assim, se uma exceo foi levantada, o trecho
finally executado e a exceo relevantada.
Graphics g = image.getGraphics();
try {
// cdigo que pode gerar erros
}
catch(IOException e) {
// tratamento de erros
}
finally {
// libera recursos, mesmo se nenhuma exceo for levantada
g.dispose();
}

Exerccios de Fixao 4 Tratamento de Erros


Qual a diferena entre lanar uma exceo e capturar uma exceo?

42

Java bsico 2

Atividade 1 GUI em Java


1. Faa uma classe executvel que receba por meio da linha de comando do programa
(prompt) dois nmeros e um operador aritmtico ( + , - , x , / ), informe o resultado da
operao. Ateno: no possvel diviso por zero. Ento, lance uma exceo caso isso
ocorra.
2. Faa uma classe executvel que receba por meio da linha de comando do programa
(prompt) um nmero natural (de 1 a 10) e informe a sua tabuada. Ateno: Se no
informado, assuma o valor 7. Ento, utilize a clusula finally em sua soluo.
3. Crie uma classe de exceo que implemente o mtodo toString() e retorne a mensagem
Impossvel converter. Favor informar apenas dgitos na entrada de dados
4. Crie uma classe que implemente o mtodo retornaDouble(String) que lana a exceo
implementada no enunciado 3 caso o String de entrada seja vazia.
5. Faa uma aplicao Java com uma interface que possibilite a digitao de um nmero e
que mostre em uma mensagem (JOptionPane) com resultado da multiplicao deste
nmero por 5. Utilize try-catch para tratar a exceo por meio do mtodo de converso
de String para double implementado no enunciado 4 para tratar a entrada de dados.

Atividade 2 GUI em Java (complementar)


1. Defina a classe ContaCorrente contendo os atributos nmero da conta, nome do cliente
e saldo para lanar excees (definidas por voc) quando a conta construda com
saldo negativo e quando se saca uma quantidade maior que o saldo atual.
2. Faa uma aplicao Java com uma interface que possibilite a digitao de informaes
para instanciar objetos da classe ContaCorrente (criada no enunciado anterior) e
armazenar num ArrayList.
3. Faa uma aplicao Java com uma interface que possibilite informar o nmero de uma
conta corrente e o valor com dois botes (JButton), sendo um para depsito e outro
para saque. O boto de saque dever lanar uma exceo para tratar possvel saldo
negativo em caso de saque de valores superiores ao saldo atual da conta.
4. Defina uma classe MyInput, contendo mtodos estticos abaixo (todos os mtodos
devem retornar o tipo especificado), de forma que excees sejam lanadas caso um
valor incorreto tenha sido fornecido pelo usurio.
a. getInt para leitura de um inteiro, com parmetros que representem os
valores mnimo e mximo aceitos.
b. getFloat para leitura de um flutuante, com parmetros que representem os
valores mnimo e mximo aceitos.
43

Java bsico 2
c. getChar para leitura de um caractere, com um parmetro do tipo String
contendo um conjunto de caracteres aceitos.
5. Faa uma classe executvel Java que teste entradas de dados para cada um dos mtodos
implementados no enunciado 4 e trate possveis excees (problemas de converso
com a estrutura try-catch).

44

Java bsico 2

5. Controle de entrada (I/O)


Exerccio de nivelamento I/O
Voc j desenvolveu alguma aplicao que utilizou manipulou arquivos em disco? Em que linguagem?
Trabalhou com gravao de objetos? Que recurso utilizou?

Controle de entrada e sada

Pacote java.io
Leitura/Escrita de Dados
Orientada a bytes (modo binrio)
Orientada a caracteres (modo texto)
Serializao de Objetos
Outros
Acesso Aleatrio: classe RandomAccessFile
Informaes sobre arquivos e diretrios: classe File

Uma stream de I/O gera o caminho por meio do qual seus programas podem enviar
uma sequncia de bytes de uma fonte at um destino. Uma stream de entrada uma fonte
(ou produtor) de bytes e uma stream de sada o destino (ou consumidor).
Todas as funes de I/O stream tratam os arquivos de dados ou os itens de dados
como uma corrente ou um fluxo (stream) de caracteres individuais. Se for escolhida uma
funo de stream apropriada, a aplicao poder processar dados em qualquer tamanho ou
formato, desde simples caracteres at estruturas de dados grandes e complicadas.
Tecnicamente falando, quando um programa usa uma funo stream para abrir um arquivo
para I/O, o arquivo que foi aberto associado com uma estrutura do tipo FILE que contm
informaes bsicas sobre o arquivo.
45

Java bsico 2
Uma vez aberta a stream, retornado um ponteiro para a estrutura FILE. Este
ponteiro FILE algumas vezes chamado de ponteiro stream ou stream usado para fazer
referncia ao arquivo para todas as entradas/sadas subsequentes.
Todas as funes de I/O stream fornecem entrada e sada bufferizada, formatada ou
no formatada. Uma stream bufferizada proporciona uma localizao de armazenamento
intermediria para todas as informaes que so provenientes de stream e toda sada que
est sendo enviada a stream. I/O em disco uma operao que toma tempo, mas a
bufferizao da stream agilizar sua aplicao. Ao invs de introduzir os dados stream, um
caractere ou uma estrutura a cada vez, as funes I/O stream acessam os dados em um
bloco de cada vez.
medida que a aplicao necessita processar a entrada, ela simplesmente acessa o
buffer, o que um processo muito mais rpido. Quando o buffer estiver vazio, ser
acessado um novo bloco de disco. O inverso tambm verdadeiro para sada stream. Ao
invs de colocar fisicamente na sada todos os dados, medida que executada a instruo
de sada, as funes de I/O stream colocam todos os dados de sada no buffer. Quando o
buffer estiver cheio, os dados sero escritos no disco.
Dependendo da linguagem de alto nvel que estiver sendo utilizada, pode ocorrer
um problema de I/O bufferizado. Por exemplo, se o programa executar vrias instrues de
sada que no preencham o buffer de sada, condio necessria para que ele fosse
descarregado no disco, aquelas informaes sero perdidas quando terminar o
processamento de programa.
A soluo geralmente envolve a chamada de uma funo apropriada para limpar
o buffer. claro que uma aplicao bem escrita no dever ficar dependendo destes
recursos automticos, mas dever sempre detalhar explicitamente cada ao que o
programa deve tomar. Mais uma observao: se a aplicao terminar de maneira anormal
quando se estiver usando stream I/O, os buffers de sada podem no ser esgotados
(limpos), resultando em perda de dados.
O ltimo tipo de entrada e sada chamado low-level I/O I/O de baixo nvel.
Nenhuma das funes de I/O de baixo nvel executa bufferizao e formatao. Ao invs
disso, elas chamam diretamente os recursos de I/O do sistema operacional. Estas rotinas
permitem acessar arquivos e dispositivos perifricos em um nvel mais bsico do que as
funes stream.
Os arquivos abertos desta maneira retornam um manipulador de arquivo, um valor
inteiro que utilizado para fazer referncia ao arquivo em operaes subseqentes. Em
geral, uma prtica ruim de programao misturar funes de I/O stream com rotinas de
baixo nvel.
Como as funes stream so bufferizadas e as funes de baixo nvel no, a
tentativa de acessar o mesmo arquivo ou dispositivo por dois mtodos diferentes leva
confuso e eventual perda de dados nos buffers.
46

Java bsico 2

5.1 Stream em Java


As bibliotecas Java para I/O (java.io e java.nio) oferecem numerosas classes de
stream. Mas todas as classes de stream de entrada so subclasses da classe abstrata
InputStream, e todas as classes stream de sada so subclasses da classe abstrata
OutputStream. A figura abaixo ilustra a hierarquia de classes do pacote java.io.

Figura 20 Biblioteca Java IO.

O recurso de serializao permite que um objeto seja transformado em um stream


de bytes, que podem ser armazenados em um arquivo e enviados via rede. Atravs desses
bytes torna-se possvel recriar a classe serializada, desde que esta implemente a interface
Serializable ou a Externalizable.
Somente objetos que implementem essas interface podem ser desintegrados em
bytes, ou integrados a partir dos bytes. A interface Externalizable, por exemplo, deve
implementar os mtodos writeExternal e readExternal. As variveis sero salvas ou lidas
por esses mtodos. Essas duas chamadas recebem uma classe do tipo ObjectOutput e
ObjectInput, respectivamente. O principal mtodo da classe ObjectOutput writeObject e
o da classe ObjectInput o readObject.
47

Java bsico 2
Esses mtodos sero os responsveis pela transformao da classe em bytes e viceversa. Existem classes concretas para essas interfaces, que so ObjectOutputStream e
ObjectInputStream. Este recurso, serializao, pode ser utilizado em aplicaes visuais, por
exemplo, para permitir que os usurios salvem seus trabalhos em um arquivo. Neste caso,
antes de escrever um objeto em uma stream, os objetos devero ser serializados.
Deve-se considerar a serializao de objetos semelhante diviso de um objeto em
pequenos pedaos para poder escrev-los em uma stream de bytes. O termo para este
processo serializao de objetos.

5.2 Entrada e Sada baseada em Bytes


A classe abstrata OutputStream contm definies de mtodos write para gravao
de bytes de um arquivo. O mtodo de gravao de byte abstrato, devendo ser redefinido
em subclasses, como FileOutputStream e DataOutputStream.
O cdigo abaixo ilustra a utilizao dos mtodos writeInt() e writeDouble()
utilizados para gravao de bytes de um arquivo informado pelo usurio.
import java.io.*;
public class EscritaBytes {
public static void main(String a[]) {
// verifica presena do argumento obrigatrio com nome do arquivo
if (a.length==0) {
System.out.println("uso:\njava
EscritaBytes
<nomeArquivo>
[quant]");
System.exit(-1);
}
// efetua abertura do arquivo
DataOutputStream dos = null;
try {
dos = new DataOutputStream(new FileOutputStream(a[0]));
System.out.println("Arquivo '" + a[0] + "' aberto.");
} catch(FileNotFoundException e) {
System.out.println(e);
System.exit(-1);
}
// converte quantidade dada pelo usurio ou usa default
int quant = 10;
try {
quant = Integer.parseInt(a[1]);
} catch (Exception e) {
System.out.println("Usando quantidade default 10");
}
// gera quantidade indicada de valores aleatrios
try {
System.out.println("Gerando conteudo...");
for(int i=0; i<quant; i++) {
dos.writeInt(i);
double aux = Math.random();
dos.writeDouble(aux);
System.out.println("#" + i + " : " + aux);
}
dos.close();
System.out.println("Arquivo '" + a[0] + "' fechado.");

48

Java bsico 2
} catch(Exception e) {
System.out.println(e);
}
}
}

Da mesma forma a classe abstrata InputStream contm definies de mtodos read


para leitura de bytes de um arquivo. O mtodo de leitura de byte abstrato, devendo ser
redefinido em subclasses, como FileInputStream.
O cdigo abaixo ilustra a utilizao dos mtodos readInt() e readDouble() utilizados
para leitura de bytes de um arquivo informado pelo usurio.
import java.io.*;
public class LeituraBytes {
public static void main(String a[]) {
// verifica presena de argumento com nome do arquivo
if (a.length==0) {
System.out.println("uso:\njava LeituraBytes <nomeArquivo>");
System.exit(-1);
}
// efetua a abertura do arquivo, para leitura de bytes
DataInputStream dis = null;
try {
dis = new DataInputStream(new FileInputStream(a[0]));
System.out.println("Arquivo '" + a[0] + "' aberto.");
} catch(FileNotFoundException e) {
System.out.println(e);
System.exit(-1);
}
// efetua a leitura do arquivo enquanto existirem dados
try {
System.out.println("--- Conteudo ---");
while(dis.available()>0) {
int i = dis.readInt();
double aux = dis.readDouble();
System.out.println("#" + i + " : " + aux);
}
System.out.println("--- Conteudo ---");
dis.close();
System.out.println("Arquivo '" + a[0] + "' fechado.");
} catch(IOException e) {
System.out.println(e);
}
}
}

5.3 Serializao de Objetos


A serializao um mecanismo que permite transformar um objeto em uma
sequncia de bytes, a qual pode ser restaurada, em um momento posterior, em um objeto
idntico ao original.

49

Java bsico 2

Figura 21 Processo de serializao de objetos em Java.

As classes ObjectOutputStream e ObjectInputStream implementam o protocolo de


serializao do Java. Estes streams so capazes de serializar e desserializar objetos
instanciados em aplicaes Java. Por exemplo, podemos ter uma classe da qual podemos
instanciar objetos que representam produtos.
Note que, para um objeto ser serializado, sua classe deve implementar a interface
Serializable, que no exige a implementao de qualquer mtodo, servindo apenas como
uma tag interface (marcao) que autoriza a serializao. O cdigo a seguir exemplifica a
implementao de uma classe que permite a serializao de seus objetos.

Depois de instanciar objetos da classe produto ns podemos ter uma aplicao Java
que possibilite a serializao destes objetos e grav-los em um arquivo em disco. O ideal
que a regra de negcio fique separada da interface grfica. Com isso, podemos criar uma
classe responsvel pelo acesso ao arquivo, onde os objetos gravados so apresentados no
cdigo a seguir:

50

Java bsico 2

Por fim, desenvolvemos uma interface grfica que ir fazer uso da classe que
permite a instncia de objetos serializados que sero repassados para a classe que gerencia
a regra de negcio da aplicao. Esta ltima ser responsvel por persistir o objeto
instanciado em memria num arquivo em disco. O cdigo a seguir ilustra o uso da classe
serializvel e da classe de regra de negcio para possibilitar a manipulao de objetos
armazenados num arquivo em disco:

51

Java bsico 2

Exerccios de Fixao 5 Java I/O


Qual a diferena entre lanar uma exceo e capturar uma exceo?

Atividade 1 Java I/O


1. Desenvolva os problemas (aplicao em trs camadas) descritos abaixo:
1.1. Crie uma classe com o nome de produto com os atributos cdigo, nome, preo de
compra e preo de venda que possibilite a serializao de objetos.
1.2. Crie uma classe de controle que ir possibilitar a gravao de objetos em disco e
demais consultas que so solicitadas;
1.3. Utilizar Colees para busca e ordenao;
1.4. Desenvolva uma aplicao GUI em Java que disponibilize as seguintes
funcionalidades:
1.4.1. Menu principal que possibilite acesso as seguintes funcionalidades:
1.4.1.1. Tela que possibilite a digitao dos dados de produtos e sua incluso
num arquivo em disco;
1.4.1.2. Tela que possibilite a digitao de um intervalo de preos de compra
necessrios para a gerao de uma listagem (jTextArea) com produtos
que tenham esta caracterstica informada pelo usurio do sistema;
1.4.1.3. Tela que possibilite a listagem de todos os produtos cadastrados;
1.4.1.4. Tela que possibilite a visualizao de dados do produto com o maior
preo de compra e tambm o que tem o menor preo de venda;
1.4.1.5. Tela que possibilite a consulta de um produto pelo seu nome. A tela
dever mostrar todos os dados cadastrados do produto em jTextFields
desabilitados ou uma mensagem (JOptionPane) com a informao de que
no existe produto com a descrio informada;

2. Atividade 2 Java I/O (complementar)


1. Uma indstria deseja manter um banco de dados sobre a folha de pagamento mensal de
seus funcionrios. Para isso, lido de cada funcionrio: o nome, o salrio-base e uma
categoria funcional (numrica: 1-operrio, 2-administrativo ou 3-gerncia). Os dados
devem ficar armazenados em um arquivo (folha.dat) e a cada vez que for solicitado, o
52

Java bsico 2
contra-cheque de um funcionrio deve ser exibido, com as seguintes informaes:
nome do funcionrio, salrio bruto (se da categoria 1, o prprio salrio-base; se da
categoria 2, o salrio-base + 5%; se da categoria 3, o salrio-base + 15%), descontos
(se salrio bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso contrrio, 1%
sobre o salrio bruto) e salrio lquido (salrio bruto descontos). Desenvolva um
aplicao GUI em Java que apresente as seguintes opes:
a) Incluir (solicitao dos dados de um funcionrio e gravao de um registro
com os dados da folha de pagamento no arquivo)
b) Listar (leitura dos dados da folha de pagamento de um funcionrio do
arquivo, mostrando as informaes do contra-cheque)
2. A comisso organizadora de um campeonato de atletismo decidiu apurar os resultados
da competio atravs de um processamento eletrnico. De cada atleta so lidos:
cdigo de identificao, nome e o tempo gasto em cada uma das 5 provas que formam
a competio. Esses dados so armazenados em um arquivo. Ao final de cada prova, a
pontuao atribuda de acordo com o tempo realizado em cada prova (quem gastou
menos tempo est em 1 lugar) e feita da seguinte maneira: 1 colocado: 5 pontos, 2
colocado: 3 pontos e 3 colocado: 1 ponto. Essa pontuao atualizada na pontuao
geral do campeonato. Desenvolva uma aplicao GUI em Java que apresente as
seguintes opes:
a) Incluso dos dados (solicitao dos dados de um atleta e gravao de um
registro no arquivo)
b) Classificao (leitura dos dados dos atletas e processamento dos tempos e
pontos)

53

Java bsico 2

54

Java bsico 2

6. Java Database Conectivity - JDBC


Exerccio de nivelamento JDBC
Voc j desenvolveu alguma aplicao que utilizou acesso a banco de dados? Em que
linguagem? Que banco de dados utilizou?

6.1 O que JDBC


JDBC (Java Database Conectivity) a API padro para conectividade de bancos de
dados, tais como banco de dados SQL e outras fontes de dados tabulares, como planilhas e
arquivos simples, com a linguagem de programao Java.

JDBC fornece uma biblioteca padro para acessar base de dados relacionais. A API
padroniza o meio para estabelecer a conexo com a fonte de dados, a abordagem para
iniciar a execuo de uma consulta SQL, a estrutura de dados resultante da consulta SQL
para que possam ser manipuladas na interface grfica e um conjunto de classes de interface
que possibilitam manipular os dados por meio de instrues preparadas, bem como a
possibilidade de manipulao de metadados das fontes de dados que esto sendo
manipuladas. importante ressaltar que esta API no padroniza a sintaxe SQL em uso.
A arquitetura da API JDBC foi desenvolvida para ser independente de plataforma e
consiste basicamente de duas partes:
55

Java bsico 2
JDBC API, uma API java-based pura
JDBC Driver Manager, usado para estabelecer conexo com drivers
especficos de fabricantes de BD/SGBD.

Figura 21 Arquitetura JDBC.

O JDBC est no pacote java.sql.*. Pode ser encontrado no site da Oracle. A


instalao do J2SE j trs consigo o JDBC.
Alm disso, precisa-se de um driver para acesso ao banco de dados que se quer.
Atualmente os drivers de acesso a banco de dados para aplicaes desenvolvidas em Java
esto disponveis no site do fornecedor do SGBD que voc necessita acessar. Por exemplo,
para acesso ao PostgreSQL, usa-se o driver JDBC para PostgreSQL. O driver deve ser
colocado no CLASSPATH do projeto para que possa ser referenciado.
Os passos para o acesso so:
1. Carregar o driver do BD/SGBD;
2. Conectar-se ao DB;
3. Especificar a operao SQL;
4. Manipular os resultados obtidos.

56

Java bsico 2
Alm de acessos usando-se drivers, pode-se usar uma ponte que vai desde o JDBC
ao ODBC, para acesso de bases Win32.
A arquitetura JDBC pode ser visualizada na seguinte figura:

Figura 22 Arquitetura JDBC.

JDBC fornece em sua API um conjunto de classes genricas para acesso a qualquer
tipo de banco de dados baseado em SQL.

6.2 Componentes JDBC


A classe DriverManager e os Drivers JDBC so particularmente os componentes
JDBC mais importantes para se estabelecer uma conexo com um BD/SGBD.
Os quatros componentes centrais da arquitetura so:
Classes e interfaces da API (contidos nos pacotes java.sql e javax.sql) para
interligao padronizada entre Java e SGBDRs;
Drivers JDBC que implementam de fato os mecanismos de conexo e
interao com o SGBDRs (no site do fabricante);
Sute de testes de drivers (no site do Java) para avaliar as funcionalidades e
compatibilidades de drivers JDBC;
Ponte JDBC-ODBC para uso com BD acessveis exclusivamente por meio
de ODBC.
57

Java bsico 2

6.3 Driver JDBC


Um driver JDBC uma classe especial que implementa a interface java.sql.Driver,
podendo ser escrito complemente em Java ou com cdigo nativo criando uma espcie de
ponte e deve suportar o padro SQL-92.
O driver JDBC deve permitir que a aplicao acesse classes capazes de converter
requisies SQL em aes particulares no BD.
Os driver JDBC so desenvolvidos pelos fabricantes dos BD/SGBD e so
disponibilizados para download para que os desenvolvedores de aplicaes Java possam
incorpor-los em seus projetos.

Figura 23 JDBC Driver.

Atualmente existem 4 tipos de Driver JDBC que os desenvolvedores de aplicaes


Java podem utilizar para acessar BD/SGBD, conforme ilustrado na figura 24.

58

Java bsico 2

Figura 24 JDBC Driver.

O driver tipo 1 a ponte ODBC-JDBC. o tipo mais simples e restrito


plataforma Windows. Utiliza ODBC para conectar-se com o banco de dados, convertendo
mtodos JDBC em chamadas s funes do ODBC e normalmente usada quando no h
um driver puro-Java (tipo 4) para determinado banco de dados.
O driver tipo 2 o Driver API-Nativo. Este driver traduz as chamadas JDBC para
as chamadas da API cliente do banco de dados usado. Assim como a Ponte JDBC-ODBC,
este driver pode precisar de software extra, instalado na mquina cliente.
O driver tipo 3 o Driver de Protocolo de Rede. Este driver traduz a chamada
JDBC para um protocolo de rede independente do banco de dados utilizado, que
traduzido para o protocolo do banco de dados por um servidor. Por utilizar um protocolo
independente, pode conectar as aplicaes clientes Java a vrios bancos de dados
diferentes, sendo considerado o tipo de driver mais flexvel.
O driver tipo 4 o Driver nativo. Este driver implementado em Java e converte as
chamadas JDBC diretamente no protocolo do banco de dados. Normalmente independente
de plataforma e escrito pelos desenvolvedores dos DB/SGBD, sendo o tipo mais
recomentado para uso em aplicaes Java com acesso a BD.

59

Java bsico 2

6.4 Classe Connection


O objeto Connection representa uma conexo especfica com o banco de dados. No
contexto de uma conexo, statements so executados e os resultados das consultas so
retornados. A inicializao de uma conexo feita pelo mtodo getConnection() do
DriverManager, como ilustrado no tpico 7.5.

6.5 Classe DriverManager e URLs JDBC


Classe DriverManager responsvel por administrar e selecionar tal driver
conforme o BD especfico, possibilitando efetuar a conexo. A solicitao de conexo
realizada pelo mtodo getConnection( String URL_BD ).
Para que a classe DriverManager possa selecionar o driver adequado conexo
solicitada (passo 1), necessrio que sua classe tenha sido carregada dinamicamente pela
JVM por meio do mtodo forName(String) da classe Class.
O cdigo abaixo apresenta o uso do mtodo getConnection() da classe
DriveMenager para que possamos especificar um driver para efetuar conexo ao
BD/SGBD:

60

Java bsico 2
A ilustrao da figura 25 apresenta os passos necessrios para a utilizao do
DriverManager dentro de uma aplicao Java com acesso a banco de dados.

Figura 25 Passos para utilizao do DriverManager.

6.6 Princpios das aplicaes JDBC


As operaes SQL de uma aplicao Java JDBC podem ser indicadas de 4 formas:
Interativa, representada por comandos SQL estticos;
Preparada, representada por comandos SQL preparados;
Em lote;
Acionamento de Stored Procedures.

61

Java bsico 2

6.6.1 Operao Interativa: comandos SQL estticos

Figura 26 Operao SQL interativa.

6.7 Statement
O objeto Statement permite o envio de comandos SQL ao banco de dados e a
obteno dos resultados produzidos por esses comandos.
A obteno dos objetos Statement feita pelo mtodo creadStatement() do objeto
Connection, e a execuo do comando SQL pelos mtodos executeQuery(),
executeUpdate() ou execute().
O objeto Statement possibilita a execuo de instrues SQL CRUD, sendo o
mtodo executeQuery() utilizado para instrues SELECT e os mtodos executeUpdate() e
execute() para instrues INSERT, UPDATE e DELETE. O uso deste objeto ilustrado
no passo 3 da figura 26.

6.8 ResultSet
O objeto ResultSet utilizado para armazenar o resultado dos comandos SQL
executados no Statement pelo mtodo executeQuery(). O acesso aos dados do ResultSet
feito pelo mtodos getXXX(), onde XXX pode ser um dos tipo JDBC apresentados a
seguir:

62

Java bsico 2

Figura 26 Mapeamento de Tipos entre JDBC e Java.

O objeto ResultSet representa uma espcie de tabela dinmica (matriz), com


cursores para navegao de suas linhas e colunas, onde linhas representam registros
(tuplas) e colunas representam os valores de cada um dos atributos (campos de dados)
retornados aps a execuo de instruo DML do tipo SELECT.
Os mtodos para navegao entre os registros de um objeto ResultSet so: first(),
last(), next(), previous(), beforeFirst(), absolute(<nReg>), getRow(), entre outros.
possvel obter o contedo de cada campo (colunas requisitadas da tabela) atravs dos
mtodos de acesso.
Por padro o objeto ResultSet no rolvel, possibilitando apenas a leitura de
primeiro para o ltimo registro nele armazenado com o uso do mtodo next() e
manipulao do dado com o uso do mtodo getXXX();

Figura 27 Mtodo de acesso a coluna de dados de um ResultSet.

O cdigo a seguir apresenta o uso de um objeto ResultSet para manipulao de


registros de uma tabela no banco de dados que foram retornados pela consulta SQL
executada pelo mtodo executeQuery() da classe Statement.

63

Java bsico 2

6.8.1 ResultSet rolvel e atualizvel


Um dos aprimoramentos interessantes, embora frequentemente ignorado,
implementado a partir do JDBC 2.0, a capacidade de "rolar" pelo ResultSet. Isso nos
possibilita a navegao para frente ou para trs, ou para ambas as direes ao mesmo
tempo, conforme necessrio. Para isso necessrio um avano, mas a chamada de JDBC
deve indicar que ela deseja um ResultSet no momento em que Statement criado.

O primeiro parmetro indica a "capacidade de rolagem" desejada no ResultSet,


pode ser um dos trs valores aceitos:

ResultSet.TYPE_FORWARD_ONLY: Esse o padro, o estilo de cursor fire hose

ResultSet.TYPE_SCROLL_INSENSITIVE: Esse ResultSet permite a iterao para


trs e para frente, mas se os dados no banco de dados forem alterados, o ResultSet
no a refletir. Esse ResultSet rolvel provavelmente o tipo desejado mais

que conhecemos e adoramos.

comum.

64

Java bsico 2

ResultSet.TYPE_SCROLL_SENSITIVE: O ResultSet criado no s permitir a

iterao bidirecional, como tambm fornecer uma visualizao "ativa" dos dados
no banco de dados quando forem alterados.

O cdigo a seguir exemplifica o uso de um ResultSet rolvel:

O segundo parmetro indica a "capacidade de atualizao" desejada no ResultSet,


pode ser um dos dois valores aceitos:

ResultSet.CONCUR_READ_ONLY: Esse o padro, o estilo de cursor

ResultSet.CONCUR_UPDATEABLE: Esse ResultSet permite a iterao e atualizao

leitura.

somente

de dados do ResultSet na tabela do banco de dados ao qual esta relacionada.

A possibilidade de atualizao de um banco de dados a partir de um objeto


ResultSet est disponvel a partir do JDBC 2.0 e suportada pela maioria dos bancos de
dados que disponibilizam driver JDBC. O cdigo a seguir exemplifica o uso de um
ResultSet rolvel e atualizvel.

65

Java bsico 2

6.8.2 Fechando Recursos


Depois de usadas, as conexes Connections, Statemets e ResultSets devem ser
fechadas. O mtodo close() existente nestas classes deve ser chamado sempre que um
destes recursos no forem mais necessrios dentro da execuo de uma aplicao Java com
acesso a banco de dados. O programador deve ter o cuidado de realizar a chamada deste
mtodo para no quebrar a conexo ou canal de execuo de uma instruo SQL no meio
de uma transao.
con.close();
st.close();
rs.close();

// con um objeto de Connection


// st um objeto de Statement
// rs um ojbeto de ResultSet

Exerccios de Fixao 6 Java JDBC


Qual a classe Java que possibilita a manipulao de dados resultantes de uma consulta SQL?
Quais so os mtodos de navegao de ponteiro disponibilizados por esta classe?

Atividade 1 Java JDBC


1. Todas as consultas a seguir se referem ao banco de dados empresa empresa.sql.
Escreva o comando DML para cada uma delas e mostre o resultado por meio de uma
classe executvel Java.
a. Mostre o primeiro nome e endereo de todos os empregados que trabalham
para o departamento Pesquisa.
b. Encontre os nomes (primeiro nome) de todos os empregados que so
diretamente supervisionados por Joaquim.
c. Faa uma lista dos nmeros e nomes de projetos que envolvam um
empregado cujo ltimo nome seja Will, mesmo que esse trabalhador seja o
gerente do departamento que controla o projeto.
66

Java bsico 2
d. Para todo projeto localizado em Araucaria, liste o nome do projeto, o
nome do departamento de controle e o ltimo nome, endereo e data de
nascimento do gerente do departamento.
e. Encontre o nome dos empregados que trabalham em todos os projetos
controlados pelo departamento nmero 5.
f. Para cada projeto, liste o nome do projeto e o total de horas por semana (de
todos os empregados) gastas no projeto.
g. Recupere os nomes de todos os empregados que trabalhem mais de 10 horas
por semana no projeto Automatizacao.
h. Recupere os nomes de todos os empregados que no trabalham em nenhum
projeto.
i. Recupere a mdia salarial de todos os empregados do sexo feminino.
j. Para cada departamento, recupere o nome do departamento e a mdia
salarial de todos os empregados que trabalham nesse departamento.

Atividade 2 Java JDBC


1. Encontre o nome e o endereo de todos os empregados que trabalhem em pelo menos
um projeto localizado em Curitiba, mas cujo departamento no se localiza em
Curitiba.
2. Liste os nomes de todos os empregados com dois ou mais dependentes.
3. Recupere o nome de empregados que no tenham dependentes.
4. Liste o ltimo nome de todos os gerentes de departamento que no tenham
dependentes.
5. Liste os nomes dos gerentes que tenham, pelo menos, um dependente.

7. Manipulando Resultados de Consultas


Nesta sesso iremos utilizar alguns recursos avanados de Java JDBC para
organizar a aplicao em camadas para possibilitar a manipulao de banco de dados.

67

Java bsico 2

7.1 Uso da classe Properties


Java disponibiliza uma classe onde podemos especificar algumas configuraes que
podem ser acessadas por uma determinada aplicao. A classe Proporties possibilita a
leitura de valores por meio de campos chave que esto armazenados num arquivo de
propriedades separado da aplicao. O arquivo de propriedades uma tima opo para
passar configuraes para uma determinada aplicao que necessitada de configuraes
externas. Um exemplo seria um programa que conecta a um banco de dados e precisa de
dados para realizar a conexo, sem que o cdigo fonte do mesmo seja alterado.
O arquivo de propriedade um arquivo simples salvo com a extenso .properties
que deve fazer parte da estrutura do projeto em desenvolvimento. Nos exemplos que
iremos estudar, o arquivo de propriedades estar dentro do pacote til. A seguir,
apresentamos a estrutura do arquivo de propriedades bancoDeDados.properties com um
par de identificador e valor que sero lidos pela aplicao java que necessita destas
informaes externas para seu funcionamento.

Uma vez criado o arquivo de propriedades, uma aplicao Java pode acess-lo e
realizar a leitura de cada um dos valores dos identificadores nele armazenados. Para isso
devemos utilizar o mtodo getProperty() da classe Properties conforme exemplo a seguir:

68

Java bsico 2

7.2 DAO e Java Bean


O padro Data Access Object ou padro DAO usado para separar a camada de
acesso ao banco de dados da regra de negcio da aplicao, ficando responsvel por
gerenciar a conexo com a fonte de dados.
O DAO deve implementar os mecanismos de acesso fonte de dados que se deseja
manipular na interface da aplicao em desenvolvimento. Os detalhes de sua
implementao no so de conhecimento do cliente.
Java Bean so classes que possuem o construtor padro (sem argumentos) e
mtodos de acesso getters e setters, podendo ser serializvel ou dando. A serializao
depende da fonte de dados utilizada.
Apresentamos a seguir um diagrama que ilustra o processo de criao da classe
Java Bean para possibilitar a construo da aplicao em camadas:

A prximo passo a criao da classe DAO correspondente a classe Java Bean


implementa. A DAO dever conter um mtodo para estabelecer conexo com a fonte de
dados e, no mnimo, mentos para realizao de operaes CRUD. A imagem a seguir
ilustra a criao de uma classe DAO.

69

Java bsico 2

Por fim, objetos das classes DAO e Java Bean sero utilizados no processo de
desenvolvimento da interface grfica para possibilitar a manipulao de dados
armazenados na fonte de dados. Este processo ilustrado na figura a seguir.

7.3 Instrues Preparadas


Instrues preparadas permitem pr-compilar uma instruo para depois poder
execut-la mais de uma vez, com uma performance melhor.
Como um objeto Statement, o objeto PreparedStatement obtido a partir de um
Connection:
70

Java bsico 2
PreparedStatement pstmt = con.prepareStatement(
insert into teste (cod, nome) values (?, ?));

Repare que h dois pontos de interrogao (?) na instruo. Isso so parmetros da


instruo, que devem ser preenchidos antes da sua execuo:
pstmt.setInt(1, 1);
pstmt.setString(2, Camila);

Onde o primeiro parmetro (1 e 2) a posio do parmetro. O segundo o valor a


ser colocado no lugar das interrogaes. Assim como as funes get*, as funes set*
podem inserir qualquer tipo de dados numa instruo preparada.
Depois de inseridos os parmetros, pode-se executar a consulta:
pstmt.executeUpdate();

Se fosse uma query (select) pode-se tambm usar:


pstmt.executeQuery();

7.4 Executando atualizaes em fontes de dados


Os mtodos int executeUpdate() e boolean execute() da classe Statement so
utilizados para executar instrues SQL no BD/SGBD como inserts, updates, create
table, entre outras. Instrues DDL e DML, com exceo do select, sero executadas por
meio destes mtodos. O trecho de cdigo abaixo apresenta o uso do mtodo
executeUpdate() que ir executar o comando DDL para criao de uma tabela chamada
teste com dois atributos.
st = con.createStatement();
st.executeUpdate("create table teste (cod int, nome char(50))");

Esse mtodo no retorna resultado, somente gera exceo caso haja erro.

71

Java bsico 2

7.5 Exemplo Java Bean

72

Java bsico 2

7.6 Exemplo DAO

73

Java bsico 2

7.7 Exemplo de Incluso

7.8 Exemplo de Alterao

74

Java bsico 2

7.9 Exemplo de Consulta

7.10 Exemplo de Excluso

75

Java bsico 2

Exerccio de Fixao 7 Manipulando Resultados de Consultas


Liste as principais classes que o Java disponibiliza no pacote java.sql necessrios para o
desenvolvimento de aplicaes Java que possibilitem acesso a banco de dados?

Atividade 1 Manipulando Resultados de Consultas


Desenvolva a aplicao em camadas (padro MVC).
1. Uma indstria deseja manter um banco de dados sobre a folha de pagamento mensal de
seus funcionrios. Para isso, lido de cada funcionrio: o nome, o salrio-base e uma
categoria funcional (numrica: 1-operrio, 2-administrativo ou 3-gerncia). Os dados
devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for
solicitado, o contracheque de um funcionrio deve ser exibido, com as seguintes
informaes: nome do funcionrio, salrio bruto (se da categoria 1, o prprio salriobase; se da categoria 2, o salrio-base + 5%; se da categoria 3, o salrio-base + 15%),
descontos (se salrio bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso
contrrio, 1% sobre o salrio bruto) e salrio lquido (salrio bruto descontos).
Desenvolva uma aplicao GUI em Java que apresente as seguintes opes:
c) Incluir (solicitao dos dados de um funcionrio e gravao de um registro
com os dados da folha de pagamento no arquivo).
d) Listar (leitura dos dados da folha de pagamento de um funcionrio do
arquivo, mostrando as informaes do contra-cheque).

76

Java bsico 2

Atividade 2 Manipulando Resultados de Consultas


1. Defina um novo banco de dados no PostgreSQL que dever possuir trs tabelas. A
primeira, denominada DEPARTAMENTO, dever conter o cdigo (valor inteiro) e seu
nome (literal). A segunda, denominada OCUPAO, dever conter o cdigo (valor
inteiro) e sua descrio (literal). A terceira, denominada FUNCIONRIO, dever
conter o nmero de registro do funcionrio (valor inteiro), o nome (literal), o cdigo de
ocupao, o cdigo do departamento em que est lotado.
2. Desenvolva um aplicao GUI em Java que apresente as seguintes opes para
manipulao do banco de dados implementado no enunciado 1 da atividade 2 Java
JDBC:
a) Uma tela (JFrame) que possibilite a manuteno de registros na tabela
DEPARTAMENTO (incluso, excluso, consulta, alterao);
b) Uma tela (JFrame) que possibilite a manuteno de registros na tabela
OCUPAO (incluso, excluso, consulta, alterao);
c) Uma tela (JFrame) que possibilite a manuteno de registros na tabela
FUNCIONRIO (incluso, excluso, consulta, alterao). Os dados das
tabelas relacionadas devero estar acessveis em objetos JComboBox;
d) Implementar uma classe executvel que disponibilize um Menu com opes
de acesso para as telas implementadas nos itens a, b e c.

77

Java bsico 2

78

Java bsico 2

8. Gerenciamento de Transaes
8.1 Stored Procedures
So procedimentos armazenados no banco de dados, prontas para execuo, que
podem ou no ter parmetros, e tambm podem ou no ter algum resultado.
Suponha que exista uma stored procedure no nosso banco, chamada:
consultaempregado, que recebe um parmetro, o cdigo de um funcionrio e retorna o
seu nome caso o encontre. A ilustrao abaixo apresenta o cdigo da stored procedure
implementada dentro de uma SGBD:

Para executar a stored procedure consultaempregado, a aplicao deve instanciar


um objeto da classe CallabeStatement, confirme ilustrao a seguir.

Quando se quer que a Stored Procedure retorne um valor, sem ser um parmetro de
retorno, a sintaxe da string dentro do prepareCall :
{?= call [,, ...]}

Nesse caso, a primeira interrogao ({ ?= ...) ter o ndice 1 para o

registerOutParameter.

Todos

os

parmetros

de

sada

(OUT)

devem

registerOutParameter, antes de chamar o procedimento.

Java.

ser

registrados

com

A ilustrao a seguir lista a sintaxe de chamada de stored procedures disponveis no

79

Java bsico 2

8.2 Transaes
Uma transao um conjunto de um ou mais comandos que so executados,
completados e ento validados (commit) ou cancelados (rollback). Quando uma transao
validada ou cancelada, outra transao se inicia.
A conexo em java , por default, auto-commit. Isso significa que sempre que um
comando executado, um commit executado no banco de dados. Se o comando autocommit for desabilitado, ento deve-se fazer explicitamente o commit ou rollback das
transaes. A maioria dos drivers JDBC suportam transaes.
Um exemplo de cdigo:
con.setAutoCommit(false);
Statement st = con.createStatement();
....
con.commit();
con.setAutoCommit(true);

O comando setAutoCommit aplicado conexo, e define se os commits e


rollbacks sero ou no efetuados automaticamente. Caso no sejam, a conexo
disponibiliza os comandos commit() e rollback().
O cdigo da ilustrao a seguir demonstra o uso de controle de transaes dentro de
uma aplicao Java.

80

Java bsico 2

8.3 Execuo em Batch


usado quando se tem muitas atualizaes para serem feitas no banco de dados.
Muitas vezes, atualizaes em batch so mais rpidas do que atualizaes feitas uma a
uma. Exemplo:
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Amaretto', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Amaretto_decaf', 49,
10.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut_decaf', 49,
10.99, 0, 0)");
int [] updateCounts = stmt.executeBatch();
con.commit();
con.setAutoCommit(true);

A linha:
con.setAutoCommit(false);

usada para desabilitar o auto-commit da conexo. Isso usado para que no


aconteam erros imprevistos na execuo do batch.
A linha de cdigo int [] updateCounts = stmt.executeBatch(); executa todos os
comandos que foram inseridos com addBatch, na ordem em que foram inseridos. Quando
terminados, esse mtodo retorna, para cada um dos comandos, a quantidade de linhas
81

Java bsico 2
afetas por eles (por isso que retorna um array de inteiros). Como o auto-commit foi
desligado, deve-se explicitamente efetuar o commit.
O cdigo da ilustrao a seguir demonstra o uso de controle de transaes dentro de
uma aplicao Java.

Exerccios de Fixao 8 Gerenciamento de Transaes


Liste os principais recursos que voc consegue identificar que sejam necessrios para o
desenvolvimento de aplicaes Java que possibilitem acesso a banco de dados?

82

Java bsico 2

Atividade 1 Gerenciamento de Transaes


1. Uma loja decidiu fazer o levantamento de informaes em relao aos produtos que
disponibiliza para venda, juntamente com informaes de seus fornecedores. Durante a
fase de especificao de requisitos e entrevistas com o usurio os analistas conseguiram
identificar a necessidade da criao da entidade Produto (nome, preo de compra, preo
de venda, estoque e estoque mnimo) e tambm a entidade Fornecedor (nome,
endereo, telefone, contato). Verificou-se tambm que a relao entre estas entidades
de (1:N), sendo necessria a criao de um relacionamento entre Produto e Fornecedor,
visto que um produto pode ser fornecido por apenas um fornecedor e um fornecedor
pode fornecer mais de um produto para esta empresa.
Desenvolva os problemas descritos abaixo:
2.1. Crie um banco de dados no PostgreSQL com o nome de estoque.
2.1.1. Crie as tabelas, com base nas estruturas de dados descritas anteriormente,
que iro compor o banco de dados no SGBD PostgreSQL.
2.2. Desenvolva uma aplicao GUI Java que disponibilize as seguintes
funcionalidades:
2.2.1. Classes modelos para cada uma das tabelas implementadas no banco de
dados da aplicao;
2.2.2. Classes DAO que iro possibilitar o acesso ao banco de dados para
manuteno de registros das tabelas implementadas no banco de dados da
aplicao;
2.2.3. Menu principal que possibilite acesso as telas para manuteno de registros
da tabela produto, fornecedor e tambm para relao entre produtofornecedor;
2.2.4. Tela que possibilite a manuteno de dados de produtos (incluso, alterao,
consulta, excluso).
2.2.5. Tela que possibilite a manuteno de dados de fornecedores (incluso,
alterao, consulta, excluso).
2.2.6. Tela que possibilite, atravs de cliques em botes, a visualizao dos
resultados das seguintes consultas SQL:
2.2.6.1. A mdia geral da quantidade em estoque dos produtos da empresa;
2.2.6.2. O nome e o contato do fornecedor do produto que tem o menor preo
de venda;
2.2.6.3. O nome do produto que tem o maior preo de compra, juntamente
com seu fornecedor e contato;
2.2.6.4. Para cada fornecedor, o total de produto que ele fornece;
2.2.6.5. A mdia dos preos de compra de cada um dos fornecedores
2.2.6.6. O total em R$ dos produtos armazenados na empresa, tendo como
base o preo de compra.

83

Java bsico 2

3. Atividade 2 Gerenciamento de Transaes


1. Uma indstria deseja manter um banco de dados sobre a folha de pagamento mensal de
seus funcionrios. Para isso, lido de cada funcionrio: o nome, o salrio-base e uma
categoria funcional (numrica: 1-operrio, 2-administrativo ou 3-gerncia). Os dados
devem ficar armazenados em uma tabela no PostgreSQL e a cada vez que for
solicitado, o contracheque de um funcionrio deve ser exibido, com as seguintes
informaes: nome do funcionrio, salrio bruto (se da categoria 1, o prprio salriobase; se da categoria 2, o salrio-base + 5%; se da categoria 3, o salrio-base + 15%),
descontos (se salrio bruto maior ou igual a 1000, 3% sobre o salrio bruto; caso
contrrio, 1% sobre o salrio bruto) e salrio lquido (salrio bruto descontos).
Desenvolva uma aplicao GUI em Java que apresente as seguintes opes:
a) Incluir (solicitao dos dados de um funcionrio e gravao de um registro
com os dados da folha de pagamento no arquivo).
b) Listar (leitura dos dados da folha de pagamento de um funcionrio do
arquivo, mostrando as informaes do contracheque).
2. A comisso organizadora de um campeonato de atletismo decidiu apurar os resultados
da competio atravs de um processamento eletrnico. De cada atleta so lidos:
cdigo de identificao, nome e o tempo gasto em cada uma das 5 provas que formam
a competio. Esses dados so armazenados em um arquivo. Ao final de cada prova, a
pontuao atribuda de acordo com o tempo realizado em cada prova (quem gastou
menos tempo est em 1 lugar) e feita da seguinte maneira: 1 colocado: 5 pontos, 2
colocado: 3 pontos e 3 colocado: 1 ponto. Essa pontuao atualizada na pontuao
geral do campeonato. Desenvolva uma aplicao GUI em Java que apresente as
seguintes opes:
a) Incluso dos dados (solicitao dos dados de um atleta e gravao de um
registro no arquivo).
b) Classificao (leitura dos dados dos atletas e processamento dos tempos e
pontos).

84

Java bsico 2

9. Biblioteca Jasper Relatrios


9.1 Biblioteca JasperReport
A biblioteca JasperReports uma biblioteca Java que oferece uma interface
amigvel para o mecanismo de gerao de relatrios. JasperReports considerada
atualmente o mecanismo de relatrios mais popular do mundo open source. totalmente
escrita em Java e capaz de usar dados provenientes de qualquer tipo de fonte de dados e
produzir documentos que podem ser visualizados, impressos ou exportados em uma
variedade de formatos de documentos, incluindo HTML, PDF, Excel, OpenOffice e Word.
A figura 27 ilustra a interface Ireport desenvolvida para facilitar o uso da bibliteca
JasperReports na gerao de relatrios em Java.

Figura 27 Interface do iReport.

O iReport uma ferramenta que foi desenvolvida com o intuito de facilitar a


construo de relatrios utilizando a biblioteca JasperReports por meio de uma interface
grfica desenvolvida em Java com o uso da biblioteca Swing. Ele dispe de um conjunto
de recursos que auxiliam no desenvolvimento de relatrios por meio de uma interface
amigvel e intuitiva.
Um aspecto importante do JasperReports que o layout do relatrio definido em
um arquivo XML, geralmente com a extenso .jrxml. Este XML possui todas as
informaes de formatao do relatrio e, alm disso, possui os campos que sero
preenchidos posteriormente, de acordo com a fonte de dados utilizada. Como dito
anteriormente, a fonte de dados pode variar, e ser uma tabela em uma base de dados, ou ser
um arquivo CSV, sendo que a formatao do relatrio ser a mesma em ambos os casos.
85

Java bsico 2
Os passos para gerar um relatrio so bem simples. O primeiro passo compilar o
relatrio em XML. Depois da compilao, o resultado um objeto do tipo JasperReport. O
prximo passo preencher o relatrio com os dados, e o resultado dessa etapa fica
armazenado em um objeto do tipo JasperPrint. Esse objeto j representa o relatrio
finalizado, a partir dele podemos enviar para impresso diretamente, ou podemos exportar
para um outro formato, como PDF por exemplo. O diagrama apresentado na figura 28
ilustra o processo completo.

Figura 28 Passos para gerao de relatrios.

Desta forma, os desenvolvedores do iReport pensaram em trs etapas que se fazem


necessrias para a criao de relatrios, que so:
1 etapa: Criao da conexo com o banco de dados ou com a fonte de dados a ser
utilizada na gerao do relatrio
2 etapa: Criao do novo relatrio, por meio da escolha de layout pr-definidos ou
pela criao de novos layouts. Nesta etapa que se trabalha a disposio dos contedos
selecionados da fonte de dados informada na etapa 1.
3 etapa: Visualizao do relatrio em desenvolvimento para verificar se as
informaes e sua disposio esto de acordo com o projetado para o relatrio e
desenvolvimento.
Por fim, aps a executao das trs etapas descritas anteriormente, o
programadador ter um arquivo que contm as informaes necessrias para que a
aplicao em desenvolvimento possa gerar relatrios de forma bem estruturada.

9.2 Exemplo de utilizao das etapas para criao de relatrios


9.2.1 1 Etapa Criao da conexo
Nesta etapa so apresentados os tipos de fontes de dados que podemos utilizar no
processo de desenvolvimento de relatrios no iReport. A figura 29 ilustra as fontes de
dados que podem ser utilizadas. Em nosso exemplo, utilizaremos uma fonte de dados
JDBC.

86

Java bsico 2

Figura 29 Interface de criao de fonte de dados para gerao de relatrios.

Selecione o tipo de fonte de dados Database JDBC connection e clique no boto


next para ter acesso tela de configurao de uma nova fonte de dados JDBC, conforme
ilustrado na figura 30.

87

Java bsico 2

Figura 30 Interface de configurao de fonte de dados JDBC.

Nesta tela dever ser informado o nome para esta nova fonte de dados, nome este
que ser utilizado pela biblioteca JasperReports para encontrar a fonte de dados para a
gerao do relatrio, bem como as informaes sobre o Driver JDBC, a URL com a
localizao da fonte de dados, e usurio e senha para autenticao da conexo com a fonte
de dados informada.
Utilize o boto TEST para testar se a conexo ser realizada com sucesso e, se
estiver tudo certo, clique no boto SAVE para salvar esta nova fonte de dados que ser
utilizada na gerao de relatrios na interface do iReport.

9.2.2 2 Etapa Criao da conexo


Nesta etapa so sero solicitadas as informaes para a contruo do relatrio em
desenvolvimento, tais como nome do relatrio, qual a fonte de dados, qual a consulta SQL
que ser utilizada para a gerao de relatrios que utilizam fonte de dados JDBC, dentre
outras. A figura 31 ilusta a interface inicial da 2 etapa do processo de criao de relatrios
na interface iReport.

88

Java bsico 2

Figura 31 Interface de configurao do layout do relatrio.

O primeiro passo a escolha do layout para a gerao do relatrio. O iReport


sugere alguns layouts que podemos utilizar para no processo de criao de relatrio, ou se
preferir o desenvolvedor pode optar por uma folha em banco que possibilita a criao do
relatrio sem a especificao de um layout inicial. Este uma opo que dar mais
trabalho na criao do relatrio.
No nosso exemplo iremos utilizar o layout Leaf Gray. Selecione este layout e
clique no boto Launch Report Wizard para dar incia s configuraes necessrias
gerao do relatrio.
O segundo passo a solicitao do nome e localizao do arquivo fonte de gerao
do layout do relatrio em desenvolvimento. Este arquivo tem a extenso .jrxml e o
arquivo que contem as informaes necessrias para a biblioteca JasperReports consigua
compilar o arquivo com o resultado do processo de desenvolvimento do relatrio que ser
utilizado na aplicao java em desenvolvimento. A figura 32 ilusta o segundo passo.

89

Java bsico 2

Figura 32 Interface para informar o nome e localizao do relatrio.

O terceiro passo onde se informa a fonte de dados para gerao do relatrio, bem
como a consulta que ser executada na fonte de dados. Inicialmente dever ser selecionada
a fonte de dados criada na primeira etapa e em seguida dever ser escrita a consulta SQL
que ir fornecer os dados para a gerao do relatrio, conforme ilustrado na figura 33.

Figura 33 Especificao dos dados para gerao do relatrio.

90

Java bsico 2
No quarto passo ser necessrio informar os campos de dados que sero
visualizados no relatrio em desenvolvimento. Neste ponto o iReport ir disponibilizar
para seleo apenas os campos informados com resultado da consulta SQL informada.
Selecione a ordem de incluso dos campos, sendo a orientao da esquerda para a
direita. A figura 34 ilusta a sequencia de campos selecionados para a gerao das linhas de
dados do relatrio.

Figura 34 Campos de dados do relatrio.

O passo cinco onde podemos informar os agrupadores de informaes do


relatrio, conforme ilustrado na figura 35.

91

Java bsico 2

Figura 35 Agrupadores de dados do relatrio.

O sexto ltimo passo informa que voc informou os dados de maneira correta
para a gerao de um novo relatrio na interface do iReport. Clique no boto Finalizar
para que voc possa visualizar o layout do relatrio desenvolvido.
Como resultado voc ir visualizar a rea de edio do layout do relatrio criado
para que voc possa fazer as alteraes necessrias para finalizar o relatrio a ser
disponibilizado na aplicao Java em desenvolvimento.
O relatrio que foi gerado apresenta um conjunto de camadas de informaes que
so conhecidas como sees, quais sejam:
1. Title: como o nome o indica, esta seo contm o ttulo do relatrio. Esta
informao s aparece na primeira pgina do relatrio;
2. Page Header: esta seo aparece no topo de cada pgina. Geralmente utilizada
para colocar datas, numerao de pginas, etc.;
3. Column Header: esta seo aparece no topo de cada coluna de dado de se
pretende imprimir no relatrio;
4. Detail: nesta rea sero colocadas as informaes para cada item de registro. O
JasperReports gera uma seo de detalhe para cada registro retornado pela consulta
realizada na fonte de dados do relatrio;
5. Column Footer: esta seo aparece ao final de cada coluna;
6. Page Footer: esta seo aparece ao final de cada pgina;
92

Java bsico 2
7. Last Page Footer: esta seo aparece ao final da ltima pgina;
8. Summary: esta seo aparece ao trmino do relatrio, logo aps o ltimo
registro.
A figura 36 ilustra o layout sugerido para a criao do relatrio onde voc poder
realizar alteraes no ttulo e rtulo das colunas de dados do relatrio em construo.

Figura 36 Layout criado pelo wizard do iReport.

J a figura 37 apresenta o relatrio aps as alteraes dos dados que sero


visualizados no relatrio quando este estiver disponvel dentro de uma aplicao Java.

Figura 37 Layout reconfigurado pelo programador.

93

Java bsico 2

9.2.3 3 Etapa Visualizao do relatrio


Aps, ou mesmo durante, a reconfigurao dos dados a serem visualizados no
relatrio, o iReport possibilita da visualizao para que possamos ter uma ideia de como
os dados sero visualizados aps a incluso deste relatrio dentro da aplicao Java em
desenvolvimento. A figura 38 ilustra o processo de visualizao interna, disponibilizada
pelo clique no boto Preview.

Figura 38 Layout reconfigurado pelo programador.

Por default, o iReport disponibiliza a visualizao interna. Voc pode configurar a


visualizao para PDF, por exemplo, clicando na opo de menu Perview do iReport e
selecionando a opo PDF Preview.
Outra possibilidade a visualizao do cdigo XML sendo gerado e que ser
utilizado pela biblioteca JasperReports para a gerao do relatrio dentro da aplicao
Java. O cdigo XML ilustrado na figura 39 parte do cdigo a ser utilizado para a gerao
do arquivo . jasper, que ser importado dentro da aplicao Java.

Figura 39 Cdigo XML iReport-JasperReports.

94

Java bsico 2

9.3 Incluindo relatrio na aplicao Java


Aps a construo do relatrio dentro da interface do iReport voc dever fazer a
incluso deste novo recurso dentro do projeto da aplicao Java em desenvolvimento. Para
isso voc dever copiar o arquivo .jasper resultante do processo de criao dentro do
iReport e importar as bibliotecas do JasperReports para dentro projeto em
desenvolvimento. As bibliotecas do JasperReports so:
commons-digester-2.1.jar
commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-javaflow-20060411.jar
commons-logging-1.1.jar
groovy-all-1.7.5.jar
jasperreports-4.7.0.jar
iText-2.1.7.jar
Estes arquivos encontram-se dentro da pasta ireport\modules\ext no diretrio de
instalao da interface iReport.
Lembre-se de importar a biblioteca de acesso ao banco de dados postgres para que
o relatrio possa estar acessando a fonte de dados que foi informada durante o processo de
desenvolvimento do relatrio dentro da interface iReport.
Aps a importao das bibliotecas voc dever desenvolver um programa Java e
nele fazer a chamada ao relatrio referenciado pelo arquivo com a extenso .jasper,
resultante do processo de criao dentro da interface iReport.

9.4 Classe Java para gerao de relatrio


Uma vez importadas as bibliotecas necessrias para o que o projeto em
desenvolvimento possa gerar relatrios. O cdigo Java a seguir representa a estrutura de
uma classe genrica para gerao e visualizao de relatrios criados tendo como base a
biblioteca JasperPrints. Esta classe recebe como parmetros o nome do arquivo que contm
nome e os valores de parmetros necessrios para gerao do relatrio, e retorno um objeto
da classe JasperPrint.

95

Java bsico 2

9.5 Gerando um relatrio na interface grfica


O prximo passo a criao de uma classe Java que possibilite ao usurio da
aplicao a visualizao do relatrio. O cdigo Java apresentado a seguir ilustra o processo
de criao da chamada de um relatrio criado com a biblioteca JarperReports.

O objeto map da classe HashMap responsvel por armazenar os valores dos


parmetros a serem tratados no relatrio. Ele deve ser informado mesmo que o relatrio
96

Java bsico 2
no v utilizar parmetros. A String src/reports/RelatorioEmpregados.jasper informa o
nome do relatrio que se deseja visualizar.
O mtodo viewReport() torna visvel o relatrio que foi gerado e referenciado pelo
objeto da classe JasperPrint.

9.6 Relatrio com Passagem de Parmetros


A biblioteca JarperReports possibilita a criao de relatrios que podem receber
valores como parmetros durante a chamada do relatrio e utiliz-los durante o processo
construo e posterior visualizao pelo usurio. A definio de variveis de relatrio torna
este processo possvel. Variveis de relatrio so utilizadas para armazenar e calcular
qualquer valor temporrio necessrio para o relatrio, tais como totais, subtotais, mdias,
ou para receber valores enviados da interface grfica que esta solicitao a gerao do
relatrio. Vejamos alguns detalhes importantes a respeito de variveis de relatrio:
O tipo de classe varivel (variable class type) tem que ser compatvel com o tipo
de campo (field type)
O tipo de clculo informa ao JasperReports como calcular a varivel. Neste caso,
configuramos como 'Sum', para achar a soma total de todos os valores do campo
emp_salary;
A expresso varivel representa o valor a ser avaliado no clculo. Esta expresso
pode ter vrios formatos:
Uma expresso Java (por exemplo, New Date());
$F para campos (por exemplo, "$F{salario}");
$V para variveis (por exemplo, "$V{media}");
$P para parmetros de relatrio;
$R para recursos localizados (localized resources).
O cdigo Java a seguir apresenta a configurao de parmetros dentro do HashMap
que sero recebidos pelo relatrio para que possam ser utilizados durante o processo de
gerao e posterior visualizao.
Cada entrada na HashMap dever conter um par chave/valor, sendo a chave o nome
do parmetro definido dentro da estrutura do relatrio e valor o contedo que ser enviado
para o relatrio processar.

97

Java bsico 2

Como resultado, teremos um relatrio que ir imprimir os valores de parmetros no


cabealho e tambm ir utiliz-los na montagem da consulta dinmica. A instruo SQL
apresentada na figura 40 foi informada como fonte de dados para a gerao do relatrio e
nela esto sendo informados os parmetros que sero utilizados como filtro, sendo os
parmetros enviados na chamada do relatrio na interface grfico do usurio.

Figura 40 Instruo SQL com parmetros no iReport.

98

Java bsico 2

Exerccios de Fixao 9 Biblioteca Jasper Relatrios


Liste os principais recursos (aplicativo, biblioteca de classes, etc.) que voc consegue
identificar para o desenvolvimento de relatrios em Java?

Atividade 1 Biblioteca Jasper Relatrios


1. Utilize a interface iReport para criar um relatrio que:

a. Liste os nomes de todos os empregados com dois ou mais


dependentes
/*
SELECT d.essn, e.pnome
FROM empregado e
INNER JOIN dependente d on d.essn = e.ssn
GROUP BY d.essn, e.pnome
HAVING count(d.essn) >=2 ;
*/
b. Para cada projeto, liste o nome do projeto e o total de
horas por semana (de todos os empregados) gastas no
projeto
/*
SELECT p.pjnome, SUM(t.horas)
FROM projeto p
INNER JOIN trabalha t ON t.pno = p.pnumero
GROUP BY t.pno, p.pjnome ;
*/

2. Desenvolva as interfaces grficas


implementados no enunciado 1.

necessrias

para

executar

os

relatrios

99

Java bsico 2

Atividade 2 Biblioteca Jasper Relatrios


1. Utilize a interface iReport para criar um relatrio que:
a. Liste todos os empregados cadastrados que tenha o sexo igual ao informado
pelo usurio na interface grfica.
b. Crie um grfico com o total de empregados por sexo.

100

Java bsico 2

10.

Bibliografia
DEITEL. Java Como Programar. 6a. ed. So Paulo: Pearson Prentice Hall, 2005.

HORSTMANN, Cay. CORNELL, Gary. Core Java 2 Fundamentals. The Sun


Microsystems Press Java Series. Vol. I. 2003.
JANDL Junior, Peter. Java Guia do Programador. So Paulo: Novatec, 2007.
POSTGRESQL.
The
Java
Tutorials.
Disponvel
http://docs.PostgreSQL.com/javase/tutorial/. Acessado em: 29 jan. 2013.

em:

SIERRA, Kathy; BATES, Bert. Certificao Sun Para Programador Java 6 Guia de
Estudo. So Paulo: Rio de Janeiro, 2008.

101