Professional Documents
Culture Documents
Sumário
2. Gerenciadores de Layout............................................1
Objetivos.....................................................................................2
Introdução...................................................................................3
FlowLayout..................................................................................4
BorderLayout..............................................................................6
GridLayout..................................................................................9
Exercícios..................................................................................11
6. Arquivos................................................. ...................1
I
Frameworks para interfaces gráficas
Objetivos.....................................................................................2
Introdução...................................................................................3
Hierarquia de Dados...................................................................4
Arquivos e Fluxos........................................................................7
Testando Arquivos.....................................................................13
Criando um Arquivo..................................................................16
Lendo Dados de um Arquivo.....................................................25
Gerenciamento de memória: Garbage Collector ......................34
Exercícios..................................................................................35
II
1.Frameworks para
interfaces gráficas
1
Frameworks para interfaces gráficas
Objetivos
• Conhecer os diferentes frameworks existentes para construção de
interfaces gráficas
• Enteder as relações e a evolução destes frameworks
• Conhecer as diferenças entre estes frameworks
2
Frameworks para interfaces gráficas
3
Frameworks para interfaces gráficas
Swing
As classes que são utilizadas para criar os componentes são parte dos
componentes GUI do Swing do pacote javax.swing. Esses são os mais novos
componentes GUI da plataforma do Java 2.
DICA: Uma forma fácil de diferenciar classes Swing de classes AWT é pelo
seu prefixo, todas classes Swing inicial com a letra “J”.
4
Frameworks para interfaces gráficas
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
5
Frameworks para interfaces gráficas
6
Frameworks para interfaces gráficas
Exercícios
7
Frameworks para interfaces gráficas
8
2.Gerenciadores de Layout
1
Tratamento de Eventos
Objetivos
• Apresentar os principais gerenciadores de layout de interface gráfica
• BorderLayout
• FlowLayout
• GridLayout
2
Tratamento de Eventos
Introdução
Gerenciador de
Descrição
Layout
Padrão para java.awt.Applet, java.awt.Panel e
FlowLayout javax.swing.JPanel. Coloca os componentes
seqüencialmente (da esquerda para a direita) na
ordem que foram adicionados. Também é possível
especificar a ordem dos componentes utilizando o
método add de Container que aceita um Component e
uma posição de índice inteiro como argumentos.
3
Tratamento de Eventos
FlowLayout
package com.targettrust.java.capitulo02;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public FlowLayoutDemo() {
layout.layoutContainer( c );
}
});
c.add( right );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 300, 75 );
setVisible(true);
}
5
Tratamento de Eventos
BorderLayout
package com.targettrust.java.capitulo02;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public BorderLayoutDemo() {
super( "BorderLayout Demo" );
layout = new BorderLayout( 5, 5 );
6
Tratamento de Eventos
Container c = getContentPane();
c.setLayout( layout );
b = new JButton[ names.length ];
c.add( b[ 0 ], BorderLayout.NORTH );
c.add( b[ 1 ], BorderLayout.SOUTH );
c.add( b[ 2 ], BorderLayout.EAST );
c.add( b[ 3 ], BorderLayout.WEST );
c.add( b[ 4 ], BorderLayout.CENTER );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
7
Tratamento de Eventos
8
Tratamento de Eventos
GridLayout
package com.targettrust.java.capitulo02;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public GridLayoutDemo() {
super( "GridLayout Demo" );
grid1 = new GridLayout( 2, 3, 5, 5 );
grid2 = new GridLayout( 3, 2 );
c = getContentPane();
c.setLayout( grid1 );
b = new JButton[ names.length ];
for (int i = 0; i < names.length; i++ ) {
b[ i ] = new JButton( names[ i ] );
b[ i ].addActionListener( this );
c.add( b[ i ] );
}
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 300, 150 );
setVisible(true);
}
9
Tratamento de Eventos
toggle = !toggle;
c.validate();
}
10
Tratamento de Eventos
Exercícios
11
Tratamento de Eventos
12
Tratamento de Eventos
3.Tratamento de Eventos
13
Tratamento de Eventos
Objetivos
• Entender como podem ser tratados os eventos na linguagem java
• Conhecer as principais interfaces para tratar eventos
• Criar uma aplicação e utilizar o mecanismo de tratamento de eventos
14
Tratamento de Eventos
Listeners
15
Tratamento de Eventos
16
Tratamento de Eventos
package com.targettrust.java.capitulo03;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public ExemploEventos() {
getContentPane().setLayout(new FlowLayout());
getContentPane().add(botao);
botao.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize( 350, 200 );
setVisible( true );
}
17
Tratamento de Eventos
1. Implementar a interface
18
Tratamento de Eventos
package com.targettrust.java.capitulo03;
import java.awt.*;
import javax.swing.*;
public DelegandoEventos() {
setTitle("Exemplo de Tratamento de Eventos");
setSize(400, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(botao);
botao.addActionListener(new TratandoEventos());
setVisible(true);
}
package com.targettrust.java.capitulo03;
import java.awt.event.*;
import javax.swing.*;
20
Tratamento de Eventos
package com.targettrust.java.capitulo03;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
getContentPane().setLayout(new FlowLayout());
getContentPane().add(botao);
botao.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
System.exit(0);
}
}
);
setSize(400, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
22
Tratamento de Eventos
Eventos de Mouse
23
Tratamento de Eventos
Observe que todos os sete métodos dessas duas interfaces devem ser
definidos pelo programador quando uma classe implementa as duas
interfaces.
package com.targettrust.java.capitulo03;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public MouseTracker() {
super( "Demonstrando Evento do mouse" );
statusBar = new JLabel();
24
Tratamento de Eventos
}
Código 3-5: Tratando eventos do mouse
Quando quaisquer dos outros cinco eventos ocorrem, eles exibem uma
mensagem na statusBar que inclui um String representando o evento que
ocorreu e as coordenadas onde o evento de mouse ocorreu.
26
Tratamento de Eventos
Classes Adaptadoras
ComponentListener ComponentAdapter
ContainerListener ContainerAdapter
FocusListener FocusAdapter
KeyListener KeyAdapter
MouseListener MouseAdapter
MouseMotionListener MouseMotionAdapter
WindowListener WindowAdapter
27
Tratamento de Eventos
package com.targettrust.java.capitulo03;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
addMouseMotionListener(
new MouseMotionAdapter() {
public void mouseDragged( MouseEvent e ) {
xValue = e.getX();
yValue = e.getY();
repaint();
}
}
);
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 300, 150 );
setVisible(true);
}
28
Tratamento de Eventos
29
Tratamento de Eventos
package com.targettrust.java.capitulo03;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public MouseDetails() {
super( "Mouse clicks and buttons" );
addMouseListener( new MouseClickHandler() );
setSize( 350, 150 );
show();
}
30
Tratamento de Eventos
xPos = e.getX();
yPos = e.getY();
String s = "Clicked " + e.getClickCount() + " vez(s)";
31
Tratamento de Eventos
do mouse.
32
Tratamento de Eventos
package com.targettrust.java.capitulo03;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public KeyDemo() {
super( "Demostrando eventos de mouse" );
textArea = new JTextArea( 10, 15 );
textArea.setText( "Pressione uma tecla " );
textArea.setEnabled( false );
addKeyListener( this );
getContentPane().add( textArea );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 350, 100 );
setVisible(true);
}
33
Tratamento de Eventos
34
Tratamento de Eventos
35
Tratamento de Eventos
Exercícios
36
Tratamento de Eventos
37
Tratamento de Eventos
38
4.Componentes para
Interface Gráfica
1
Acesso a Banco de Dados
Objetivos
• Apresentar os componentes mais utilizados em uma GUI Swing
2
Acesso a Banco de Dados
JFrame
Janelas em uma interface gráfica são áreas retangulares que podem ser
exibidas em qualquer área da tela.
import java.awt.event.*;
import javax.swing.JFrame;
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize( 400, 300 );
setVisible(true);
}
O método estático main esta presente para que o programa possa ser
executado. Apenas para relembrar, qualquer programa em uma aplicação Java
Swing (que não seja applet) inicia sua execução no método estático main.
Antes de a janela ser exibida, deve ser decidido o que o programa irá
realizar quando for efetuada uma operação de fechar a janela. No AWT fazia-se
necessário implementar um evento com o código responsável pela operação
de fechar a janela. No Swing foi criado um novo método que pode realizar
operações padroões de fechamento.
5
Acesso a Banco de Dados
JLabel
package com.targettrust.java.capitulo04;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public LabelTest() {
c.add( label3 );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 275, 170 );
setVisible(true);
}
6
Acesso a Banco de Dados
8
Acesso a Banco de Dados
JButton
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public ButtonTest() {
super( "Testando botões" );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
9
Acesso a Banco de Dados
c.add( fancyButton );
fancyButton.addActionListener( handler );
plainButton.addActionListener( handler );
pack();
setVisible(true);
}
11
Acesso a Banco de Dados
JTextField e JPasswordField
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public TextFieldTest() {
super( "Testando JTextField e JPasswordField" );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
text1 = new JTextField( 10 );
c.add( text1 );
12
Acesso a Banco de Dados
text1.addActionListener( handler );
text2.addActionListener( handler );
text2.addMouseListener( handler );
text3.addActionListener( handler );
addMouseWheelListener(handler);
password.addActionListener( handler );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 325, 100 );
setVisible(true);
}
if ( e.getSource() == text1 )
s = "text1: " + e.getActionCommand();
else if ( e.getSource() == text2 )
s = "text2: " + e.getActionCommand();
else if ( e.getSource() == text3 )
s = "text3: " + e.getActionCommand();
else if ( e.getSource() == password ) {
s = "password: " + e.getActionCommand();
}
JOptionPane.showMessageDialog( null, s );
}
13
Acesso a Banco de Dados
14
Acesso a Banco de Dados
15
Acesso a Banco de Dados
JTextArea
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public TextAreaTest() {
texto2 = new String("");
texto = new String("Digite aqui");
txtArea1 = new JTextArea(texto, 10, 15);
txtArea2 = new JTextArea(texto2, 10, 15);
c = getContentPane();
// Cria a JTextArea 1
c.add(txtArea1);
// Cria a JTextArea 2
c.add(txtArea2);
16
Acesso a Banco de Dados
copiarSelecionado.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
txtArea2.setText(txtArea1.getSelectedText());
}
}
);
17
Acesso a Banco de Dados
Além disso, são criados dois botões (conforme já visto no tópico sobre
JButton) os quais ao serem clicados realizam diferentes operações. Ambos os
botões inserem texto na segunda JTextArea através do método setText.
18
Acesso a Banco de Dados
JPanel
package com.targettrust.java.capitulo04;
import java.awt.*;
import javax.swing.*;
public Paineis() {
19
Acesso a Banco de Dados
getContentPane().setLayout(new BorderLayout());
setTitle("Exemplo de Paineis");
painelGrid.add(esquerda);
painelGrid.add(meio);
painelGrid.add(direita);
getContentPane().add(painelGrid, BorderLayout.SOUTH);
}
Código 4-6: Utilização de painéis com JPanel.
20
Acesso a Banco de Dados
JComboBox
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public ComboBoxTest() {
super( "JComboBox" );
Container c = getContentPane();
c.setLayout( new FlowLayout() );
images = new JComboBox( names );
images.setMaximumRowCount( 3 );
images.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
label.setIcon( icons[ images.getSelectedIndex() ] );
}
}
);
c.add( images );
label = new JLabel( icons[ 0 ] );
c.add( label );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 350, 100 );
setVisible(true);
}
21
Acesso a Banco de Dados
23
Acesso a Banco de Dados
Construindo Menus
24
Acesso a Banco de Dados
A classe JMenuBar tem por objetivo gerenciar uma barra de menus. Uma
barra de menus comumente é utilizada em aplicações, estando localizada
abaixo do título da janela.
25
Acesso a Banco de Dados
Segue o código fonte exemplo que foi utilizado para construção da tela
acima:
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public ExemploMenu() {
FlowLayout layout = new FlowLayout();
layout.setAlignment(FlowLayout.CENTER);
getContentPane().setLayout(layout);
barra.add(arquivo);
cor.add(azul);
cor.add(vermelho);
cor.add(verde);
barra.add(cor);
setJMenuBar(barra);
texto.setText("Curso Java");
texto.setSize(100, 14);
texto.setForeground(Color.BLUE);
getContentPane().add(texto);
26
Acesso a Banco de Dados
new ActionListener() {
public void actionPerformed(ActionEvent e) {
texto.setForeground(Color.BLUE);
}
}
);
vermelho.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
texto.setForeground(Color.RED);
}
}
);
verde.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
texto.setForeground(Color.GREEN);
}
}
);
sair.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
);
setVisible(true);
}
27
Acesso a Banco de Dados
28
Acesso a Banco de Dados
Utilizando JRadioButtonMenuItem
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public ExemploMenuRadioButton() {
FlowLayout layout = new FlowLayout();
layout.setAlignment(FlowLayout.CENTER);
getContentPane().setLayout(layout);
grupo.add(azul);
29
Acesso a Banco de Dados
grupo.add(verde);
grupo.add(vermelho);
cores.add(azul);
cores.add(verde);
cores.add(vermelho);
barra.add(cores);
setJMenuBar(barra);
Este código fará com que sejam exibidos três itens radio no menu
permitindo a seleção de apenas um destes.
30
Acesso a Banco de Dados
JCheckBoxMenuItem
package com.targettrust.java.capitulo04;
import java.awt.*;
import javax.swing.*;
public ExemploMenuCheckBox() {
estilo.add(negrito);
estilo.add(italico);
31
Acesso a Banco de Dados
estilo.add(sublinhado);
barra.add(estilo);
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setJMenuBar(barra);
setVisible(true);
}
32
Acesso a Banco de Dados
JPopupMenu
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public PopupMenu() {
setTitle("Exemplo de JPopupMenu");
getContentPane().setLayout(null);
33
Acesso a Banco de Dados
getContentPane().add(popupMenu);
if(item.equals("Novo")) {
JOptionPane.showMessageDialog(getContentPane(),
"Você clicou em Novo");
} else if(item.equals("Abrir")) {
JOptionPane.showMessageDialog(getContentPane(),
"Você clicou em Abrir");
} else if(item.equals("Salvar")) {
JOptionPane.showMessageDialog(getContentPane(),
"Você clicou em Salvar");
} else if(item.equals("Sair")) {
System.exit(0);
}
}
}
Código 4-11: Exemplo de utilização de JPopupMenu
34
Acesso a Banco de Dados
35
Acesso a Banco de Dados
36
Acesso a Banco de Dados
JOptionPane
package com.targettrust.java.capitulo04;
import javax.swing.*;
import java.awt.Dimension;
37
Acesso a Banco de Dados
setSize(400, 300);
setVisible(true);
JOptionPane.showMessageDialog(getContentPane(), "Mensagem de teste",
"Titulo da mensagem", JOptionPane.INFORMATION_MESSAGE);
}
38
Acesso a Banco de Dados
package com.targettrust.java.capitulo04;
import java.awt.Dimension;
import javax.swing.*;
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 300);
show();
JOptionPane.showConfirmDialog(getContentPane(), "Confirma?");
}
package com.targettrust.java.capitulo04;
import java.awt.Dimension;
import javax.swing.*;
public OptionDialog() {
setSize(400, 300);
setTitle("Exemplo de Dialogo");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
int selecionado = JOptionPane.showOptionDialog(getContentPane(),
"Existem registros não salvos.", "Sair",
39
Acesso a Banco de Dados
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
}
}
Cóldigo 4-14: Utilização de JOptionDialog().
40
Acesso a Banco de Dados
JTable
package com.targettrust.java.capitulo04;
import java.awt.*;
import javax.swing.*;
Object[][] dados = {
{new Integer(1), "Maça", "Vermelho"},
{new Integer(2), "Banana", "Amarelo"},
{new Integer(3), "Limão", "Verde"}
};
}
Código 4-15: Exemplo de JTable simples.
41
Acesso a Banco de Dados
Montada a origem dos dados, é criado o objeto JTable que recebe como
parâmetros os dados obtidos nas linhas anteriores (o vetor e a matriz). Em
seguida é definido o tamanho da tabela.
42
Acesso a Banco de Dados
43
Acesso a Banco de Dados
JScrollPane
package com.targettrust.java.capitulo04;
import java.awt.*;
import javax.swing.*;
public ExemploScroll() {
c = getContentPane();
getContentPane().setLayout(new BorderLayout());
setTitle("Exemplo de JScrollPane");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 300);
setVisible(true);
}
44
Acesso a Banco de Dados
O JScrollPane permite que sejam criadas regras para exibição ou não das
barras de rolagem, estas regras são definidas através dos seguintes métodos
que recebem os parâmetros (constantes) indicados nas tabelas seguintes:
setHorizontalScrollBarPolicy
HORIZONTAL_SCROLLBAR_AS_NEED Barra de rolagem exibida
ED somente quando necessário.
HORIZONTAL_SCROLLBAR_ALWAYS Barra de rolagem exibida
independente da necessidade.
HORIZONTAL_SCROLLBAR_NEVER Barra de rolagem nunca é
exibida.
Tabela 4-7: Regras para exibição de bara de rolagem horizontal
setVerticalScrollBarPolicy
VERTICAL_SCROLLBAR_AS_NEEDED Barra de rolagem exibida
somente quando necessário.
VERTICAL_SCROLLBAR_ALWAYS Barra de rolagem exibida
independente da necessidade.
VERTICAL_SCROLLBAR_NEVER Barra de rolagem nunca é
exibida.
Tabela 4-8: Regras para exibição de bara de rolagem vertical
45
Acesso a Banco de Dados
JFileChooser
O Look And Feel irá determinar o que será exibido de opções nestas caixas
de diálogo.
package com.targettrust.java.capitulo04;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public Arquivo() {
c = getContentPane();
c.setLayout(null);
setTitle("Exemplo de JFileChooser");
botao.addActionListener(
new ActionListener() {
46
Acesso a Banco de Dados
}
Código: 4-19: Exemplo de utilização de JFileChooser.
file.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
Código 4-20: Exemplo de seleção de diretórios com JFileChooser.
47
Acesso a Banco de Dados
Exercícios
48
Acesso a Banco de Dados
49
5.Look And Feel
1
Acesso a Banco de Dados
Objetivos
• Conhecer o funcionamento do Look And Feel
• Aplicar o recurso de Look And Feel na aplicação
2
Acesso a Banco de Dados
Aparência e Comportamento
package com.target.swing.capitulo05;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
3
Acesso a Banco de Dados
public LookAndFeelDemo() {
super( "Look and Feel Demo" );
Container c = getContentPane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize( 300, 200 );
setVisible(true);
4
Acesso a Banco de Dados
}
Código 5-1: Exemplo de utilização de Look And Feel
# Swing properties
swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel
5
Acesso a Banco de Dados
Exercícios
JFrame.setDefaultLookAndFeelDecorated(true);
6
Acesso a Banco de Dados
7
Acesso a Banco de Dados
8
6.Arquivos
1
Acesso a Banco de Dados
Objetivos
• Apresentar os fluxos de dados:
• InputStream
• OutputStream
• Serializar objetos
2
Acesso a Banco de Dados
Introdução
3
Acesso a Banco de Dados
Hierarquia de Dados
4
Acesso a Banco de Dados
• Nome
• Endereço
• Salário-hora
Não é incomum uma empresa ter muitos arquivos, que contêm alguns
milhões, ou mesmo bilhões, de caracteres de informações.
5
Acesso a Banco de Dados
6
Acesso a Banco de Dados
Arquivos e Fluxos
7
Acesso a Banco de Dados
java.lang.Object
File
FileDescriptor
InputStream
ByteArraylnputStream
FilelnputStream
FilterlnputStream
BufferedlnputStream
DatalnputStream
PushbacklnputStream
ObjectlnputStream
PipedlnputStream
SequencelnputStream
OutputStream
ByteArrayOutputStream
FileOutputStream
FilterOutputStream
BufferedOutputStream
DataOutputStream
PushbackOutputStream
ObjectOutputStream
PipedOutputStream
Na verdade, temos utilizado a saída PrintStream por todo o texto até este
ponto; System.out é um PrintStream (assim como System.err).
A medida que o programa solicita cada novo trecho dos dados, é feita
uma busca no buffer (isso é ás vezes referido como uma operação lógica de
entrada).
9
Acesso a Banco de Dados
testBufferedoutputStream.flush();
Uma vez que o programa determinou que o agregado atual está completo,
o caractere extra é reinserido (“pushed back”) no fluxo. PushBackInputStreams
são utilizados por programas como compiladores que analisam sintaticamente
(parse) suas entradas, isto é, eles as dividem em unidades significativas (como
palavras-chave, identificadores e operadores que o compilador Java deve
reconhecer).
Esse objeto, então, pode sofrer coerção para o tipo desejado. Além disso,
essas interfaces incluem outros métodos centrados em Object, bem como os
mesmos métodos que DataInput e DataOutput para leitura e gravação de tipos
de dados primitivos.
10
Acesso a Banco de Dados
Um programa pode inserir uma linha inteira por vez do fluxo de entrada
em um array de byte. Então uma rotina de validação pode escrutinar o
conteúdo do array de byte e corrigir os dados, se necessário.
11
Acesso a Banco de Dados
12
Acesso a Banco de Dados
Testando Arquivos
package com.targettrust.java.capitulo06;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public FileTest() {
super( "Testando a classe File" );
Container c = getContentPane();
ScrollPane p = new ScrollPane();
p.add( output );
c.add( enter, BorderLayout.NORTH );
c.add( p, BorderLayout.CENTER );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setSize( 400, 400 );
setVisible(true);
}
// Se existe o arquivo
if ( name.exists() ) {
output.setText(
name.getName() + " existe\n" +
( name.isFile() ? "é um arquivo\n" : "é um arquivo\n" ) +
( name.isDirectory() ? "is a directory\n" : "é um diretório\n") +
( name.isAbsolute() ? "is absolute path\n" : "não é um caminho
absoluto\n" ) +
"\nÚltima modificação: " + name.lastModified() +
"\nTamanho: " + name.length() +
"\nCaminho: " + name.getPath() +
"\nCaminho absoluto: " + name.getAbsolutePath() +
13
Acesso a Banco de Dados
if ( name.isFile() ) {
try {
RandomAccessFile r = new RandomAccessFile( name, "r" );
StringBuffer buf = new StringBuffer();
String text;
output.append( "\n\n" );
while( ( text = r.readLine() ) != null ) {
buf.append( text + "\n" );
}
output.append( buf.toString() );
}
catch( IOException e2 ) {
JOptionPane.showMessageDialog( this, "FILE ERROR",
"FILE ERROR", JOptionPane.ERROR_MESSAGE );
}
}
else if ( name.isDirectory() ) {
String directory[] = name.list();
output.append( "\n\nConteúdo do diretório:\n");
for ( int i = 0; i < directory.length; i++ )
output.append( directory[ i ] + "\n" );
}
}
else {
JOptionPane.showMessageDialog(this, e.getActionCommand()+
" Não existe","FILE ERROR",JOptionPane.ERROR_MESSAGE);
}
}
public static void main( String args[] ) {
FileTest app = new FileTest();
}
}
14
Acesso a Banco de Dados
15
Acesso a Banco de Dados
Criando um Arquivo
package com.targettrust.java.capitulo06;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public BankUI() {
this( 4 );
}
16
Acesso a Banco de Dados
innerPanelSouth.add( doTask2 );
innerPanelSouth.add( doTask );
return values;
}
17
Acesso a Banco de Dados
package com.targettrust.java.capitulo06;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public BankAccountRecord() {
this( 0, "", "", 0.0 );
}
18
Acesso a Banco de Dados
return balance;
}
package com.targettrust.java.capitulo06;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public CreateFile() {
super( "Creating a Sequential File of Objects" );
getContentPane().setLayout( new BorderLayout() );
userInterface = new BankUI();
enter = userInterface.getDoTask();
enter.setText( "Enter" );
enter.setEnabled( false );
enter.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
addRecord();
}
});
addWindowListener(
19
Acesso a Banco de Dados
new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
if(output != null) {
addRecord();
closeFile();
}
System.exit( 0 );
}
});
open = userInterface.getDoTask2();
open.setText( "Save As" );
open.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
openFile();
}
});
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY );
if ( result == JFileChooser.CANCEL_OPTION ) {
return;
}
21
Acesso a Banco de Dados
FILES_AND_DIRECTORIES e DIRECTORIES_ONLY.
22
Acesso a Banco de Dados
23
Acesso a Banco de Dados
24
Acesso a Banco de Dados
25
Acesso a Banco de Dados
package com.targettrust.java.capitulo06;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public ReadFile() {
super( "Reading a Sequential File of Objects" );
getContentPane().setLayout( new BorderLayout() );
userInterface = new BankUI();
nextRecord = userInterface.getDoTask();
nextRecord.setText( "Next Record" );
nextRecord.setEnabled( false );
nextRecord.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
readRecord();
}
}
);
addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
if ( input != null ) {
closeFile();
}
System.exit( 0 );
}
}
);
open = userInterface.getDoTask2();
open.setText( "Open File" );
open.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
openFile();
}
}
);
26
Acesso a Banco de Dados
catch ( IOException e ) {
JOptionPane.showMessageDialog( this, "Error closing file",
"Error", JOptionPane.ERROR_MESSAGE );
System.exit( 1 );
}
}
public static void main( String args[] ) {
new ReadFile();
}
if ( result == JFileChooser.CANCEL_OPTION ) {
return;
}
package com.targettrust.java.capitulo06;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
public CreditInquiry(){
buttonPanel.add( open );
credit = new JButton( "Credit balances" );
credit.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
accountType = e.getActionCommand();
readRecords();
}
}
);
buttonPanel.add( credit );
debit = new JButton( "Debit balances" );
debit.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
30
Acesso a Banco de Dados
accountType = e.getActionCommand();
readRecords();
}
}
);
buttonPanel.add( debit );
zero = new JButton( "Zero balances" );
zero.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
accountType = e.getActionCommand();
readRecords();
}
}
);
buttonPanel.add( zero );
done = new JButton( "Done" );
buttonPanel.add( done );
done.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
if ( fileInput != null ) closeFile();
System.exit( 0 );
}
}
);
debit.setEnabled( true );
zero.setEnabled( true );
}
catch ( IOException e ) {
JOptionPane.showMessageDialog( this, "File does not exist",
"Invalid File Name",
JOptionPane.ERROR_MESSAGE );
}
}
}
BankAccountRecord record;
DecimalFormat twoDigits = new DecimalFormat( "0.00" );
openFile( false );
try {
recordDisplay.setText( "The accounts are:\n" );
while ( true ) {
record = ( BankAccountRecord ) input.readObject();
if ( shouldDisplay( record.getBalance() ) )
recordDisplay.append( record.getAccount() + "\t" +
record.getFirstName() + "\t" +
record.getLastName() + "\t" +
twoDigits.format( record.getBalance()
) + "\n" );
}
}
33
Acesso a Banco de Dados
Não há funções free() ou delete() em Java, tal como elas existem em C++.
Para forçar a marcação de um objeto simplesmente remova todas as
referências para este objeto, atribuindo null para todas as referências.
34
Acesso a Banco de Dados
Exercícios
35
7.Acesso a Banco de Dados
1
Objetivos
• Conectar um banco de dados usando Java Database Connectivity
(JDBC)
• Executar comandos
1
Acesso a Banco de Dados
Introdução
• Client-based Driver
• Server-based Driver
2
Acesso a Banco de Dados
JDBC Drivers
Por comunicar com o banco de dados, o driver usa uma versão leve do
SQL*Net ou Net8 em cima da camada TCP/IP que pode ser carregado em
tempo de execução.
3
Acesso a Banco de Dados
Há três drivers: o OCI 7 para Oracle7, o OCI 8 para Oracle8/8i e OCI 9 para
Oracle 9i. Cada um dos drivers OCI que usa uma biblioteca de ligação dinâmica
(DLL) deve ser instalado no sistema do cliente. Estes drivers convertem
chamadas de JDBC à Oracle Call Interface (OCI). As chamadas de OCI são
enviadas por SQL*Net ou Net8/9 para o banco de dados.
Você deve usar um dos drivers OCI se você está desenvolvendo um cliente
ou uma aplicação no servidor de aplicação e precisa do máximo de
performance.
4
Acesso a Banco de Dados
Server-Side Driver
5
Acesso a Banco de Dados
6
Acesso a Banco de Dados
Applet Thin
Thin
7
Acesso a Banco de Dados
JDBC URLs
JDBC usa uma URL para identificar a conexão de banco de dados. A URL
de um JDBC é um pouco diferente de uma URL de HTTP ou FTP, mas como
qualquer URL, é um localizador de recursos, neste caso, de um banco de
dados. A estrutura de um URL de JDBC é flexível, permitindo assim que cada
jdbc:<subprotocol>:<subname>
8
Acesso a Banco de Dados
Thin Driver
jdbc:oracle:thin:@<host>:<porta>:<SID>
<driver>: thin
<database>: é uma strinig formada por <host>:<port>:<sid>
jdbc:db2://<host>:<porta>/<DBName>
<driver>: thin (IBM)
<database>: é uma strinig formada por
<host>:<port>/<DBName>.
Por exemplo:jdbc:db2://serverHostname:port/databaseName
9
Acesso a Banco de Dados
OCI Driver
jdbc:oracle:oci8:@<TNSNAMES>
<driver> é oci8/oci7, dependende de qual driver é utilizado.
<database> é uma entrada de TNSNAMES no arquivo de
tnsnames.ora.
10
Acesso a Banco de Dados
jdbc:oracle:DBName
<driver> é DBName. Você não especifica um banco de dados,
porque o driver é amarrado a um banco de dados específico.
jdbc:db2:DBName
<driver> é DBName. Você não especifica um banco de dados,
porque o driver é amarrado a um banco de dados específico.
11
Acesso a Banco de Dados
• Query
• Process Results
• Close
12
Acesso a Banco de Dados
Etapa 1: Connect
• Registrar o driver
import java.sql.*;
DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(URL, userId,
password);
13
Acesso a Banco de Dados
Carregando o Driver
Class C = class.forName
(“oracle.jdbc.driver.OracleDriver”); //Ou
Class C = class.forName
(“COM.ibm.db2.jdbc.net.DB2Driver”);
14
Acesso a Banco de Dados
Exceções
• X/Open SQLState
15
Acesso a Banco de Dados
Etapa 2: Query
• Cria o comando
• Executa a query
16
Acesso a Banco de Dados
Statement
Um objeto Statement envia seu comando SQL para banco de dados. Você
precisa de uma conexão ativa para criar uma declaração de JDBC. A
Declaração tem dois métodos para executar uma query no banco de dados:
• executeQuery () para QUERY
17
Acesso a Banco de Dados
Objetos e Interfaces
18
Acesso a Banco de Dados
• Execute a query
Por exemplo:
19
Acesso a Banco de Dados
20
Acesso a Banco de Dados
ResultSet
Para query que não foi especificado o nome da coluna é melhor usar
números de coluna. ResultSet provê um método chamado findColumn() que
devolve o número da coluna para um determinado nome de coluna. O método
getString() pode ser usado para recuperar qualquer tipo de dados. É o método
mais fácil para ser usado em aplicações visuais, quando se quer exibir ou
imprimir os dados. Também pode ser usado quando o usuário monta o
comando SQL de alteração utilizando a declaração SQL UPDATE.
21
Acesso a Banco de Dados
Processando os Resultados
Por exemplo:
while (rset.next ( ) ) {
22
Acesso a Banco de Dados
Etapa 4: Close
• Encerrando a interação com o banco de dados
23
Acesso a Banco de Dados
24
Acesso a Banco de Dados
Você tem que fechar todo o ResultSet explicitamente como também sua
declaração. O método close() limpa a memória e os cursores de banco de
dados, assim se você não fecha seu ResultSet explicitamente e sua
declaração, você pode ter sérios problemas de memória.
25
Acesso a Banco de Dados
MetaData
26
Acesso a Banco de Dados
Tipo de Dados
27
Acesso a Banco de Dados
DriverManager
DriverManager provê acesso a drivers JDBC registrados. DriverManager
entrega conexões a uma fonte de dados especificada por seu método
getConnection().
Connection
A classe Connection é disponibilizada pelo driver JDBC. A Connection
representa uma sessão com um banco de dados. A Conexão é usada para criar
um objeto Statement, usando createStatement().
Statement
Statement executa comandos SQL. Por exemplo, podem ser executadas
querys usando o método executeQuery() e os resultados são disponibilizados
em ResultSet.
ResultSet
JDBC devolve os resultados de uma query em um objeto de ResultSet. Um
ResultSet mantém um cursor. O método next() move o cursor para o próximo
registro. ResultSet tem métodos getXXX() para recuperar valores de colunas.
DatabaseMetaData e ResultSetMetaData
DatabaseMetaData e ResultSetMetaData devolvem metadata sobre o
banco de dados e ResultSet respectivamente. Chame getMetaData() na
Connection ou no ResultSet.
28
Acesso a Banco de Dados
package com.targettrust.java.capitulo07;
import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public TableDisplay() {
try{
/* Conexão com outros bancos
* Class.forName( "COM.ibm.db2.jdbc.app.DB2Driver");
* Class.forName( "COM.ibm.db2.jdbc.net.DB2Driver");
* Class.forName( "org.postgresql.Driver");
***
* Criação de um objeto do driver:
* DriverManager.registerDriver(
new org.postgresql.Driver()
);
*/
Class.forName( "oracle.jdbc.driver.OracleDriver");
getTable();
setTitle("Oracle Connection");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize( 450, 150 );
setVisible(true);
}
private void displayResultSet( ResultSet rs ) throws SQLException {
boolean moreRecords = rs.next();
if ( ! moreRecords ){
JOptionPane.showMessageDialog( this, "ResultSet contained no
records" );
return;
}
Vector columnHeads = new Vector();
Vector rows = new Vector();
try {
do {
rows.addElement( getNextRow( rs, rsmd ) );
} while ( rs.next() );
return currentRow;
}
30
Acesso a Banco de Dados
try {
String query = "SELECT * FROM Emp";
statement = connection.createStatement();
resultSet = statement.executeQuery( query );
displayResultSet( resultSet );
}
catch ( SQLException sqlex ) {
try {
statement.close();
connection.close();
sqlex.printStackTrace();
}
catch (SQLException e) {}
}
}
31
Acesso a Banco de Dados
http://java.sun. com/products/jdbc/
32
Acesso a Banco de Dados
34
Acesso a Banco de Dados
Esse diálogo é utilizado para registrador nosso User Data Source Name
(User DSN). Certifique-se de que a guia User DSN esteja selecionada, então
clique em Add para exibir o diálogo Create new Data Source. Como estamos
utilizando um banco de dados do Microsoft Access, selecionamos Microsoft
Access Driver e clicamos em Finish.
35
Acesso a Banco de Dados
36
Acesso a Banco de Dados
package com.targettrust.java.capitulo07;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public AddressBook() {
super( "Address Book Database Application" );
Container c = getContentPane();
scrollArea = new ScrollingPanel();
output = new JTextArea( 6, 30 );
c.setLayout( new BorderLayout() );
c.add( new JScrollPane( scrollArea ), BorderLayout.CENTER );
textpane = new JScrollPane( output );
c.add( textpane, BorderLayout.SOUTH );
try {
url = "jdbc:odbc:AddressBook";
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
connect = DriverManager.getConnection( url );
output.append( "Connection successful\n" );
}
catch ( ClassNotFoundException cnfex ) {
cnfex.printStackTrace();
output.append( "Connection unsuccessful\n" +
cnfex.toString() );
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
output.append( "Connection unsuccessful\n" +
sqlex.toString() );
}
catch ( Exception ex ) {
ex.printStackTrace();
output.append( ex.toString() );
}
37
Acesso a Banco de Dados
package com.targettrust.java.capitulo07;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
fields.address.setText( "" );
fields.city.setText( "" );
fields.state.setText( "" );
fields.zip.setText( "" );
fields.country.setText( "" );
fields.email.setText( "" );
fields.home.setText( "" );
fields.fax.setText( "" );
}
}
else output.append( "\nEnter at least first and last name
then press Add\n" );
statement.close();
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
output.append( sqlex.toString() );
}
}
}
39
Acesso a Banco de Dados
package com.targettrust.java.capitulo07;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
package com.targettrust.java.capitulo07;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
if ( !fields.id.getText().equals( "" ) ) {
String query = "UPDATE addresses SET " +
"firstname='" + fields.first.getText() +
"', lastname='" + fields.last.getText() +
"', address='" + fields.address.getText() +
"', city='" + fields.city.getText() +
"', stateorprovince='" +
fields.state.getText() +
"', postalcode='" + fields.zip.getText() +
"', country='" + fields.country.getText() +
"', emailaddress='" +
fields.email.getText() +
"', homephone='" + fields.home.getText() +
"', faxnumber='" + fields.fax.getText() +
"' WHERE id=" + fields.id.getText();
41
Acesso a Banco de Dados
fields.first.setText( "" );
fields.last.setText( "" );
fields.address.setText( "" );
fields.city.setText( "" );
fields.state.setText( "" );
fields.zip.setText( "" );
fields.country.setText( "" );
fields.email.setText( "" );
fields.home.setText( "" );
fields.fax.setText( "" );
}
statement.close();
}
else output.append( "\nYou may only update an " +
"existing record. Use Find to " +
"locate the record, then " +
"modify the information and " +
"press Update.\n" );
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
output.append( sqlex.toString() );
}
}
}
package com.targettrust.java.capitulo07;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
42
Acesso a Banco de Dados
package com.targettrust.java.capitulo07;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
package com.targettrust.java.capitulo07;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public ScrollingPanel() {
labelPanel = new JPanel();
labelPanel.setLayout( new GridLayout( labels.length, 1 ) );
id = new JTextField( 20 );
id.setEditable( false );
fieldsPanel.add( id );
add( labelPanel );
add( fieldsPanel );
}
}
44
Acesso a Banco de Dados
package com.targettrust.java.capitulo07;
import java.awt.*;
import java.awt.event.*;
45
Acesso a Banco de Dados
46
Acesso a Banco de Dados
47
Acesso a Banco de Dados
Processamento de Transações
48
Acesso a Banco de Dados
Exercícios
49