Escolar Documentos
Profissional Documentos
Cultura Documentos
Programacao Visual em Java
Programacao Visual em Java
bom salientar que o Swing no substitui o AWT, mas o kit de ferramentas GUI mais utilizado
para desenvolvimento de aplicaes visuais. O AWT continua existindo, mantendo a mesma
arquitetura criada para o Java verso 1.1.
O Swing possui muito mais recursos, alm de garantir maior portabilidade e, em boa parte dos
casos, mais fcil de usar. Isso no significa que ou se utiliza AWT ou se utiliza Swing,
normalmente o que acontece que elementos das duas bibliotecas so utilizados conjuntamente
nas aplicaes.
Referente a criao das aplicaes, exitem muitas ferramentas que auxiliam na produo de
interfaces de usurio grficas, mas no se comparam a ferramentas para plataformas especficas,
como Delphi e VisualBasic, que so voltadas exclusivamente para esse fim. Boa parte da
elaborao da interface da aplicao tem que ser feita manualmente, o que exige bastante
trabalho.
1.1 Frames
Na AWT, a janela de mais alto nvel de uma aplicao (no est contida dentro de nenhuma
outra) denominada Frame. No Swing, existe uma verso chamada JFrame, que
derivada/estendida da classe Frame, possuindo alguns poucos mtodos adicionais relacionados
manipulao da disposio visual dos frames .Todos os outros mtodos so derivados da classe
Frame. Um frame pode conter diversos outros componentes da GUI.
Para se definir um frame bsico baseado em AWT, deve-se:
Torn-lo visvel.
O frame criado no possui tamanho definido, nem ttulo ou posicionamento. Para personalizar o
frame necessrio inserir um mtodo construtor com as instrues necessrias. Exemplo:
import java.awt.*;
public class FrameDois extends Frame
{
public FrameDois() //construtor
{
setTitle("Frame Dois"); // ttulo do Frame
setSize(300, 200); // largura: 300 pixels
altura: 200 pixels
setResizable(false); // no permite o redimensionamento
y: 100 pixels
A figura 1.2 mostra o resultado da execuo, um frame com largura 300 x 200 pixels
(setSize()), com o ttulo Frame Dois (setTitle()), que no permite redimensionamento
(setResizable()).
(0 ,0)
(x, y)
Conforme j mencionado, o frame ainda no pode ser fechado. Para que isso acontea
necessrio ter uma maneira de se ter a notificao de quando ele fechado. A partir da
manipulao desse evento, mostrado no exemplo a seguir, possvel fechar o frame. necessrio
importar o pacote java.awt.event.* para manipular eventos do AWT. O modelo de eventos e
os demais eventos de janela sero vistos em sees posteriores.
import java.awt.*;
import java.awt.event.*;
public class FrameTres extends Frame
{
public FrameTres() //construtor
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setTitle("Frame Trs"); // ttulo do Frame
setSize(300, 200); // largura: 300 pixels
altura: 200 pixels
setResizable(false); // no permite o redimensionamento
setLocation(200, 100); // x: 200 pixels
y: 100 pixels
}
public static void main (String[] args)
{
FrameTres fr = new FrameTres();
fr.setVisible(true);
}
}
Ainda em relao ao posicionamento, dependendo da resoluo da tela onde o frame ser aberto,
pode se ter situaes bem desagradveis, como, por exemplo, o frame ser aberto e ficar com parte
fora da tela. necessrio ento posicionar o frame em coordenadas que independam da resoluo
utilizada. O exemplo a seguir abrir um frame com a metade do tamanho da tela, posicionado no
centro, respeitando a resoluo.
import java.awt.*;
import java.awt.event.*;
public class FrameQuatro extends Frame
{
public FrameQuatro() //construtor
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension d = tk.getScreenSize();
setSize(d.width / 2, d.height / 2);
setLocation(d.width / 4, d.height / 4);
Image img = tk.getImage("icone.gif");
setIconImage(img);
setTitle("Frame Quatro");
setResizable(false);
}
public static void main (String[] args)
{
FrameQuatro fr = new FrameQuatro();
fr.setVisible(true);
}
}
Para que seja possvel essa tarefa de posicionamento conforme a resoluo de vdeo, necessrio
obter informaes do sistema operacional, e isso feito atravs da classe Toolkit, mtodo
getScreenSize(), cujos dados so jogados em um objeto da classe Dimension, que armazena a
altura e largura nos campos d.width e d.height. Por exemplo, se a resoluo de vdeo for
800x600, o d.width fica com 800 e o d.height fica com 600. Tendo esses valores, possvel
utilizar em mtodos como o setLocation() e o setSize(), como foi feito no exemplo. Alm
disso, o exemplo tambm acrescenta um cone ao frame, tambm utilizando a classe Toolkit,
4
mtodo getImage(), para carregar a imagem (extenso .gif) e jogar em um objeto da classe
Image, para depois setar o cone atravs do setIconImage().
O mesmo exemplo pode ser feito baseado na biblioteca Swing, classe JFrame, mudando apenas a
derivao e importando o pacote javax.swing.*, assim:
import
import
import
public
{
...
}
java.awt.*;
java.awt.event.*;
javax.swing.*;
class FrameQuatro extends JFrame
Os exemplos apresentados nas prximas sees criaro frames baseado na classe JFrame.
A partir disso, mtodos como drawString() e drawLine() podem ser utilizados, como no
exemplo a seguir. O resultado apresentado na figura 1.4.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MostrandoTextos extends JFrame
{
public MostrandoTextos()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension d = tk.getScreenSize();
int screenHeight = d.height;
int screenWidth = d.width;
setSize(d.width / 2, d.height / 2);
setLocation(d.width / 4, d.height / 4);
setTitle("Escrevendo Textos");
setResizable(false);
}
public void paint (Graphics g)
{
g.drawString("Estou escrevendo no frame", 40, 50);
g.drawLine(40, 60, 200, 60);
int i = 30;
while (i < 150)
{
1.3 Cores
O mtodo setColor() seleciona a cor que utilizada para todas as operaes de desenho dentro
do contexto grfico ou componente. Um parmetro Color define a cor a ser usada, sendo que as
treze cores padro, apresentadas na tabela 1.1, esto definidas na classe java.awt.Color.
black
(preto)
magenta
blue
(azulo)
orange
cyan
(ciano)
pink
darkGray
gray
(cinza-escuro)
(cinza)
green
(verde)
red
(magenta)
(laranja)
(rosa)
(vermelho)
white
(branco)
yellow
(amarelo)
lightGray
(cinza-claro)
Alm das cores pr-definidas, pode-se criar novas cores baseadas no contedo RGB (redvermelho, green-verde, blue-azul), expressos por inteiros de 0 a 255. O exemplo a seguir
apresenta a criao de objetos coloridos em um frame. O resultado apresentado na figura 1.5.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Cores extends JFrame
{
public Cores()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(400, 200);
setLocation(200, 100);
setTitle("Cores");
}
public void paint (Graphics g)
{
g.setColor(Color.blue);
g.drawString("Cor Azul", 50, 50);
g.setColor(Color.green);
g.drawLine(50, 60, 220, 60);
g.setColor(Color.red);
g.drawRect(50,70,100,30);
g.setColor(new Color(0,128,128));
g.fillRect(50,110,100,30);
}
public static void main (String[] args)
{
Cores fr = new Cores();
fr.setVisible(true);
}
}
O mtodo drawRect(int x, int y, int width, int height) desenha um retngulo com a
cor definida em setColor(), iniciando nas coordenadas x,y, tendo uma largura width e uma
altura height. O mtodo fillRect(int x, int y, int width, int height) faz a mesma
coisa, mas preenche o retngulo.
1.4 Fontes
O mtodo responsvel por definir o tipo de fonte desejado o setFont(), que precisa de um
objeto criado, baseado na classe Font, definindo assim o nome da fonte, o seu estilo e seu
tamanho. O nome pode ser qualquer fonte suportada pelo sistema operacional especfico; o estilo
pode ser: PLAIN regular, BOLD negrito e ITALIC itlico, sendo possvel combinar os estilos
utilizando o operador +; o tamanho pode ser qualquer valor que represente o tamanho em pontos
da fonte. Exemplo:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Fontes extends JFrame
{
public Fontes()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(400,130);
setTitle("Tipos de Fonte");
}
public void paint (Graphics g)
{
g.setColor(Color.blue);
Font f = new Font("SansSerif", Font.ITALIC, 16);
g.setFont(f);
g.drawString("Fonte SansSerif itlico tamanho 16", 20, 50);
g.setFont(new Font("Monospaced", Font.BOLD + Font.ITALIC, 14));
g.drawString("Fonte Monospaced negrito e itlico tamanho 14", 20, 80);
g.setFont(f);
g.drawString("Novamente Fonte SansSerif itlico tamanho 16", 20, 110);
}
public static void main (String[] args)
{
Fontes fr = new Fontes();
fr.setVisible(true);
}
}
A figura 1.6 mostra o resultado. Percebe-se que no necessrio criar explicitamente um objeto
do tipo Font (objeto f), podendo ser possvel cri-lo no prprio argumento do setFont(). Se a
fonte for utilizada vrias vezes no decorrer da aplicao, torna-se til a criao do objeto
explicitamente.
Em termos de portabilidade, deve-se tomar cuidado quanto a fontes que no existem em alguns
sistemas operacionais. O ideal trabalhar com fontes comuns em sistemas operacionais
diferentes. O modelo do AWT define cinco fontes disponveis em qualquer sistema operacional.
So elas: Serif, Monospaced, SansSerif, Dialog e DialogInput.
}
public static void main (String[] args)
{
FormasGeometricas fr = new FormasGeometricas();
fr.setVisible(true);
}
}
int arcWidth,
int
drawOval(int x, int y, int width, int height): Desenha uma forma oval,
baseado nas coordenadas do retngulo que inicia em x,y, tendo uma largura width e uma
altura height.
Idem a
a forma oval.
int y,
int width,
int height,
int startAngle,
int
drawPolygon(int[] xPoints,
int[] yPoints,
int nPoints):
Desenha
um
Idem
fillPolygon(int[] xPoints,
int[] yPoints,
drawPolygon, mas preenche o arco.
int nPoints):
1.6 Imagens
A classe Image a responsvel pelo carregamento de imagens armazenadas em disco.
Novamente, necessrio utilizar um objeto do tipo Toolkit para obter uma imagem, atravs do
mtodo getImage(), e depois jogar em um objeto do tipo Image. O exemplo a seguir mostra a
maneira de se preencher um frame com as imagens lado a lado. A figura 1.8 mostra o resultado.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Imagens extends JFrame
{
public Imagens() //construtora
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(400,200);
setTitle("Imagens");
}
public void paint (Graphics g)
{
Image ima = Toolkit.getDefaultToolkit().getImage("LogoJava.gif");
int larguraTela = 400;
int alturaTela = 200;
int larguraImagem = ima.getWidth(this);
int alturaImagem = ima.getHeight(this);
g.drawImage(ima,4,23,null);
for (int i = 0; i <= larguraTela / larguraImagem; i++)
for (int j = 0; j <= alturaTela / alturaImagem; j++)
if (i + j > 0)
g.copyArea(4,23,larguraImagem, alturaImagem,
i * larguraImagem, j * alturaImagem);
}
public static void main (String[] args)
{
Imagens fr = new Imagens();
fr.setVisible(true);
}
}
11
A primeira imagem, obtida pelo getImage() e jogada no objeto Image ima, mostrada a partir
do drawImage(Image img, int x, int y, ImageObserver observer), que insere a imagem
img nas coordenadas x,y, para depois ser copiada lado a lado, atravs do mtodo
copyArea(int x, int y, int width, int height, int dx, int dy), que copia o
contedo da rea que comear nas coordenadas x,y com largura width e altura height, em um
local a uma distncia dx,dy. Para realizar essa tarefa, foi necessrio descobrir o tamanho da
imagem, atravs getWidth() e do getHeight().
1.7 Continers
Continers servem de repositrio de outros componentes, como botes, por exemplo. Alguns
exemplos de continers: JFrame, JPanel e JApplet. Um JFrame uma janela de mais alto nvel;
um JPanel um continer usado para agrupar componentes, normalmente dentro de um JFrame;
um JApplet permite a execuo em navegadores da Web. Pode-se desenhar algo diretamente no
frame ou definir um continer, como um painel, por exemplo, e desenhar nele. No considerada
uma boa prtica de programao desenhar diretamente no frame, pois ele foi projetado para ser
continer de componentes especficos, como barras de menu, por exemplo. Os painis devem ser
utilizados para agrupar outros componentes. Exemplo de adio de um painel a um frame:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Painel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawString("Estou escrevendo em um painel", 100, 50);
}
}
public class EscrevendoEmPainel extends JFrame
{
public EscrevendoEmPainel()
{
addWindowListener(new WindowAdapter()
12
O resultado pode ser conferido na figura 1.9. Para desenhar algo em um painel, deve-se criar uma
classe derivada de JPanel e sobrepor o mtodo paintComponent(), que est definido na classe
JComponent, e recebe um parmetro do tipo Graphics. Tal mtodo chamado automaticamente
toda vez que a janela redesenhada, como na criao e no redimensionamento. Se, por algum
motivo, se desejar redesenhar o contedo no painel, o mtodo a ser chamado o repaint(), que
se encarrega de executar novamente o paintComponent(). O super.paintComponent(g) faz
com que o mtodo da superclasse seja executado tambm. Isso normalmente feito em
sobreposies de mtodos, quando se deseja criar algo a mais que o mtodo definido na
superclasse. A criao de uma classe derivada de JFrame feita a seguir, e um objeto Container
criado para depois adicionar (add) o painel. O mtodo getContentPane() retorna a rea de
contedo do frame para que possa ser adicionado o painel.
Gerenciador FlowLayout
Para que seja possvel verificar a diferena entre alguns deles, exemplos so demonstrados nas
prximas sees, comeando exatamente pelo gerenciador FlowLayout, padro do JPanel. Nos
exemplos, so definidos objetos boto a partir da classe JButton.
import java.awt.*;
13
import java.awt.event.*;
import javax.swing.*;
class PainelFlow extends JPanel
{
public PainelFlow()
{
setLayout(new FlowLayout());
add(new JButton("Um"));
add(new JButton("Dois"));
add(new JButton("Trs"));
add(new JButton("Quatro"));
add(new JButton("Cinco"));
}
}
public class GerenciadorFlowLayout extends JFrame
{
public GerenciadorFlowLayout()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(200,90);
setLocation(150,150);
setTitle("FlowLayout");
Container P = getContentPane();
P.add(new PainelFlow());
}
public static void main (String[] args)
{
GerenciadorFlowLayout fr = new GerenciadorFlowLayout();
fr.setVisible(true);
}
}
1.8.2
Gerenciador GridLayout
14
15
setLayout().
1.8.3
Gerenciador BorderLayout
16
Na figura 1.12 se observa o resultado da aplicao, com um boto em cada localizao geogrfica
dentro do painel. O BorderLayout o gerenciador padro para os continers JWindow e JFrame.
No necessrio ter todas as localizaes preenchidas. Se alguma das localizaes (norte, sul,
leste ou oeste) no for ocupada, as demais ocupam o lugar da(s) omitida(s). Porm, se a
localizao central no for ocupada, ela ficar vazia.
Na definio do layout possvel determinar o espaamento horizontal e vertical entre as
localizaes. O layout abaixo, por exemplo, define 5 pixels de espaameno horizontal e 8 pixels
de espaamento vertical:
setLayout(new BorderLayout(5,8));
1.8.4
Gerenciador BoxLayout
Os gerenciadores de layout foram criados ainda na verso 1.0 do Java. O Swing possui apenas
um gerenciador de layout de uso geral, chamado BoxLayout, sendo mais utilizado para criar
barras de ferramentas, podendo inserir componentes em apenas uma linha ou uma coluna. Ao
invs de utilizar o BoxLayout diretamente, pode-se usar um outro continer do Swing chamado
Box, como no exemplo a seguir.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class PainelBox extends JPanel
{
public PainelBox()
{
add(Box.createHorizontalGlue());
add(new JButton("Um"));
add(Box.createHorizontalGlue());
add(new JButton("Dois"));
add(Box.createHorizontalStrut(10));
add(new JButton("Trs"));
add(Box.createHorizontalStrut(30));
add(new JButton("Quatro"));
add(Box.createHorizontalGlue());
add(new JButton("Cinco"));
add(Box.createHorizontalGlue());
}
}
public class GerenciadorBoxLayout extends JFrame
17
{
public GerenciadorBoxLayout()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(500,100);
setLocation(150,150);
setTitle("BoxLayout");
Container b = Box.createHorizontalBox();
getContentPane().add(b,BorderLayout.CENTER);
b.add(new PainelBox());
}
public static void main (String[] args)
{
GerenciadorBoxLayout fr = new GerenciadorBoxLayout();
fr.setVisible(true);
}
}
Observa-se, na figura 1.13, que os botes no ficaram distanciados uniformemente. Isso porque
dois mtodos foram utilizados: o createHorizontalGlue(), que determina um espaamento
varivel, conforme o tamanho da janela e o createHorizontalStrut(), que determina um
espaamento fixo, determinado pelo seu parmetro.
1.8.5
Gerenciador GridBagLayout
Descrio
int fill
int gridheight, gridwidth
18
componente ir se espalhar.
Utilizado para controlar a posio do componente, caso ele
no esteja espalhado.
Utilizado para controlar o aumento do tamanho mnimo dos
componente.
Utilizado para controlar o afastamento entre componentes.
int anchor
int ipadx, ipady
Insets insets
19
}
}
O resultado, mostrado na figura 1.13, apresenta cinco botes inseridos em coordenadas que
indicam a presena de trs linhas por trs colunas (0, 1 e 2). O tamanho da grade definido por
essas coordenadas, sendo possvel, por isso, ter quantas colunas e linhas se desejar. O mtodo
addGridBag() criado serve para auxiliar na definio dos valores que os campos de controle do
GridBagConstraints iro assumir.
Para que os botes preencham toda a rea do painel necessrio definir, no construtor, a restrio
fill para BOTH e os campos weigthx e weigthy para 1, assim:
public PainelGridBag()
{
setLayout(new GridBagLayout());
restricoes.weightx = 1.0;
restricoes.weighty = 1.0;
restricoes.fill = GridBagConstraints.BOTH;
addGridBag(new JButton("Um"), 1, 0);
addGridBag(new JButton("Dois"), 0, 1);
addGridBag(new JButton("Trs"), 1, 1);
addGridBag(new JButton("Quatro"), 2, 1);
addGridBag(new JButton("Cinco"), 1, 2);
}
O resultado o preenchimento de todo painel, como mostra a figura 1.14. O fill ainda pode ser
definido como: HORIZONTAL, preenchendo o espao horizontal disponvel; VERTICAL,
preenchendo o espao vertical disponvel e; NONE, no preenchendo o espao disponvel. Os
campos weigthx e weigthy devem receber um valor diferente de zero, pois o preenchimento no
ocorre se esse valor for igual a zero, que o valor default.
possvel realizar um espalhamento dos componentes em mais do que uma linha e/ou coluna.
Para isso, necessrio combinar os valores de gridx e gridy com a determinao da altura (em
20
nmero de linhas) e largura (em nmero de colunas) atravs dos campos gridwidth e
gridheight, assim:
public PainelGridBag()
{
setLayout(new GridBagLayout());
restricoes.weightx = 1.0;
restricoes.weighty = 1.0;
restricoes.fill = GridBagConstraints.BOTH;
restricoes.gridwidth = 3;
addGridBag(new JButton("Um"), 0, 0);
restricoes.gridwidth = 1;
addGridBag(new JButton("Dois"), 0, 1);
addGridBag(new JButton("Trs"), 1, 1);
restricoes.gridheight = 2;
addGridBag(new JButton("Quatro"), 2, 1);
restricoes.gridheight = 1;
addGridBag(new JButton("Cinco"), 0, 2);
addGridBag(new JButton("Seis"), 1, 2);
}
Percebe-se, pelo resultado apresentado na figura 1.15, que o boto Um ocupou trs colunas e uma
linha, enquanto o boto Quatro ocupou duas linhas e uma coluna. No momento que o nmero de
colunas/linhas definido, todos os componentes utilizaro esse tamanho de espao da pra diante,
a no ser que este seja redefinido.
possvel tambm definir o tamanho dos componentes atravs do peso atribudo aos campos
weigthx e weigthy, como no exemplo:
public PainelGridBag()
{
setLayout(new GridBagLayout());
restricoes.weighty = 1.0;
restricoes.fill = GridBagConstraints.BOTH;
restricoes.weightx = 0.2;
addGridBag(new JButton("Um"), 0, 0);
restricoes.weightx = 0.6;
addGridBag(new JButton("Dois"), 1, 0);
restricoes.weightx = 1.5;
addGridBag(new JButton("Trs"), 2, 0);
restricoes.weightx = 4.0;
addGridBag(new JButton("Quatro"), 3, 0);
}
21
Para que o exemplo fique igual ao apresentado na figura 1.16, necessrio mudar o setSize()
do frame para (400,60). Os botes ficam dispostos em uma nica linha, com tamanhos
diferentes, determinados pela atribuio de seus respectivos pesos, sabendo-se que o valor
especfico do peso no o que importa, e sim as propores relativas entre os botes e o tamanho
do painel.
O aumento do tamanho de alguns componentes pode ser feito pelos campos ipadx e ipady, que
especificam valores de aumento vertical e horizontal. Alm disso, possvel fixar uma posio
do componente, dentro do espao reservado a ele, desde que ele no esteja espalhado em mais
que uma coluna e/ou linha. Isso feito atravs do anchor. Exemplo:
public PainelGridBag()
{
setLayout(new GridBagLayout());
addGridBag(new JButton("Um"), 1, 0);
restricoes.ipadx=10;
restricoes.ipady=10;
addGridBag(new JButton("Dois"), 0, 1);
restricoes.ipadx=0;
restricoes.ipady=0;
restricoes.anchor = GridBagConstraints.SOUTHEAST;
addGridBag(new JButton("Trs"), 1, 1);
restricoes.ipadx=10;
restricoes.ipady=10;
restricoes.anchor = GridBagConstraints.CENTER;
addGridBag(new JButton("Quatro"), 2, 1);
restricoes.ipadx=0;
restricoes.ipady=0;
addGridBag(new JButton("Cinco"), 1, 2);
}
Novamente, para que o exemplo fique igual ao da figura 1.17, necessrio alterar o setSize()
do frame para (270,130). Percebe-se que o tamanho dos componentes Dois e Quatro foi
aumentado, sendo mantido o tamanho mnimo do boto Trs. Para esse mesmo boto Trs foi
especificado um posicionamento fixo no canto inferior direito, dentro de sua rea definida. O
anchor s pode ser utilizado quando o tamanho do componente for menor que a rea que lhe foi
22
concedida. O valor padro CENTER, e os outros valores possveis so: NORTH, NORTHEAST, EAST,
SOUTHEAST, SOUTH, SOUTHWEST, WEST, e NORTHWEST.
Atravs do campo insets possvel indicar as distncias entre os componentes do layout. Uma
classe Insets possui valores para as quatro direes: cima, baixo, direita e esquerda, dando
muita flexibilidade ao layout. O valor padro (0, 0, 0, 0). Exemplo:
public PainelGridBag()
{
setLayout(new GridBagLayout());
restricoes.weightx = 1.0;
restricoes.weighty = 1.0;
restricoes.fill = GridBagConstraints.BOTH;
restricoes.insets = new Insets(3,3,3,3);
addGridBag(new JButton("Um"), 1, 0);
addGridBag(new JButton("Dois"), 0, 1);
addGridBag(new JButton("Trs"), 1, 1);
addGridBag(new JButton("Quatro"), 2, 1);
addGridBag(new JButton("Cinco"), 1, 2);
}
A figura 1.18 mostra que cada componente ganhou um espao adicional de trs pixels para cada
uma das direes: cima, baixo, direita e esquerda.
1.8.6
Layouts Compostos
23
public PainelTipoFlow()
{
setLayout(new FlowLayout());
add(new JButton("Um"));
add(new JButton("Dois"));
add(new JButton("Trs"));
add(new JButton("Quatro"));
add(new JButton("Cinco"));
}
}
public class LayoutsCompostos extends JFrame
{
public LayoutsCompostos()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(400,120);
setLocation(150,150);
setTitle("Layouts Compostos");
Container P = getContentPane();
P.add(new PainelComposto());
}
public static void main (String[] args)
{
LayoutsCompostos fr = new LayoutsCompostos();
fr.setVisible(true);
}
}
A figura 1.17 mostra que o painel com layout FlowLayout foi inserido na localizao sul do
painel com layout BorderLayout. Isso uma prtica bastante comum para se alcanar layouts
com disposio de componentes que satisfaam aos objetivos da aplicao. A localizao do
centro ficou vazia porque isso uma caracterstica do BorderLayout: no expandir as outras
localizaes se a do centro estiver vazia.
24
sees descrevem o modelo de manipulao de eventos AWT a partir de alguns elementos GUI
simples.
seguindo a sintaxe:
ObjetoOrigem.addEventListener(ObjetoOuvinte);
Assim, o objeto painel notificado sempre que um evento ocorrer em botao, como o clique,
por exemplo. No exemplo, a classe onde o objeto ouvinte painel registrado deve implementar
a interface ActionListener e definir o mtodo actionPerformed(), que recebe um objeto
ActionEvent como parmetro. Assim:
public class MeuPainel extends Jpanel implements ActionListener
{
...
public void actionPerformed(ActionEvent evt)
{
//cdigo para a reao ao evento
}
}
25
26
Na criao do painel, trs botes foram adicionados a ele. Logo aps, foi determinado que o
prprio painel (this) seria o ouvinte das aes dos trs botes. O mtodo actionPerformed()
o nico mtodo da interface ActionListener, por isso apenas ele deve ser implementado. Esse
mtodo recebe como parmetro um objeto do tipo ActionEvent, que fornece informaes sobre
o evento ocorrido, sendo o local para implementar as aes a serem realizadas. A classe
TesteEventosBotao adiciona o painel com os botes.
27
A figura 2.1 mostra o que acontece se for digitado algo em cdigo e logo a seguir for pressionada
a tecla Enter. Novamente, o mtodo actionPerformed() foi sobreposto e, no momento que for
pressionado o Enter, o getSource() pega o objeto onde est o foco naquele momento e mostra
em uma caixa de mensagens, criada a partir do mtodo showMessageDialog(), pertencente
classe JOptionPane.
28
import javax.swing.*;
class PainelAV extends JPanel implements ActionListener
{
private JButton BotaoMetal;
private JButton BotaoWindows;
private JButton BotaoMotif;
private JButton BotaoGTK;
private JButton BotaoMac;
private JTextField Texto;
public PainelAV()
{
BotaoMetal = new JButton("Metal");
BotaoWindows = new JButton("Windows");
BotaoMotif = new JButton("Motif");
BotaoGTK = new JButton("GTK");
BotaoMac = new JButton("Mac");
Texto = new JTextField("Digite seu texto aqui");
add(BotaoMetal);
add(BotaoWindows);
add(BotaoMotif);
add(BotaoGTK);
add(BotaoMac);
add(Texto);
BotaoMetal.addActionListener(this);
BotaoWindows.addActionListener(this);
BotaoMotif.addActionListener(this);
BotaoGTK.addActionListener(this);
BotaoMac.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
String modelo = "";
if (origem == BotaoMetal)
modelo = "javax.swing.plaf.metal.MetalLookAndFeel";
else if (origem == BotaoWindows)
modelo = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
else if (origem == BotaoMotif)
modelo = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
else if (origem == BotaoGTK)
modelo = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
else if (origem == BotaoMac)
modelo = "javax.swing.plaf.mac.MacLookAndFeel";
try
{
UIManager.setLookAndFeel(modelo);
SwingUtilities.updateComponentTreeUI(this);
} catch (Exception e) {}
}
}
public class AspectosVisuais extends JFrame
{
public AspectosVisuais()
29
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(370,100);
setTitle("Aspectos Visuais");
Container P = getContentPane();
P.add(new PainelAV());
}
public static void main(String[] args)
{
JFrame fr = new AspectosVisuais();
fr.setVisible(true);
}
}
A figura 2.3 mostra e resultado da execuo aps selecionar cada um dos aspectos visuais.
importante salientar que o aspecto Windows s funciona no prprio Windows, pois a Sun no
disponibiliza esse aspecto para outras plataformas. Alguns Look And Feels podem gerar uma
exceo, por no existirem ou no serem suportados em determinadas plataformas, como o que
ocorreu como aspecto Mac. importante salientar tambm que, a depender do layout utilizado
em uma determinada aplicao, podem ocorrer problemas de aparncia, por que tamanhos de
botes, caixas de texto e outros componentes variam de plataforma para plataforma, e podem
fazer com que a aparncia de uma aplicao fique desorganizada, como o que ocorreu com o
aspecto GTK. Muitos aspectos interessantes podem ser encontrados na Internet.
Mtodos
Parmetros
Origens
ActionListener
actionPerformed
ActionEvent
getActionCommand
getModifiers
AdjustmentListener
AdjustementValueChanged AdjustmentEvent
getAdjustable
Button
List
MenuItem
TextField
Scrollbar
30
ItemListener
ItemStateChanged
TextListener
ComponentListenter
TextValueChanged
componentMoved
componentHidden
componentResized
componentShown
componentAdded
componentRemoved
ContainerListener
FocusListener
KeyListener
MouseListener
focusGained
focusLost
keyPressed
keyReleased
keyTyped
mousePressed
mouseReleased
mouseEntered
mouseExited
mouseClicked
MouseMotionListener mouseDragged
mouseMoved
WindowListener
windowClosing
windowOpened
windowIconified
windowDeiconified
windowClosed
windowActivated
windowDeactivated
getAdjustmentType
getValue
ItemEvent
getItem
getItemSelectable
getStateChange
TextEvent
ComponentEvent
getComponent
Checkbox
CheckboxMenuItem
Choice
List
TextComponent
Component
ComponentEvent
getChild
getContainer
FocusEvent
isTemporary
KeyEvent
getKeyChar
getKeyCode
getKeyModifiersText
getKeyText
isActionKey
MouseEvent
getClickCount
getX
getY
getPoint
translatePoint
isPopupTrigger
MouseEvent
Container
WindowEvent
getWindow
Window
Component
Component
Component
Component
Boa parte dos componentes do Swing utilizam essas mesmas interfaces para manipular eventos,
mas existem outras. Os pacotes dessas interfaces so: java.awt.event e javax.swing.event.
31
As prximas sees se destinam a apresentao dos principais componentes do Swing, alm dos
botes e caixas de texto, que foram vistos no captulo anterior.
32
A figura 3.1 mostra a situao aps o clique nos dois botes. No cdigo, percebe-se que existem
duas maneiras de saber qual boto foi clicado. A primeira testando o prprio texto do boto, a
partir do getActionCommand().equals(). A segunda atravs da definio de um objeto
origem, que, atravs do mtodo getSource(), sabe qual boto gerou o evento. No clique do
BotaoUm alterado o texto do LabelUm, setado um cone para ele e realizado seu posicionamento
horizontal (setHorizontalTextPosition()) e vertical (setVerticalTextPosition()). O
clique do BotaoDois altera o texto do LabelUm, alm de utilizar o mtodo setToolTipText()
para especificar a dica de ferramenta, que exibida quando o cursor do mouse passa sobre o
label.
33
34
}
}
public class BotoesDeEstado extends JFrame
{
public BotoesDeEstado()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(350,100);
setTitle("Botes de Estado");
Container P = getContentPane();
P.add(new PainelBotoesDeEstado());
}
public static void main(String[] args)
{
JFrame fr = new BotoesDeEstado();
fr.setVisible(true);
}
}
A figura 3.2 apresenta o resultado da execuo do exemplo, j com alguns itens selecionados. Ao
clicar em uma caixa de seleo, acionado um evento de ao, capturado no mtodo
actionPerformed(). O mtodo isSelect() retorna o estado atual da caixa de seleo e,
conforme o estado, as variveis Italico e Negrito so atualizadas, para depois servirem de
parmetro para a alterao da fonte a partir do setFont(). Os botes de rdio so criados, j
tendo setado qual o boto que ficar selecionado inicialmente. Cada um desses botes deve ser
adicionado a um grupo de botes (ButtonGroup), sendo ele responsvel pala desativao do
boto anteriormente selecionado, quando um novo for clicado. No actionPerformed()
verificado qual boto originou o evento, e a varivel Fonte atualizada com a fonte atual, para
tambm servir de parmetro no setFont(). Isso feito atravs da criao de um objeto f, do tipo
Font, incializado a partir do getFont() e passado para a varivel Fonte atravs do getName().
3.3 Bordas
O Swing oferece vrias opes de bordas para melhorar o aspecto visual da aplicao. O mtodo
setBorder(), da classe JComponent, a responsvel pela definio das bordas, recebendo como
parmetro um objeto de uma das classes de bordas existentes no pacote javax.swing.border.
Por isso, necessrio realizar um import desse pacote. O exemplo a seguir mostra as diversas
bordas existentes, permitindo a utilizao de ttulo ou no.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
35
import javax.swing.border.*;
public class Bordas extends JFrame implements ActionListener
{
private JButton RBEtched;
private JButton RBEmpty;
private JButton RBLine;
private JButton RBMatte;
private JButton RBLoweredBevel;
private JButton RBRaisedBevel;
private JButton RBCompound;
private JCheckBox CBTitled;
private Border BordaCentro = null;
public Bordas()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(700,250);
setTitle("Bordas");
JPanel PainelBaixo = new JPanel();
RBEtched = new JButton("Etched");
RBEmpty = new JButton("Empty");
RBLine = new JButton("Line");
RBMatte = new JButton("Matte");
RBLoweredBevel = new JButton("LoweredBevel");
RBRaisedBevel = new JButton("RaisedBevel");
RBCompound = new JButton("Compound");
CBTitled = new JCheckBox("Titled");
PainelBaixo.add(RBEtched);
PainelBaixo.add(RBEmpty);
PainelBaixo.add(RBLine);
PainelBaixo.add(RBMatte);
PainelBaixo.add(RBLoweredBevel);
PainelBaixo.add(RBRaisedBevel);
PainelBaixo.add(RBCompound);
PainelBaixo.add(CBTitled);
Border borda = BorderFactory.createEtchedBorder();
Border BordaBaixo =
BorderFactory.createTitledBorder(borda," Tipos de Borda ");
PainelBaixo.setBorder(BordaBaixo);
Container P = getContentPane();
P.setLayout(new BorderLayout());
P.add(PainelBaixo,"South");
RBEtched.addActionListener(this);
RBEmpty.addActionListener(this);
RBLine.addActionListener(this);
RBMatte.addActionListener(this);
RBLoweredBevel.addActionListener(this);
RBRaisedBevel.addActionListener(this);
RBCompound.addActionListener(this);
CBTitled.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
36
37
A figura 3.3 mostra o resultado da execuo, onde cada um dos botes realiza a mudana para a
borda especificada. O ttulo na borda somente mostrado se a caixa de seleo Titled estiver
marcada.
De forma geral, para criar uma borda necessrio criar um objeto Border e utilizar um dos
mtodos da classe BorderFactory para criar a borda desejada. Os tipos de borda existentes, os
mtodos para criao, o parmetros necessrios em cada tipo e as variaes possveis so:
EmptyBorder: cria uma borda vazia, mas ocupa espao e permite insero de ttulo.
createEmptyBorder()
createEmptyBorder(int topo, int esquerda, int base, int direita)
MatteBorder: cria uma borda larga que pode ser preenchida com uma cor slida ou um
cone.
createMatteBorder(int topo, int esquerda, int base, int direita, Color
cor)
createMatteBorder(int topo, int esquerda, int base, int direita, Icon
icone)
BevelBorder: cria uma borda com efeito de relevo (para cima ou para baixo).
createLoweredBorder()
createRaisedBorder()
TitledBorder: cria uma borda com um ttulo. Normalmente utilizado para inserir ttulos
em outras bordas.
createTitledBorder(String titulo)
createTitledBorder(Border borda, String titulo)
createTitledBorder(Border borda, String titulo, int alinhamento, int
posicao)
createTitledBorder(Border borda, String titulo, int alinhamento, int
posio, Font fonte, Color cor)
38
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.border.*;
39
Uma borda Borda do tipo MatteBorder foi criada no PainelCentro para que as cores sejam
alteradas a partir da seleo pela caixa de combinao Cores (figura 3.4), localizada no
PainelSul. O PainelCentro tambm contm um label Texto, que mostra a cor atual da borda.
Para manipular o evento de seleo da caixa de combinao, foi implementado o mtodo
actionPerformed(), que define um objeto origem, do tipo JComboBox, e testa o item
selecionado a partir do getSelectedItem(). Conforme a seleo, um objeto cor, do tipo Color,
atualizado, para depois ser utilizado na definio da nova cor da borda. Alm disso, o label
Texto tambm atualizado com a cor selecionada.
Alguns outros mtodos so importantes:
indicada.
posio indicada.
40
As caixas de listagem, criadas a partir de objetos do tipo JList, apresentam listas de valores para
selees nicas ou mltiplas. Elas, por si s, no apresenta nenhuma barra de rolagem, sendo
necessrio para isso, inseri-la em um continer JScrollPane, como no exemplo a seguir.
import
import
import
import
import
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.border.*;
javax.swing.event.*;
41
A figura 3.5 apresenta o resultado da execuo da aplicao, onde h uma caixa de listagem com
trs linhas e uma barra de rolagem. Ao clicar em cada opo, aparece ao lado a imagem
solicitada. Para criar a lista foi declarado um objeto FrutasLegumes, do tipo JList, passando
como parmetro um arranjo String ItensLista, com os itens desejados. A partir do mtodo
setVisibleRowCount() foi definido o nmero de itens visveis da lista. O
setSelectionMode() especifica o modo de seleo da lista, definido na classe
ListSelectionModel, que pode ser: SINGLE_SELECTION, que permite a seleo de um nico
item; SINGLE_INTERVAL_SELECTION, que permite a seleo mltipla e contgua na lista, e;
MULTIPLE_INTERVAL_SELECTION, que permite a seleo mltipla, no interessando quais itens
sero selecionados.
Para que a lista pudesse ser apresentada com a barra de rolagem, o objeto FrutasLegumes foi
adicionado a um JScrollPane que, por sua vez, foi adicionado ao painel. Por fim, para ser
possvel tratar o evento de seleo na lista, foi necessrio implementar a interface
ListSelectionListener(), que est definida em javax.swing.event, sendo preciso importar
esse pacote, e que utiliza o mtodo valueChanged() para efetuar as aes desejadas. Para alterar
a imagem do LabelImagem foi utilizado o setIcon(), relacionando o ndice do arranjo Imagens
com o ndice do item que foi selecionado na lista, buscado atravs do getSelectedIndex(). O
modo como o evento foi tratado poderia ter sido feito como nos exemplos vistos at agora, assim:
Antes de tudo, inserir o implements ListSelectionListener na criao da classe:
public class CaixasDeListagem extends JFrame implements ListSelectionListener
Para que se possa efetuar a seleo mltipla dos itens de uma caixa de listagem, necessrio
determinar se a seleo SINGLE_INTERVAL_SELECTION, permitindo selecionar um intervalo
contguo, clicando com o mouse em um primeiro item e, com a tecla Shift pressionada, clicando
no ltimo item desejado; ou MULTIPLE_INTERVAL_SELECTION, permitindo selecionar itens no
contguos, atravs da utilizao da tecla Ctrl, clicando com o mouse nos itens desejados.
Exemplo:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
42
import javax.swing.event.*;
public class ListaSelecaoMultipla extends JFrame
{
private JList Numeros;
private JList Selecionados;
private String ItensLista[] =
{"Zero","Um","Dois","Trs","Quatro","Cinco","Seis","Sete"};
private JPanel PainelListaSM;
public ListaSelecaoMultipla()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(250,150);
setTitle("Seleo Mltipla");
Container P = getContentPane();
PainelListaSM = new JPanel();
Numeros = new JList(ItensLista);
Numeros.setVisibleRowCount(5);
Numeros.setFixedCellWidth(60);
Numeros.setFixedCellHeight(20);
Numeros.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
PainelListaSM.add(new JScrollPane(Numeros));
Selecionados = new JList();
Selecionados.setVisibleRowCount(5);
Selecionados.setFixedCellWidth(80);
Selecionados.setFixedCellHeight(20);
Selecionados.setSelectionMode
(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
PainelListaSM.add(new JScrollPane(Selecionados));
P.add(PainelListaSM);
Numeros.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e)
{
Selecionados.setListData(Numeros.getSelectedValues());
}
});
}
public static void main (String[] args)
{
ListaSelecaoMultipla fr = new ListaSelecaoMultipla();
fr.setVisible(true);
}
}
43
Na figura 3.6 possvel perceber os vrios itens selecionados intercaladamente na primeira caixa
de listagem. A segunda caixa foi criada para mostrar os itens selecionados na primeira caixa.
Dois novos mtodos foram utilizados para alterar a parte visual das caixas de listagem:
setFixedCellWidth(), que determina um tamanho fixo de largura da caixa de listagem e;
setFixedCellHeight(), que determina um tamanho fixo de algura da caixa. Percebe-se que a
primeira caixa de listagem permite uma seleo intercalada de valores, atravs da utilizao da
tecla Ctrl (MULTIPLE_INTERVAL_SELECTION), enquanto a segunda caixa permite apenas a
seleo contgua, utilizando a tecla Shift (SINGLE_INTERVAL_SELECTION). A caixa de listagem
Numeros recebeu um ouvinte de eventos que, no momento que cada item selecionado, realiza a
operao de atualizao da caixa Selecionados. Isso feito atravs do mtodo setListData(),
que recebe como parmetro o conjunto de valores selecionados a partir do mtodo
getSelectedValues().
44
Figura 3.7. Labels com imagens compartilhando um painel dividido pelo JSplitPane
A barra que divide as imagens (figura 3.7) redimensionvel, permitindo aumentar ou diminuir o
espao de cada um dos componentes. Depois de criados os labels Um e Dois, eles so colocados
em um JScrollPane, para que tenham barras de rolagem, e atribudos a dois objetos Esquerda e
Direita, do tipo Component. Estes, por sua vez, so os componentes que vo compartilhar a
diviso horizontal (HORIZONTAL_SPLIT) feita pelo JSplitPane. A outra forma de diviso a
VERTICAL_SPLIT, que divide o painel verticalmente. O mtodo setDividerLocation() indica a
posio onde deve ficar o divisor redimensionvel e o mtodo setDividerSize() determina o
tamanho em pixels da barra divisria.
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.event.*;
45
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(570,230);
setTitle("Controle Deslizante");
Container P = getContentPane();
P.setLayout(new BorderLayout());
JPanel PainelCDNorte = new JPanel();
TextoSlider = new JLabel("JSlider tamanho 20");
TextoSlider.setFont(new Font("SansSerif",Font.PLAIN,20));
PainelCDNorte.add(TextoSlider);
P.add(PainelCDNorte,"North");
JPanel PainelCDCentro = new JPanel();
TextoScroll = new JLabel("JScrollBar tamanho 20");
TextoScroll.setFont(new Font("SansSerif",Font.PLAIN,20));
PainelCDCentro.add(TextoScroll);
P.add(PainelCDCentro,"Center");
JPanel PainelCDSul = new JPanel();
TamanhoTextoSlider = new JSlider(SwingConstants.HORIZONTAL,0,50,20);
TamanhoTextoSlider.setMajorTickSpacing(10);
TamanhoTextoSlider.setMinorTickSpacing(2);
TamanhoTextoSlider.setPaintTicks(true);
PainelCDSul.add(TamanhoTextoSlider);
TamanhoTextoScroll = new JScrollBar(JScrollBar.HORIZONTAL,20,0,0,50);
TamanhoTextoScroll.setPreferredSize(
new Dimension(200,TamanhoTextoScroll.getPreferredSize().height));
PainelCDSul.add(TamanhoTextoScroll);
P.add(PainelCDSul,"South");
TamanhoTextoSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e)
{
TextoSlider.setText("JSlider tamanho "+TamanhoTextoSlider.getValue());
TextoSlider.setFont(
new Font("SansSerif",Font.PLAIN,TamanhoTextoSlider.getValue()));
}
});
TamanhoTextoScroll.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e)
{
TextoScroll.setText(
"JScrollBar tamanho "+TamanhoTextoScroll.getValue());
TextoScroll.setFont(
new Font("SansSerif",Font.PLAIN,TamanhoTextoScroll.getValue()));
}
});
}
public static void main (String[] args)
{
ControleDeslizante fr = new ControleDeslizante();
fr.setVisible(true);
}
}
46
47
abas, cada uma com um tipo diferente de caixa de dilogo, provenientes de objetos das classes
JOptionPane, JFileChooser e JColorChooser. As caixas de dilogo so, por padro, modais,
ou seja, no possvel interagir com outras janelas enquanto essa no for fechada. Elas so
utilizadas para exibir alguma mensagem ou obter algum tipo de informao do usurio, seja uma
confirmao, uma entrada de dados, ou uma seleo de algo.
import
import
import
import
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.io.*;
48
PCxDlgConfirmacao.add(CDConfirmacao1);
PCxDlgConfirmacao.add(CDConfirmacao2);
PCxDlgConfirmacao.add(CDConfirmacao3);
PCxDlgConfirmacao.add(CDConfirmacao4);
PCxDlgConfirmacao.add(LabelConfirmacao);
JPanel PCxDlgOpcao = new JPanel();
CDOpcao1 = new JButton("Opo 1");
LabelOpcao = new JLabel("Retorno:");
PCxDlgOpcao.add(CDOpcao1);
PCxDlgOpcao.add(LabelOpcao);
JPanel PCxDlgEntrada = new JPanel();
CDEntrada1 = new JButton("Entrada 1");
CDEntrada2 = new JButton("Entrada 2");
CDEntrada3 = new JButton("Entrada 3");
LabelEntrada = new JLabel("Retorno:");
PCxDlgEntrada.add(CDEntrada1);
PCxDlgEntrada.add(CDEntrada2);
PCxDlgEntrada.add(CDEntrada3);
PCxDlgEntrada.add(LabelEntrada);
JPanel PCxDlgArquivo = new JPanel();
CDArquivo1 = new JButton("Arquivo 1");
LabelArquivo1 = new JLabel("Retorno:");
LabelArquivo2 = new JLabel("Seleo:");
PCxDlgArquivo.add(CDArquivo1);
PCxDlgArquivo.add(LabelArquivo1);
PCxDlgArquivo.add(LabelArquivo2);
JPanel PCxDlgCor = new JPanel();
CDCor1 = new JButton("Cor 1");
LabelCor = new JLabel("Retorno:");
PCxDlgCor.add(CDCor1);
PCxDlgCor.add(LabelCor);
Abas.addTab("Mensagem",PCxDlgMensagem);
Abas.addTab("Confirmao",PCxDlgConfirmacao);
Abas.addTab("Opo",PCxDlgOpcao);
Abas.addTab("Entrada",PCxDlgEntrada);
Abas.addTab("Arquivo",PCxDlgArquivo);
Abas.addTab("Cor",PCxDlgCor);
P.add(Abas);
CDMensagem1.addActionListener(this);
CDMensagem2.addActionListener(this);
CDMensagem3.addActionListener(this);
CDConfirmacao1.addActionListener(this);
CDConfirmacao2.addActionListener(this);
CDConfirmacao3.addActionListener(this);
CDConfirmacao4.addActionListener(this);
CDOpcao1.addActionListener(this);
CDEntrada1.addActionListener(this);
CDEntrada2.addActionListener(this);
CDEntrada3.addActionListener(this);
CDArquivo1.addActionListener(this);
CDCor1.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
int retorno = 0;
49
50
}
else if (origem == CDEntrada3)
{
Object[] valores= {"Opo Um","Opo Dois","Opo Trs","Opo Quatro"};
Object valorSelec = JOptionPane.showInputDialog(null,
"Escolha uma opo",
"Entrada", JOptionPane.INFORMATION_MESSAGE,
null, valores, valores[0]);
LabelEntrada.setText("Retorno: " + valorSelec.toString());
}
else if (origem == CDArquivo1)
{
JFileChooser abreArquivo = new JFileChooser();
abreArquivo.setCurrentDirectory(new File("."));
abreArquivo.setSelectedFile(new File("AbasRotuladas.java"));
retorno = abreArquivo.showOpenDialog(this);
LabelArquivo1.setText("Retorno: " + retorno);
if (retorno == JFileChooser.APPROVE_OPTION)
{
File arquivoSelec = abreArquivo.getSelectedFile();
LabelArquivo2.setText("Seleo: " + arquivoSelec.getName());
}
else
LabelArquivo2.setText("Seleo: Nenhum arquivo");
}
else if (origem == CDCor1)
{
JColorChooser abreCor = new JColorChooser();
Color c = abreCor.showDialog(this, "Escolha uma cor", Color.black);
LabelCor.setForeground(c);
LabelCor.setText("Retorno: " + c.toString());
}
}
public static void main (String[] args)
{
AbasRotuladas fr = new AbasRotuladas();
fr.setVisible(true);
}
}
Figura 3.9. Abas rotuladas para demonstrao das diversas caixas de dilogo
Na figura 3.9 possvel visualizar a situao do frame na execuo da aplicao. Para que as abas
fossem criadas, foi definido um objeto Abas, do tipo JTabbedPane. Como so seis as abas, foram
criados seis painis (PCxDlgMensagem, PCxDlgConfirmacao, PCxDlgOpcao, PCxDlgEntrada,
51
52
O quarto tipo a caixa de dilogo de entrada, que um pouco diferente que as outras, pois
permite a insero ou seleo de valores textuais. Se a caixa de dilogo permitir a insero de um
valor, o retorno do tipo String, j que o que vai ser digitado um texto. No caso de ser
permitida a seleo de um dos valores em uma lista, o retorno um objeto do tipo Object, onde,
atravs de um mtodo toString() possvel obter o contedo textual do tem selecionado. O
mtodo para criao desse tipo de caixa de dilogo o showInputDialog() e suas variaes so:
53
com a possibilidade de inserir um ttulo e selecionar o tipo da mensagem, que vai definir o
cone a ser apresentado, que pode ser: ERROR_MESSAGE, INFORMATION_MESSAGE,
WARNING_MESSAGE, QUESTION_MESSAGE, ou PLAIN_MESSAGE.
A quinta aba apresenta um boto que, ao ser clicado, abre uma caixa de dilogo de arquivos,
como mostra a figura 3.11. A classe JFileChooser fornece mtodos para apresentar essa caixa
de dilogo e configur-la conforme as necessidades. Semelhante s outras caixas de dilogo, essa
tambm apresentada na forma modal, tendo que fecha-la antes de continuar a utilizao da
aplicao que a chamou.
No exemplo apresentado criado um objeto abreArquivo, do tipo JFileChooser, em primeiro
lugar. Aps setado o diretrio a ser mostrado inicialmente, atravs do mtodo
setCurrentDirectory(), passando como parmetro um objeto do tipo File. Alm do diretrio,
foi setado o nome do arquivo inicial da busca, atravs do mtodo setSelectedFile(), que
tambm precisa de um objeto do tipo File como parmetro. No foi utilizado no exemplo, mas,
se for necessrio permitir a seleo mltipla de arquivos, possvel utilizar o mtodo
setMultiSelectionEnabled(true). Para abrir a caixa de dilogo, basta chamar o mtodo
showOpenDialog(), tendo como valor de retorno um inteiro que representa o boto que foi
pressionado (0 para Open e 1 para Cancel). Da mesma forma, se for desejvel abrir uma caixa de
dilogo para Salvar arquivo, ao invs de Abrir, basta utilizar o showSaveDialog(). No
exemplo, foi utilizada a varivel retorno para ser posteriormente mostrada no label
LabelArquivo1.
54
Esse retorno pode ser testado utilizando o JFileChooser.APPROVE_OPTION, no caso de ter sido
clicado o boto Open e JFileChooser.CANCEL_OPTION, no caso de ter sido clicado o boto
Cancel. No exemplo, se for clicado no boto Open, atribudo ao objeto arquivoSelec, do tipo
File, o retorno do mtodo getSelectedFile(), que traz o arquivo que foi selecionado na caixa
de dilogo. Se existir a situao de mltipla seleo de arquivos, o mtodo a ser utilizado o
getSelectedFiles(), que retorna um arranjo de objetos do tipo File. Aps, o nome desse
arquivo foi mostrado no label LabelArquivo2, atravs do mtodo getName(). Caso tenha sido
clicado no boto Cancel, esse mesmo label apresenta uma mensagem que no foi selecionado
nenhum arquivo.
A sexta e ltima aba apresenta um boto que, ao ser clicado, abre uma caixa de dilogo de
seleo de cores, mostrado na figura 3.12. A classe JColorChooser a responsvel por essa
tarefa. No exemplo, foi criado um objeto abreCor a partir dessa classe e depois foi aberta a caixa
de dilogo a partir do mtodo showDialog(), tendo que passar como parmetro o seu ttulo e a
sua cor inicial. O retorno desse mtodo foi atribudo a um objeto c, do tipo Color, para depois ser
utilizado na determinao da cor do label, atravs do mtodo setForeground().
serem clicados, podem abrir itens de menu, com aes diretas, ou submenus, que abrem outros
menus suspensos direita, contendo itens de menu ou at mesmo outros submenus.
Os itens de menu podem ser mostrados de diversas formas: com uma imagem associada, com
teclas de atalho, com teclas aceleradoras, na forma de caixa de seleo ou boto de rdio. Ao
serem clicados, os itens de menu disparam eventos de ao, como um boto, por exemplo.
Referente s teclas de atalho, so utilizados mnemnicos para realizar essa funo, que sublinham
um caracter para cada item de menu e so ativados utilizando a tecla Alt + caracter sublinhado.
Quanto s teclas aceleradoras, possvel relacionar uma combinao de teclas, ou uma tecla de
funo, aos itens de menu, como Ctrl + C, Alt + R ou F3.
Para demonstar a utilizao da maioria das funes possveis em um menu, o exemplo a seguir
apresenta uma barra de menu com itens que manipulam uma rea de texto. Uma rea de texto
semelhante aos objetos da classe JTextField, mas permite a entrada de mais que uma linha de
texto, podendo utilizar a tecla Enter para passar de uma linha para outra. A classe responsvel por
esse componente a JTextArea, permitindo especificar o nmero de linhas e colunas na criao
dos seus objetos.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class TesteDeMenu extends JFrame implements ActionListener
{
private JRadioButtonMenuItem RBFontes[],RBCores[];
private JCheckBoxMenuItem CBNegritoItalico[];
private Color cores[]= {Color.black, Color.red,
Color.blue, Color.orange, Color.green};
private JTextArea AreaTexto;
private ButtonGroup grupoFontes, grupoCores;
public TesteDeMenu()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(400,180);
setLocation(200,150);
setTitle("Menus e reas de Texto");
JMenuBar BarraMenu = new JMenuBar();
setJMenuBar(BarraMenu);
// criao do menu Arquivo
JMenu menuArquivo = new JMenu("Arquivo");
menuArquivo.setMnemonic('A');
JMenuItem itemNovo = new JMenuItem("Novo...", new ImageIcon("novo.gif"));
itemNovo.setMnemonic('N');
JMenuItem itemAbrir= new JMenuItem("Abrir...",new ImageIcon("abrir.gif"));
itemAbrir.setMnemonic('b');
itemAbrir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));;
JMenuItem itemSalvar= new JMenuItem("Salvar",new ImageIcon("salvar.gif"));
itemSalvar.setMnemonic('S');
itemSalvar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
InputEvent.CTRL_MASK));;
JMenuItem itemSair= new JMenuItem("Sair");
56
itemSair.setMnemonic('r');
itemSair.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,
InputEvent.ALT_MASK));;
menuArquivo.add(itemNovo);
menuArquivo.add(itemAbrir);
menuArquivo.addSeparator();
menuArquivo.add(itemSalvar);
menuArquivo.addSeparator();
menuArquivo.add(itemSair);
BarraMenu.add(menuArquivo);
itemNovo.addActionListener(this);
itemAbrir.addActionListener(this);
itemSalvar.addActionListener(this);
itemSair.addActionListener(this);
// criao do menu Editar
JMenu menuEditar = new JMenu("Editar");
menuEditar.setMnemonic('E');
JMenuItem itemRecortar = new JMenuItem("Recortar...",
new ImageIcon("recortar.gif"));
itemRecortar.setMnemonic('t');
itemRecortar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
InputEvent.CTRL_MASK));;
JMenuItem itemCopiar = new JMenuItem("Copiar...",
new ImageIcon("copiar.gif"));
itemCopiar.setMnemonic('b');
itemCopiar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
InputEvent.CTRL_MASK));;
JMenuItem itemColar = new JMenuItem("Colar...",
new ImageIcon("colar.gif"));
itemColar.setMnemonic('S');
itemColar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
InputEvent.CTRL_MASK));;
menuEditar.add(itemRecortar);
menuEditar.add(itemCopiar);
menuEditar.add(itemColar);
BarraMenu.add(menuEditar);
itemRecortar.addActionListener(this);
itemCopiar.addActionListener(this);
itemColar.addActionListener(this);
// criao do menu Formatar
JMenu menuFormatar = new JMenu("Formatar");
menuFormatar.setMnemonic('F');
// criao do submenu Cor
String nomesCores[]= {"Preto", "Vermelho", "Azul", "Laranjado", "Verde"};
JMenu menuCor = new JMenu("Cor");
menuCor.setMnemonic('C');
RBCores = new JRadioButtonMenuItem[nomesCores.length];
grupoCores = new ButtonGroup();
for (int i = 0; i < nomesCores.length; i++)
{
RBCores[i] = new JRadioButtonMenuItem(nomesCores[i]);
menuCor.add(RBCores[i]);
grupoCores.add(RBCores[i]);
RBCores[i].addActionListener(this);
}
RBCores[0].setSelected(true);
menuFormatar.add(menuCor);
57
menuFormatar.addSeparator();
// criao do submenu Fonte
String nomesFontes[] = {"SansSerif", "Monospaced", "Serif"};
JMenu menuFonte = new JMenu("Fonte");
menuFonte.setMnemonic('n');
RBFontes = new JRadioButtonMenuItem[nomesFontes.length];
grupoFontes = new ButtonGroup();
for (int i = 0; i < RBFontes.length; i++)
{
RBFontes[i] = new JRadioButtonMenuItem(nomesFontes[i]);
menuFonte.add(RBFontes[i]);
grupoFontes.add(RBFontes[i]);
RBFontes[i].addActionListener(this);
}
RBFontes[0].setSelected(true);
menuFonte.addSeparator();
String CBItalicoNegrigoItens[] = {"Negrito", "Itlico"};
CBNegritoItalico = new JCheckBoxMenuItem[CBItalicoNegrigoItens.length];
for (int i = 0; i < CBItalicoNegrigoItens.length; i++)
{
CBNegritoItalico[i] = new JCheckBoxMenuItem(CBItalicoNegrigoItens[i]);
menuFonte.add(CBNegritoItalico[i]);
CBNegritoItalico[i].addActionListener(this);
}
menuFormatar.add(menuFonte);
BarraMenu.add(menuFormatar);
// criao do menu Ajuda
JMenu menuAjuda = new JMenu("Ajuda");
menuAjuda.setMnemonic('u');
JMenuItem itemSobre = new JMenuItem("Sobre a Aplicao...");
itemSobre.setMnemonic('S');
menuAjuda.add(itemSobre);
BarraMenu.add(menuAjuda);
itemSobre.addActionListener(this);
AreaTexto = new JTextArea(5, 40);
AreaTexto.setForeground(Color.black);
AreaTexto.setFont(new Font("SansSerif", Font.PLAIN, 14));
AreaTexto.setLineWrap(true);
Container P = getContentPane();
P.add(new JScrollPane(AreaTexto));
}
public void actionPerformed(ActionEvent evt)
{
if (evt.getSource() instanceof JMenuItem)
{
String item = evt.getActionCommand();
if (item == "Novo...")
JOptionPane.showMessageDialog(this, "Opao Novo no disponvel!",
"Alerta", JOptionPane.WARNING_MESSAGE);
else if (item == "Abrir...")
JOptionPane.showMessageDialog(this, "Opao Abrir no disponvel!",
"Alerta", JOptionPane.WARNING_MESSAGE);
else if (item == "Salvar")
JOptionPane.showMessageDialog(this, "Opao Salvar no disponvel!",
"Alerta", JOptionPane.WARNING_MESSAGE);
else if (item == "Sair")
58
System.exit(0);
else if (item == "Recortar...")
AreaTexto.cut();
else if (item == "Copiar...")
AreaTexto.copy();
else if (item == "Colar...")
AreaTexto.paste();
else if (item == "Sobre a Aplicao...")
JOptionPane.showMessageDialog(this,
"Este um exemplo de utilizao de menus",
"Sobre", JOptionPane.PLAIN_MESSAGE);
else
{
int Tipo = Font.PLAIN;
if (CBNegritoItalico[0].isSelected())
Tipo += Font.BOLD;
if (CBNegritoItalico[1].isSelected() )
Tipo += Font.ITALIC;
AreaTexto.setFont(new Font(AreaTexto.getFont().getName(), Tipo, 14));
for (int i = 0; i < RBCores.length; i++)
if (evt.getSource() == RBCores[i])
{
AreaTexto.setForeground(cores[i]);
break;
}
for (int i = 0; i < RBFontes.length; i++ )
if (evt.getSource() == RBFontes[i])
{
AreaTexto.setFont(new Font(RBFontes[i].getText(), Tipo, 14));
break;
}
repaint();
}
}
}
public static void main(String args[])
{
TesteDeMenu fr = new TesteDeMenu();
fr.setVisible(true);
}
}
59
A figura 3.13 mostra a execuo da aplicao, notando que no foi inserido nenhum painel no
frame, tendo sido setada a barra de menu para o frame e inserida a rea de texto diretamente em
um continer. Para criar uma rea de texto necessrio, primeiramente, criar um objeto do tipo
JTextArea e passar os parmetros para determinar o nmero de linhas e o nmero de colunas
desejado. Aps, alguns mtodos podem ser utilizados para configurar a rea: o setForeground()
indica a cor do texto; o setFont() determina o tipo, tamanho e formato de fonte; o
setLineWrap() determina se o texto vai mudar de linha ao chegar no final da rea definida. Para
que o texto possa ser mostrado com barras de rolagem, caso este seja maior que a rea visvel,
necessrio inserir o objeto rea de texto em um objeto JScrollPane e aps inseri-lo no continer.
Dois outros mtodos so teis: o setWrapStyleWord(), que faz a quebra da linha ao final da
palavra se o parmetro for true, ou ignora o final da palavra para a quebra da linha, se o
parmetro for falso, e; o setTabSize(), que determina, em seu parmetro, o nmero de colunas
utilizados para a tabulao.
Para criar o menu mostrado na figura 3.14, foi necessrio seguir vrios passos. No exemplo, antes
de tudo, foi criado o objeto BarraMenu, do tipo JMenuBar, para depois ser passado como
parmetro pelo mtodo setJMenuBar(), que responsvel pela insero do menu no frame.
Aps foram inseridos os vrios menus que compem a barra de menu. Para a criao do menu
Arquivo foi criado um objeto menuArquivo, do tipo JMenu e setado um mnemnico, que ir
sublinhar o caracter desejado e servir de tecla de atalho, atravs do mtodo setMnemonic().
Os itens de menu so adicionados a seguir, a partir da criao de objetos do tipo JMenuItem,
permitindo a definio de imagens a serem mostradas juntamente com os itens. Para cada item foi
setada uma tecla de atalho a partir do setMnemonic() e, para alguns deles, foram associadas
teclas aceleradoras atravs do mtodo setAccelerator(), tendo que passar como parmetro um
objeto do tipo KeyStroke, que identifica o caracter e a tecla de controle utilizados para fazer a
combinao. Tendo definidos todos itens de menu, suas teclas de atalho e aceleradoras, estes
foram adicionados ao menu menuArquivo, e este foi adiconado barra de menu BarraMenu.
Percebe-se a existncia de linhas separatrias entre os itens, criadas pelo mtodo
addSeparator(). Como os itens de menu respondem a eventos de ao, foi setado um ouvinte
de eventos para cada um, a partir do addActionListener. Os mesmos passos foram seguidos
para criar os menus menuEditar e menuAjuda.
A criao do menuFormatar segue basicamente os mesmos passos, mas eles possuem, no lugar
de itens de menu comuns, itens que abrem submenus, que contm outros itens especiais (caixas
60
de seleo e botes de rdio). Assim, no menu Formatar foram inseridos dois submenus: Cor e
Fonte. Para a criao do menu Cor foi definido um objeto menuCor, do tipo JMenu, e foram
adicionados seis itens de menu a partir do arranjo RBCores, do tipo JRadioButtonMenuItem. Por
se tratar de botes de rdio, foi necessrio adicion-los tambm ao grupo grupoCores, do tipo
ButtonGroup. Antes de adicionar o menuCor ao menuFormatar, foi setado o boto de rdio que
inicia selecionado, pelo mtodo setSelected().
Para a criao do menu Fonte foi definido um objeto menuFonte, tambm do tipo JMenu, e foram
adicionados: um grupo de botes de rdio, seguindo os mesmos passos j apresentados, uma
linha separatria, e dois itens do tipo caixa de seleo, feitos a partir do arranjo
CBNegritoItalico, do tipo JCheckBoxMenuItem. Ao final, o menuFonte foi adicionado ao
menuFormatar, e esse, por sua vez, foi adicionado barra de menu. Da mesma forma que os
itens de menu normais, tembm foi setado um ouvinte de eventos para cada um, a partir do
addActionListener.
Como j comentado, para o tratamento dos eventos, foi utilizada a interface ActionListener e
implementado o mtodo actionPerformed() que, a partir do getActionCommand(), permite a
comparao do que foi clicado com o texto do item de menu especfico. Como as opes Novo,
Abrir e Salvar no possuem uma efetiva implementao, foi apresentada uma mensagem para
cada uma delas. O item Sair encerra a aplicao. Os itens do menu Editar simplesmente
executam os mtodos cut(), copy() e paste(), do objeto AreaTexto. O item Sobre tambm
mostra apenas uma mensagem. Caso o item selecionado for algum dos constantes no menu
Formatar, ento so utilizados mtodos como o setFont() e o setForeground(), para realizar
as operaes desejadas, sendo confirmadas a partir do repaint().
Como padro, os componentes do Swing so percorridos, pela tecla Tab, da esquerda para a
direita e de cima para baixo, dentro do continer. Essa ordem conhecida como Ordem de
tabulao, e o exemplo a seguir foi criado para realizar a verificao dessa ordem.
import
import
import
import
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.border.*;
62
As legendas inseridas na figura 3.15 mostram o sentido natural seguido pelos componentes do
Swing. Se existir um continer dentro de outro, no momento que entrar no continer interno, ir
ser seguida a ordem padro at o seu ltimo componente, s ento voltar a percorrer os
componentes do continer externo. possvel alterar essa ordem atravs do mtodo
setNextFocusableComponent(). Por exemplo, para passar o foco do objeto TextoUm
diretamente para o TextoTres, basta implementar o cdigo:
TextoUm.setNextFocusableComponent(TextoTres);
Nesse caso, aps o TextoUm viria o TextoTres, e depois retornaria o sentido normal, ou seja:
TextoDois, BotaoUm, etc., a no ser que se altere novamente a ordem.
Como visto anteriormente, o requestFocus() permite alterar o foco, mas apenas em resposta a
algum evento. Isso bastante til se for necessrio testar o contedo de uma caixa de texto e,
caso no esteja correto, emitir uma mensagem e no permitir a sada da caixa, como no exemplo
a seguir.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FocoAlterado extends JFrame implements FocusListener
{
private JTextField TextoUm;
private JTextField TextoDois;
public FocoAlterado()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(300,70);
setLocation(200,200);
setTitle("Alterando o Foco");
Container P = getContentPane();
JPanel PainelFoco = new JPanel();
TextoUm = new JTextField("Texto Um",10);
PainelFoco.add(TextoUm);
63
A figura 3.16 mostra o que acontece se for feita a tentativa de sair da primeira caixa de texto sem
digitar nada nela. Para que isso seja possvel, necessrio implementar os mtodos da interface
FocusListener, focusLost() e focusGained(), que so invocados no momento que a origem
do evento ganhar ou perder o foco. O parmetro FocusEvent uma classe que apresenta alguns
mtodos importantes, como o getComponent(), que informa quem recebeu ou perdeu o foco e o
isTemporary(), que informa se a mudana de foco foi permanente ou temporria, podendo ser,
por exemplo, na ativao de uma outra janela e posterior retorno janela atual.
No exemplo, para o objeto TextoUm, foi adicionado o ouvinte de eventos a partir do
addFocusListener(). No mtodo focusLost() foi feito o teste se a origem do evento foi o
TextoUm e se no foi uma perda de foco temporria. Caso seja verdadeiro e o contedo da caixa
de texto esteja vazio, mostrada uma mensagem e devolvido o foco ao prprio TextoUm, no
permitindo, dessa forma, sair da caixa de texto sem a digitao de algo. Como no foi realizada
64
Alm do mtodo windowClosing(), outros seis mtodos podem ser implementados. So eles:
windowDeactivated():
windowOpened(): ocorre
windowDeiconified():
a janela minimizada.
65
System.exit(0);
}
public void windowOpened(WindowEvent e)
{
setTitle("Aberto");
}
public void windowIconified(WindowEvent e)
{
setTitle("Minimizado");
}
public void windowDeiconified(WindowEvent e)
{
setTitle("Restaurado");
}
});
setSize(300,70);
setLocation(200,200);
}
public static void main(String[] args)
{
JFrame fr = new EventosEmJanelas();
fr.setVisible(true);
}
}
Percebe-se que a estrutura adotada na maioria dos exemplos vistos at aqui foi seguida,
acrescentando-se apenas os mtodos windowOpened(), na abertura do frame,
windowIconified(), no ato de minimizar o frame, e windowDeiconified(), no ato de restaurar
o frame. O resultado, apresentado na figura 3.17, mostra que foi feita uma alterao no ttulo do
frame nesses mtodos. O mtodo windowClosing(), antes de finalizar a aplicao, mostra uma
mensagem alertando o usurio que isso ir acontecer. Nota-se que os demais mtodos no foram
implementados, pois nesse tipo de implementao no necessrio.
A segunda maneira de realizar as mesmas tarefas mostrada no exemplo a seguir.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosEmJanelasSegundaForma extends JFrame
implements WindowListener
{
public EventosEmJanelasSegundaForma()
66
{
addWindowListener(this);
setSize(300,70);
setLocation(200,200);
}
public void windowClosing(WindowEvent e)
{
JOptionPane.showMessageDialog(null, "O frame ser fechado...");
System.exit(0);
}
public void windowOpened(WindowEvent e)
{
setTitle("Aberto");
}
public void windowIconified(WindowEvent e)
{
setTitle("Minimizado");
}
public void windowDeiconified(WindowEvent e)
{
setTitle("Restaurado");
}
public void windowClosed(WindowEvent e) { }
public void windowActivated(WindowEvent e) { }
public void windowDeactivated(WindowEvent e){ }
public static void main(String[] args)
{
JFrame fr = new EventosEmJanelasSegundaForma();
fr.setVisible(true);
}
}
A execuo a mesma, mas a forma escolhida para a programao diferente. Observe que, em
primeiro lugar, utilizou-se o implements WindowListener, e aps foi realizada a implementao
dos mtodos, tornando-se obrigatria, dessa forma, que todos os mtodos estejam presentes,
inclusive aqueles que no tem nenhum cdigo interno.
3.10.3 Eventos de Mouse
Qualquer ao do mouse pode ser capturada como sendo um evento especfico, porm, na
maioria das vezes, essas aes j so tratadas pelos componentes que esto sendo manipulados.
Por exemplo, se for clicado em um boto, o mtodo a ser implementado o
actionPerformed(), da interface ActionListener, no sendo necessrio tratar exclusivamente
o clique do mouse. Porm, existem situaes que necessitam da implementao de linhas de
cdigo que respondam a eventos de mouse, e quando isso acontece, os mtodos da interface
MouseListener e MouseMotionListener devem ser implementados, tendo como parmetro um
67
objeto do tipo MouseEvent, que contm as informaes necessrias para o tratamento, como as
coordenadas x e y de onde o evento ocorreu, por exemplo.
A interface MouseListener possui cinco mtodos possveis de serem implementados. So eles:
mousePressed(): ocorre
mouseExited():
mouseMoved():
especfico.
68
// mensagem no perceptvel
69
Apenas uma das mensagens, das vrias existentes, est sendo mostrada na figura 3.18. Antes de
tudo, as duas interfaces esto sendo utilizadas, atravs do implements MouseListener,
MouseMotionListener. Atravs do addMouseListener() e do addMouseMotionListener() foi
setado o frame como sendo ouvinte de eventos dele mesmo. Para que o boto BotaoOK tambm
pudesse responder aos eventos de clique, foi adicionado um ouvinte de eventos para ele. O
resultado que, para cada um dos mtodos implementados, uma mensagem mostrada no label
Mensagem, que fica no painel situado na parte sul do frame. Em algumas situaes, porm,
algumas mensagens no podem ser vistas porque a mensagem de outro evento a sobrepe, como
o caso de quando se entra no frame, onde a mensagem sobreposta por aquela emitida pelo
mtodo mouseMoved().
Os mtodos mouseClicked(), mousePressed() e mouseReleased() simplesmente atualizam o
label com: a mensagem de qual boto foi pressionado, informao adquirida pelo mtodo
getButton(), que retorna um inteiro (1- boto esquerdo, 2- boto do meio e 3- boto direito); a
ao realizada, se o boto foi clicado, pressionado ou liberado; e as coordenadas x e y, adquiridas
pelos mtodos getX() e getY(). Como o boto tambm possui um ouvinte de eventos, a
mensagem tambm atualizada quando o evento ocorre sobre ele. Percebe-se que as coordenadas
x e y so especficas do boto.
Nos mtodos mouseEntered() e mouseExited() h um tratamento especial para a ocorrncia do
evento no boto. Quando o evento de entrada ou sada ocorre no frame, apenas uma mensagem
adequada mostrada, porm, quando esse tipo de evento ocorre no boto, alm da mensagem,
alterado o cursor para HAND_CURSOR na entrada e para o cursor padro na sada. Isso feito a
partir do mtodo setCursor(), que tem como parmetro um objeto do tipo Cursor, onde,
atravs do getPredefinedCursor(), possvel setar um dos cursores pr-definidos. Alguns
desses tipos de cursor so mostrados na tabela 3.1.
70
DEFAULT_CURSOR
HAND_CURSOR
WAIT_CURSOR
TEXT_CURSOR
CROSSHAIR_CURSOR
MOVE_CURSOR
N_RESIZE_CURSOR
SW_RESIZE_CURSOR
SE_RESIZE_CURSOR
E_RESIZE_CURSOR
Por fim, durante a movimentao sobre o frame, com ou sem o boto do mouse pressionado, uma
mensagem mostrada, indicando o posicionamento. Os mtodos responsveis so o
mouseMoved() e o mouseDragged(). Percebe-se que esse tipo de mensagem no aparece quando
se passa em cima do boto. Isso ocorre porque no foi adicionado um ouvinte de eventos de
movimento (addMouseMotionListener()) ao boto.
3.10.4 Eventos de Teclado
Da mesma forma que o mouse, qualquer evento gerado pelo teclado pode ser tratado, mas isso s
necessrio em situaes em que o evento ocorrido no esteja associado a um componente
especfico. No mesmo exemplo utilizado para os eventos de mouse, um boto, para ser
presssionado, pode ser clicado o mouse sobre ele, ou pode ser pressionada a barra de espaos
quando o foco est sobre ele. Nesse caso, o evento a ser tratado no algum especfico de
teclado, e sim o evento especfico para o boto. Nos casos especficos de tratamento de eventos
de teclado, a interface utilizada a KeyListener, onde existem trs mtodos possveis de serem
implementados, todos eles recebendo um objeto do tipo KeyEvent como parmetro. So eles:
keyPressed():
keyReleased():
pressionamento.
keyTyped():
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventosDeTeclado extends JFrame implements KeyListener
{
private JLabel Mensagem;
private int tecla = 0;
private String teclaPressed = null;
private char teclaTyped;
private boolean entrouPressed;
private boolean combinacao;
public EventosDeTeclado()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
addKeyListener(this);
setSize(250,100);
setLocation(300,250);
setTitle("Eventos de Teclado");
Container P = getContentPane();
Mensagem = new JLabel();
P.add(Mensagem);
}
public void keyPressed(KeyEvent e)
{
tecla = e.getKeyCode();
teclaPressed = e.getKeyText(tecla);
entrouPressed = true;
switch (tecla){
case KeyEvent.VK_SHIFT: teclaPressed = "Shift"; break;
case KeyEvent.VK_CONTROL: teclaPressed = "Control"; break;
case KeyEvent.VK_ALT: teclaPressed = "Alt"; break;
case KeyEvent.VK_RIGHT: teclaPressed = "Direita"; break;
case KeyEvent.VK_LEFT: teclaPressed = "Esquerda"; break;
case KeyEvent.VK_UP: teclaPressed = "Cima"; break;
case KeyEvent.VK_DOWN: teclaPressed = "Baixo"; break;
}
if (tecla == KeyEvent.VK_A && e.isShiftDown())
{
combinacao = true;
teclaPressed = "Shift + A";
}
if (tecla == KeyEvent.VK_A && e.isControlDown())
{
combinacao = true;
teclaPressed = "Control + A";
}
if (tecla == KeyEvent.VK_A && e.isAltDown())
{
combinacao = true;
teclaPressed = "Alt + A";
}
Mensagem.setText("Tecla " + tecla + " - " + teclaPressed +" PRESSIONADA");
72
}
public void keyReleased(KeyEvent e)
{
if (entrouPressed)
{
Mensagem.setText("Tecla " + tecla + " - " + teclaPressed + " LIBERADA");
combinacao = false;
}
else
Mensagem.setText("Tecla " + teclaTyped + " LIBERADA");
}
public void keyTyped(KeyEvent e)
{
if (!combinacao)
{
teclaTyped = e.getKeyChar();
entrouPressed = false;
Mensagem.setText("Tecla " + teclaTyped +
}
}
" PRESSIONADA");
Um label Mensagem inserido no frame (figura 3.19) indica qual tecla ou combinao foi
pressionada ou liberada. Para que isso seja possvel, necessrio implementar os trs mtodos da
interface KeyListener. No exemplo, algumas variveis foram declaradas a fim de utilizar nos
trs mtodos, j que, em algumas situaes, a mensagem de um sobreporia aquela emitida por
outro mtodo. No keyPressed() a varivel tecla armazena o cdigo inteiro da tecla
pressionada, a partir do getKeyCode(), e a varivel teclaPressed armazena a descrio da tecla
pressionada, a partir do getKeyText(). No caso de se querer testar uma tecla especfica,
necessrio testar o cdigo para ver se ele igual a alguma das constantes definidas na classe
KeyEvent, sempre iniciadas por VK_. No exemplo, foi feito isso simplesmente para colocar uma
descrio em portugus de algumas teclas na varivel teclaPressed. Aps, foi verificada a
ocorrncia, e atualizada a varivel teclaPressed, das combinaes de teclas Shift+A,
Control+A e Alt+A, atravs dos mtodos isShiftDown(), isControlDown() e isAltDown(),
respectivamente. A varivel entrouPressed setada para true sempre que for executado o
mtodo keyPressed() e a varivel combinacao setada para true sempre que forem
73
javax.swing.*;
java.awt.event.*;
java.awt.*;
java.beans.*;
74
private
private
private
private
private
private
private
JDesktopPane DPane;
JPopupMenu Menu;
JButton abreFrameUm;
JButton abreFrameDois;
JButton sair;
JInternalFrame IFrameUm;
JInternalFrame IFrameDois;
public AplicacaoMDI()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(500,400);
setLocation(100,50);
setTitle("Aplicao MDI com Barra de Ferramentas e Menu Flutuante");
//criao do menu
JMenuBar BarraMenu = new JMenuBar();
setJMenuBar(BarraMenu);
JMenu menuArquivo = new JMenu("Arquivo");
menuArquivo.setMnemonic('A');
JMenuItem itemAbrirUm = new JMenuItem("Abrir Frame Interno Um...",
new ImageIcon("EstrelaUm.gif"));
itemAbrirUm.setMnemonic('U');
JMenuItem itemAbrirDois= new JMenuItem("Abrir Frame Interno Dois...",
new ImageIcon("EstrelaDois.gif"));
itemAbrirDois.setMnemonic('D');
JMenuItem itemSair= new JMenuItem("Sair",
new ImageIcon("Sair.gif"));
itemSair.setMnemonic('r');
itemSair.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,
InputEvent.ALT_MASK));;
menuArquivo.add(itemAbrirUm);
menuArquivo.add(itemAbrirDois);
menuArquivo.addSeparator();
menuArquivo.add(itemSair);
BarraMenu.add(menuArquivo);
itemAbrirUm.addActionListener(this);
itemAbrirDois.addActionListener(this);
itemSair.addActionListener(this);
//criao da barra de ferramentas
JToolBar barra = new JToolBar();
abreFrameUm = new JButton(new ImageIcon("EstrelaUm.gif"));
abreFrameUm.setToolTipText("Abre o Frame Interno Um");
abreFrameDois = new JButton(new ImageIcon("EstrelaDois.gif"));
abreFrameDois.setToolTipText("Abre o Frame Interno Dois");
sair = new JButton(new ImageIcon("Sair.gif"));
sair.setToolTipText("Encerra a aplicao");
barra.add(abreFrameUm);
barra.add(abreFrameDois);
barra.addSeparator();
barra.add(sair);
abreFrameUm.addActionListener(this);
abreFrameDois.addActionListener(this);
sair.addActionListener(this);
Container P = getContentPane();
P.setLayout(new BorderLayout());
P.add(barra,"North");
75
76
77
A primeira parte do exemplo mostra a criao da barra de menu do frame principal, j adiantando
que os frames internos tambm podem conter barras de menu individuais, o que no o caso do
exemplo. A barra de menu BarraMenu, objeto da classe JMenuBar, definida como barra de
menu do frame principal atravs do setJMenuBar(), e criado um nico menu nessa barra, o
menuArquivo, onde so adicionados os itens de menu apresentados na figura 3.20. O processo de
criao dos itens de menu segue o j visto em sees anteriores.
Aps, a barra de ferramentas mostrada na figura 3.21 criada, e isso feito de maneira simples, a
partir do objeto barra, da classe JToolBar. Ao criar esse objeto, todas as caractersticas
referentes a uma barra de ferramentas so assimiladas, sendo necessrio apenas inserir botes
com imagens atravs do mtodo add(). O tamanho de cada boto proporcional ao tamanho da
imagem e cada um dos botes vai ter um comportamento normal, sendo necessrio adicionar um
ouvinte de eventos (addActionListener()) a eles para virem a executar aes posteriormente.
Na figura, tambm possvel verificar a existncia de uma dica de ferramenta, que aparece
quando o cursor posicionado sobre um componente, para o boto sair, inserido em cada boto
a partir do mtodo setToolTipText(). bom lembrar que qualquer componente que possui
como superclasse a classe JComponent pode possuir uma dica de ferramenta. O separador
existente entre os dois primeiros botes e o ltimo foi adicionado pelo mtodo addSeparator().
Ao final, o objeto barra includo na parte norte do frame.
78
Entre as caractersticas particulares de uma barra de ferramentas, uma que se destaca a que est
sendo mostrada na figura 3.22, caracterizada pela sua mobilidade. A barra de ferramentas pode
ser arrastada para qualquer uma das bordas do frame, ou ainda pode ser destacada do frame,
sendo criado um frame especfico para ela. Nesse caso, se esse frame for fechado, a barra volta ao
seu lugar de origem.
79
Para que seja inserida a capacidade de receber frames internos, como mostra a figura 3.23,
criando assim uma aplicao MDI, necessrio adicionar ao continer um objeto da classe
JDesktopPane(). Foi isso que ocorreu na criao do objeto DPane, que, ao ser adicionado ao
continer, tornou possvel a criao de frames internos.
O mtodo putClientProperty() utilizado em seguida referente ao arrastar dos frames
internos. Como padro, toda vez que se tentar movimentar um frame interno, este redesenhado
a todo momento, enquanto estiver sendo arrastado. Isso pode causar desagrado a usurios que no
tenham um bom equipamento, principalmente no que diz respeito ao vdeo, pois o desempenho
pode no ser satisfatrio. Para evitar isso, o mtodo chamado faz com que, no ato de arrastar,
apenas o contorno aparea e o frame s seja redesenhado na posio final desejada. O Windows,
por exemplo, tem esse procedimento como padro no arrastar de janelas.
No exemplo, os frames internos somente sero criados se um evento ocorrer, seja pela chamada
do item de menu especfico, ou atravs da barra de ferramentas. Ento, no mtodo
actionPerformed(), se for selecionado o item do menu Abrir Frame Interno Um..., ou se
for clicado o primeiro boto da barra de ferramentas, ser mostrrado o primeiro frame interno.
Para isso, foi criado um objeto IFrameUm a partir da classe JInternalFrame, passando cinco
parmetros, seguindo a sintaxe:
JInternalFrame(String titulo,
boolean redimensionar,
boolean fechar,
boolean maximizar,
boolean minimizar)
80
Como todos os parmetro foram passados como true, o frame incorporou todas as
funcionalidades permitidas a ele. Aps, como qualquer outro frame, ele foi configurado atravs
de alguns mtodos:
setSize():
setLocation():
setFrameIcon(): insere
setVisible():
Para esse frame interno, e apenas esse, foi criado um menu flutuante a partir do objeto Menu, da
classe JPopupMenu (figura 3.24). Cada item de menu criado e adicionado ao menu flutuante da
81
mesma maneira que ocorre em um menu normal. No exemplo, no foi criado nenhum menu
muito elaborado, tendo apenas dois itens: itemTitulo e itemFechar. O primeiro tem como ao
a alterao do ttulo do frame pelo setTitle() a partir do retorno do que for digitado na caixa de
dilogo de entrada interna showInternalInputDialog(). Normalmente, quando se utilizam
frames internos, tambm so usadas caixas de dilogo internas. Elas so iguais s normais, mas,
alm do nome, que recebe o termo Internal, permitem criar caixas de dilogo com as mesmas
caractersticas dos frames internos, no sendo frames modais e possuem atuao dentro da rea
definida pelo frame principal.
No ato de fechar a caixa de dilogo, definindo o novo ttulo, o frameUm no volta a ficar
selecionado. Para isso, foi utilizado o mtodo setSelected(), necessitando tambm do
tratamento da exceo PropertyVetoException, pois pode ser que haja alguma rejeio nessa
ao.
O segundo item, o itemFechar, simplesmente executa o mtodo setClosed(), da mesma forma
que foi feito no boto BotaoFechar.
Com os itens criados, necessrio mostrar o menu de alguma forma e isso feito atravs do
mtodo show(). A questo a ser resolvida : onde ele ir ser mostrado? Como a inteno fazer
com que a rea de atuao desse menu flutuante seja somente o frame interno IFrameUm, nele
que foi adicionado um ouvinte de eventos baseado na interface MouseListener e implementado
o mtodo mouseReleased(). Isso porque o menu flutuante vai ser mostrado quando ocorrer uma
ao do mouse. No cdigo da implementao, foi utilizado o mtodo isPopupTrigger() para
verificar se o boto que foi clicado o correspondente ao boto padro para abrir menus
flutuantes da plataforma atual, no caso do Windows, o boto direito. Os parmetros do mtodo
show() envolvem o componente sobre o qual o menu flutuante ir aparecer e as coordenadas do
clique do mouse, que onde o menu flutuante ir ser desenhado
Por fim, criado um continer dentro do frame IFrameUm para receber o boto na parte inferior, o
frame adicionado ao DPane, rea destinada a receber os frames internos e utilizado o
setSelected() para selecionar o frame.
Ainda no actionPerformed(), caso o item do menu selecionado for o Abrir Frame Interno
Dois... ou se for clicado o segundo boto da barra de ferramentas, ser criado o segundo frame
interno (objeto IFrameDois). Os procedimentos de criao e configurao so os mesmos, mas
esse frame mais simples, possuindo o boto fechar e no possuindo o menu flutuante. Tambm
foi setado para false as opes de redimensionar, minimizar e maximizar.
Por fim, se o item do menu selecionado for o Sair ou se for clicado o terceiro boto da barra de
ferramentas, a aplicao ser finalizada, no interessando se existem frames internos abertos ou
no.
82
principal, como acontece com os frames internos. O exemplo a seguir ilustra essa situao, com a
criao de dois frames a partir de dois botes localizados no frame principal.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class VariosFrames extends JFrame implements ActionListener
{
private JButton abreFrameUm;
private JButton abreFrameDois;
private JFrame FrameDois;
public VariosFrames()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(300,200);
setLocation(150,150);
setTitle("Criando Frames");
JPanel painelVF = new JPanel();
abreFrameUm = new JButton("Criar Frame Um");
abreFrameDois = new JButton("Criar Frame Dois");
painelVF.add(abreFrameUm);
painelVF.add(abreFrameDois);
abreFrameUm.addActionListener(this);
abreFrameDois.addActionListener(this);
Container P = getContentPane();
P.add(painelVF);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
if (origem == abreFrameUm)
{
FrameUm frame = new FrameUm();
frame.show();
}
if (origem == abreFrameDois)
{
FrameDois = new JFrame();
FrameDois.setTitle("Frame Dois");
FrameDois.setSize(200,100);
FrameDois.setLocation(350,230);
JPanel painelFDois = new JPanel();
painelFDois.setLayout(new BorderLayout());
JButton Fecha = new JButton("Fechar");
painelFDois.add(Fecha,"South");
Container P = FrameDois.getContentPane();
P.add(painelFDois);
Fecha.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
FrameDois.dispose();
}
});
FrameDois.show();
83
}
}
public static void main(String args[])
{
VariosFrames fr = new VariosFrames();
fr.setVisible(true);
}
}
class FrameUm extends JFrame implements ActionListener
{
private JButton Fecha;
public FrameUm()
{
setSize(200,100);
setLocation(50,230);
setTitle("Frame Um");
JPanel painelFUm = new JPanel();
painelFUm.setLayout(new BorderLayout());
Fecha = new JButton("Fechar");
painelFUm.add(Fecha,"South");
Fecha.addActionListener(this);
Container P = getContentPane();
P.add(painelFUm);
}
public void actionPerformed(ActionEvent evt)
{
if (evt.getSource() == Fecha)
{
dispose();
}
}
}
Os dois frames criados tem o mesmo aspecto (figura 3.25), com posicionamento diferente, mas a
criao de cada um diferente. Em primeiro lugar, no frame principal, foram inseridos dois
botes no painel painelVF: abreFrameUm e abreFrameDois. O tratamento do evento de clicar do
84
primeiro boto simplesmente cria uma instncia da classe FrameUm, chamada frame, e mostra
atravs do show().
A classe FrameUm um frame normal, que possui, em seu construtor, a definio do tamanho,
localizao e ttulo, insero de um painel com um boto que, ao ser clicado, executa o mtodo
dispose() para finalizar o frame.
O segundo boto (abreFrameDois) tambm cria uma instncia de um frame, chamada
mas faz isso internamente, sem criar uma classe a parte. Dependendo da
complexidade do frame, isso pode ser um pouco complicado de se fazer, ou pelo menos, o cdigo
fica um pouco mais confuso. Talvez seja uma melhor idia construir uma classe para cada frame
a ser criado.
FrameDois,
Como as duas instncias de frame foram criadas dentro do frame principal, no momento que este
for finalizado, automaticamente os outros frames tambm sero.
3.13 Tabelas
Existem aplicaes que necessitam apresentar dados na forma de tabelas, como o caso de
aplicaes com banco de dados. Em Java, a classe JTable a responsvel pela tarefa de
tratamento de dados em tabelas, permitindo a manipulao de linhas e colunas. As tabelas criadas
a partir dessa classe so extremamente poderosas, possuindo muitos recursos para seu manuseio.
Apesar da complexidade, relativamente fcil criar uma tabela funcional, com um
comportamento pr-definido, como mostra o exemplo a seguir, que cria uma tabela simples.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class TabelaFormaUm extends JFrame implements ActionListener
{
private JButton BSair;
public TabelaFormaUm()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setSize(500,200);
setLocation(100,50);
setTitle("Tabela - Forma Um");
Container P = getContentPane();
P.setLayout(new BorderLayout());
// criao da tabela
String[] colunas = new String []{"Referncia", "Descrio", "Estoque"};
Object[][] linhas = new Object [][] {
{"01.015", "Televisor 15 polegadas", new Float(50)},
{"03.098", "Geladeira 300 litros", new Float(30)},
{"14.055", "Forno microondas", new Float(15)},
{"08.078", "DVD porttil", new Float(85)},
{"05.150", "Freezer vertical", new Float(25)},
{"10.004", "Aparelho de Som 300W", new Float(60)}};
JTable tabela = new JTable(linhas, colunas);
JScrollPane rolagemTabela = new JScrollPane(tabela);
85
P.add(rolagemTabela,"Center");
// criao do painel de baixo
JPanel pBaixo = new JPanel();
BSair = new JButton("Sair");
pBaixo.add(BSair);
P.add(pBaixo,"South");
BSair.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
if (origem == BSair)
{
System.exit(0);
}
}
public static void main(String args[])
{
TabelaFormaUm fr = new TabelaFormaUm();
fr.setVisible(true);
}
}
A execuo do exemplo apresenta a tabela da figura 3.26. A criao dela foi baseada em um
arranjo bidimensional, e no em um modelo de tabela, como o usual e mais indicado, visto no
exemplo posterior. Os nomes das colunas foram definidos em um arranjo String chamado
colunas. Os dados da tabela so armazenados em um arranjo bidimensional do tipo Object
chamado linhas. O arranjo do tipo Object pelo fato de que possvel ter muitos tipos de
objeto em uma coluna, como um JComboBox, por exemplo.
Aps definir os arranjos, base da construo da tabela, esta criada com a passagem dos
parmetros linhas e colunas, sendo depois inserida em um JScrollPane, para perimitir a
existncia de barras de rolagem, e este, por fim, sendo inserido no continer.
No painel de baixo inserido o boto BSair no painel pBaixo, que possui a tarefa de finalizar a
aplicao.
86
permisso para digitao dos dados, sendo que, se o valor no couber na clula,
reticncias (...) so apresentadas, indicando essa situao.
troca de colunas, onde uma coluna pode ser trocada com outra atravs do ato de arrastarsoltar, com o mouse posicionado no cabealho da coluna desejada.
javax.swing.*;
javax.swing.table.*;
java.awt.*;
java.awt.event.*;
87
88
A figura 3.26 apresenta o resultado da execuo aps clicar em alguns botes. A tabela foi criada
normalmente, baseada no JTable. Aps isso, foi setado o modelo pelo mtodo setModel(), cujo
parmetro a criao de um objeto DefaultTableModel, iniciando com um arranjo
bidimensional vazio e um arranjo String com os nomes das colunas. Nenhum dado
apresentado inicialmente porque isso uma tarefa do boto Incluir.
Para cada coluna foi configurado o seu tamanho, a partir do mtodo setPreferredWidth() e se
redimensinvel ou no, a partir do mtodo setResizable(). A coluna Ativo diferente das
demais, pois apresenta um caixa de seleo. Para que isso seja possvel, foi definido um objeto
cbAtivo, do tipo JComboBox, que, posteriormente, foi inserido na tabela a partir do mtodo
setCellEditor().
As
colunas
deixaram
89
o padro.
as colunas da tabela.
90
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class TabelaFormaTres extends JFrame implements ActionListener
{
private JButton btnExcluir;
private JButton btnIncluir;
private JButton btnMostrar;
private JButton btnAlterar;
private JButton btnMostrarClasse;
private JTextField texto;
private JTable tabela;
private int incCod = 0;
private ModeloTabela modelo;
public TabelaFormaTres()
{
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e){System.exit(0);}});
setTitle("Tabela - Forma Trs");
setSize(600,250);
setLocation(100,50);
Container P = getContentPane();
P.setLayout(new BorderLayout());
// criao de um arranjo sem tamanho definido para insero
// dinmica de objetos
ArrayList dados = new ArrayList();
// criao de um arranjo para os ttulos no cabealho
String[] colunas = new String[] { "ID", "Nome", "Sobrenome",
"Limite", "Ativo" };
// criao de um arranjo para identificar se a clula editvel ou no
boolean[] edicao = {false, true, true, false, true};
// Insero da primeira linha da tabela
dados.add(new Object[]{
new Integer(++incCod),
"Cliente " + incCod,
"Endereo " + incCod,
new Double(999.99),
new Boolean(true)
});
// criao da tabela baseada no modelo ModeloTabela
modelo = new ModeloTabela(dados, colunas, edicao);
tabela = new JTable(modelo);
tabela.getColumnModel().getColumn(0).setPreferredWidth(50);
tabela.getColumnModel().getColumn(0).setResizable(false);
tabela.getColumnModel().getColumn(1).setPreferredWidth(200);
tabela.getColumnModel().getColumn(1).setResizable(true);
tabela.getColumnModel().getColumn(2).setPreferredWidth(200);
tabela.getColumnModel().getColumn(2).setResizable(true);
tabela.getColumnModel().getColumn(3).setPreferredWidth(80);
tabela.getColumnModel().getColumn(3).setResizable(true);
tabela.getColumnModel().getColumn(4).setPreferredWidth(55);
tabela.getColumnModel().getColumn(4).setResizable(true);
tabela.getTableHeader().setReorderingAllowed(false);
tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
91
92
tabela.getSelectedColumn()).toString());
}
}
public static void main(String args[])
{
TabelaFormaTres fr = new TabelaFormaTres();
fr.setVisible(true);
}
}
class ModeloTabela extends AbstractTableModel
{
private ArrayList linhas = null;
private String[] colunas = null;
private boolean[] colEditavel;
public ModeloTabela(ArrayList lin, String[] col, boolean[] editavel)
{
setLinhas(lin);
setColunas(col);
colEditavel = editavel;
}
public ArrayList getLinhas()
{
return linhas;
}
public void setLinhas(ArrayList dados)
{
linhas = dados;
}
public String[] getColunas()
{
return colunas;
}
public void setColunas(String[] nomes)
{
colunas = nomes;
}
public int getColumnCount()
{
return colunas.length;
}
public int getRowCount()
{
return linhas.size();
}
public String getColumnName(int numCol)
{
return colunas[numCol];
93
}
public boolean isCellEditable(int numCol)
{
return colEditavel[numCol];
}
public Object getValueAt(int numLin, int numCol)
{
Object[] linha = (Object[])getLinhas().get(numLin);
return linha[numCol];
}
public void setValueAt(Object dado, int numLin, int numCol)
{
if (isCellEditable(numCol))
{
Object[] linha = (Object[])getLinhas().get(numLin);
linha[numCol] = dado;
fireTableDataChanged();
}
}
public void addRow(Object[] dados)
{
getLinhas().add(dados);
fireTableDataChanged();
}
public void removeRow(int numLin)
{
getLinhas().remove(numLin);
fireTableDataChanged();
}
public Class getColumnClass(int numCol)
{
Object[] linha = (Object[])getLinhas().get(0);
return linha[numCol].getClass();
}
}
94
O contrutor da classe recebe trs parmetros: um ArrayList, para iniciar a tabela com as linhas
desejadas; um arranjo String, que so os nomes das colunas, e; um arranjo boolean, com a
indicao da possibilidade de edio de cada uma das colunas. No momento da instanciao em
alguma aplicao, esses dados devem ser passados para que a tabela tenha uma situao inicial.
Como explicado anteriormente, os nomes das colunas no seriam atribudos se no fosse
sobreposto o mtodo getColumnName(), que retorna exatamente o contedo atribudo ao arranjo
colunas. Alm disso, os dois mtodos obrigatrios getRowCount()e getColumnCount() so
implementados, retornando o nmero de linhas e colunas do modelo.
Os demais mtodos implementados so:
95
obrigatria.
arranjo de objetos.
A criao da tabela baseada nesse modelo, que resulta na aplicao mostrada na figura 3.28,
feita na classe TabelaFormaTres. O ArrayList dados criado e adicionado a ele apenas uma
nica linha, que um arranjo de vrios objetos de tipos diferentes. Alm de dados, o arranjo
colunas criado e alimentado com os nomes das colunas da tabela; e o arranjo edicao criado
com a indicao se cada coluna editvel ou no.
Tais arranjos so passados como parmetro na criao do objeto da classe ModeloTabela,
explicado anteriormente, chamado modelo, e este serve como parmetro na criao da JTable.
Aps, como no exemplo anterior, so definidos os tamanhos de cada coluna
(setPreferredWidth()), e se elas so redimensionveis ou no (setResizable()). Tambm
igualmente ao exemplo anterior, as colunas deixam de ser reorganizveis, a partir do mtodo
setReorderingAllowed(), setado para false, e configurado o modo de redimensionamento
automtico das colunas da tabela, a partir do mtodo setAutoResizeMode().
Adicionalmente, o setSelectionMode() determina que s possvel selecionar uma linha por
vez
(SINGLE_SELECTION).
Os
outros
dois
valores
possveis
so:
MULTIPLE_INTERVAL_SELECTION, que permite a seleo de uma ou mais linhas, de forma
contgua ou no, e; SINGLE_INTERVAL_SELECTION, que permite a seleo de uma ou mais linhas,
desde que seja de forma contgua.
A tabela criada , ento, jogada em um JScrollPane e esse no continer. Aps, os botes
Incluir, Excluir, Mostrar, Alterar e Classe so inseridos, alm do JTextField texto. As
aes desses botes foram implementadas no ActionPerformed:
Incluir:
utiliza o mtodo addRow() do modelo para incluir uma nova linha no final da
tabela.
96
Excluir: utiliza o mtodo removeRow() do modelo para excluir a linha que est
selecionada, capturada a partir do mtodo getSelectedRow().
Mostrar:
mostra o contedo da clula no campo texto, caso haja uma linha selecionada.
Isso feito pelo mtodo getValueAt(), passando como parmetro o nmero da linha
(getSelectedRow()) e coluna (getSelectedColumn()) referente clula selecionada.
javax.swing.*;
java.awt.*;
java.awt.event.*;
java.util.*;
java.sql.*;
javax.swing.border.*;
97
98
P.add(PSul, "South");
btnExcluir.addActionListener(this);
btnIncluir.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
if (origem == btnConectar)
{
String sFonte = "jdbc:odbc:" + fonteDados.getText().trim();
String sUsuario = usuario.getText().trim();
String sSenha = senha.getText().trim();
try {
System.setProperty("jdbc.drivers","sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(sFonte, sUsuario, sSenha);
JOptionPane.showMessageDialog(this,
"Banco conectado com sucesso!",
"Mensagem", JOptionPane.WARNING_MESSAGE);
lblCon.setText("Conectado");
}catch (SQLException eSQL) {
// excees de SQL
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"Falha na conexo com o banco!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}catch (Exception e) {
// demais excees
e.printStackTrace();
JOptionPane.showMessageDialog(this,
"Falha na conexo com o banco!\n" +
"Mensagem: " + e.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
}
if (origem == btnDesconectar)
{
try {
con.close();
lblCon.setText("Desconectado");
}catch (SQLException eSQL) {
// excees de SQL
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"No foi possvel desconectar o banco!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
}
if (origem == btnIncluir)
{
String item = nomeCampo.getText() + " " + tipoCampo.getText();
if (campos.isEmpty())
{
JOptionPane.showMessageDialog(this,
"O primeiro campo ser a chave primria da tabela",
99
"Mensagem", JOptionPane.WARNING_MESSAGE);
chavePrimaria = nomeCampo.getText();
}
campos.addElement(item);
lista.setListData(campos);
}
if (origem == btnExcluir)
{
if (lista.getSelectedIndex()>= 0)
{
campos.removeElementAt(lista.getSelectedIndex());
lista.setListData(campos);
}
}
if (origem == btnLimpar)
{
campos.removeAllElements();
lista.setListData(campos);
}
if (origem == btnCriar)
{
String itens = campos.toString();
itens = itens.substring(1,itens.length()-1);
String sentencaSQL = "CREATE TABLE " +
nomeTabela.getText().trim() + " (" + itens +
", PRIMARY KEY (" + chavePrimaria + "))" ;
try{
Statement st = con.createStatement();
st.executeUpdate(sentencaSQL);
JOptionPane.showMessageDialog(this,
"Tabela criada com sucesso!",
"Mensagem", JOptionPane.WARNING_MESSAGE);
}catch (SQLException eSQL) {
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"No foi possvel criar a tabela!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
}
}
public static void main(String args[])
{
CriaTabelas fr = new CriaTabelas();
fr.setVisible(true);
}
}
100
A
import
import
import
import
import
import
javax.swing.*;
java.awt.*;
java.awt.event.*;
java.sql.*;
java.util.*;
javax.swing.table.*;
101
PNorte.setLayout(new BorderLayout());
JPanel PNorteNorte = new JPanel();
PNorteNorte.add(new JLabel("Digite nome"));
nome = new JTextField(13);
PNorteNorte.add(nome);
btnPesqNome = new JButton("Pesquisar por nome");
PNorteNorte.add(btnPesqNome);
btnPesqNome.addActionListener(this);
PNorte.add(PNorteNorte,"North");
JPanel PNorteCentro = new JPanel();
PNorteCentro.add(new JLabel("Digite cdigo"));
codigo = new JTextField(7);
PNorteCentro.add(codigo);
btnPesqCod = new JButton("Pesquisar por cdigo");
PNorteCentro.add(btnPesqCod);
PNorte.add(PNorteCentro,"Center");
btnPesqCod.addActionListener(this);
P.add(PNorte, "North");
// criao da tabela
// criao de um array para insero dinmica de objetos
ArrayList dados = new ArrayList();
// criao de um array para os ttulos no cabealho
String[] colunas = new String[] { "Cdigo", "Nome", "Endereo"};
// criao de um array para identificar se a clula editvel ou no
boolean[] edicao = {false, false, false};
// seleciona todos os registros da tabela Clientes e joga no ArrayList
try {
String sentencaSQL = "SELECT * FROM Clientes ORDER BY Codigo";
sentenca = con.createStatement();
registros = sentenca.executeQuery(sentencaSQL);
boolean proximoRegistro = registros.next();
if (!proximoRegistro)
{
JOptionPane.showMessageDialog(this,
"Nenhum registro foi encontrado!",
"Mensagem", JOptionPane.WARNING_MESSAGE);
}
else
do {
dados.add(new Object[]{
new Integer(Integer.parseInt(registros.getString("Codigo"))),
registros.getString("Nome"),
registros.getString("Endereco")
});
} while (registros.next());
sentenca.close();
}catch (SQLException eSQL) {
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"No foi possvel carregar os dados!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
// criao da tabela baseada no modelo ModeloTabelaBD
modelo = new ModeloTabelaBD(dados, colunas, edicao);
tabela = new JTable(modelo);
tabela.getColumnModel().getColumn(0).setPreferredWidth(50);
102
tabela.getColumnModel().getColumn(0).setResizable(false);
tabela.getColumnModel().getColumn(1).setPreferredWidth(200);
tabela.getColumnModel().getColumn(1).setResizable(true);
tabela.getColumnModel().getColumn(2).setPreferredWidth(240);
tabela.getColumnModel().getColumn(2).setResizable(true);
tabela.getTableHeader().setReorderingAllowed(false);
tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane rolagemTabela = new JScrollPane(tabela);
P.add(rolagemTabela, "Center");
// criao do terceiro painel
JPanel PSul = new JPanel();
btnSair = new JButton("Sair");
PSul.add(btnSair);
P.add(PSul, "South");
btnSair.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
if (origem == btnPesqNome)
{
Selecao("SELECT * FROM Clientes WHERE NOME LIKE '%" +
nome.getText() + "%' ORDER BY NOME");
}
if (origem == btnPesqCod)
{
Selecao("SELECT * FROM Clientes WHERE CODIGO = " +
codigo.getText() + " ORDER BY CODIGO");
}
if (origem == btnSair)
{
try {
con.close();
System.exit(0);
}catch (SQLException eSQL) {
// excees de SQL
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"No foi possvel desconectar o banco!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
}
}
public void Selecao(String sentencaSQL)
{
// apaga todas as linhas da tabela
for (int i= modelo.getRowCount()-1; i >= 0; i--)
modelo.removeRow(i);
try {
sentenca = con.createStatement();
registros = sentenca.executeQuery(sentencaSQL);
boolean proximoRegistro = registros.next();
if (!proximoRegistro)
103
{
JOptionPane.showMessageDialog(this,
"Nenhum registro foi encontrado!",
"Mensagem", JOptionPane.WARNING_MESSAGE);
}
else
do {
modelo.addRow(new Object[]{
new Integer(Integer.parseInt(registros.getString("Codigo"))),
registros.getString("Nome"),
registros.getString("Endereco")
});
} while (registros.next());
sentenca.close();
}catch (SQLException eSQL) {
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"No foi possvel carregar os dados!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
}
public Connection conectaBanco(String sFonte,String sUsuario,String sSenha)
{
Connection conexao = null;
try {
System.setProperty("jdbc.drivers","sun.jdbc.odbc.JdbcOdbcDriver");
conexao = DriverManager.getConnection(sFonte, sUsuario, sSenha);
}catch (SQLException eSQL) {
// excees de SQL
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"Falha na conexo com o banco!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}catch (Exception e) {
// demais excees
e.printStackTrace();
JOptionPane.showMessageDialog(this,
"Falha na conexo com o banco!\n" +
"Mensagem: " + e.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
return conexao;
}
public static void main(String args[])
{
Consulta fr = new Consulta();
fr.setVisible(true);
}
}
class ModeloTabelaBD extends AbstractTableModel
{
private ArrayList linhas = null;
104
105
{
if (isCellEditable(numCol))
{
Object[] linha = (Object[])getLinhas().get(numLin);
linha[numCol] = dado;
fireTableDataChanged();
}
}
public void addRow(Object[] dados)
{
getLinhas().add(dados);
fireTableDataChanged();
}
public void removeRow(int numLin)
{
getLinhas().remove(numLin);
fireTableDataChanged();
}
public Class getColumnClass(int numCol)
{
Object[] linha = (Object[])getLinhas().get(0);
return linha[numCol].getClass();
}
}
D
import javax.swing.*;
import java.awt.*;
106
import
import
import
import
java.awt.event.*;
java.sql.*;
java.util.*;
javax.swing.table.*;
107
tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane rolagemTabela = new JScrollPane(tabela);
P.add(rolagemTabela, "Center");
// criao do terceiro painel
JPanel PSul = new JPanel();
btnIncluir = new JButton("Incluir");
btnAlterar = new JButton("Alterar");
btnExcluir = new JButton("Excluir");
btnSair = new JButton("Sair");
PSul.add(btnIncluir);
PSul.add(btnAlterar);
PSul.add(btnExcluir);
PSul.add(btnSair);
P.add(PSul, "South");
btnIncluir.addActionListener(this);
btnAlterar.addActionListener(this);
btnExcluir.addActionListener(this);
btnSair.addActionListener(this);
}
public void actionPerformed(ActionEvent evt)
{
Object origem = evt.getSource();
if (origem == btnPesqNome)
{
Selecao("SELECT * FROM Clientes WHERE NOME LIKE '%" +
nome.getText() + "%' ORDER BY NOME");
}
if (origem == btnIncluir)
{
FrameCadastro frame = new FrameCadastro(con, null, null, null, 'I');
frame.show();
}
if (origem == btnAlterar)
{
if (tabela.getSelectedRow()>=0)
{
FrameCadastro frame = new FrameCadastro(con,
modelo.getValueAt(tabela.getSelectedRow(),0).toString(),
modelo.getValueAt(tabela.getSelectedRow(),1).toString(),
modelo.getValueAt(tabela.getSelectedRow(),2).toString(), 'A');
frame.show();
}
else
JOptionPane.showMessageDialog(this,
"No existe registro selecionado!\n",
"Mensagem", JOptionPane.WARNING_MESSAGE);
}
if (origem == btnExcluir)
{
try {
if (JOptionPane.showConfirmDialog(null,"Confirma Excluso?",
"Confirmao", JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE) == 0)
{
sentenca = con.createStatement();
108
109
JOptionPane.showMessageDialog(this,
"No foi possvel carregar os dados!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
}
public Connection conectaBanco(String sFonte,String sUsuario,String sSenha)
{
Connection conexao = null;
try {
System.setProperty("jdbc.drivers","sun.jdbc.odbc.JdbcOdbcDriver");
conexao = DriverManager.getConnection(sFonte, sUsuario, sSenha);
}catch (SQLException eSQL) {
// excees de SQL
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"Falha na conexo com o banco!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}catch (Exception e) {
// demais excees
e.printStackTrace();
JOptionPane.showMessageDialog(this,
"Falha na conexo com o banco!\n" +
"Mensagem: " + e.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
return conexao;
}
public static void main(String args[])
{
Cadastro fr = new Cadastro();
fr.setVisible(true);
}
}
class FrameCadastro extends JFrame implements ActionListener
{
private JButton OK;
private JButton Cancelar;
private JTextField txtCodigo;
private JTextField txtNome;
private JTextField txtEndereco;
private Connection conexao;
private char TipoOperacao;
public FrameCadastro(Connection con, String Cod, String Nome,
String Endereco, char Tipo)
{
conexao = con;
TipoOperacao = Tipo;
setSize(250,140);
setLocation(220,190);
Container P = getContentPane();
JPanel painelFC = new JPanel();
110
painelFC.setLayout(new FlowLayout());
painelFC.add(new JLabel("Cdigo"));
txtCodigo = new JTextField(15);
txtCodigo.setText(Cod);
if (Tipo == 'A')
{
txtCodigo.setEditable(false);
setTitle("Alterao");
}
else
setTitle("Incluso");
painelFC.add(txtCodigo);
painelFC.add(new JLabel("Nome"));
txtNome = new JTextField(15);
txtNome.setText(Nome);
painelFC.add(txtNome);
painelFC.add(new JLabel("Endereo"));
txtEndereco = new JTextField(15);
txtEndereco.setText(Endereco);
painelFC.add(txtEndereco);
OK = new JButton("OK");
Cancelar = new JButton("Cancelar");
painelFC.add(OK);
painelFC.add(Cancelar);
OK.addActionListener(this);
Cancelar.addActionListener(this);
P.add(painelFC,"Center");
}
public void actionPerformed(ActionEvent evt)
{
if (evt.getSource() == OK)
{
if (txtCodigo.getText().trim().equals("") ||
txtNome.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(this,
"Campos Cdigo e Nome devem ser preenchidos!\n",
"Erro", JOptionPane.ERROR_MESSAGE);
}
else
{
try {
Statement sentenca = conexao.createStatement();
String sentencaSQL = null;
if (TipoOperacao == 'I')
sentencaSQL = "INSERT INTO Clientes (" +
"Codigo, Nome, Endereco) "+
"VALUES ("+
Integer.parseInt(txtCodigo.getText())+", '"+
txtNome.getText() + "', '" +
txtEndereco.getText()+"')";
else
sentencaSQL = "UPDATE Clientes SET Nome = '" +
txtNome.getText() + "', Endereco = '" +
txtEndereco.getText()+"' WHERE Codigo = " +
Integer.parseInt(txtCodigo.getText());
111
sentenca.executeUpdate(sentencaSQL);
sentenca.close();
dispose();
}catch (SQLException eSQL) {
eSQL.printStackTrace();
JOptionPane.showMessageDialog(this,
"No foi possvel realizar a operao!\n" +
"Mensagem: " + eSQL.getMessage(),
"Erro", JOptionPane.ERROR_MESSAGE);
}
}
}
if (evt.getSource() == Cancelar)
{
dispose();
}
}
}
D
D
d
3. AWT Avanado
Imagens e desenhos mais complexos no podem ser feitos a partir da classe Graphics.
necessrio utilizar pacotes existentes na API Java 2D, que permite produzir desenhos de mais alta
qualidade.
112
3.14 Java 2D
O Java 2D apresenta pacotes de classes com mtodos para desenhos grficos com um nvel maior
de complexidade. Alguns desses pacotes: java.awt.image, java.awt.geom, java.awt.print,
java.awt.Graphics2D. Com o Java 2D possvel produzir uma variedade maior de figuras
geomtricas, com padres diferentes de preenchimento, alm de ter controle sobre os desenhos
criados, podendo move-los, gira-los ou alonga-los.
3.15 Imagens
A classe Image a responsvel pelo carregamento de imagens armazenadas em disco. Novam
d
113
Bibliografia
Cesta, Andr Augusto. Tutorial: A Linguagem de Programao JAVA. Instituto de
Computao. UNICAMP, 1996. Disponvel em http://www.dcc.unicamp.br
Davis, Stephen R. Aprenda Java agora. 2.ed. Rio de Janeiro : Campus, 1997. 401p.
Deitel, Harvey M. Java : como programar. 3.ed. Porto Alegre : Bookman, 2001. 1201p.
Flanagan, David. Java : o guia essencial. Rio de Janeiro : Campus, 2000. 718 p.
Lemay, Laura; Cadenhead, Rogers. Aprenda em 21 dias Java 2. Rio de Janeiro : Campus,
1999. 661p.
Schtzer, Waldeck; Massago, Sadao. Programao Java. Departamento de Matemtica
Universidade Federal de So Carlos UFSCar. 1999. Disponvel em:
http://www2.dm.ufscar.br/~waldeck/curso/java/
Sites de Interesse
www.java.sun.com - Site ofical do Java.
www.javafree.com.br - Comunidade de desenvolvedores Java.
www.portaljava.com.br - Comunidade de desenvolvedores Java.
114