Programação JAVA

1. Programação Visual Básica
A Interface Gráfica com o Usuário, também conhecido como GUI - Graphical User Interface, em Java, é feita através de bibliotecas de classes, sendo que a primeira a surgir foi a AWT (Abstract Window Toolkit). A AWT surgiu já na versão 1.0, mas se tornou confiável a partir da versão 1.1. A maneira como as classes dessa biblioteca trabalham garante a criação dos elementos da interface de usuário seguindo o comportamento destinado às ferramentas GUI nativas de cada plataforma (Windows, Mac, Solaris, ...). Alguns exemplos destes elementos são: botões, listas, menus, componentes de textos, containers (janelas e barras de menus), caixas de diálogo para abrir ou salvar arquivos, além de elementos para manipulação de imagens, fontes e cores. A portabilidade de plataforma funcionava bem em aplicações simples, mas aplicações que envolviam elementos mais complexos, como menus e barras de rolagem, por exemplo, apresentavam diferenças de comportamento conforme a plataforma. O que aconteceu foi que as aplicações visuais feitas em Java não se pareciam, e nem tinham as mesmas funcionalidades, com as aplicações convencionais de cada plataforma. A partir da versão 2 do Java, a JFC (Java Foundation Classes) apresentou novos recursos para a construção da GUI das aplicações, o que melhorou muito os problemas de portabilidade. São eles:
• • •

Java 2D: novas funções para desenhos e gráficos. Drag & Drop: clicar, arrastar, copiar e colar. Swing: biblioteca de classes extensão da AWT, onde são apresentados novos componentes de interface e o que é conhecido por look and feel, que é uma adaptação perfeita da GUI ao sistema operacional específico de desenvolvimento.

É bom salientar que o Swing não substitui o AWT, mas é o kit de ferramentas GUI mais utilizado para desenvolvimento de aplicações visuais. O AWT continua existindo, mantendo a mesma arquitetura criada para o Java versão 1.1. O Swing possui muito mais recursos, além de garantir maior portabilidade e, em boa parte dos casos, é mais fácil de usar. Isso não significa que ou se utiliza AWT ou se utiliza Swing, normalmente o que acontece é que elementos das duas bibliotecas são utilizados conjuntamente nas aplicações. Referente a criação das aplicações, exitem muitas ferramentas que auxiliam na produção de interfaces de usuário gráficas, mas não se comparam a ferramentas para plataformas específicas,

1

como Delphi e VisualBasic, que são voltadas exclusivamente para esse fim. Boa parte da elaboração da interface da aplicação tem que ser feita manualmente, o que exige bastante trabalho.

1.1 Frames
Na AWT, a janela de mais alto nível de uma aplicação (não está contida dentro de nenhuma outra) é denominada Frame. No Swing, existe uma versão chamada JFrame, que é derivada/estendida da classe Frame, possuindo alguns poucos métodos adicionais relacionados à manipulação da disposição visual dos frames .Todos os outros métodos são derivados da classe Frame. Um frame pode conter diversos outros componentes da GUI. Para se definir um frame básico baseado em AWT, deve-se:
• • • •

Importar o pacote java.awt.*. Estender a classe Frame. Ter um método main() para criar o objeto a partir do operador new. Torná-lo visível.

Assim, o código a seguir resulta no frame apresentado na figura 1.1.
import java.awt.*; public class FrameUm extends Frame { public static void main (String[] args) { FrameUm fr = new FrameUm(); fr.setVisible(true); } }

Para torná-lo visível, é possível utilizar fr.show(); no lugar de fr.setVisible(true);. Percebe-se que não é possível fechá-lo utilizando o botão fechar. Por enquanto, ela deve ser encerrada forçando a finalização do processo (ex.: finalizar tarefa no Windows, ou terminar processo na ferramenta específica de desenvolvimento).

Figura 1.1. Frame FrameUm

O frame criado não possui tamanho definido, nem título ou posicionamento. Para personalizar o frame é necessário inserir um método construtor com as instruções necessárias. Exemplo:
import java.awt.*; public class FrameDois extends Frame { public FrameDois() //construtor { setTitle("Frame Dois"); // título do Frame setSize(300, 200); // largura: 300 pixels altura: 200 pixels setResizable(false); // não permite o redimensionamento

2

setLocation(200, 100); // x: 200 pixels } public static void main (String[] args) { FrameDois fr = new FrameDois(); fr.setVisible(true); } }

y: 100 pixels

A figura 1.2 mostra o resultado da execução, um frame com largura 300 x 200 pixels (setSize()), com o título “Frame Dois” (setTitle()), que não permite redimensionamento (setResizable()).

Figura 1.2. Frame FrameDois

Além disso, o setLocation() realiza o posicionamento em tela do frame, seguindo o sistema de coordenadas do Java (figura 1.3), medidas em pixels, conforme a resolução atual da tela. No exemplo, o frame fica posicionado em 200 pixels para x e 100 pixels para y.
(0 ,0) x

(x, y)

y

Figura 1.3. Sistema de coordenadas do Java

Conforme já mencionado, o frame ainda não pode ser fechado. Para que isso aconteça é necessário ter uma maneira de se ter a notificação de quando ele é fechado. A partir da manipulação desse evento, mostrado no exemplo a seguir, é possível fechar o frame. É necessário importar o pacote java.awt.event.* para manipular eventos do AWT. O modelo de eventos e os demais eventos de janela serão vistos em seções posteriores.
import java.awt.*;

3

setTitle("Frame Três"). posicionado no centro. // título do Frame setSize(300.awt. Toolkit tk = Toolkit. // x: 200 pixels y: 100 pixels } public static void main (String[] args) { FrameTres fr = new FrameTres(). } } Ainda em relação ao posicionamento. 100).}}). fr. import java.awt. Por exemplo. o frame ser aberto e ficar com parte fora da tela. d. Além disso. setLocation(d. o exemplo também acrescenta um ícone ao frame. respeitando a resolução.event.gif").*.event.}}).exit(0).width / 2. como. setTitle("Frame Quatro").*. e isso é feito através da classe Toolkit.height / 4).height. // não permite o redimensionamento setLocation(200. 4 .getScreenSize(). se a resolução de vídeo for 800x600. setSize(d. Tendo esses valores. é possível utilizar em métodos como o setLocation() e o setSize(). por exemplo. } public static void main (String[] args) { FrameQuatro fr = new FrameQuatro().height / 2). pode se ter situações bem desagradáveis. cujos dados são jogados em um objeto da classe Dimension. como foi feito no exemplo.getImage("icone. Dimension d = tk. É necessário então posicionar o frame em coordenadas que independam da resolução utilizada.exit(0).setVisible(true). Image img = tk.width / 4. 200). método getScreenSize(). setResizable(false). d. // largura: 300 pixels altura: 200 pixels setResizable(false).setVisible(true). import java.*. também utilizando a classe Toolkit. o d. } } Para que seja possível essa tarefa de posicionamento conforme a resolução de vídeo. fr.height fica com 600. dependendo da resolução da tela onde o frame será aberto.getDefaultToolkit().width e d. public class FrameTres extends Frame { public FrameTres() //construtor { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. setIconImage(img). O exemplo a seguir abrirá um frame com a metade do tamanho da tela. é necessário obter informações do sistema operacional. que armazena a altura e largura nos campos d.import java.width fica com 800 e o d. public class FrameQuatro extends Frame { public FrameQuatro() //construtor { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.awt.

int screenWidth = d. java. setLocation(d. d. não faz nada. tipos de fontes.awt.width. import java.drawString("Estou escrevendo no frame".. O mesmo exemplo pode ser feito baseado na biblioteca Swing. 50).*. g. A classe Component possui um método paint() que aceita um objeto Graphics como parâmetro. Para efetuar a sobreposição do método paint() deve-se ter o cabeçalho: public void paint(Graphics g) A partir disso. etc. para depois setar o ícone através do setIconImage(). Dimension d = tk. } public void paint (Graphics g) { g.drawLine(40.}}).awt.2 Mostrando Textos e Linhas no Frame Para que seja possível mostrar textos em um frame é necessário criar um objeto baseado na classe Graphics. public class MostrandoTextos extends JFrame { public MostrandoTextos() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. 1.event. etc.gif) e jogar em um objeto da classe Image.swing.*. while (i < 150) { 5 . int screenHeight = d. O resultado é apresentado na figura 1. setSize(d. } java. setTitle("Escrevendo Textos"). controlando cores. métodos como drawString() e drawLine() podem ser utilizados. 60).*.*.height / 2).. Toolkit tk = Toolkit.awt. Esse método. class FrameQuatro extends JFrame Os exemplos apresentados nas próximas seções criarão frames baseado na classe JFrame. d. setResizable(false). 200.exit(0).event. desenho.width / 2.swing.getScreenSize().height / 4).swing. assim: import import import public { . por isso ele deve ser sobrescrito com a chamada de métodos que realizam operações de escrita. na classe de origem.awt.*. 40. pintura. que será responsável pelo gerenciamento da área gráfica a ser desenhada.*.width / 4.método getImage(). import javax. mudando apenas a derivação e importando o pacote javax.getDefaultToolkit(). para carregar a imagem (extensão . int i = 30. import java.*. como no exemplo a seguir.4. 60. classe JFrame.height. javax.

} } Figura 1. int x2.drawLine(40+i. g. int x. O método drawLine(int x1. int y1.g. apresentadas na tabela 1. fr. 40+i.Color. 1. 60+i.1.awt. 50+i).y2. 60+i). int y2) desenha uma linha que inicia nas coordenadas x1. estão definidas na classe java. Frame MostrandoTextos O método drawString(String s. 200+i. black blue cyan (preto) magenta orange pink red (magenta) (azulo) (ciano) (cinza-escuro) (laranja) (rosa) darkGray gray (vermelho) (branco) (amarelo) (cinza) (verde) white green yellow 6 .4. Um parâmetro Color define a cor a ser usada. int y) realiza a mostragem de um texto em uma posição definida por x e y.y1 e termina nas coordenadas x2.3 Cores O método setColor() seleciona a cor que é utilizada para todas as operações de desenho dentro do contexto gráfico ou componente. i+=30.drawString("Estou escrevendo no frame". } } public static void main (String[] args) { MostrandoTextos fr = new MostrandoTextos().setVisible(true). sendo que as treze cores padrão.

200).5.30).awt.*. } public void paint (Graphics g) { g. O exemplo a seguir apresenta a criação de objetos coloridos em um frame. setLocation(200. g. setTitle("Cores").setColor(new Color(0. pode-se criar novas cores baseadas no conteúdo RGB (redvermelho.100.setVisible(true). Cores definidas em java.5. import java.blue).Color Além das cores pré-definidas. g.drawString("Cor Azul". expressos por inteiros de 0 a 255.100.setColor(Color.lightGray (cinza-claro) Tabela 1.red). 220.1.setColor(Color. import java.*. public class Cores extends JFrame { public Cores() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. fr. } public static void main (String[] args) { Cores fr = new Cores(). g.drawLine(50. 50.exit(0). g.30). g. 60).}}).*. 50). } } Figura 1.70.fillRect(50.awt.128)). O resultado é apresentado na figura 1. green-verde.swing.drawRect(50. 100). 60.110.event. blue-azul). setSize(400.green). Frame Cores 7 . import javax.setColor(Color.128. g. g.awt.

1. public class Fontes extends JFrame { public Fontes() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. 50). baseado na classe Font. 110).130). tendo uma largura width e uma altura height.ITALIC.setFont(f). iniciando nas coordenadas x.swing. que precisa de um objeto criado. int width.blue).4 Fontes O método responsável por definir o tipo de fonte desejado é o setFont(). import javax.O método drawRect(int x. 16). Exemplo: import java. 20. Font.y.setFont(f).}}). o seu estilo e seu tamanho. O nome pode ser qualquer fonte suportada pelo sistema operacional específico. setTitle("Tipos de Fonte"). import java.setVisible(true). int height) faz a mesma coisa. int width.BOLD + Font. int y. o estilo pode ser: PLAIN – regular. int height) desenha um retângulo com a cor definida em setColor(). g. 80).ITALIC. sendo possível combinar os estilos utilizando o operador +. BOLD – negrito e ITALIC – itálico. O método fillRect(int x. int y.*. setSize(400. podendo ser possível criá-lo no próprio argumento do setFont(). } } A figura 1. torna-se útil a criação do objeto explicitamente.6 mostra o resultado. Se a fonte for utilizada várias vezes no decorrer da aplicação. Percebe-se que não é necessário criar explicitamente um objeto do tipo Font (objeto f). 14)).drawString("Fonte Monospaced negrito e itálico tamanho 14".awt. 8 .setColor(Color. o tamanho pode ser qualquer valor que represente o tamanho em pontos da fonte. Font. fr. 20. g.awt. definindo assim o nome da fonte. } public static void main (String[] args) { Fontes fr = new Fontes(). g. Font f = new Font("SansSerif". g.setFont(new Font("Monospaced".drawString("Fonte SansSerif itálico tamanho 16".*.drawString("Novamente Fonte SansSerif itálico tamanho 16". mas preenche o retângulo. g. 20.*. g.event. } public void paint (Graphics g) { g.exit(0).

import java. g. int ValoresY2[] = {80. deve-se tomar cuidado quanto a fontes que não existem em alguns sistemas operacionais.setColor(Color.fillPolygon(ValoresX2.140).blue).80. setSize(460.80.30. g.80. Dialog e DialogInput.30}.fillOval(190.red).450. São elas: Serif.80.awt.drawArc(280.}}).80.30.swing.awt.270). 1. a maioria com a opção de preenchimento ou não.ValoresY. g.70.drawOval(190.40.Figura 1.true). g.30.drawRoundRect(10.370}.30.80.30.40.410.90.80}. a partir da precedência de draw ou fill.40.*.false). int ValoresX2[] = {370. import javax.3).80. g.80. Frame Fontes Em termos de portabilidade.40. O exemplo a seguir tem como resultado o frame apresentado na figura 1. int ValoresX[] = {370.90.80.ValoresY2.120.5 Outras Formas Geométricas Além das formas já apresentadas.draw3DRect(100. g. SansSerif. g.setColor(Color. 9 .80. setTitle("Formas Geométricas"). Monospaced.30).40.7. g. import java.270).40). g. existem várias outras possíveis. O ideal é trabalhar com fontes comuns em sistemas operacionais diferentes. g.30. g.fill3DRect(100.drawPolygon(ValoresX.*. O modelo do AWT define cinco fontes disponíveis em qualquer sistema operacional.80.setColor(Color.setColor(Color.*.370}.fillRoundRect(10.450. g.3).40.80.setColor(Color.410. g.yellow).exit(0).30.80.magenta). } public void paint (Graphics g) { g. int ValoresY[] = {30.40).event. public class FormasGeometricas extends JFrame { public FormasGeometricas() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.30).6.fillArc(280. g.darkGray).

int width. tendo uma largura width e uma altura height. baseado nas coordenadas do retângulo que inicia em x. mostrando apenas a linha que vai do ângulo startAngle até o ângulo arcAngle. int y. int y. arcAngle): Idem int y. tendo uma largura width e uma altura height. Frame Fontes Várias formas geométricas foram desenhadas no frame. int y. baseado nas coordenadas do retângulo que inicia em x. int • a drawArc. int height. e um valor lógico para indicar a aparência do 3D. int width. int startAngle. 10 . int height): Desenha uma forma oval. int width.7. tendo uma largura width e uma altura height. int y. } } Figura 1. fillOval(int x. int arcAngle): Desenha um arco. mas preenche o arco. arcHeight): Idem a drawRoundRect. mas preenche a forma oval. int height. fillRoundRect(int x. int arcWidth. int height. int width. boolean raised): Desenha um retângulo 3D. Funcionamento de cada método: • drawRoundRect(int x. int startAngle.setVisible(true). iniciando nas coordenadas x. int width.y. int • • draw3DRect(int x. int y. • • Idem a drawOval(int x. mas preenche o retângulo. mas preenche o retângulo. int height. int height. tendo uma largura width e uma altura height. int width. int y. fr. int arcHeight): Desenha um retângulo com cantos arredondados.y. int width. drawArc(int x.y. int height.} public static void main (String[] args) { FormasGeometricas fr = new FormasGeometricas(). int y.y. int arcWidth. iniciando nas coordenadas x. boolean raised): draw3DRect. e cantos definidos por arcWidth e arcHeight. fillArc(int x. fill3DRect(int x. int height): • • Idem a drawOval. int width.

através do método getImage().23. j <= alturaTela / alturaImagem.*.getHeight(this).gif"). public class Imagens extends JFrame { public Imagens() //construtora { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.23. int nPoints): Desenha Idem um a polígono.*.}}). import java.awt. drawPolygon. import java. Novamente. j * alturaImagem). i++) for (int j = 0.event.getWidth(this). alturaImagem.getImage("LogoJava.swing.drawImage(ima. int larguraImagem = ima.exit(0). baseado nas coordenadas dos arranjos x. } public void paint (Graphics g) { Image ima = Toolkit.setVisible(true). } } 11 . A figura 1.• • drawPolygon(int[] xPoints. int larguraTela = 400. int alturaTela = 200. int alturaImagem = ima. setTitle("Imagens").larguraImagem. i * larguraImagem.6 Imagens A classe Image é a responsável pelo carregamento de imagens armazenadas em disco. setSize(400. O exemplo a seguir mostra a maneira de se preencher um frame com as imagens lado a lado.8 mostra o resultado.copyArea(4. fr. mas preenche o arco. int[] yPoints. import javax.null). e depois jogar em um objeto do tipo Image.awt. for (int i = 0. é necessário utilizar um objeto do tipo Toolkit para obter uma imagem. fillPolygon(int[] xPoints. int[] yPoints. i <= larguraTela / larguraImagem. g.*. int nPoints): 1.getDefaultToolkit(). j++) if (i + j > 0) g.4.y. } public static void main (String[] args) { Imagens fr = new Imagens().200).

class Painel extends JPanel { public void paintComponent(Graphics g) { super. normalmente dentro de um JFrame.*. import java. Os painéis devem ser utilizados para agrupar outros componentes. obtida pelo getImage() e jogada no objeto Image ima. como um painel.awt.y com largura width e altura height. para depois ser copiada lado a lado. g.awt.drawString("Estou escrevendo em um painel". em um local a uma distância dx. import javax.dy. que insere a imagem img nas coordenadas x. foi necessário descobrir o tamanho da imagem. que copia o conteúdo da área que começar nas coordenadas x. Não é considerada uma boa prática de programação desenhar diretamente no frame. Pode-se desenhar algo diretamente no frame ou definir um contêiner. um JPanel é um contêiner usado para agrupar componentes. 1. Um JFrame é uma janela de mais alto nível. 100. int width.8. JPanel e JApplet. Exemplo de adição de um painel a um frame: import java. por exemplo.event.*. Para realizar essa tarefa. por exemplo. int y. e desenhar nele. int y.paintComponent(g). como botões. por exemplo. 50). Alguns exemplos de contêiners: JFrame.y. como barras de menu. int dx. é mostrada a partir do drawImage(Image img. int x. ImageObserver observer). Frame Imagens A primeira imagem. pois ele foi projetado para ser contêiner de componentes específicos.Figura 1. int height.*. através do método copyArea(int x. um JApplet permite a execução em navegadores da Web. int dy).swing.7 Contêiners Contêiners servem de repositório de outros componentes. através getWidth() e do getHeight(). } } public class EscrevendoEmPainel extends JFrame { public EscrevendoEmPainel() { addWindowListener(new WindowAdapter() 12 .

setSize(400. BoxLayout e GridBagLayout.paintComponent(g) faz com que o método da superclasse seja executado também.8 Gerenciadores de Layout Os gerenciadores de layout controlam o dimensionamento e posicionamento dos componentes dentro de contêiners. exemplos são demonstrados nas próximas seções. padrão do JPanel. Para desenhar algo em um painel. setTitle("Painel"). Se. por algum motivo.130). são definidos objetos botão a partir da classe JButton. e recebe um parâmetro do tipo Graphics. que está definido na classe JComponent.add(new Painel()).8. Container P = getContentPane(). 1. deve-se criar uma classe derivada de JPanel e sobrepor o método paintComponent().9. que se encarrega de executar novamente o paintComponent(). o gerenciador padrão do JPanel é o FlowLayout.exit(0). import java. BorderLayout. Nos exemplos. O método getContentPane() retorna a área de conteúdo do frame para que possa ser adicionado o painel. O super. P.{public void windowClosing(WindowEvent e){System. Contêiner do tipo painel O resultado pode ser conferido na figura 1.1 Gerenciador FlowLayout Para que seja possível verificar a diferença entre alguns deles. A criação de uma classe derivada de JFrame é feita a seguir. } } Figura 1. Outros gerenciadores de layout existentes: GridLayout. mas pode ser alterado através da chamada ao método setLayout() do contêiner específico. Tal método é chamado automaticamente toda vez que a janela é redesenhada.setVisible(true). se desejar redesenhar o conteúdo no painel.awt. o método a ser chamado é o repaint(). começando exatamente pelo gerenciador FlowLayout. quando se deseja criar algo a mais que o método definido na superclasse.}}). Isso normalmente é feito em sobreposições de métodos. sendo que cada contêiner possui um gerenciador padrão. fr. como na criação e no redimensionamento. } public static void main (String[] args) { EscrevendoEmPainel fr = new EscrevendoEmPainel(). Por exemplo. 13 . 1. que coloca os componentes em um tamanho prédefinido da esquerda para a direita e de cima para baixo no contêiner. e um objeto Container é criado para depois adicionar (add) o painel.9.*.

*.setVisible(true).2 Gerenciador GridLayout 14 . P. add(new JButton("Cinco")). O alinhamento dos componentes fica centralizado e. assim: setLayout(new FlowLayout(FlowLayout. fr. } } Figura 1.RIGHT)).import java. add(new JButton("Dois")).swing. add(new JButton("Três")).*.8. não seria necessário setar o layout através do setLayout(new FlowLayout()). class PainelFlow extends JPanel { public PainelFlow() { setLayout(new FlowLayout()).10. add(new JButton("Um")). add(new JButton("Quatro")).. caso algum compontnte não caiba em uma linha.90). } public static void main (String[] args) { GerenciadorFlowLayout fr = new GerenciadorFlowLayout().exit(0).event.150). 1.}}). Gerenciador de Layout FlowLayout Como o FlowLayout é o gerenciador padrão do JPanel. RIGHT ou CENTER). setSize(200. import javax. setTitle("FlowLayout"). passando-o como parâmetro na determinação do layout (LEFT.add(new PainelFlow()). como mostra a figura 1.10. } } public class GerenciadorFlowLayout extends JFrame { public GerenciadorFlowLayout() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. é jogado para a linha seguinte.awt. Container P = getContentPane(). setLocation(150. É possível alterar o alinhamento.

Exemplo: import java. É necessário definir o número de linhas e colunas no 15 .*.}}). } public static void main (String[] args) { GerenciadorGridLayout fr = new GerenciadorGridLayout(). podendo ficar espaços vazios. import javax.150). add(new JButton("Três")). Container P = getContentPane().2)).exit(0). como mostra a figura 1.11. add(new JButton("Dois")).O GridLayout é um gerenciador que organiza os componentes em linhas e colunas espaçadas regularmente. } } public class GerenciadorGridLayout extends JFrame { public GerenciadorGridLayout() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. setSize(200. fr.setVisible(true). Gerenciador de Layout GridLayout O tamanho de cada componente é redimensionado automaticamente. add(new JButton("Um")).event.awt.11. } } Figura 1.add(new PainelGrid()). add(new JButton("Cinco")). import java.150).*. setTitle("GridLayout"). setLocation(150.*.swing. P. add(new JButton("Quatro")).awt. class PainelGrid extends JPanel { public PainelGrid() { setLayout(new GridLayout(3.

EAST). Também é possível espaçar os componentes horizontal e verticalmente.}}).*.SOUTH). class PainelBorder extends JPanel { public PainelBorder() { setLayout(new BorderLayout()). setTitle("BorderLayout"). Container P = getContentPane(). como o BorderLayout. 1. add(new JButton("Quatro").add(new PainelBorder()). setSize(300.setLayout().awt. Os componentes são adicionados a partir da posição na parte superior esquerda da grade. add(new JButton("Um").3 Gerenciador BorderLayout Existem gerenciadores mais interessantes.CENTER).5.*.WEST).NORTH).BorderLayout. que organiza os objetos em locais determinados por NORTH. por exemplo.BorderLayout. O layout abaixo. na definição do layout.150). SOUTH. add(new JButton("Dois"). Exemplo: import java. } public static void main (String[] args) { GerenciadorBorderLayout fr = new GerenciadorBorderLayout().swing.setVisible(true).exit(0).*. } } 16 . add(new JButton("Três").150).awt.BorderLayout.2. add(new JButton("Cinco"). } } public class GerenciadorBorderLayout extends JFrame { public GerenciadorBorderLayout() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.BorderLayout. P. setLocation(150.event. EAST. seguindo para a direita até preencher a linha e passar para baixo.8.8)). Nesse caso. WEST e CENTER. define 5 pixels de espaçameno horizontal e 8 pixels de espaçamento vertical: setLayout(new GridLayout(3.BorderLayout. deve-se passar esses valores também. import javax. import java. fr.

as demais ocupam o lugar da(s) omitida(s).8)).8.createHorizontalStrut(30)).4 Gerenciador BoxLayout Os gerenciadores de layout foram criados ainda na versão 1. add(new JButton("Dois")). O BorderLayout é o gerenciador padrão para os contêiners JWindow e JFrame.*. pode-se usar um outro contêiner do Swing chamado Box. se a localização central não for ocupada. add(new JButton("Três")). podendo inserir componentes em apenas uma linha ou uma coluna. add(new JButton("Quatro")). add(Box.Figura 1. Se alguma das localizações (norte. class PainelBox extends JPanel { public PainelBox() { add(Box.*. O Swing possui apenas um gerenciador de layout de uso geral. Gerenciador de Layout GridLayout Na figura 1. 1. Ao invés de utilizar o BoxLayout diretamente. add(Box.0 do Java. por exemplo. add(new JButton("Um")). com um botão em cada localização geográfica dentro do painel. ela ficará vazia. import java.event.createHorizontalGlue()). import javax. O layout abaixo. } } public class GerenciadorBoxLayout extends JFrame 17 .12. add(Box. define 5 pixels de espaçameno horizontal e 8 pixels de espaçamento vertical: setLayout(new BorderLayout(5. add(new JButton("Cinco")). import java. Na definição do layout é possível determinar o espaçamento horizontal e vertical entre as localizações. add(Box.swing. sendo mais utilizado para criar barras de ferramentas.createHorizontalGlue()). chamado BoxLayout. Não é necessário ter todas as localizações preenchidas.createHorizontalGlue()).createHorizontalStrut(10)).12 se observa o resultado da aplicação. sul.*.createHorizontalGlue()). add(Box.awt.awt. como no exemplo a seguir. Porém. leste ou oeste) não for ocupada.

createHorizontalBox(). Utilizado para expandir o componente a fim de preencher o espaço reservado a ele.add(b. que irão aumentar também se estiverem expandidos.}}). Utilizado para indicar o número de linhas ou colunas que o int fill int gridheight.8.100). 1. } public static void main (String[] args) { GerenciadorBoxLayout fr = new GerenciadorBoxLayout(). } } Figura 1. Campo int gridx. conforme o tamanho da janela e o createHorizontalStrut(). que os botões não ficaram distanciados uniformemente. setSize(500. na figura 1.5 Gerenciador GridBagLayout O gerenciador GridBagLayout é bastante flexível. gridy int weightx. getContentPane(). que possui campos. para controle dos componentes. Isso porque dois métodos foram utilizados: o createHorizontalGlue().{ public GerenciadorBoxLayout() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. Utilizado para especificar um percentual de aumento do local destinado aos componentes. mostrados na tabela 1.1. weighty Descrição Utilizado para controlar o posicionamento dos componentes na grade do layout. Os componentes gerenciados devem estar associados a um objeto GridBagConstraints. setLocation(150. Por ser mais flexível. Assim. é possível criar praticamente qualquer tipo de layout.BorderLayout.exit(0). que determina um espaçamento fixo.150). O construtor não possui argumentos e a aparência do layout é controlada pela classe GridBagConstraints.13.13. determinado pelo seu parâmetro. é também mais difícil de ser utilizado. b. Container b = Box. Gerenciador de Layout BoxLayout Observa-se.add(new PainelBox()). que determina um espaçamento variável.setVisible(true).CENTER). permitindo posicionamento dos componentes em relação aos outros. gridwidth 18 . setTitle("BoxLayout"). fr.

gridx = x.*. 19 . caso ele não esteja espalhado.setVisible(true). restricoes). Container P = getContentPane(). 1). Utilizado para controlar o afastamento entre componentes. } public static void main (String[] args) { GerenciadorGridBagLayout fr = new GerenciadorGridBagLayout().awt.*. public PainelGridBag() { setLayout(new GridBagLayout()). 2. restricoes. addGridBag(new JButton("Cinco"). Utilizado para controlar o aumento do tamanho mínimo dos componente. 0).}}).150). int y) { restricoes. setSize(270. addGridBag(new JButton("Quatro").*. addGridBag(new JButton("Um").int anchor int ipadx. import java. O primeiro deles mostra um GridBagLayout com cinco botões inseridos em posições determinadas pelo gridx e gridy. } void addGridBag(Component objeto. setLocation(150. 1. class PainelGridBag extends JPanel { GridBagConstraints restricoes = new GridBagConstraints(). fr.gridy = y.130). 1.event. 1). 2).1. import java. 1).add(new PainelGridBag()). Campos da classe GridBagConstraints A utilização desses campos são demonstradas através de exemplos. P. 1. ipady Insets insets componente irá se espalhar. addGridBag(new JButton("Três"). import javax. int x.exit(0).swing. add(objeto. addGridBag(new JButton("Dois"). 0. Tabela 1. Utilizado para controlar a posição do componente. setTitle("GridBagLayout").awt. } } public class GerenciadorGridBagLayout extends JFrame { public GerenciadorGridBagLayout() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.

1).BOTH. addGridBag(new JButton("Dois"). mostrado na figura 1.13. preenchendo o espaço vertical disponível e. addGridBag(new JButton("Três"). 1. addGridBag(new JButton("Quatro"). Para isso. O tamanho da grade é definido por essas coordenadas.0. não preenchendo o espaço disponível.0.13. VERTICAL. a restrição fill para BOTH e os campos weigthx e weigthy para 1.weighty = 1.14. 0. no construtor. 1. restricoes. por isso. addGridBag(new JButton("Cinco"). como mostra a figura 1. sendo possível. que é o valor default. 1). ter quantas colunas e linhas se desejar. é necessário combinar os valores de gridx e gridy com a determinação da altura (em 20 . 1 e 2). restricoes. 1). assim: public PainelGridBag() { setLayout(new GridBagLayout()). O método addGridBag() criado serve para auxiliar na definição dos valores que os campos de controle do GridBagConstraints irão assumir. É possível realizar um espalhamento dos componentes em mais do que uma linha e/ou coluna.weightx = 1. O fill ainda pode ser definido como: HORIZONTAL. Gerenciador de Layout GridBagLayout com cinco botões O resultado.fill = GridBagConstraints. addGridBag(new JButton("Um").} } Figura 1. 2). Os campos weigthx e weigthy devem receber um valor diferente de zero. restricoes. Gerenciador de Layout GridBagLayout ocupando todo espaço disponível O resultado é o preenchimento de todo painel. NONE. 1. Para que os botões preencham toda a área do painel é necessário definir. } Figura 1.14. apresenta cinco botões inseridos em coordenadas que indicam a presença de três linhas por três colunas (0. 0). preenchendo o espaço horizontal disponível. pois o preenchimento não ocorre se esse valor for igual a zero. 2.

como no exemplo: public PainelGridBag() { setLayout(new GridBagLayout()). addGridBag(new JButton("Cinco"). } 21 . 1. 0). restricoes.weightx = 1. 1. 0. restricoes. addGridBag(new JButton("Três").0. restricoes. enquanto o botão Quatro ocupou duas linhas e uma coluna.6. Gerenciador de Layout GridBagLayout utilizando espalhamento Percebe-se. addGridBag(new JButton("Um").0. 1).BOTH.15. restricoes. pelo resultado apresentado na figura 1.gridwidth = 3. addGridBag(new JButton("Quatro"). que o botão Um ocupou três colunas e uma linha.gridheight = 2. É possível também definir o tamanho dos componentes através do peso atribuído aos campos weigthx e weigthy. restricoes. todos os componentes utilizarão esse tamanho de espaço daí pra diante. 1).fill = GridBagConstraints. addGridBag(new JButton("Três"). restricoes.gridheight = 1. restricoes. addGridBag(new JButton("Dois"). restricoes.15. 1.2. restricoes. 0). addGridBag(new JButton("Dois"). 1). No momento que o número de colunas/linhas é definido. } Figura 1. 2. restricoes.0. addGridBag(new JButton("Um").weighty = 1.weightx = 4. restricoes.weightx = 0. 2). 2. restricoes.BOTH.fill = GridBagConstraints.número de linhas) e largura (em número de colunas) através dos campos gridwidth e gridheight. assim: public PainelGridBag() { setLayout(new GridBagLayout()). restricoes. 0). 2).weighty = 1. 0).weightx = 1. a não ser que este seja redefinido. 0.weightx = 0. 0. 0).5.0. addGridBag(new JButton("Quatro"). 3. 0.gridwidth = 1. addGridBag(new JButton("Seis").

Gerenciador de Layout GridBagLayout com aumento do tamanho e posicionamento de componentes Novamente. Percebe-se que o tamanho dos componentes Dois e Quatro foi aumentado.anchor = GridBagConstraints.CENTER. 0). sendo mantido o tamanho mínimo do botão Três. addGridBag(new JButton("Cinco"). 1.17. restricoes. 1. Para esse mesmo botão Três foi especificado um posicionamento fixo no canto inferior direito. addGridBag(new JButton("Três"). Os botões ficam dispostos em uma única linha.60). 1).Figura 1. restricoes. restricoes. Além disso. addGridBag(new JButton("Um"). 0.ipady=0. dentro do espaço reservado a ele. e sim as proporções relativas entre os botões e o tamanho do painel. restricoes. restricoes. Gerenciador de Layout GridBagLayout com determinação de pesos Para que o exemplo fique igual ao apresentado na figura 1. restricoes. restricoes. determinados pela atribuição de seus respectivos pesos. addGridBag(new JButton("Dois"). 1). restricoes. restricoes. O aumento do tamanho de alguns componentes pode ser feito pelos campos ipadx e ipady.130).16.anchor = GridBagConstraints. é necessário mudar o setSize() do frame para (400. 2). é necessário alterar o setSize() do frame para (270.17. 1). restricoes. dentro de sua área definida.ipady=10. desde que ele não esteja espalhado em mais que uma coluna e/ou linha. com tamanhos diferentes.ipady=0. 2. O anchor só pode ser utilizado quando o tamanho do componente for menor que a área que lhe foi 22 .SOUTHEAST. sabendo-se que o valor específico do peso não é o que importa.ipadx=10. } Figura 1. addGridBag(new JButton("Quatro"). que especificam valores de aumento vertical e horizontal.ipadx=0.ipadx=10. para que o exemplo fique igual ao da figura 1. Isso é feito através do anchor. 1.ipadx=0. é possível fixar uma posição do componente. Exemplo: public PainelGridBag() { setLayout(new GridBagLayout()).ipady=10.16.

concedida. O valor padrão é CENTER, e os outros valores possíveis são: NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, e NORTHWEST. Através do campo insets é possível indicar as distâncias entre os componentes do layout. Uma classe Insets possui valores para as quatro direções: cima, baixo, direita e esquerda, dando muita flexibilidade ao layout. O valor padrão é (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("Três"), 1, 1); addGridBag(new JButton("Quatro"), 2, 1); addGridBag(new JButton("Cinco"), 1, 2); }

Figura 1.18. Gerenciador de Layout GridBagLayout utilizando Insets

A figura 1.18 mostra que cada componente ganhou um espaço adicional de três pixels para cada uma das direções: cima, baixo, direita e esquerda. 1.8.6 Layouts Compostos

Normalmente, ao querer criar um determinado layout, a utillização de um gerenciador apenas não é suficiente. É necessário, então, combinar os diferentes layouts, como no exemplo a seguir.
import java.awt.*; import java.awt.event.*; import javax.swing.*; class PainelComposto extends JPanel { public PainelComposto() { setLayout(new BorderLayout()); add(new JTextField("Digite seu texto aqui"),BorderLayout.NORTH); add(new PainelTipoFlow(),BorderLayout.SOUTH); } } class PainelTipoFlow extends JPanel {

23

public PainelTipoFlow() { setLayout(new FlowLayout()); add(new JButton("Um")); add(new JButton("Dois")); add(new JButton("Três")); 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); } }

Figura 1.17. Layouts Compostos – BorderLayout e FlowLayout

A figura 1.17 mostra que o painel com layout FlowLayout foi inserido na localização sul do painel com layout BorderLayout. Isso é uma prática bastante comum para se alcançar layouts com disposição de componentes que satisfaçam aos objetivos da aplicação. A localização do centro ficou vazia porque isso é uma característica do BorderLayout: não expandir as outras localizações se a do centro estiver vazia.

2. Interface Gráfica com o Usuário e a Manipulação de Eventos
Os componentes de uma Interface Gráfica com o Usuário (GUI) são baseados em eventos, os quais são gerados na interação do usuário com a interface. Alguns exemplos de eventos possíveis: mover/clicar o mouse, clicar em um botão, fechar o frame, digitar um texto em um campo de edição, etc. É necessário, então, realizar uma manipulação dos eventos gerados. As próximas

24

seções descrevem o modelo de manipulação de eventos AWT a partir de alguns elementos GUI simples.

2.1 O Modelo de Manipulação de Eventos AWT
É muito comum encontrar, em linguagens de programação visuais, o tratamento dos eventos que são gerados por seus componentes visuais. Com Java não é diferente, tanto na biblioteca AWT, quanto na biblioteca Swing, existem classes para manipulação de eventos. A maneira como essa manipulação acontece não é tão simples como nas linguagens Delphi e Visual Basic, exigindo que haja a designação de pelo menos um (pode ter mais que um) objeto ouvinte de eventos, que deve ser um objeto de uma classe que implemente a interface ouvinte (listener interface). O objeto deve efetuar convenientemente a resposta desejada ao evento. É necessário lembrar que as interfaces possuem métodos abstract para serem redefinidos pelas classes que as implementarem. Além disso, “todos” os métodos abstract devem ser redefinidos. O registro desses ouvintes é feito em objetos conhecidos como origem do evento, como um botão, por exemplo. A origem envia objetos eventos para o(s) ouvinte(s) na ocorrência de um evento, e esse(s) usa(m) essa informação para determinar o que será feito em reação ao evento. Um exemplo de registro de um objeto ouvinte painel em um objeto de origem botão:
MeuPainel painel = new MeuPainel(); Jbutton botao = new Jbutton(“OK”); botao.addActionListener(painel);

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 método actionPerformed(), que recebe um objeto ActionEvent como parâmetro. Assim:
public class MeuPainel extends Jpanel implements ActionListener { ... public void actionPerformed(ActionEvent evt) { //código para a reação ao evento } }

2.2 Eventos em Botões
O exemplo a seguir apresenta um painel com três botões, sendo que o próprio painel é definido como ouvinte para monitorar os eventos que podem acontecer nos botões.
import java.awt.*; import java.awt.event.*; import javax.swing.*; class PainelEventosBotao extends JPanel implements ActionListener { private JButton BotaoVerde; private JButton BotaoPreto;

25

BotaoPreto = new JButton("Preto").addActionListener(this). add(BotaoPreto). } } 26 .addActionListener(this).getSource(). Container P = getContentPane(). BotaoBranco = new JButton("Branco"). setSize(400. BotaoVerde. } public static void main(String[] args) { JFrame fr = new TesteEventosBotao(). } } public class TesteEventosBotao extends JFrame { public TesteEventosBotao() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.green.private JButton BotaoBranco.setVisible(true). } public void actionPerformed(ActionEvent evt) { Object origem = evt. repaint(). BotaoBranco. else if (origem == BotaoBranco) cor = Color. setBackground(cor).black. fr.exit(0).add(new PainelEventosBotao()). P.white. public PainelEventosBotao() { BotaoVerde = new JButton("Verde"). setTitle("Eventos em Botões").130).}}). if (origem == BotaoVerde) cor = Color. BotaoPreto. Color cor = getBackground().addActionListener(this). add(BotaoBranco). add(BotaoVerde). else if (origem == BotaoPreto) cor = Color.

addActionListener(this). add(Nome). private JTextField Nome."Código = "+ evt."Senha = "+ evt. else if (origem == Nome) JOptionPane.3 Eventos em Caixas de Texto O exemplo a seguir apresenta um painel com duas caixas de texto do tipo JTextField e uma do tipo JPasswordField. três botões foram adicionados a ele.*. class PainelEventosCaixaTexto extends JPanel implements ActionListener { private JTextField Codigo. private JPasswordField Senha. Nome. else if (origem == Senha) JOptionPane.getActionCommand()).*. Senha. } public void actionPerformed(ActionEvent evt) { Object origem = evt.awt.*. O objeto ouvinte definido foi o próprio painel e."Nome = "+ evt. add(Codigo).getSource().showMessageDialog(null. Codigo. O método actionPerformed() é o único método da interface ActionListener.getActionCommand()). import java. if (origem == Codigo) JOptionPane.Figura 2. foi determinado que o próprio painel (this) seria o ouvinte das ações dos três botões. Esse método recebe como parâmetro um objeto do tipo ActionEvent. o conteúdo digitado irá aparecer em uma caixa de mensagens. A classe TesteEventosBotao adiciona o painel com os botões.event. por isso apenas ele deve ser implementado.showMessageDialog(null. Eventos em objetos JButton Na criação do painel. Senha = new JPasswordField(10).addActionListener(this).getActionCommand()). import javax.showMessageDialog(null. Logo após. quando for dado um Enter em qualquer uma das caixas.addActionListener(this).awt. import java. } } public class TesteEventosCaixaTexto extends JFrame { public TesteEventosCaixaTexto() { addWindowListener(new WindowAdapter() 27 . 2. sendo o local para implementar as ações a serem realizadas. add(Senha). public PainelEventosCaixaTexto() { Codigo = new JTextField(3).1.swing. que fornece informações sobre o evento ocorrido. Nome = new JTextField("Digite seu nome").

o aspecto visual é determinado pelo estilo Metal.mac. é necessário chamar o método SwingUtilities.GTKLookAndFeel Aspecto Mac: javax.sun.java. Container P = getContentPane(). import java. setTitle("Eventos em Caixas de Texto").add(new PainelEventosCaixaTexto()). 2.swing.WindowsLookAndFeel Aspecto Motif: com.sun.}}).sun.4 Utilizando Eventos para Alterar o Aspecto Visual da Aplicação O Look and Feel é a aparência que sua aplicação irá tomar.awt. criada a partir do método showMessageDialog().2. localizados em pacotes diferentes: • • • • • Aspecto Metal: javax.1 mostra o que acontece se for digitado algo em código e logo a seguir for pressionada a tecla Enter.MacLookAndFeel Logo após.*.MotifLookAndFeel Aspecto GTK: com. mas existem outros.350). e a alteração é feita através do método UIManager.{public void windowClosing(WindowEvent e){System. definindo a forma como seus componentes serão mostrados na tela.plaf.swing.updateComponentTreeUI para atualizar todo o conjunto de componentes. pertencente à classe JOptionPane. Eventos em objetos JTextField e JPasswordField A figura 2. 28 . Novamente. o método actionPerformed() foi sobreposto e.java.70).awt. fr.java.swing.setVisible(true). no momento que for pressionado o Enter. setSize(300.plaf. P. } } Figura 2. setLocation(300.metal.swing. import java.motif.plaf.exit(0). o getSource() pega o objeto onde está o foco naquele momento e mostra em uma caixa de mensagens. } public static void main(String[] args) { JFrame fr = new TesteEventosCaixaTexto().plaf.windows. passando como parâmetro o aspecto visual desejado.plaf.swing.event.MetalLookAndFeel Aspecto Windows: com.setLookAndFeel(). Ao utilizar componentes da biblioteca Swing.*.gtk.

add(BotaoWindows). try { UIManager. SwingUtilities. private JTextField Texto.addActionListener(this). BotaoWindows. BotaoMac = new JButton("Mac").updateComponentTreeUI(this).swing.sun. BotaoMotif = new JButton("Motif").addActionListener(this).swing. BotaoMotif.WindowsLookAndFeel".plaf.MetalLookAndFeel". else if (origem == BotaoMac) modelo = "javax. BotaoMac.swing. add(BotaoMac).plaf.getSource().java. else if (origem == BotaoWindows) modelo = "com. BotaoGTK.import javax.motif. class PainelAV extends JPanel implements ActionListener { private JButton BotaoMetal.MotifLookAndFeel". BotaoGTK = new JButton("GTK").*.plaf. else if (origem == BotaoMotif) modelo = "com. if (origem == BotaoMetal) modelo = "javax. add(Texto).GTKLookAndFeel".MacLookAndFeel". BotaoWindows = new JButton("Windows"). add(BotaoMetal). add(BotaoGTK). private JButton BotaoWindows. } catch (Exception e) {} } } public class AspectosVisuais extends JFrame { public AspectosVisuais() 29 .addActionListener(this).mac.gtk.java. } public void actionPerformed(ActionEvent evt) { Object origem = evt.metal. private JButton BotaoMac. private JButton BotaoMotif. public PainelAV() { BotaoMetal = new JButton("Metal").windows. private JButton BotaoGTK.addActionListener(this). else if (origem == BotaoGTK) modelo = "com.plaf.swing.sun.swing.plaf.addActionListener(this).setLookAndFeel(modelo). BotaoMetal.swing. Texto = new JTextField("Digite seu texto aqui"). String modelo = "".java. add(BotaoMotif).sun.

Motif. por não existirem ou não serem suportados em determinadas plataformas. os parâmetros e os objetos origens dos eventos.5 Resumo de Eventos no AWT A tabela 2.100). Windows.3 mostra e resultado da execução após selecionar cada um dos aspectos visuais. GTK e Mac A figura 2. É importante salientar também que. como o que ocorreu com o aspecto GTK. por que tamanhos de botões. a depender do layout utilizado em uma determinada aplicação. podem ocorrer problemas de aparência. Alguns Look And Feel’s podem gerar uma exceção. setTitle("Aspectos Visuais").3.exit(0).setVisible(true). e podem fazer com que a aparência de uma aplicação fique desorganizada. fr. P. caixas de texto e outros componentes variam de plataforma para plataforma. } public static void main(String[] args) { JFrame fr = new AspectosVisuais(). Muitos aspectos interessantes podem ser encontrados na Internet.add(new PainelAV()). Interface ActionListener Métodos actionPerformed Parâmetros ActionEvent getActionCommand getModifiers Origens Button List MenuItem TextField Scrollbar AdjustmentListener AdjustementValueChanged AdjustmentEvent getAdjustable 30 . Container P = getContentPane(). setSize(370.1 mostra todas as interfaces da AWT existentes para serem implementadas em classes com objetos ouvintes. pois a Sun não disponibiliza esse aspecto para outras plataformas.}}).{ addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. Aspectos Visuais Metal. } } Figura 2. 2. os métodos que devem ser sobrepostos. como o que ocorreu como aspecto Mac. É importante salientar que o aspecto Windows só funciona no próprio Windows.

Os pacotes dessas interfaces são: java. como listas. Utilizando a Biblioteca Swing para a Interface com o Usuário A partir do conhecimento do funcionamento do modelo de eventos é possível utiliza-lo nos muitos componentes de interface com o usuário existentes na biblioteca Swing. É bom lembrar que boa parte desses componentes possui um correspondente no AWT. menus e caixas de diálogo.event. 31 . mas existem outras. 3. os componentes do Swing são implementados no próprio Java. indiferente da plataforma utilizada. ao contrário do AWT. A diferença é que.3. Interfaces existentes para manipular eventos Boa parte dos componentes do Swing utilizam essas mesmas interfaces para manipular eventos.awt.ItemListener ItemStateChanged TextListener ComponentListenter ContainerListener TextValueChanged componentMoved componentHidden componentResized componentShown componentAdded componentRemoved focusGained focusLost keyPressed keyReleased keyTyped getAdjustmentType getValue ItemEvent getItem getItemSelectable getStateChange TextEvent ComponentEvent getComponent Checkbox CheckboxMenuItem Choice List TextComponent Component FocusListener KeyListener MouseListener mousePressed mouseReleased mouseEntered mouseExited mouseClicked MouseMotionListener mouseDragged mouseMoved WindowListener windowClosing windowOpened windowIconified windowDeiconified windowClosed windowActivated windowDeactivated ComponentEvent getChild getContainer FocusEvent isTemporary KeyEvent getKeyChar getKeyCode getKeyModifiersText getKeyText isActionKey MouseEvent getClickCount getX getY getPoint translatePoint isPopupTrigger MouseEvent WindowEvent getWindow Container Component Component Component Component Window Figura 2.swing.event e javax. a aparência não fique prejudicada. por exemplo. garantindo que.

getText() + " foi clicado"). if (evt. class PainelEventosBotaoELabel extends JPanel implements ActionListener { private JButton BotaoUm.*. private JLabel LabelUm.setVerticalTextPosition(SwingConstants.addActionListener(this). O exemplo a seguir mostra as principais ações que podem ser realizadas em labels.setText("O botão " + BotaoDois.getActionCommand().1 Labels e Botões – Classes JLabel e JButton Os labels e botões são componentes muito utilizados e de fácil manipulação. LabelDois.addActionListener(this).swing. import javax. acionadas a partir do clique de botões. add(LabelDois). add(BotaoUm). } public void actionPerformed(ActionEvent evt) { Object origem = evt. public PainelEventosBotaoELabel() { BotaoUm = new JButton("Um").getText() + " foi clicado"). LabelDois = new JLabel("Label para o botão dois"). que foram vistos no capítulo anterior. } if (origem == BotaoDois) // segunda maneira de verificar { LabelDois. add(BotaoDois). private JButton BotaoDois. add(LabelUm). 3. private JLabel LabelDois. além dos botões e caixas de texto.awt. LabelUm. BotaoDois = new JButton("Dois").equals("Um")) // primeira maneira de verificar { LabelUm.event.getSource(). LabelUm.setIcon(icone).As próximas seções se destinam a apresentação dos principais componentes do Swing. Como já visto. BotaoDois. para tratar eventos em botões é necessário implementar o método actionPerformed() da interface ActionListenter. import java.awt.*. BotaoUm.setToolTipText("Esse é o label do botão dois"). LabelUm. LabelUm = new JLabel("Label para o botão um").setText("O botão " + BotaoUm.BOTTOM). import java. Icon icone = new ImageIcon("LogoJava.RIGHT).setHorizontalTextPosition(SwingConstants.gif").*. } } } 32 .

Uma caixa de seleção possui um rótulo (label) que a identifica e. setTitle("Botões e Labels"). Exemplo: import java. setado um ícone para ele e realizado seu posicionamento horizontal (setHorizontalTextPosition()) e vertical (setVerticalTextPosition()). a opção vai ficar ativada ou não. } } Figura 3. através do método getSource(). import java. import javax. A segunda é através da definição de um objeto origem.add(new PainelEventosBotaoELabel()). sabe qual botão gerou o evento. No clique do BotaoUm é alterado o texto do LabelUm.1. a partir do getActionCommand().exit(0). conforme o estado atual.2 Botões de Estado – Classes JRadioButton e JCheckBox Os botões de estado permitem ativar ou desativar opções.public class TesteEventosBotaoELabel extends JFrame { public TesteEventosBotaoELabel() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. setSize(600.1 mostra a situação após o clique nos dois botões. sendo que apenas uma opção pode ficar selecionada. Botões de rádio ficam agrupados a partir da classe ButtonGroup. além de utilizar o método setToolTipText() para especificar a dica de ferramenta. ao clicar nela. Manipulação de Botões e Labels A figura 3. Para tratamento dos eventos. que. Container P = getContentPane().}}). a interface utilizada é a ActionListener.awt. } public static void main(String[] args) { JFrame fr = new TesteEventosBotaoELabel().equals().130).awt.event. A primeira é testando o próprio texto do botão. fr.setVisible(true). No código.*.*.*. 3.swing. que é exibida quando o cursor do mouse passa sobre o label. percebe-se que existem duas maneiras de saber qual botão foi clicado. 33 . Dois tipos são comumente usados: as caixas de seleção e os botões de rádio. P. como nos botões e caixas de texto. O clique do BotaoDois altera o texto do LabelUm.

add(CBItalico).PLAIN.getSource().add(RBSerif). else Italico = Font.addActionListener(this). private JRadioButton RBSerif. if (origem == RBSansSerif) Fonte = "SansSerif".false).PLAIN.addActionListener(this). Grupo. else if (origem == RBMonospaced) Fonte = "Monospaced". CBItalico. if (CBItalico.class PainelBotoesDeEstado extends JPanel implements ActionListener { private JTextField Texto. RBMonospaced = new JRadioButton("Monospaced". 34 . Grupo. RBSansSerif. public PainelBotoesDeEstado() { Texto = new JTextField("Texto para visualização". add(Texto). RBMonospaced. if (CBNegrito. add(CBNegrito).addActionListener(this). RBSansSerif = new JRadioButton("SansSerif". else if (origem == RBSerif) Fonte = "Serif".ITALIC. add(RBSerif). Grupo. RBSerif. CBNegrito = new JCheckBox("Negrito"). String Fonte = f. Font f = Texto. else Negrito = Font. add(RBSansSerif). Negrito + Italico. private JCheckBox CBNegrito.isSelected()) Negrito = Font. int Italico = Font. 12)).isSelected()) Italico = Font.add(RBMonospaced). CBItalico = new JCheckBox("Itálico"). private ButtonGroup Grupo.setFont(new Font(Fonte.addActionListener(this).add(RBSansSerif). CBNegrito. Texto.addActionListener(this).PLAIN. private JRadioButton RBMonospaced.BOLD.getName(). add(RBMonospaced). Grupo = new ButtonGroup(). int Negrito = Font.false).getFont().15). private JRadioButton RBSansSerif.true). } public void actionPerformed(ActionEvent evt) { Object origem = evt.PLAIN. private JCheckBox CBItalico. RBSerif = new JRadioButton("Serif".

para depois servirem de parâmetro para a alteração da fonte a partir do setFont(). setTitle("Botões de Estado"). Isso é feito através da criação de um objeto f. recebendo como parâmetro um objeto de uma das classes de bordas existentes no pacote javax. 3.event. setSize(350. conforme o estado. é acionado um evento de ação. Ao clicar em uma caixa de seleção. } public static void main(String[] args) { JFrame fr = new BotoesDeEstado(). Cada um desses botões deve ser adicionado a um grupo de botões (ButtonGroup). Por isso. as variáveis Italico e Negrito são atualizadas.*. O exemplo a seguir mostra as diversas bordas existentes.3 Bordas O Swing oferece várias opções de bordas para melhorar o aspecto visual da aplicação.*.setVisible(true). sendo ele responsável pala desativação do botão anteriormente selecionado. P.2. é a responsável pela definição das bordas. import java.2 apresenta o resultado da execução do exemplo. import javax. 35 .}}).} } public class BotoesDeEstado extends JFrame { public BotoesDeEstado() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. já com alguns itens selecionados. da classe JComponent.exit(0).swing. } } Figura 3. já tendo setado qual é o botão que ficará selecionado inicialmente. capturado no método actionPerformed(). quando um novo for clicado. permitindo a utilização de título ou não. é necessário realizar um import desse pacote.*. Os botões de rádio são criados.swing. incializado a partir do getFont() e passado para a variável Fonte através do getName(). O método setBorder(). do tipo Font.awt. import java.100).awt. fr. e a variável Fonte é atualizada com a fonte atual.add(new PainelBotoesDeEstado()). Container P = getContentPane(). para também servir de parâmetro no setFont(). O método isSelect() retorna o estado atual da caixa de seleção e. Botões de Estado A figura 3.border. No actionPerformed() é verificado qual botão originou o evento.

RBEmpty.addActionListener(this).exit(0). public class Bordas extends JFrame implements ActionListener { private JButton RBEtched. Container P = getContentPane(). private JButton RBMatte.addActionListener(this).add(RBLoweredBevel). CBTitled.import javax.addActionListener(this). private Border BordaCentro = null.add(RBEmpty).250).add(PainelBaixo. RBLine = new JButton("Line"). setSize(700. RBLoweredBevel = new JButton("LoweredBevel").createTitledBorder(borda.getSource(). PainelBaixo. private JButton RBLoweredBevel.setLayout(new BorderLayout()).}}). PainelBaixo.addActionListener(this). RBLine. private JButton RBRaisedBevel.swing.addActionListener(this). public Bordas() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. PainelBaixo.*. RBCompound.add(RBLine).setBorder(BordaBaixo).border.addActionListener(this). RBMatte = new JButton("Matte"). PainelBaixo. RBMatte. Border borda = BorderFactory. private JCheckBox CBTitled. RBEtched. RBLoweredBevel. PainelBaixo.add(RBRaisedBevel).add(RBCompound)." Tipos de Borda ").add(RBMatte). CBTitled = new JCheckBox("Titled"). RBRaisedBevel. PainelBaixo. PainelBaixo."South"). PainelBaixo. RBEtched = new JButton("Etched"). 36 . RBRaisedBevel = new JButton("RaisedBevel"). setTitle("Bordas"). P. RBEmpty = new JButton("Empty"). private JButton RBEmpty. P.createEtchedBorder().add(RBEtched). private JButton RBLine.add(CBTitled). Border BordaBaixo = BorderFactory. RBCompound = new JButton("Compound"). private JButton RBCompound.addActionListener(this).addActionListener(this). PainelBaixo. } public void actionPerformed(ActionEvent evt) { Object origem = evt. JPanel PainelBaixo = new JPanel().

createMatteBorder(8. fr. } } Figura 3.green)). else if (origem == RBLine) BordaCentro = BorderFactory.orange). validate().createTitledBorder(BordaCentro.add(PainelCentro. 8. BorderFactory. 8. 3. PainelCentro.red).createCompoundBorder (BorderFactory.createRaisedBevelBorder(). P. } public static void main(String[] args) { JFrame fr = new Bordas(). Container P = getContentPane(). Tipos de Bordas no Swing 37 . Color. else if (origem == RBEmpty) BordaCentro = BorderFactory.JPanel PainelCentro = new JPanel(). } else PainelCentro.createMatteBorder(3.setVisible(true). else if (origem == RBMatte) BordaCentro = BorderFactory. else if (origem == RBRaisedBevel) BordaCentro = BorderFactory. if (CBTitled.createEtchedBorder(). 3."Center").setBorder(BordaCentro)." Exemplo de Título ").createEmptyBorder().3. 3.createLineBorder(Color.setBorder(BordaTitulo).createEtchedBorder().isSelected()) { Border BordaTitulo = BorderFactory. 8. Color. else if (origem == RBCompound) BordaCentro = BorderFactory. if (origem == RBEtched) BordaCentro = BorderFactory.createLoweredBevelBorder(). else if (origem == RBLoweredBevel) BordaCentro = BorderFactory.

String titulo) createTitledBorder(Border borda. BOTTOM. createEmptyBorder() createEmptyBorder(int topo. A posição pode ser uma das constantes de TitledBorder: ABOVE_TOP. Color cor) O alinhamento do TitledBorder pode ser uma das constantes: TitledBorder. A classe que implementa esse componente é a 38 . Font fonte.A figura 3. int alinhamento. int base. int esquerda. createLineBorder(Color cor) createLineBorder(Color cor.RIGHT ou TitledBorder. TitledBorder. o parâmetros necessários em cada tipo e as variações possíveis são: • EtchedBorder: cria uma borda de linha com efeito 3D. String titulo. onde cada um dos botões realiza a mudança para a borda especificada. Color Sombra) • EmptyBorder: cria uma borda vazia. int direita) • LineBorder: cria uma borda de linha simples. mas ocupa espaço e permite inserção de título. int base. createTitledBorder(String titulo) createTitledBorder(Border borda. Normalmente é utilizado para inserir títulos em outras bordas. createCompundBorder(Border BordaExterna. para criar uma borda é necessário criar um objeto Border e utilizar um dos métodos da classe BorderFactory para criar a borda desejada. int alinhamento. int espessura) • MatteBorder: cria uma borda larga que pode ser preenchida com uma cor sólida ou um ícone. int posição.CENTER. TOP. Icon icone) • BevelBorder: cria uma borda com efeito de relevo (para cima ou para baixo). ABOVE_BOTTOM. int esquerda. os métodos para criação. BELOW_TOP. 3. De forma geral. O título na borda somente é mostrado se a caixa de seleção Titled estiver marcada. int base. BELOW_BOTTOM. int direita. createEtchedBorder() createEtchedBorder(Color destaque. Color cor) createMatteBorder(int topo. createMatteBorder(int topo.4 Caixas de Combinação Uma caixa de combinação é uma lista do tipo “abre/fecha” que apresenta múltiplos valores.3 mostra o resultado da execução.LEFT. Os tipos de borda existentes. sendo que apenas um pode ser selecionado. Border BordaInterna) TitledBorder: cria uma borda com um título. int esquerda. int posicao) createTitledBorder(Border borda. String titulo. createLoweredBorder() createRaisedBorder() • • CompoundBorder: cria uma borda unindo duas outras bordas. int direita.

blue. public CaixasDeCombinacao() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.getSelectedItem() == "Verde") cor = Color.swing. private JPanel PainelSul. private JPanel PainelCentro. Cores = new JComboBox(Itens).160).createMatteBorder(8. 8.green. Texto = new JLabel("Verde"). setTitle("Caixa de Combinação").add(PainelSul. P. javax. private Border Borda.green.add(Texto). 8. Container P = getContentPane(). if ((String)origem. PainelSul.event."South"). P. P.getSource()."Azul".getSelectedItem()). 8. Borda = BorderFactory.getSelectedItem() == "Amarelo") cor = Color.getSelectedItem() == "Branco") cor = Color.add(PainelCentro.exit(0).white.*.setBorder(Borda). java. PainelCentro. 8. } public static void main (String[] args) { 39 .}}). 8. cor). setSize(300."Center").*.yellow.createMatteBorder(8.*. private JLabel Texto.setBorder(Borda). } public void actionPerformed(ActionEvent evt) { JComboBox origem = (JComboBox)evt."Branco"}.swing. como mostra o exemplo a seguir. Cores.setLayout(new BorderLayout()).getSelectedItem() == "Azul") cor = Color. PainelCentro = new JPanel(). Borda = BorderFactory. PainelCentro. import import import import java. javax. 8.*. private Color cor = Color.add(Cores). cor). private String Itens[] = {"Verde".JComboBox e o tratamento dos eventos também ActionListener.addActionListener(this).awt.setText((String)origem. pode ser feito através da interface public class CaixasDeCombinacao extends JFrame implements ActionListener { private JComboBox Cores.awt. PainelCentro. PainelSul = new JPanel(). Texto.border."Amarelo". else if ((String)origem. else if ((String)origem. else if ((String)origem.

do tipo Color. para depois ser utilizado na definição da nova cor da borda. Alguns outros métodos são importantes: • • • • • void setEditable(Boolean editavel): se o parâmetro for true. 40 . } } Figura 3. adiciona um item à lista na posição void insertItemAt(Object Item. pois ele tem seu próprio layout.4).setVisible(true). Manipulação de Bordas através de uma Caixa de Combinação Uma borda Borda do tipo MatteBorder foi criada no PainelCentro para que as cores sejam alteradas a partir da seleção pela caixa de combinação Cores (figura 3. é necessário inserilo em um contêiner JScrollPane. void removeItem(Object Item): remove um item da lista. Tal layout aceita apenas um componente. int posicao): posição indicada. que define um objeto origem. Não é possível atribuir um layout ao JScrollPane. 3.5 Contêiner JScrollPane e Caixas de Listagem Sempre que se deseja incluir barras de rolagem em um componente qualquer. e testa o item selecionado a partir do getSelectedItem(). localizada no PainelSul. como um painel. não podendo ser alterado. O PainelCentro também contém um label Texto. fr. Para manipular o evento de seleção da caixa de combinação. void addItem(Object Item): adiciona um item à lista. o label Texto também é atualizado com a cor selecionada. que mostra a cor atual da borda. foi implementado o método actionPerformed(). Caso o componente inserido seja maior que o contêiner. tanto vertical. int posicao): indicada. é atualizado.CaixasDeCombinacao fr = new CaixasDeCombinacao(). por exemplo.4. quanto horizontalmente. automaticamente são mostradas barras de rolagem para poder visualizar a parte do componente que não ficou visível. do tipo JComboBox. Conforme a seleção. o item selecionado pode sofrer alterações. permitindo a inserção de um outro contêiner. remove o item da lista que está void removeItemAt(Object Item. caso contrário não. Além disso. um objeto cor.

exit(0).setVisibleRowCount(3).setSelectionMode(ListSelectionModel. PainelLista = new JPanel(). setSize(250.100).addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { LabelImagem.add(PainelLista).gif"."Alcachofra. P.*.gif". new ImageIcon(NomesImagens[3]). FrutasLegumes.gif". por si só. FrutasLegumes = new JList(ItensLista). } })."Alcachofra".swing.swing.*. new ImageIcon(NomesImagens[1])."Abóbora". new ImageIcon(NomesImagens[2]). como no exemplo a seguir. javax. FrutasLegumes.event.add(new JScrollPane(FrutasLegumes)). FrutasLegumes.getSelectedIndex()]). new ImageIcon(NomesImagens[4])}."Abobora. public CaixasDeListagem() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.event. private String ItensLista[] = {"Nenhum".swing.As caixas de listagem. PainelLista. private JPanel PainelLista.setIcon(Imagens[FrutasLegumes. não apresenta nenhuma barra de rolagem."Maca.SINGLE_SELECTION).*. Container P = getContentPane(). Elas.gif"}. private Icon Imagens[] = {new ImageIcon(NomesImagens[0]). } } 41 . fr. setTitle("Caixa de Listagem"). apresentam listas de valores para seleções únicas ou múltiplas."Berinjela". javax. criadas a partir de objetos do tipo JList. sendo necessário para isso.*. } public static void main (String[] args) { CaixasDeListagem fr = new CaixasDeListagem(). import import import import import java."Maçã"}.awt. PainelLista. java.*.setVisible(true). public class CaixasDeListagem extends JFrame { private JList FrutasLegumes. inseri-la em um contêiner JScrollPane. javax.}}).add(LabelImagem). LabelImagem = new JLabel(Imagens[0]).awt. private JLabel LabelImagem.border."Berinjela. private String NomesImagens[] = {"".

event. é necessário determinar se a seleção é SINGLE_INTERVAL_SELECTION. que permite a seleção de um único item.getSelectedIndex()]). relacionando o índice do arranjo Imagens com o índice do item que foi selecionado na lista.awt. import java.*. 42 . que permite a seleção múltipla. do tipo JList. O setSelectionMode() especifica o modo de seleção da lista. através da utilização da tecla Ctrl. Exemplo: import java. Por fim. que permite a seleção múltipla e contígua na lista. Ao clicar em cada opção. MULTIPLE_INTERVAL_SELECTION. e que utiliza o método valueChanged() para efetuar as ações desejadas. Para alterar a imagem do LabelImagem foi utilizado o setIcon().awt.addListSelectionListener(this).*. indicar o próprio frame como objeto ouvinte: FrutasLegumes. A partir do método setVisibleRowCount() foi definido o número de itens visíveis da lista. import javax. para ser possível tratar o evento de seleção na lista.5 apresenta o resultado da execução da aplicação. por sua vez. Por fim. Para que a lista pudesse ser apresentada com a barra de rolagem. definido na classe ListSelectionModel. clicando com o mouse em um primeiro item e.setIcon(Imagens[FrutasLegumes.5. implementar o método valueChanged(): public void valueChanged(ListSelectionEvent evt) { LabelImagem. assim: Antes de tudo. que está definida em javax.*. foi adicionado ao painel. inserir o implements ListSelectionListener na criação da classe: public class CaixasDeListagem extends JFrame implements ListSelectionListener Depois. sendo preciso importar esse pacote. clicando no último item desejado.event.swing. o objeto FrutasLegumes foi adicionado a um JScrollPane que. permitindo selecionar um intervalo contíguo. com a tecla Shift pressionada. SINGLE_INTERVAL_SELECTION. clicando com o mouse nos itens desejados. e. } Para que se possa efetuar a seleção múltipla dos itens de uma caixa de listagem.swing. com os itens desejados. onde há uma caixa de listagem com três linhas e uma barra de rolagem. buscado através do getSelectedIndex(). que pode ser: SINGLE_SELECTION. O modo como o evento foi tratado poderia ter sido feito como nos exemplos vistos até agora. passando como parâmetro um arranjo String ItensLista. ou MULTIPLE_INTERVAL_SELECTION. aparece ao lado a imagem solicitada. permitindo selecionar itens não contíguos. foi necessário implementar a interface ListSelectionListener(). não interessando quais itens serão selecionados. Caixa de Listagem de seleção única A figura 3.Figura 3. Para criar a lista foi declarado um objeto FrutasLegumes.

setTitle("Seleção Múltipla"). Numeros.SINGLE_INTERVAL_SELECTION). PainelListaSM = new JPanel(). } public static void main (String[] args) { ListaSelecaoMultipla fr = new ListaSelecaoMultipla().}})."Um"."Três".add(new JScrollPane(Selecionados)).*. Selecionados = new JList(). public ListaSelecaoMultipla() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System."Seis"."Sete"}.setVisibleRowCount(5). P. Numeros.event.import javax. private String ItensLista[] = {"Zero"."Quatro".MULTIPLE_INTERVAL_SELECTION)."Cinco". PainelListaSM. Container P = getContentPane().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { Selecionados.150).getSelectedValues()).add(PainelListaSM). Numeros.add(new JScrollPane(Numeros)).setFixedCellHeight(20). Selecionados.swing. public class ListaSelecaoMultipla extends JFrame { private JList Numeros."Dois".exit(0).setFixedCellHeight(20). private JList Selecionados. private JPanel PainelListaSM. PainelListaSM. Numeros. Numeros.setVisibleRowCount(5).setVisible(true). } }).setSelectionMode (ListSelectionModel.setFixedCellWidth(60). Selecionados.setFixedCellWidth(80). Numeros = new JList(ItensLista). Selecionados.setListData(Numeros. fr. } } 43 . setSize(250.setSelectionMode(ListSelectionModel. Selecionados.

public class PainelDividido extends JFrame { public PainelDividido() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.add(Divisao). setSize(615.6. que determina um tamanho fixo de algura da caixa. Component Esquerda = new JScrollPane(Um). Divisao. O exemplo a seguir mostra dois labels com imagens compartilhando a área definida pelo JSplitPane. Esquerda.setDividerSize(10). ele é um contêiner especial que permite o compartilhamento do espaço para dois outros componentes. enquanto a segunda caixa permite apenas a seleção contígua.awt. Percebe-se que a primeira caixa de listagem permite uma seleção intercalada de valores. Component Direita = new JScrollPane(Dois). separando-os por uma barra divisora ajustável. Caixas de Listagem de seleção múltipla Na figura 3.jpg")). A segunda caixa foi criada para mostrar os itens selecionados na primeira caixa. fr. P. através da utilização da tecla Ctrl (MULTIPLE_INTERVAL_SELECTION).Figura 3.300). import java. JLabel Um = new JLabel(new ImageIcon("Um. } public static void main (String[] args) { PainelDividido fr = new PainelDividido(). import java.setDividerLocation(300). A caixa de listagem Numeros recebeu um ouvinte de eventos que.awt.exit(0). no momento que cada item é selecionado. realiza a operação de atualização da caixa Selecionados.*.event. Divisao. setTitle("Painel Dividido"). Isso é feito através do método setListData().}}). Dois novos métodos foram utilizados para alterar a parte visual das caixas de listagem: setFixedCellWidth().6 Dividindo Painéis A classe JSplitPane é a responsável pela divisão de áreas. JSplitPane Divisao = new JSplitPane(JSplitPane.swing.jpg")).6 é possível perceber os vários itens selecionados intercaladamente na primeira caixa de listagem. } } 44 . que recebe como parâmetro o conjunto de valores selecionados a partir do método getSelectedValues(). import javax. 3. JLabel Dois = new JLabel(new ImageIcon("Dois.*. que determina um tamanho fixo de largura da caixa de listagem e. Container P = getContentPane(). setFixedCellHeight(). Direita).HORIZONTAL_SPLIT. utilizando a tecla Shift (SINGLE_INTERVAL_SELECTION).setVisible(true).*. Na verdade.

3.7) é redimensionável.awt. Estes.*. A outra forma de divisão é a VERTICAL_SPLIT.*. javax. private JLabel TextoSlider.swing. public ControleDeslizante() 45 .*. eles são colocados em um JScrollPane. e atribuídos a dois objetos Esquerda e Direita. do tipo Component. permitindo aumentar ou diminuir o espaço de cada um dos componentes. O método setDividerLocation() indica a posição onde deve ficar o divisor redimensionável e o método setDividerSize() determina o tamanho em pixels da barra divisória. para que tenham barras de rolagem. private JLabel TextoScroll.7. public class ControleDeslizante extends JFrame { private JSlider TamanhoTextoSlider.swing.Figura 3.8 Barra de Controle Deslizante A partir de um objeto do tipo JSlider é possível selecionar um valor inteiro entre um intervalo definido em uma barra de controle com um marcador de medidas. Depois de criados os labels Um e Dois.event. O exemplo a seguir mostra uma barra de controle deslizante (JSlider) e uma barra de rolagem normal (JScrollBar). java. javax.event. que divide o painel verticalmente. private JScrollBar TamanhoTextoScroll. Tal componente possui diversas configurações possíveis. Labels com imagens compartilhando um painel dividido pelo JSplitPane A barra que divide as imagens (figura 3. por sua vez. como: o posicionamento horizontal ou vertical.awt. são os componentes que vão compartilhar a divisão horizontal (HORIZONTAL_SPLIT) feita pelo JSplitPane. import import import import java. a exibição de marcas de medida principais e secundárias e a mostragem de rótulos para essas marcas.*.

setFont( new Font("SansSerif".addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { TextoSlider.setFont( new Font("SansSerif". P.getPreferredSize().230).50.HORIZONTAL. PainelCDCentro.exit(0). TamanhoTextoScroll = new JScrollBar(JScrollBar.PLAIN.add(PainelCDNorte.Font.getValue()). TextoSlider = new JLabel("JSlider tamanho 20"). setSize(570. Container P = getContentPane().setText( "JScrollBar tamanho "+TamanhoTextoScroll. } public static void main (String[] args) { ControleDeslizante fr = new ControleDeslizante().add(PainelCDSul.50)."North").setVisible(true).setLayout(new BorderLayout()).TamanhoTextoScroll. TextoSlider.add(TextoSlider).TamanhoTextoScroll.HORIZONTAL. PainelCDSul.setText("JSlider tamanho "+TamanhoTextoSlider. JPanel PainelCDNorte = new JPanel().add(TamanhoTextoScroll). P.20)).add(PainelCDCentro.setMinorTickSpacing(2). TextoScroll. fr. TamanhoTextoScroll. TamanhoTextoSlider. TamanhoTextoSlider.}}).setPaintTicks(true).add(TamanhoTextoSlider). } } 46 .setFont(new Font("SansSerif". JPanel PainelCDSul = new JPanel().add(TextoScroll).Font."South"). JPanel PainelCDCentro = new JPanel(). setTitle("Controle Deslizante").0.getValue())).Font. TamanhoTextoScroll."Center").0.PLAIN.setMajorTickSpacing(10).setFont(new Font("SansSerif". TamanhoTextoSlider. PainelCDNorte. } }).getValue()). TextoScroll = new JLabel("JScrollBar tamanho 20"). TextoSlider.addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { TextoScroll.TamanhoTextoSlider.20)). PainelCDSul.height)).PLAIN.20. TamanhoTextoSlider = new JSlider(SwingConstants.setPreferredSize( new Dimension(200.PLAIN.{ addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. P. TextoScroll.getValue())). TamanhoTextoSlider. } }).0. P.Font.20).

a partir do getValue(). que necessita de um objeto Dimension como parâmetro. Utilização do JSlider e e JScrollBar para alterar tamanho de fonte Dois labels de tamanho 20 foram inseridos em dois painéis (PainelCDNorte e PainelCDCentro) para mostrar a funcionalidade dos componentes (figura 3. foram setados os marcadores principal e secundário como sendo 10 e 2. a AdjustmentListener. e a posição de início como sendo 20. a cada modificação no controle deslizante. para controlar o tamanho do segundo label. e um outro componente TamanhoTextoScroll. onde. Após. do tipo JSlider.8. a posição de início como sendo 20. para controlar o tamanho do primeiro label. a área visível da barra de rolagem como sendo 0 pois. que nada mais é que um contêiner que permite a inserção de diversos painéis. Para criar o objeto JSlider foi identificada a orientação como sendo horizontal (SwingConstants. um em cada aba. A mesma coisa ocorre no tratamento dos eventos do objeto TamanhoTextoScroll. através do setMajorTickSpacing() e do setMinorTickSpacing(). Uma opção muito utilizada nesses casos é a criação de abas rotuladas conforme o tipo de objetos que serão inseridos. com a implementação do método adjustmentValueChanged().HORIZONTAL). sendo passado os valores de largura 200 e sendo mantida a altura original da barra de rolagem. o exemplo a seguir possui seis 47 . é necessária a utilização total da barra. o texto é alterado pelo setText() e a fonte é alterada pelo setFont(). para depois serem mostrados através do setPaintTicks().Figura 3. através do getPreferredSize(). freqüentemente ocorre o problema de falta de espaço para inserir todos os componentes necessários. A classe que realiza essa tarefa é a JTabbedPane. Para o tratamento dos eventos do objeto TamanhoTextoSlider foi feita a implementação do método stateChanged().HORIZONTAL). nesse tipo de utilização do JScrollBar. 3. a partir da interface ChangeListener.8 Abas Rotuladas e Caixas de Diálogo Na construção de aplicações. passando como parâmetro a posição atual do controle deslizante. Para exemplificar a utilização das abas rotuladas. O seu tamanho foi definido pelo método setPreferredSize(). o valor mínimo como sendo 0 e o valor máximo como sendo 50.8). No PainelCDSul foi inserido um componente TamanhoTextoSlider. Para criar o objeto JScrollBar também foi identificada a orientação como sendo horizontal (JScrollBar. o valor mínimo como sendo 0. utilizando uma interface diferente. o valor máximo como sendo 50.height.

java. Container P = getContentPane(). JPanel PCxDlgMensagem = new JPanel(). private JButton CDConfirmacao3.150). CDConfirmacao1 = new JButton("Confirmação 1").awt. private JButton CDCor1.. CDMensagem1 = new JButton("Mensagem 1"). seja uma confirmação. provenientes de objetos das classes JOptionPane. LabelConfirmacao = new JLabel("Retorno:"). Elas são utilizadas para exibir alguma mensagem ou obter algum tipo de informação do usuário. PCxDlgMensagem. setLocation(300. private JButton CDConfirmacao1. modais.add(CDMensagem2). private JButton CDMensagem3.abas. ou uma seleção de algo.*. private JButton CDConfirmacao4. private JButton CDMensagem2.add(CDMensagem1). JPanel PCxDlgConfirmacao = new JPanel(). private JLabel LabelArquivo2. CDConfirmacao2 = new JButton("Confirmação 2"). private JButton CDEntrada1. private JButton CDEntrada2. não é possível interagir com outras janelas enquanto essa não for fechada. setTitle("Caixas de Diálogo de. por padrão.200)..add(CDMensagem3). PCxDlgMensagem. uma entrada de dados. java. CDMensagem2 = new JButton("Mensagem 2"). CDMensagem3 = new JButton("Mensagem 3"). private JButton CDMensagem1.}}). private JButton CDConfirmacao2. 48 . private JLabel LabelOpcao. cada uma com um tipo diferente de caixa de diálogo. Abas = new JTabbedPane().event. public AbasRotuladas() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. CDConfirmacao3 = new JButton("Confirmação 3").exit(0).awt. PCxDlgMensagem. As caixas de diálogo são. private JLabel LabelCor. private JLabel LabelArquivo1. private JLabel LabelEntrada.*. private JButton CDEntrada3. public class AbasRotuladas extends JFrame implements ActionListener { private JTabbedPane Abas. ou seja. private JLabel LabelConfirmacao. private JButton CDOpcao1. JFileChooser e JColorChooser. javax.io. private JButton CDArquivo1. CDConfirmacao4 = new JButton("Confirmação 4")."). import import import import java.*.*.swing. setSize(450.

addActionListener(this). PCxDlgArquivo.add(LabelCor). LabelEntrada = new JLabel("Retorno:"). Abas. CDCor1. CDArquivo1.addTab("Mensagem".addActionListener(this). CDEntrada2. CDConfirmacao2.addActionListener(this).add(LabelOpcao). 49 . P. JPanel PCxDlgEntrada = new JPanel().addTab("Opção". PCxDlgEntrada.addActionListener(this). CDArquivo1 = new JButton("Arquivo 1").add(CDEntrada1).PCxDlgArquivo). PCxDlgOpcao. Abas. CDMensagem2. Abas.add(LabelArquivo2). } public void actionPerformed(ActionEvent evt) { Object origem = evt. CDMensagem3. PCxDlgEntrada.PCxDlgCor). Abas. JPanel PCxDlgOpcao = new JPanel(). Abas.PCxDlgConfirmacao).PCxDlgConfirmacao. JPanel PCxDlgCor = new JPanel(). PCxDlgConfirmacao.getSource(). CDOpcao1. CDOpcao1 = new JButton("Opção 1").addActionListener(this). PCxDlgConfirmacao. CDEntrada1 = new JButton("Entrada 1").addActionListener(this).add(LabelEntrada).PCxDlgEntrada). PCxDlgCor. LabelCor = new JLabel("Retorno:").add(CDConfirmacao2).addTab("Arquivo".addActionListener(this). CDMensagem1. PCxDlgArquivo. CDCor1 = new JButton("Cor 1"). PCxDlgConfirmacao.add(CDEntrada2).add(LabelConfirmacao).addActionListener(this). CDConfirmacao3.addTab("Cor".PCxDlgMensagem).add(CDEntrada3). CDEntrada3 = new JButton("Entrada 3"). PCxDlgArquivo.addActionListener(this). PCxDlgCor. CDConfirmacao1. JPanel PCxDlgArquivo = new JPanel().PCxDlgOpcao).add(LabelArquivo1). LabelOpcao = new JLabel("Retorno:").add(CDOpcao1).add(CDConfirmacao4). LabelArquivo1 = new JLabel("Retorno:"). PCxDlgEntrada.addTab("Confirmação".add(CDConfirmacao3). CDEntrada3.add(CDArquivo1).addActionListener(this). CDEntrada2 = new JButton("Entrada 2"). CDEntrada1. PCxDlgEntrada.addActionListener(this).add(Abas).add(CDConfirmacao1). PCxDlgOpcao. int retorno = 0. CDConfirmacao4. LabelArquivo2 = new JLabel("Seleção:").addTab("Entrada".addActionListener(this).add(CDCor1).addActionListener(this). PCxDlgConfirmacao. Abas.

showMessageDialog(null.setText("Retorno: " + valorRet)."Confirma Operação?". JOptionPane. "Esta é uma caixa de diálogo de Mensagem". if (origem == CDMensagem1) JOptionPane. "Entrada". "Confirmação". JOptionPane.setText("Retorno: " + retorno).showConfirmDialog(null. LabelEntrada.WARNING_MESSAGE. retorno = JOptionPane."Confirma Operação?". else if (origem == CDMensagem3) JOptionPane. } else if (origem == CDConfirmacao4) { retorno = JOptionPane. JOptionPane. LabelOpcao. opcoes[0])."Confirma Operação?"). LabelConfirmacao.QUESTION_MESSAGE).ERROR_MESSAGE.setText("Retorno: " + retorno).YES_NO_OPTION. Icon icone = new ImageIcon("LogoSun.YES_NO_OPTION. JOptionPane.JOptionPane. "Esta é uma caixa de diálogo de Mensagem"."Confirma Operação?". JOptionPane.showOptionDialog(null.YES_NO_OPTION. JOptionPane. null. "Mensagem". LabelConfirmacao.gif").showInputDialog(null.setText("Retorno: " + retorno). "Confirmação". "Opção". 50 . "Cancelar" }.setText("Retorno: " + retorno).WARNING_MESSAGE). LabelConfirmacao. JOptionPane.String valorRet = null. else if (origem == CDConfirmacao1) { retorno = JOptionPane. opcoes. icone). LabelEntrada. "Digite um valor"). "Esta é uma caixa de diálogo de Mensagem").setText("Retorno: " + retorno).showConfirmDialog(null. icone).setText("Retorno: " + valorRet).showMessageDialog(null. "Digite um valor". } else if (origem == CDEntrada2) { valorRet = JOptionPane.QUESTION_MESSAGE. } else if (origem == CDEntrada1) { valorRet = JOptionPane. } else if (origem == CDConfirmacao2) { retorno = JOptionPane. JOptionPane.showConfirmDialog(null.WARNING_MESSAGE). "Esta é uma caixa de diálogo de Opção".showMessageDialog(null. else if (origem == CDMensagem2) JOptionPane. "Confirmação". JOptionPane. LabelConfirmacao. } else if (origem == CDConfirmacao3) { retorno = JOptionPane.showConfirmDialog(null. "Mensagem".YES_NO_OPTION).showInputDialog(null. } else if (origem == CDOpcao1) { Object[] opcoes = { "OK".

} else if (origem == CDArquivo1) { JFileChooser abreArquivo = new JFileChooser().getName()).INFORMATION_MESSAGE. abreArquivo. do tipo JTabbedPane. 51 .setText("Seleção: " + arquivoSelec.setText("Seleção: Nenhum arquivo"). abreArquivo. "Escolha uma opção". "Escolha uma cor". PCxDlgOpcao. Abas rotuladas para demonstração das diversas caixas de diálogo Na figura 3.showOpenDialog(this). Color.setText("Retorno: " + valorSelec.setText("Retorno: " + c.java")). } else if (origem == CDCor1) { JColorChooser abreCor = new JColorChooser().toString()). Color c = abreCor. valores[0]). LabelArquivo1.getSelectedFile().showDialog(this. if (retorno == JFileChooser. } } Figura 3. Para que as abas fossem criadas. null.setText("Retorno: " + retorno).toString())."Opção Dois".APPROVE_OPTION) { File arquivoSelec = abreArquivo. fr."Opção Quatro"}.setCurrentDirectory(new File(". retorno = abreArquivo. foi definido um objeto Abas. PCxDlgEntrada. LabelEntrada.setSelectedFile(new File("AbasRotuladas.9 é possível visualizar a situação do frame na execução da aplicação. Como são seis as abas. valores. } } public static void main (String[] args) { AbasRotuladas fr = new AbasRotuladas(). LabelArquivo2.")). } else LabelArquivo2. LabelCor. "Entrada". LabelCor.} else if (origem == CDEntrada3) { Object[] valores= {"Opção Um".black). Object valorSelec = JOptionPane. JOptionPane. PCxDlgConfirmacao.9.showInputDialog(null."Opção Três".setForeground(c).setVisible(true). foram criados seis painéis (PCxDlgMensagem.

onde uma mensagem é mostrada.10. PCxDlgArquivo Figura 3. inseri-los no objeto Abas. opção e entrada As primeiras quatro abas correspondem às caixas de diálogo existentes na classe JOptionPane. acompanhada de um botão OK. O segundo tipo é a caixa de diálogo de confirmação. confirmação. Object mensagem. int tipoDaMensagem): mostra uma caixa de mensagem com o título definido por titulo. INFORMATION_MESSAGE. O método para criação desse tipo de caixa de diálogo é o showMessageDialog() e existem variações em relação aos parâmetros que são passados. O primeiro tipo é a caixa de diálogo de mensagem. permitindo a inclusão de um título para cada aba. Object mensagem. através do método addTab(). No exemplo. com a • possibilidade de mostrar um ícone específico. int tipoDaMensagem. String titulo.10. mostrados nos exemplos da figura 3. um botão OK e o tipo da mensagem. que possui como retorno um inteiro que indica o botão que foi pressionado (começando por zero). conforme a necessidade. Object mensagem): mostra uma caixa de mensagem com o título Message e um botão OK. O método para criação desse tipo de caixa de diálogo é o showConfirmDialog().e PCxDlgCor). dividas em quatro tipos. que são: • • static void showMessageDialog(Component componentePai. onde uma mensagem é mostrada. static void showMessageDialog(Component componentePai. QUESTION_MESSAGE. podendo ser ERROR_MESSAGE. Caixas de diálogo de mensagem. static void showMessageDialog(Component componentePai. inseridos botões e labels em cada um deles. Também existem variações em relação aos parâmetros que são passados: 52 . tal retorno é armazenado em uma variável retorno e mostrado no label LabelConfirmacao. WARNING_MESSAGE. para depois. normalmente uma pergunta. Icon icone): idêntico ao anterior. ou PLAIN_MESSAGE. que identifica o ícone apresentado. acompanhada de botões de confirmação. String titulo.

onde. QUESTION_MESSAGE. que pode ser YES_NO_OPTION. Se a caixa de diálogo permitir a inserção de um valor. o retorno é do tipo String. Object message. através de um método toString() é possível obter o conteúdo textual do ítem selecionado. do tipo Object. Object mensagem. podendo ser ERROR_MESSAGE. static int showConfirmDialog(Component componentePai. o nome dos botões. o tipo da mensagem. String titulo. um ícone. na resposta de uma mensagem. uma mensagem. Icon icone. Nesse tipo de caixa de diálogo não existem variações em relação aos parâmetros. INFORMATION_MESSAGE. O terceiro tipo é a caixa de diálogo de opção. int tipoDaMensagem. pois permite a inserção ou seleção de valores textuais. static String showInputDialog(Component componentePai. static int showConfirmDialog(Component componentePai. O método para criação desse tipo de caixa de diálogo é o showInputDialog() e suas variações são: • static String showInputDialog(Component componentePai. uma caixa de texto para a entrada de dados e os botões OK e Cancel. permitindo mostrar um ícone. QUESTION_MESSAGE. WARNING_MESSAGE. WARNING_MESSAGE. • 53 . a única sintaxe aceita é: • static int showOptionDialog(Component componentePai. ou YES_NO_CANCEL_OPTION. int tipoDaMensagem): idêntico ao anterior. O método para criação desse tipo de caixa de diálogo é o showOptionDialog(). Object valorInicial): mostra uma caixa de opção com o título definido por titulo. e o botão que será o inicialmente selecionado. já que o que vai ser digitado é um texto. que é um pouco diferente que as outras. com a possibilidade de identificar o tipo da mensagem e o ícone. que possui como retorno um inteiro que indica o botão que foi pressionado (começando por zero). int tipoDaMensagem): mostra uma caixa de entrada como a anterior. Object mensagem): mostra uma caixa de confirmação com o título Select an Option e os botões Yes. O quarto tipo é a caixa de diálogo de entrada. No e Cancel. Icon icone): idêntico • • • ao anterior. int tipoDaOpcao. Object mensagem. int tipoDaOpcao. ou PLAIN_MESSAGE. e o o conjunto de botões definido por tipoDaOpcao. o retorno é um objeto do tipo Object. Object message. String titulo. static int showConfirmDialog(Component componentePai. definido por valorInicial. int tipoDaOpcao. onde é possível determinar as opções possíveis para os botões.• static int showConfirmDialog(Component componentePai. definido por um objeto opcoes. int tipoDaOpcao): mostra uma caixa de confirmação com o título definido por titulo. String titulo. String titulo. definido por tipoDaOpcao. podendo ser ERROR_MESSAGE. que identifica o ícone apresentado. No caso de ser permitida a seleção de um dos valores em uma lista. INFORMATION_MESSAGE. ou PLAIN_MESSAGE. a escolha do conjunto de botões utilizado. Object[] opcoes. que pode ser YES_NO_OPTION. int tipoDaMensagem. sendo necessário passar todos eles. Então. Object mensagem): mostra uma caixa de entrada com com o título Input. Object message. String titulo. ou YES_NO_CANCEL_OPTION.

passando como parâmetro um objeto do tipo File. tendo que fecha-la antes de continuar a utilização da aplicação que a chamou. Caixa de diálogo de seleção de arquivos A quinta aba apresenta um botão que. foi setado o nome do arquivo inicial da busca. mas. Não foi utilizado no exemplo. Object mensagem. tendo como valor de retorno um inteiro que representa o botão que foi pressionado (0 para Open e 1 para Cancel). basta utilizar o showSaveDialog(). abre uma caixa de diálogo de arquivos. ou PLAIN_MESSAGE. através da criação de um objeto do tipo Object.11. é possível utilizar o método setMultiSelectionEnabled(true). permite inserir um ícone e. Para abrir a caixa de diálogo. apresenta os valores em uma lista. Object[] valoresSelec. Figura 3. int tipoDaMensagem. através do método setSelectedFile(). No exemplo apresentado é criado um objeto abreArquivo. podendo ainda ter o valor inicial setado por valorSelecInicial. Após é setado o diretório a ser mostrado inicialmente. String titulo. que vai definir o ícone a ser apresentado. em primeiro lugar. ao invés de Abrir. se for necessário permitir a seleção múltipla de arquivos. Object valorSelecInicial): tem as mesmas opções que o anterior. A classe JFileChooser fornece métodos para apresentar essa caixa de diálogo e configurá-la conforme as necessidades. basta chamar o método showOpenDialog().com a possibilidade de inserir um título e selecionar o tipo da mensagem. que também precisa de um objeto do tipo File como parâmetro. Icon icone. através do método setCurrentDirectory(). No exemplo. INFORMATION_MESSAGE. foi utilizada a variável retorno para ser posteriormente mostrada no label LabelArquivo1. que pode ser: ERROR_MESSAGE. ao ser clicado.11. Semelhante às outras caixas de diálogo. Além do diretório. WARNING_MESSAGE. como mostra a figura 3. QUESTION_MESSAGE. 54 . do tipo JFileChooser. se for desejável abrir uma caixa de diálogo para Salvar arquivo. • static Object showInputDialog(Component componentePai. essa também é apresentada na forma modal. porém. Da mesma forma.

12.CANCEL_OPTION. A barra de menu é apresentada.12.9 Menus e Áreas de Texto O Swing apresenta suporte a menus a partir das classes JMenuBar. Se existir a situação de múltipla seleção de arquivos. esse mesmo label apresenta uma mensagem que não foi selecionado nenhum arquivo.APPROVE_OPTION. através do método setForeground(). ao ser clicado. 3. ao 55 . Para criar um menu não é necessário ter um gerenciador de layout específico. no caso de ter sido clicado o botão Open e JFileChooser. o retorno do método getSelectedFile(). JCheckBoxMenuItem e JRadioButtonMenuItem. no topo do frame. A classe JColorChooser é a responsável por essa tarefa. no caso de ter sido clicado o botão Cancel. através do método getName(). do tipo Color. Caso tenha sido clicado no botão Cancel. mostrado na figura 3. o método a ser utilizado é o getSelectedFiles().Esse retorno pode ser testado utilizando o JFileChooser. JMenu. com os nomes para cada menu suspenso que. que retorna um arranjo de objetos do tipo File. foi criado um objeto abreCor a partir dessa classe e depois foi aberta a caixa de diálogo a partir do método showDialog(). Após. JMenuItem. O retorno desse método foi atribuído a um objeto c. que traz o arquivo que foi selecionado na caixa de diálogo. o nome desse arquivo foi mostrado no label LabelArquivo2. se for clicado no botão Open. para depois ser utilizado na determinação da cor do label. sendo normalmente inserido no próprio frame. Caixa de diálogo de seleção de cores A sexta e última aba apresenta um botão que. normalmente. tendo que passar como parâmetro o seu título e a sua cor inicial. do tipo File. No exemplo. Figura 3. abre uma caixa de diálogo de seleção de cores. No exemplo. é atribuído ao objeto arquivoSelec.

Color. Color. public class TesteDeMenu extends JFrame implements ActionListener { private JRadioButtonMenuItem RBFontes[].event.*. por exemplo. JMenuItem itemAbrir= new JMenuItem("Abrir. Ao serem clicados. Uma área de texto é semelhante aos objetos da classe JTextField. Quanto às teclas aceleradoras.setAccelerator(KeyStroke. InputEvent.gif")).red. permitindo especificar o número de linhas e colunas na criação dos seus objetos.180).gif")).blue.150). ou submenus. Color.gif")). são utilizados mnemônicos para realizar essa função.VK_S.awt.CTRL_MASK)).}}). JMenuItem itemNovo = new JMenuItem("Novo. o exemplo a seguir apresenta uma barra de menu com itens que manipulam uma área de texto.CTRL_MASK)). aos itens de menu. private JTextArea AreaTexto...serem clicados. os itens de menu disparam eventos de ação.black. podendo utilizar a tecla Enter para passar de uma linha para outra.new ImageIcon("salvar.setMnemonic('S').exit(0). itemSalvar. import javax. Referente às teclas de atalho. que abrem outros menus suspensos à direita. itemAbrir..*. import java.swing. grupoCores. itemNovo. podem abrir itens de menu. private ButtonGroup grupoFontes.getKeyStroke(KeyEvent.. na forma de caixa de seleção ou botão de rádio. private Color cores[]= {Color. // criação do menu Arquivo JMenu menuArquivo = new JMenu("Arquivo"). com ações diretas. JMenuBar BarraMenu = new JMenuBar().green}.orange.*. new ImageIcon("novo. setTitle("Menus e Áreas de Texto"). como Ctrl + C. com teclas de atalho.RBCores[].new ImageIcon("abrir. import java. Color. Alt + R ou F3.setMnemonic('A').". A classe responsável por esse componente é a JTextArea. itemAbrir..". private JCheckBoxMenuItem CBNegritoItalico[]. ou uma tecla de função. menuArquivo. mas permite a entrada de mais que uma linha de texto. setJMenuBar(BarraMenu). JMenuItem itemSair= new JMenuItem("Sair"). 56 . Os itens de menu podem ser mostrados de diversas formas: com uma imagem associada.setMnemonic('N').setAccelerator(KeyStroke.awt.getKeyStroke(KeyEvent. public TesteDeMenu() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. como um botão. itemSalvar. com teclas aceleradoras.setMnemonic('b'). que sublinham um caracter para cada item de menu e são ativados utilizando a tecla Alt + caracter sublinhado. setSize(400. JMenuItem itemSalvar= new JMenuItem("Salvar". é possível relacionar uma combinação de teclas.VK_O. InputEvent. setLocation(200. contendo itens de menu ou até mesmo outros submenus. Para demonstar a utilização da maioria das funções possíveis em um menu..

for (int i = 0.". InputEvent.add(menuEditar). menuEditar. menuFormatar. } RBCores[0].setAccelerator(KeyStroke. BarraMenu. InputEvent.add(itemCopiar).add(itemNovo)...setAccelerator(KeyStroke.CTRL_MASK)). itemSalvar. itemColar.setAccelerator(KeyStroke.gif")).add(itemAbrir).CTRL_MASK)).CTRL_MASK)). i < nomesCores.add(itemSalvar). menuEditar.setMnemonic('C').add(RBCores[i]).getKeyStroke(KeyEvent.add(RBCores[i]). itemSair. i++) { RBCores[i] = new JRadioButtonMenuItem(nomesCores[i]). itemRecortar. new ImageIcon("colar.setMnemonic('t').getKeyStroke(KeyEvent.setSelected(true). itemRecortar. JMenuItem itemRecortar = new JMenuItem("Recortar.addActionListener(this).setMnemonic('E'). "Verde"}.length.setMnemonic('r').VK_C. new ImageIcon("recortar. // criação do menu Editar JMenu menuEditar = new JMenu("Editar").. itemCopiar. JMenu menuCor = new JMenu("Cor").itemSair. "Laranjado".. menuEditar.length]. RBCores[i]. itemColar.addActionListener(this). itemCopiar. // criação do submenu Cor String nomesCores[]= {"Preto". BarraMenu.setMnemonic('b').add(itemRecortar).addActionListener(this). itemCopiar. menuEditar. JMenuItem itemCopiar = new JMenuItem("Copiar. itemRecortar.. menuArquivo. 57 .add(itemColar). menuCor. itemColar.add(itemSair).addActionListener(this). menuArquivo..getKeyStroke(KeyEvent. InputEvent.addActionListener(this).getKeyStroke(KeyEvent.VK_V. itemNovo. "Vermelho". menuCor. // criação do menu Formatar JMenu menuFormatar = new JMenu("Formatar"). menuArquivo..addSeparator().ALT_MASK)). RBCores = new JRadioButtonMenuItem[nomesCores. InputEvent.setAccelerator(KeyStroke. menuArquivo. "Azul". new ImageIcon("copiar.setMnemonic('F').VK_X. itemAbrir. JMenuItem itemColar = new JMenuItem("Colar.setMnemonic('S').. grupoCores. menuFormatar. menuArquivo.addActionListener(this)..gif")).add(menuCor)..add(menuArquivo).gif")).VK_R. menuArquivo.addActionListener(this).addSeparator(). grupoCores = new ButtonGroup().".addActionListener(this). itemSair.".

i++) { RBFontes[i] = new JRadioButtonMenuItem(nomesFontes[i]).showMessageDialog(this. JOptionPane. BarraMenu. menuFonte.WARNING_MESSAGE). for (int i = 0. else if (item == "Sair") 58 .menuFormatar. AreaTexto..addActionListener(this). i < CBItalicoNegrigoItens.getActionCommand().setLineWrap(true). itemSobre. "Opçao Novo não disponível!".add(RBFontes[i]). CBNegritoItalico = new JCheckBoxMenuItem[CBItalicoNegrigoItens. CBNegritoItalico[i]. i < RBFontes.showMessageDialog(this. "Opçao Salvar não disponível!". 14)).PLAIN.WARNING_MESSAGE). } public void actionPerformed(ActionEvent evt) { if (evt.. i++) { CBNegritoItalico[i] = new JCheckBoxMenuItem(CBItalicoNegrigoItens[i]). AreaTexto = new JTextArea(5.showMessageDialog(this.addActionListener(this).. "Alerta".") JOptionPane.addSeparator(). RBFontes = new JRadioButtonMenuItem[nomesFontes.black). P.setMnemonic('S').add(new JScrollPane(AreaTexto)).setMnemonic('u'). JOptionPane.length. "Alerta". String CBItalicoNegrigoItens[] = {"Negrito". grupoFontes = new ButtonGroup().getSource() instanceof JMenuItem) { String item = evt. } menuFormatar. else if (item == "Salvar") JOptionPane.add(RBFontes[i]). JMenuItem itemSobre = new JMenuItem("Sobre a Aplicação. "Monospaced".setMnemonic('n').addActionListener(this). // criação do submenu Fonte String nomesFontes[] = {"SansSerif".add(menuAjuda).add(CBNegritoItalico[i]).add(menuFonte).length.setFont(new Font("SansSerif". menuFonte.length]. AreaTexto. AreaTexto. Font.") JOptionPane. menuFonte.. RBFontes[i].add(menuFormatar). "Opçao Abrir não disponível!". menuAjuda.addSeparator().. else if (item == "Abrir. if (item == "Novo. Container P = getContentPane().setSelected(true). BarraMenu. } RBFontes[0]. JOptionPane. JMenu menuFonte = new JMenu("Fonte").setForeground(Color. "Serif"}. itemSobre.length].WARNING_MESSAGE). // criação do menu Ajuda JMenu menuAjuda = new JMenu("Ajuda"). menuFonte. menuAjuda."). 40).. grupoFontes. "Alerta". for (int i = 0. "Itálico"}.add(itemSobre).

else if (item == "Colar.setFont(new Font(RBFontes[i].length.PLAIN_MESSAGE). break.BOLD. 14)). } } } public static void main(String args[]) { TesteDeMenu fr = new TesteDeMenu(). Tipo.. AreaTexto.System. else { int Tipo = Font. i < RBFontes. fr. } repaint().isSelected() ) Tipo += Font.setFont(new Font(AreaTexto.") JOptionPane. i++ ) if (evt. JOptionPane.setVisible(true). Tipo. i++) if (evt.exit(0).cut(). if (CBNegritoItalico[1]. } for (int i = 0.. i < RBCores. for (int i = 0.. else if (item == "Copiar..setForeground(cores[i]). if (CBNegritoItalico[0]..getName().13. } } Figura 3..showMessageDialog(this.isSelected()) Tipo += Font.getSource() == RBFontes[i]) { AreaTexto. Manipulação de uma área de texto a partir de menus 59 .copy(). break. "Este é um exemplo de utilização de menus". else if (item == "Sobre a Aplicação.ITALIC..getText(). else if (item == "Recortar..length. "Sobre". 14)).") AreaTexto.") AreaTexto.") AreaTexto.PLAIN.getFont().paste().getSource() == RBCores[i]) { AreaTexto.

foi necessário seguir vários passos. foi setado um ouvinte de eventos para cada um. estes foram adicionados ao menu menuArquivo. Para cada item foi setada uma tecla de atalho a partir do setMnemonic() e. itens que abrem submenus. As opções existentes no menu Para criar o menu mostrado na figura 3. Como os itens de menu respondem a eventos de ação.A figura 3. Para que o texto possa ser mostrado com barras de rolagem. se o parâmetro for falso. que faz a quebra da linha ao final da palavra se o parâmetro for true.13 mostra a execução da aplicação. primeiramente. permitindo a definição de imagens a serem mostradas juntamente com os itens. tamanho e formato de fonte. no lugar de itens de menu comuns. para alguns deles. Tendo definidos todos itens de menu. Os mesmos passos foram seguidos para criar os menus menuEditar e menuAjuda. que contém outros itens especiais (caixas 60 . que irá sublinhar o caracter desejado e servir de tecla de atalho. Após. antes de tudo. o setFont() determina o tipo. do tipo JMenuBar. para depois ser passado como parâmetro pelo método setJMenuBar(). notando que não foi inserido nenhum painel no frame. é necessário inserir o objeto área de texto em um objeto JScrollPane e após inseri-lo no contêiner. a partir da criação de objetos do tipo JMenuItem. ou ignora o final da palavra para a quebra da linha. Para criar uma área de texto é necessário. que determina. caso este seja maior que a área visível. o setLineWrap() determina se o texto vai mudar de linha ao chegar no final da área definida. que é responsável pela inserção do menu no frame. e. que identifica o caracter e a tecla de controle utilizados para fazer a combinação. criar um objeto do tipo JTextArea e passar os parâmetros para determinar o número de linhas e o número de colunas desejado. a partir do addActionListener. criadas pelo método addSeparator(). Figura 3. tendo sido setada a barra de menu para o frame e inserida a área de texto diretamente em um contêiner. e este foi adiconado à barra de menu BarraMenu. o setTabSize(). através do método setMnemonic().14. Os itens de menu são adicionados a seguir. alguns métodos podem ser utilizados para configurar a área: o setForeground() indica a cor do texto. em seu parâmetro. foi criado o objeto BarraMenu. No exemplo. tendo que passar como parâmetro um objeto do tipo KeyStroke. Após foram inseridos os vários menus que compõem a barra de menu. suas teclas de atalho e aceleradoras. Dois outros métodos são úteis: o setWrapStyleWord(). Para a criação do menu Arquivo foi criado um objeto menuArquivo. A criação do menuFormatar segue basicamente os mesmos passos. Percebe-se a existência de linhas separatórias entre os itens.14. o número de colunas utilizados para a tabulação. do tipo JMenu e setado um mnemônico. foram associadas teclas aceleradoras através do método setAccelerator(). mas eles possuem.

O item Sair encerra a aplicação. As próximas seções explicitam três desses tipos de eventos: de foco. Para a criação do menu Cor foi definido um objeto menuCor. o menuFonte foi adicionado ao menuFormatar. É possível mudar o foco via programação a qualquer momento. do objeto AreaTexto. Antes de adicionar o menuCor ao menuFormatar. não. vistos até aqui. permite a comparação do que foi clicado com o texto do item de menu específico. e foram adicionados seis itens de menu a partir do arranjo RBCores. do tipo ButtonGroup. Como já comentado. Abrir e Salvar não possuem uma efetiva implementação. Como as opções Novo. então. de mouse e de teclado. tembém foi setado um ouvinte de eventos para cada um. Assim. se uma caixa de texto possuir o foco. como: um botão apresenta um retângulo pontilhado e uma caixa de texto apresenta o cursor piscando na área destinada à digitação. Da mesma forma que os itens de menu normais. de janela. do tipo JMenu. este será o escolhido. sendo confirmadas a partir do repaint(). no momento que for pressionada a barra de espaços. ele pode obter foco. para o tratamento dos eventos. foi necessário adicioná-los também ao grupo grupoCores. e esse. existem eventos especiais que podem ser ativados a qualquer hora. pelo método setSelected(). Caso o item selecionado for algum dos constantes no menu Formatar. 3.1 Eventos de Foco Existem componentes que podem receber foco e outros não. é nela que eles serão mostrados. caso contrário. Por se tratar de botões de rádio. a partir do getActionCommand(). outros componentes que podem receber foco. em um frame pode haver apenas um componente com foco. foi setado o botão de rádio que inicia selecionado. no menu Formatar foram inseridos dois submenus: Cor e Fonte. e não precisam estar associados a algum componente específico. O item Sobre também mostra apenas uma mensagem. feitos a partir do arranjo CBNegritoItalico. 3.10. foi apresentada uma mensagem para cada uma delas. foi adicionado à barra de menu. a partir do addActionListener. Para a criação do menu Fonte foi definido um objeto menuFonte. por sua vez.10 Tratamento de Eventos Especiais Além dos eventos gerados por componentes de interface com o usuário. também do tipo JMenu. mas só irá funcionar em resposta a um evento qualquer. Da mesma forma. Por exemplo. se o componente puder realizar algum tipo de ação advindo do pressionamento de teclas. uma linha separatória. mas ele pode perder o foco se for pressionada a tecla Tab ou se um outro componente que pode receber foco for clicado com o mouse.de seleção e botões de rádio). do tipo JCheckBoxMenuItem. para realizar as operações desejadas. quando forem digitados caracteres. 61 . copy() e paste(). Logicamente. Os itens do menu Editar simplesmente executam os métodos cut(). foi utilizada a interface ActionListener e implementado o método actionPerformed() que. Ao final. através do método requestFocus(). O componente que possui o foco mostra visualmente essa situação. do tipo JRadioButtonMenuItem. Isso se existitem. Receber foco significa possuir prioridade sobre os outros componentes na digitação de teclas. Portanto. no frame. então são utilizados métodos como o setFont() e o setForeground(). e foram adicionados: um grupo de botões de rádio. e dois itens do tipo caixa de seleção. seguindo os mesmos passos já apresentados. se um botão possuir o foco.

exit(0). javax. setTitle("Teste de Foco"). pela tecla Tab.}}).add(BotaoDois). P.10). PainelFocoCima.setLayout(new GridLayout(2. private JButton BotaoQuatro. private JButton BotaoTres. Essa ordem é conhecida como “Ordem de tabulação”.swing. import import import import java. PainelFocoCima. private JButton BotaoDois. Border bordaPainelCima = BorderFactory.add(PainelFocoCima). e o exemplo a seguir foi criado para realizar a verificação dessa ordem.*.awt.add(TextoTres).createEtchedBorder().add(PainelFocoBaixo).add(TextoDois). Container P = getContentPane().*.swing. BotaoDois = new JButton("Botão Dois"). da esquerda para a direita e de cima para baixo.10). BotaoQuatro = new JButton("Botão Quatro"). Border bordaPainelBaixo = BorderFactory. os componentes do Swing são percorridos. public TesteDeFoco() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.border.setBorder(bordaPainelCima). private JTextField TextoDois. TextoUm = new JTextField("Texto Um". P.add(TextoQuatro). private JTextField TextoTres. P. TextoDois = new JTextField("Texto Dois".setBorder(bordaPainelBaixo).add(BotaoTres).10). BotaoUm = new JButton("Botão Um"). private JTextField TextoQuatro.10). JPanel PainelFocoBaixo = new JPanel(). PainelFocoBaixo.*.add(TextoUm).createEtchedBorder(). BotaoTres = new JButton("Botão Três").add(BotaoUm). public class TesteDeFoco extends JFrame { private JTextField TextoUm.Como padrão.170). javax.200).*. } public static void main(String[] args) { 62 . PainelFocoCima. PainelFocoCima. setSize(300. JPanel PainelFocoCima = new JPanel(). TextoTres = new JTextField("Texto Três". PainelFocoBaixo.1)). setLocation(200. PainelFocoBaixo.event. dentro do contêiner. java. private JButton BotaoUm. TextoQuatro = new JTextField("Texto Quatro". PainelFocoBaixo.awt.add(BotaoQuatro). PainelFocoBaixo. PainelFocoCima.

BotaoUm. setLocation(200. fr. setTitle("Alterando o Foco"). Por exemplo. public FocoAlterado() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. import java. emitir uma mensagem e não permitir a saída da caixa. private JTextField TextoDois. 63 . o requestFocus() permite alterar o foco. } } Figura 3. Container P = getContentPane(). etc.70). e depois retornaria o sentido normal.*. public class FocoAlterado extends JFrame implements FocusListener { private JTextField TextoUm. Se existir um contêiner dentro de outro.awt. import java. TextoUm = new JTextField("Texto Um".JFrame fr = new TesteDeFoco(). mas apenas em resposta a algum evento. como no exemplo a seguir.setNextFocusableComponent(TextoTres).setVisible(true). PainelFoco.awt. basta implementar o código: TextoUm.event. ou seja: TextoDois. caso não esteja correto.*. Nesse caso.add(TextoUm). Isso é bastante útil se for necessário testar o conteúdo de uma caixa de texto e. a não ser que se altere novamente a ordem.}}).200). Sentido da Ordem de Tabulação As legendas inseridas na figura 3. É possível alterar essa ordem através do método setNextFocusableComponent(). setSize(300. irá ser seguida a ordem padrão até o seu último componente.. JPanel PainelFoco = new JPanel(). import javax. só então voltará a percorrer os componentes do contêiner externo. para passar o foco do objeto TextoUm diretamente para o TextoTres. no momento que entrar no contêiner interno.15. Como visto anteriormente.exit(0).10).swing.*.15 mostram o sentido natural seguido pelos componentes do Swing. após o TextoUm viria o TextoTres.

} } Figura 3. não permitindo. Caso seja verdadeiro e o conteúdo da caixa de texto esteja vazio. PainelFoco. focusLost() e focusGained(). JOptionPane.16. No exemplo.getText(). TextoUm. Para que isso seja possível. para o objeto TextoUm. que informa quem recebeu ou perdeu o foco e o isTemporary(). if (origem == TextoUm && !evt. é necessário implementar os métodos da interface FocusListener. } public void focusLost(FocusEvent evt) { Component origem = evt. "O valor deve ser digitado!". na ativação de uma outra janela e posterior retorno à janela atual. como o getComponent(). é mostrada uma mensagem e é devolvido o foco ao próprio TextoUm.10). foi adicionado o ouvinte de eventos a partir do addFocusListener().equals("")) { JOptionPane.ERROR_MESSAGE). No método focusLost() foi feito o teste se a origem do evento foi o TextoUm e se não foi uma perda de foco temporária. O parâmetro FocusEvent é uma classe que apresenta alguns métodos importantes.requestFocus(). que são invocados no momento que a origem do evento ganhar ou perder o foco. P.showMessageDialog(this.add(PainelFoco). podendo ser. } } public void focusGained(FocusEvent evt) { } public static void main(String[] args) { JFrame fr = new FocoAlterado(). fr.getComponent().add(TextoDois).addFocusListener(this). Como não foi realizada 64 .setVisible(true). dessa forma. Teste de entrada de dados em uma caixa de texto A figura 3.TextoDois = new JTextField("Texto Dois". por exemplo.16 mostra o que acontece se for feita a tentativa de sair da primeira caixa de texto sem digitar nada nela. sair da caixa de texto sem a digitação de algo. TextoUm. que informa se a mudança de foco foi permanente ou temporária. "Atenção".isTemporary()) if (TextoUm.

awt. Isso significa que são incorporados recursos da GUI daquela plataforma específica.showMessageDialog(null. public class EventosEmJanelas extends JFrame { public EventosEmJanelas() { addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { JOptionPane. 3. 65 .2 Eventos de Janela Da mesma forma que os componentes. lembrando a obrigatoriedade de se implementar todos os métodos de uma interface. Quando as janelas.*. "O frame será fechado. o o ativação de outra janela. enquanto windowClosed() é executado após o fechamento da janela.}}). que tem sido colocado nos exemplos vistos até aqui. gerarem algum evento. windowIconified(): ocorre quando windowDeiconified(): • • a janela é minimizada. outros seis métodos podem ser implementados. O exemplo a seguir mostra a primeira maneira de implementação de alguns métodos da interface WindowListener. ocorre quando a janela se torna inativa.*. import javax.exit(0).awt. provavelmente na quando a janela é aberta. O método windowClosing() é executado no momento que é clicado no botão específico para fechar a janela da plataforma corrente. o método focusGained() ficou vazio.10. import java. São eles: • • • • windowActivated(): ocorre quando windowDeactivated(): a janela se torna ativa. A classe JFrame é o tipo de janela mais utilizado em Java. e alguns métodos podem ser implementados. sendo necessário para isso encerrar a aplicação com o método System.swing. deve haver um ouvinte de eventos baseado na interface WindowListener para seu tratamento. ocorre quando a janela é restaurada.*. import java. addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.event. A diferença desse método para windowClosing() é que esse último pode evitar que a janela seja fechada.. windowOpened(): ocorre windowClosed(): ocorre quando a janela é fechada.nenhuma ação no ganho de foco. possuindo uma barra de título e uma borda que se adaptam a plataforma onde o aplicativo está sendo executado. Além do método windowClosing(). com a função de fechar o frame. incluindo o JFrame. como é o caso do trecho de código a seguir."). as janelas também possuem eventos possíveis de acontecer.exit(0)..

mostra uma mensagem alertando o usuário que isso irá acontecer.awt.17. } } Figura 3. apresentado na figura 3.exit(0). Nota-se que os demais métodos não foram implementados. setSize(300.*. import javax. A segunda maneira de realizar as mesmas tarefas é mostrada no exemplo a seguir. } }). O resultado.*.*. na abertura do frame. e windowDeiconified(). windowIconified().70). } public void windowIconified(WindowEvent e) { setTitle("Minimizado"). public class EventosEmJanelasSegundaForma extends JFrame implements WindowListener { public EventosEmJanelasSegundaForma() 66 . } public void windowDeiconified(WindowEvent e) { setTitle("Restaurado"). import java. antes de finalizar a aplicação.awt. no ato de minimizar o frame. } public void windowOpened(WindowEvent e) { setTitle("Aberto"). import java. mostra que foi feita uma alteração no título do frame nesses métodos. O método windowClosing().event.swing.setVisible(true).System.17. pois nesse tipo de implementação não é necessário. no ato de restaurar o frame.200). } public static void main(String[] args) { JFrame fr = new EventosEmJanelas(). acrescentando-se apenas os métodos windowOpened(). Manipulação de eventos em janelas Percebe-se que a estrutura adotada na maioria dos exemplos vistos até aqui foi seguida. fr. setLocation(200.

inclusive aqueles que não tem nenhum código interno. se for clicado em um botão. "O frame será fechado. } public void windowClosing(WindowEvent e) { JOptionPane.10. o método a ser implementado é o actionPerformed(). porém. essas ações já são tratadas pelos componentes que estão sendo manipulados. e após foi realizada a implementação dos métodos. utilizou-se o implements WindowListener.200). não sendo necessário tratar exclusivamente o clique do mouse. da interface ActionListener. } } A execução é a mesma."). setLocation(200. na maioria das vezes.exit(0). } public void windowOpened(WindowEvent e) { setTitle("Aberto").3 Eventos de Mouse Qualquer ação do mouse pode ser capturada como sendo um evento específico. } public void windowIconified(WindowEvent e) { setTitle("Minimizado"). fr. tendo como parâmetro um 67 . existem situações que necessitam da implementação de linhas de código que respondam a eventos de mouse.. os métodos da interface MouseListener e MouseMotionListener devem ser implementados. } public void windowDeiconified(WindowEvent e) { setTitle("Restaurado"). mas a forma escolhida para a programação é diferente.. e quando isso acontece. tornando-se obrigatória.70). System.{ addWindowListener(this). Por exemplo. Observe que. que todos os métodos estejam presentes. dessa forma.showMessageDialog(null.setVisible(true). setSize(300. em primeiro lugar. 3. Porém. } 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().

com qualquer botão.*. addMouseListener(this).}}). P.swing. 68 . mouseReleased(): ocorre quando há a liberação de algum botão do mouse após ter havido o pressionamento deste. o exemplo a seguir traz uma implementação para todos os métodos de cada uma das duas interfaces. private JButton BotaoOK. como as coordenadas x e y de onde o evento ocorreu.200).awt. setLocation(200.setLayout(new BorderLayout()). ocorre quando o cursor do mouse sai da área definida por um componente específico. por exemplo.exit(0). setSize(400. A interface MouseListener possui cinco métodos possíveis de serem implementados. Os dois métodos exitentes são: • • mouseMoved(): ocorre quando há o movimento do cursor do mouse em um componente específico.awt.*. import java. JPanel PainelEMCentro = new JPanel().objeto do tipo MouseEvent. MouseMotionListener { private JLabel Mensagem.*. A fim de demonstrar o funcionamento do tratamento de eventos de mouse. mousePressed(): ocorre quando há o pressionamento de algum botão do mouse. setTitle("Eventos de Mouse"). public EventosDeMouse() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.100). e sua liberação sem o movimento do cursor. public class EventosDeMouse extends JFrame implements MouseListener. mouseExited(): Já a interface MouseMotionListener se preocupa mais com os eventos de movimento do mouse.event. Container P = getContentPane(). que contém as informações necessárias para o tratamento. mouseDragged(): ocorre quando há o pressionamento (mousePressed()) de um botão do mouse e posterior movimentação. mouseEntered(): ocorre quando o cursor do mouse entra na área definida por um componente específico. addMouseMotionListener(this). import javax. import java. São eles: • • • • • mouseClicked(): ocorre quando há o pressionamento do mouse.

setCursor(Cursor.getX() + " y = " + e.add(PainelEMSul. } public void mousePressed(MouseEvent e) { String botaoPressionado =e. Mensagem.getY()).addMouseListener(this).getY()).getX() + " y = " + e. Mensagem = new JLabel().getButton() == 1 ? "esquerdo" : (e.getButton() == 1 ? "esquerdo" : (e. } public void mouseClicked(MouseEvent e) { String botaoPressionado =e.getX() + " y = " + e. JPanel PainelEMSul = new JPanel(). PainelEMSul. if (e.getX() + 69 .BotaoOK = new JButton("OK").HAND_CURSOR)).setText("Mouse ENTROU no FRAME").getButton() == 2 ? "do meio" : "direito"). Mensagem. PainelEMCentro.getY()).setText("Mouse SAIU do FRAME")."Center"). } public void mouseReleased(MouseEvent e) { String botaoPressionado =e.getButton() == 1 ? "esquerdo" : (e.add(Mensagem).getButton() == 2 ? "do meio" : "direito").getButton() == 2 ? "do meio" : "direito").setText("Cursor MOVIDO para x = " + e.getDefaultCursor())."South").add(BotaoOK).setText("Botão " + botaoPressionado + " LIBERADO nas cordenadas x = " + e. BotaoOK. } } public void mouseExited(MouseEvent e) { Mensagem. Mensagem.add(PainelEMCentro.setText("Mouse SAIU no BOTÃO").getPredefinedCursor(Cursor. } public void mouseEntered(MouseEvent e) { Mensagem. if (e.setText("Botão " + botaoPressionado + " PRESSIONADO nas cordenadas x = " + e.setText("Mouse ENTROU no BOTÃO"). setCursor(Cursor. P.setText("Botão " + botaoPressionado + " CLICADO nas cordenadas x = " + e. } } // mensagem não perceptível public void mouseMoved(MouseEvent e) { Mensagem.getSource() == BotaoOK) { Mensagem.getSource() == BotaoOK) { Mensagem. P.

18. das várias existentes. algumas mensagens não podem ser vistas porque a mensagem de outro evento a sobrepõe.1. } public static void main(String[] args) { JFrame fr = new EventosDeMouse(). Alguns desses tipos de cursor são mostrados na tabela 3. } public void mouseDragged(MouseEvent e) { Mensagem.setText("Cursor ARRASTADO para x = " + e.botão esquerdo." y = " + e. Nos métodos mouseEntered() e mouseExited() há um tratamento especial para a ocorrência do evento no botão.getY()). se o botão foi clicado. quando esse tipo de evento ocorre no botão. que tem como parâmetro um objeto do tipo Cursor. Os métodos mouseClicked(). que fica no painel situado na parte sul do frame. e as coordenadas x e y. fr. informação adquirida pelo método getButton(). 70 . que retorna um inteiro (1. Como o botão também possui um ouvinte de eventos.botão do meio e 3. as duas interfaces estão sendo utilizadas. apenas uma mensagem adequada é mostrada. a mensagem também é atualizada quando o evento ocorre sobre ele. Através do addMouseListener() e do addMouseMotionListener() foi setado o frame como sendo ouvinte de eventos dele mesmo. Isso é feito a partir do método setCursor(). a ação realizada. através do getPredefinedCursor(). para cada um dos métodos implementados.setVisible(true).getY()). como é o caso de quando se entra no frame. foi adicionado um ouvinte de eventos para ele. adquiridas pelos métodos getX() e getY(). O resultado é que. pressionado ou liberado. Quando o evento de entrada ou saída ocorre no frame.botão direito). uma mensagem é mostrada no label Mensagem. MouseMotionListener. está sendo mostrada na figura 3. porém. } } Figura 3.18. Para que o botão BotaoOK também pudesse responder aos eventos de clique. 2. é possível setar um dos cursores pré-definidos. Manipulação de eventos de mouse Apenas uma das mensagens. além da mensagem. é alterado o cursor para HAND_CURSOR na entrada e para o cursor padrão na saída. onde. onde a mensagem é sobreposta por aquela emitida pelo método mouseMoved(). Percebe-se que as coordenadas x e y são específicas do botão.getX() + " y = " +e. Em algumas situações. através do implements MouseListener. mousePressed() e mouseReleased() simplesmente atualizam o label com: a mensagem de qual botão foi pressionado. porém. Antes de tudo.

para ser presssionado. indicando o posicionamento. Isso ocorre porque não foi adicionado um ouvinte de eventos de movimento (addMouseMotionListener()) ao botão.4 Eventos de Teclado Da mesma forma que o mouse. Alt. a interface utilizada é a KeyListener. São eles: • • • keyPressed(): ocorre quando há o pressionamento de qualquer tecla.1. etc. Os métodos responsáveis são o mouseMoved() e o mouseDragged(). que simplesmente mostra a tecla. Percebe-se que esse tipo de mensagem não aparece quando se passa em cima do botão. Exemplos de cursor existentes na plataforma Windows Por fim. No mesmo exemplo utilizado para os eventos de mouse. Shift. Caps Lock.DEFAULT_CURSOR HAND_CURSOR WAIT_CURSOR TEXT_CURSOR CROSSHAIR_CURSOR MOVE_CURSOR N_RESIZE_CURSOR SW_RESIZE_CURSOR SE_RESIZE_CURSOR E_RESIZE_CURSOR (norte) ou S_RESIZE_CURSOR (sul) (sul. Nesse caso. com ou sem o botão do mouse pressionado. um botão. ocorrida após o seu keyReleased(): pressionamento. como o Home. qualquer evento gerado pelo teclado pode ser tratado. ou pode ser pressionada a barra de espaços quando o foco está sobre ele. End. uma mensagem é mostrada. keyTyped(): O funcionamento dos eventos de teclado possíveis é demonstrado no exemplo a seguir. 3. pode ser clicado o mouse sobre ele. o evento a ser tratado não é algum específico de teclado. 71 . onde existem três métodos possíveis de serem implementados.10. ocorre quando há o pressionamento de qualquer tecla que não seja uma tecla de ação. todos eles recebendo um objeto do tipo KeyEvent como parâmetro. e sim o evento específico para o botão. ou combinação de teclas que foi pressionada ou liberada. durante a movimentação sobre o frame. Nos casos específicos de tratamento de eventos de teclado. mas isso só é necessário em situações em que o evento ocorrido não esteja associado a um componente específico. ocorre quando há a liberação de qualquer tecla.leste) ou NE_RESIZE_CURSOR (norte-leste) (sul-leste) ou NW_RESIZE_CURSOR (norte-leste) (leste) ou W_RESIZE_CURSOR (oeste) Tabela 3.

VK_ALT: teclaPressed = "Alt". import java. teclaPressed = "Control + A". private boolean entrouPressed. case KeyEvent.*.*. case KeyEvent." + teclaPressed +" PRESSIONADA"). teclaPressed = "Shift + A".VK_UP: teclaPressed = "Cima". break.VK_SHIFT: teclaPressed = "Shift". private int tecla = 0. case KeyEvent. teclaPressed = e. } if (tecla == KeyEvent. Container P = getContentPane(). teclaPressed = "Alt + A". P. } public void keyPressed(KeyEvent e) { tecla = e.isShiftDown()) { combinacao = true. break.*. entrouPressed = true. } if (tecla == KeyEvent. private char teclaTyped.setText("Tecla " + tecla + " .isControlDown()) { combinacao = true.awt. case KeyEvent. 72 . setSize(250.100).isAltDown()) { combinacao = true. case KeyEvent. break. setTitle("Eventos de Teclado"). case KeyEvent. } if (tecla == KeyEvent.VK_DOWN: teclaPressed = "Baixo".250).event.swing.getKeyCode(). import javax.exit(0).VK_RIGHT: teclaPressed = "Direita". break. public EventosDeTeclado() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.}}).VK_A && e.VK_A && e. Mensagem = new JLabel(). setLocation(300. break. public class EventosDeTeclado extends JFrame implements KeyListener { private JLabel Mensagem. break.VK_CONTROL: teclaPressed = "Control".import java. private String teclaPressed = null.getKeyText(tecla).awt. private boolean combinacao. switch (tecla){ case KeyEvent.VK_A && e. addKeyListener(this).add(Mensagem).VK_LEFT: teclaPressed = "Esquerda". } Mensagem. break.

setText("Tecla " + teclaTyped + " LIBERADA"). Para que isso seja possível. é necessário testar o código para ver se ele é igual a alguma das constantes definidas na classe KeyEvent. foi verificada a ocorrência. sempre iniciadas por VK_.} public void keyReleased(KeyEvent e) { if (entrouPressed) { Mensagem. algumas variáveis foram declaradas a fim de utilizar nos três métodos. } public void keyTyped(KeyEvent e) { if (!combinacao) { teclaTyped = e.setText("Tecla " + tecla + " .getKeyChar(). isControlDown() e isAltDown(). a partir do getKeyCode(). fr. já que. é necessário implementar os três métodos da interface KeyListener. entrouPressed = false. No exemplo. Mensagem. foi feito isso simplesmente para colocar uma descrição em português de algumas teclas na variável teclaPressed. No keyPressed() a variável tecla armazena o código inteiro da tecla pressionada. Figura 3. } } " PRESSIONADA").setVisible(true). No exemplo. das combinações de teclas Shift+A. a partir do getKeyText()." + teclaPressed + " LIBERADA"). e a variável teclaPressed armazena a descrição da tecla pressionada. Manipulação de eventos de teclado Um label Mensagem inserido no frame (figura 3. Control+A e Alt+A. em algumas situações. } else Mensagem. A variável entrouPressed é setada para true sempre que for executado o método keyPressed() e a variável combinacao é setada para true sempre que forem 73 .setText("Tecla " + teclaTyped + } } public static void main(String[] args) { JFrame fr = new EventosDeTeclado(). através dos métodos isShiftDown(). Após. respectivamente. a mensagem de um sobreporia aquela emitida por outro método.19. e atualizada a variável teclaPressed.19) indica qual tecla ou combinação foi pressionada ou liberada. No caso de se querer testar uma tecla específica. combinacao = false.

este vai ficar localizado no rodapé do frame principal. A aplicação mostrada a seguir apresenta. java. e podem aparecer em qualquer parte da área que lhe foi destinada.awt. As operações de manipulação do frame principal acarretam em efeitos nos frames internos. import import import import javax. esteja ele ocupando o espaço que for da tela. ele vai ocupar o espaço delimitado pelo frame principal. No método keyTyped() a variável teclaTyped obtém a tecla que foi pressionada. normalmente utilizada para criar acessos rápidos às principais tarefas da aplicação.*. java. através do getKeyChar(). A variável entrouPressed é setada para false para indicar a entrada no keyTyped().pressionadas as combinações anteriormente citadas. uma aplicação MDI (Mutilple Document Interface – Interface de Múltiplos Documentos) é caracterizada pela existência de um frame principal.swing. controlada pela variável combinação.*. é mostrada a tecla que foi pressionada. Uma barra de ferramentas é criada a partir da classe JToolBar. Por isso a existência da variável entrouPressed. Ao final. para dar mensagens diferentes na liberação das teclas. faz com que os frames internos que estão abertos também sejam finalizados.*.awt. Isso significa que. Tudo isso somente é feito se não tiver sido pressionada uma combinação de teclas anteriormente. java. Para que se possa criar uma área apta à manipulação de frames internos. A área de ação de um frame interno é o próprio frame principal. não podendo ultrapassar os seus limites. lembrando que apenas teclas que não são de ação ativam esse método. se um frame interno for maximizado. 3. são menus suspensos ativados normalmente pelo clique do botão direito do mouse.*. Da mesma forma. a utilização de uma barra de ferramentas e de menus flutuantes. Os itens de menu de um menu flutuante podem ter as mesmas características de um menu normal: ser apresentados na forma de caixa de seleção ou botão de rádio. que retorna true se a tecla pressionada for uma tecla de ação e false caso contrário. Adicionalmente. existe ainda o método isActionKey().11 Aplicações MDI. é mostrado no label o código e a descrição da tecla ou combinação pressionada. ao minimizar um frame interno. com teclas de atalho e teclas aceleradoras. O método keyReleased() é executado após o keyPressed() ou o keyTyped() tiver sido executado. e nada mais é do que um conjunto de botões que realizam ações. ou frame pai. Ao final.beans. criados a partir da classe JPopupMenu e comumente chamados de pop-up. Os menus flutuantes. por exemplo. ou frames filhos. com imagem associada. além do exemplo da aplicação MDI. que pode conter várias outros frames internos. deve-se trabalhar com um objeto da classe JDesktopPane e inserir um objeto da classe JInternalFrame para cada frame interno que se deseja criar. public class AplicacaoMDI extends JFrame implements ActionListener { 74 .event. Menus Flutuantes e Barra de Ferramentas Em Java. A ação de fechar.

. menuArquivo. public AplicacaoMDI() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. menuArquivo.add(itemAbrirDois).setToolTipText("Abre o Frame Interno Dois"). menuArquivo.VK_R.50). menuArquivo.exit(0). abreFrameUm = new JButton(new ImageIcon("EstrelaUm. barra. setSize(500.add(abreFrameDois).add(itemAbrirUm). abreFrameDois. InputEvent.gif")).setAccelerator(KeyStroke. //criação da barra de ferramentas JToolBar barra = new JToolBar().addActionListener(this). P.private private private private private private private JDesktopPane DPane."North").addSeparator().add(menuArquivo). sair. itemAbrirUm..addActionListener(this). JInternalFrame IFrameDois.addActionListener(this). 75 . new ImageIcon("EstrelaUm. JButton sair. setLocation(100.gif")). itemSair. JButton abreFrameUm. abreFrameDois..gif")).gif")).add(barra.setToolTipText("Abre o Frame Interno Um").getKeyStroke(KeyEvent.400). //criação do menu JMenuBar BarraMenu = new JMenuBar(). abreFrameUm. new ImageIcon("EstrelaDois..gif")).add(sair). setJMenuBar(BarraMenu). itemSair..setLayout(new BorderLayout()). barra. JInternalFrame IFrameUm. BarraMenu.". P. Container P = getContentPane(). abreFrameUm. JButton abreFrameDois. new ImageIcon("Sair. JMenuItem itemAbrirUm = new JMenuItem("Abrir Frame Interno Um.addSeparator(). barra. itemAbrirDois.add(itemSair).add(abreFrameUm).addActionListener(this). JMenuItem itemSair= new JMenuItem("Sair".setToolTipText("Encerra a aplicação").addActionListener(this). barra.setMnemonic('A'). itemAbrirUm.gif")). JPopupMenu Menu. JMenu menuArquivo = new JMenu("Arquivo").". sair.}}). sair = new JButton(new ImageIcon("Sair. setTitle("Aplicação MDI com Barra de Ferramentas e Menu Flutuante").ALT_MASK)). itemSair.addActionListener(this).setMnemonic('r'). abreFrameDois = new JButton(new ImageIcon("EstrelaDois. itemAbrirDois.setMnemonic('D'). JMenuItem itemAbrirDois= new JMenuItem("Abrir Frame Interno Dois. menuArquivo.setMnemonic('U').

BotaoFechar.setClosed(true). IFrameUm. "Digite novo título".. Menu. true.setLocation(50. "Entrada".add(itemFechar). itemFechar. Menu.setFrameIcon(new ImageIcon("EstrelaUm. IFrameUm. JButton BotaoFechar = new JButton("Fechar"). Menu = new JPopupMenu().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { IFrameUm.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { IFrameUm.setVisible(true). true. } public void actionPerformed(ActionEvent evt) { Object origem = evt.isPopupTrigger()) 76 . try { IFrameUm. JMenuItem itemFechar = new JMenuItem("Fechar").add(itemTitulo). } catch (PropertyVetoException exc) { } } }). IFrameUm."Center").putClientProperty("JDesktopPane. true. P. if (retorno != null) IFrameUm.setTitle(retorno).setClosed(true).addSeparator(). } catch (PropertyVetoException exc) { } } }).addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.150). } catch (PropertyVetoException exc) { } } }).setSelected(true).. IFrameUm." || origem == abreFrameUm) { IFrameUm = new JInternalFrame("Frame Interno Um". JMenuItem itemTitulo = new JMenuItem("Alterar Título"). JOptionPane.add(DPane.// criação da área para inserção de frames internos DPane = new JDesktopPane(). DPane. if (item == "Abrir Frame Interno Um.gif")). IFrameUm. true).QUESTION_MESSAGE).getActionCommand(). itemTitulo.setSize(250. Menu.dragMode".getSource(). String item = evt.50).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String retorno = JOptionPane. "outline").showInternalInputDialog(IFrameUm.

setSelected(true). } catch (PropertyVetoException exc) { } } else if (item == "Sair" || origem == sair) System. Container C = IFrameUm.setSize(250. } catch (PropertyVetoException exc) { } } }). e.setVisible(true).setSelected(true). true.Menu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { IFrameDois.getContentPane().150). JButton BotaoFechar = new JButton("Fechar").exit(0). Container C = IFrameDois. false.getX()." || origem == abreFrameDois) { IFrameDois = new JInternalFrame("Frame Interno Dois".setLocation(150. e. C. fr. try { IFrameUm. } } 77 . try { IFrameDois.gif")). } public static void main(String args[]) { AplicacaoMDI fr = new AplicacaoMDI()..150). } catch (PropertyVetoException exc) { } } else if (item == "Abrir Frame Interno Dois."South").setFrameIcon(new ImageIcon("EstrelaDois.setClosed(true). C."South"). DPane. C.setLayout(new BorderLayout())..getY()).add(IFrameDois). false. IFrameDois. IFrameDois.add(IFrameUm). false).add(BotaoFechar.add(BotaoFechar.setVisible(true). DPane. C. IFrameDois.setLayout(new BorderLayout()). } }).show(e. BotaoFechar. IFrameDois.getComponent().getContentPane().

Figura 3.20. Aplicação MDI – Barra de Menu

A primeira parte do exemplo mostra a criação da barra de menu do frame principal, já adiantando que os frames internos também podem conter barras de menu individuais, o que não é o caso do exemplo. A barra de menu BarraMenu, objeto da classe JMenuBar, é definida como barra de menu do frame principal através do setJMenuBar(), e é criado um único menu nessa barra, o menuArquivo, onde são adicionados os itens de menu apresentados na figura 3.20. O processo de criação dos itens de menu segue o já visto em seções anteriores.

Figura 3.21. Aplicação MDI – Barra de Ferramentas

Após, 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 características referentes a uma barra de ferramentas são assimiladas, sendo necessário apenas inserir botões com imagens através do método add(). O tamanho de cada botão é proporcional ao tamanho da imagem e cada um dos botões vai ter um comportamento normal, sendo necessário adicionar um ouvinte de eventos (addActionListener()) a eles para virem a executar ações posteriormente. Na figura, também é possível verificar a existência de uma dica de ferramenta, que aparece quando o cursor é posicionado sobre um componente, para o botão sair, inserido em cada botão a partir do método 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 botões e o último foi adicionado pelo método addSeparator(). Ao final, o objeto barra é incluído na parte norte do frame.

78

Figura 3.22. Aplicação MDI – Mobilidade da Barra de Ferramentas

Entre as características 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 específico para ela. Nesse caso, se esse frame for fechado, a barra volta ao seu lugar de origem.

79

Figura 3.23. Aplicação MDI – Frames Internos

Para que seja inserida a capacidade de receber frames internos, como mostra a figura 3.23, criando assim uma aplicação MDI, é necessário adicionar ao contêiner um objeto da classe JDesktopPane(). Foi isso que ocorreu na criação do objeto DPane, que, ao ser adicionado ao contêiner, tornou possível a criação de frames internos. O método putClientProperty() utilizado em seguida é referente ao arrastar dos frames internos. Como padrão, toda vez que se tentar movimentar um frame interno, este é redesenhado a todo momento, enquanto estiver sendo arrastado. Isso pode causar desagrado a usuários que não tenham um bom equipamento, principalmente no que diz respeito ao vídeo, pois o desempenho pode não ser satisfatório. Para evitar isso, o método chamado faz com que, no ato de arrastar, apenas o contorno apareça e o frame só seja redesenhado na posição final desejada. O Windows, por exemplo, tem esse procedimento como padrão no arrastar de janelas. No exemplo, os frames internos somente serão criados se um evento ocorrer, seja pela chamada do item de menu específico, ou através da barra de ferramentas. Então, no método actionPerformed(), se for selecionado o item do menu Abrir Frame Interno Um..., ou se for clicado o primeiro botão da barra de ferramentas, será mostrrado o primeiro frame interno. Para isso, foi criado um objeto IFrameUm a partir da classe JInternalFrame, passando cinco parâmetros, seguindo a sintaxe:
JInternalFrame(String titulo, boolean redimensionar, boolean fechar, boolean maximizar, boolean minimizar)

80

beans. Se isso não for feito. nesse caso. Figura 3. Após. a aplicação seria abortada. do pacote java. um ícone no frame interno. O Java tem muito disso.24. ele exige o tratamento da exceção. mas é necessário tratar a exceção PropertyVetoException. se a exceção não for tratada. o frame incorporou todas as funcionalidades permitidas a ele. como qualquer outro frame. setLocation(): setFrameIcon(): insere setVisible(): torna o frame interno visível.Como todos os parâmetro foram passados como true. foi criado um menu flutuante a partir do objeto Menu. quando a operação é crítica e pode resultar na finalização forçada da aplicação. por algum motivo.24). e apenas esse. e. além de não fechar. Cada item de menu é criado e adicionado ao menu flutuante da 81 . Aplicação MDI – Menu Flutuante Para esse frame interno. da classe JPopupMenu (figura 3. já adicionando um ouvinte de eventos e implementando o código para fechar o frame interno. O botão BotaoFechar foi criado. determina a localização do frame interno dentro do frame principal. não é possível executar o método. pois o frame pode ter problemas na ação de fechar. ele foi configurado através de alguns métodos: • • • • setSize(): determina o tamanho do frame interno. O método setClosed() é responsável por fechar o frame interno.

Os procedimentos de criação e configuração são os mesmos. permitem criar caixas de diálogo com as mesmas características dos frames internos. O segundo item.. O primeiro tem como ação a alteração do título do frame pelo setTitle() a partir do retorno do que for digitado na caixa de diálogo de entrada interna showInternalInputDialog(). pois pode ser que haja alguma rejeição nessa ação. além do nome. mas esse frame é mais simples. mas. que é onde o menu flutuante irá ser desenhado Por fim. Elas são iguais às normais. as aplicações devem trabalhar com um frame principal que abre outros frames normais. se o item do menu selecionado for o Sair ou se for clicado o terceiro botão da barra de ferramentas. No código da implementação. no caso do Windows. Os parâmetros do método show() envolvem o componente sobre o qual o menu flutuante irá aparecer e as coordenadas do clique do mouse. Nesses casos. caso o item do menu selecionado for o Abrir Frame Interno Dois. e não no frame 82 . é nele que foi adicionado um ouvinte de eventos baseado na interface MouseListener e implementado o método mouseReleased(). é necessário mostrar o menu de alguma forma e isso é feito através do método show(). área destinada a receber os frames internos e é utilizado o setSelected() para selecionar o frame. simplesmente executa o método setClosed()..12 Aplicação com Vários Frames Existem situações em que o estilo de aplicação MDI não é aplicável. No ato de fechar a caixa de diálogo. não sendo frames modais e possuem atuação dentro da área definida pelo frame principal. definindo o novo título.mesma maneira que ocorre em um menu normal. Ainda no actionPerformed(). o botão direito. não foi criado nenhum menu muito elaborado. também são usadas caixas de diálogo internas. necessitando também do tratamento da exceção PropertyVetoException. que recebe o termo Internal. foi utilizado o método setSelected(). foi utilizado o método isPopupTrigger() para verificar se o botão que foi clicado é o correspondente ao botão padrão para abrir menus flutuantes da plataforma atual. a aplicação será finalizada. será criado o segundo frame interno (objeto IFrameDois). o frameUm não volta a ficar selecionado. ou se for clicado o segundo botão da barra de ferramentas. possuindo o botão fechar e não possuindo o menu flutuante. Isso porque o menu flutuante vai ser mostrado quando ocorrer uma ação do mouse. é criado um contêiner dentro do frame IFrameUm para receber o botão na parte inferior. Normalmente. tendo apenas dois itens: itemTitulo e itemFechar. e nem desejado. quando se utilizam frames internos. Também foi setado para false as opções de redimensionar. que possuem suas áreas de atuação dentro da plataforma utilizada. No exemplo. não interessando se existem frames internos abertos ou não. o frame é adicionado ao DPane. não internos. Para isso. minimizar e maximizar. 3. A questão a ser resolvida é: onde ele irá ser mostrado? Como a intenção é fazer com que a área de atuação desse menu flutuante seja somente o frame interno IFrameUm. Por fim. o itemFechar. Com os itens criados. da mesma forma que foi feito no botão BotaoFechar.

200).setTitle("Frame Dois"). abreFrameUm.}}). setLocation(150.event.add(Fecha. frame. setTitle("Criando Frames"). import javax. O exemplo a seguir ilustra essa situação.swing. painelVF.100).getContentPane().*. } public void actionPerformed(ActionEvent evt) { Object origem = evt. Fecha. setSize(300.addActionListener(this). JPanel painelVF = new JPanel().setSize(200. Container P = getContentPane(). private JFrame FrameDois. public class VariosFrames extends JFrame implements ActionListener { private JButton abreFrameUm.setLocation(350.add(abreFrameDois). P.principal.awt.exit(0). } if (origem == abreFrameDois) { FrameDois = new JFrame(). FrameDois."South"). private JButton abreFrameDois.150). Container P = FrameDois.230). como acontece com os frames internos. painelFDois.add(painelFDois).add(abreFrameUm). public VariosFrames() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. abreFrameUm = new JButton("Criar Frame Um"). JPanel painelFDois = new JPanel().*.getSource(). 83 .awt. FrameDois. FrameDois. import java. FrameDois.addActionListener(this). painelFDois.add(painelVF).show(). com a criação de dois frames a partir de dois botões localizados no frame principal. import java.show(). P. abreFrameDois.dispose(). if (origem == abreFrameUm) { FrameUm frame = new FrameUm(). painelVF. abreFrameDois = new JButton("Criar Frame Dois").addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { FrameDois.*.setLayout(new BorderLayout()). JButton Fecha = new JButton("Fechar"). } }).

25. Fecha = new JButton("Fechar"). foram inseridos dois botões no painel painelVF: abreFrameUm e abreFrameDois.100). setTitle("Frame Um").getSource() == Fecha) { dispose().setLayout(new BorderLayout()). fr.addActionListener(this). painelFUm. JPanel painelFUm = new JPanel()."South"). setLocation(50. no frame principal.} } public static void main(String args[]) { VariosFrames fr = new VariosFrames(). Fecha.25). Em primeiro lugar. } public void actionPerformed(ActionEvent evt) { if (evt. } } } Figura 3. P. public FrameUm() { setSize(200. com posicionamento diferente. O tratamento do evento de clicar do 84 .add(Fecha. mas a criação de cada um é diferente.setVisible(true).add(painelFUm). Container P = getContentPane(). painelFUm.230). Aplicação normal com criação de outros frames Os dois frames criados tem o mesmo aspecto (figura 3. } } class FrameUm extends JFrame implements ActionListener { private JButton Fecha.

new Float(30)}. import javax. ou pelo menos. "Freezer vertical". que possui. que cria uma tabela simples. colunas).swing. Container P = getContentPane().200). import java. "Estoque"}. "Aparelho de Som 300W".055".awt. como é o caso de aplicações com banco de dados. FrameDois. automaticamente os outros frames também serão. setTitle("Tabela . 3. com um comportamento pré-definido.150".Forma Um"). executa o método dispose() para finalizar o frame. public class TabelaFormaUm extends JFrame implements ActionListener { private JButton BSair. Dependendo da complexidade do frame. Apesar da complexidade.015". "Descrição". As tabelas criadas a partir dessa classe são extremamente poderosas.}}). "Geladeira 300 litros". {"14. O segundo botão (abreFrameDois) também cria uma instância de um frame.13 Tabelas Existem aplicações que necessitam apresentar dados na forma de tabelas.004". "Forno microondas". como mostra o exemplo a seguir. new Float(60)}}. JTable tabela = new JTable(linhas. e mostra através do show(). o código fica um pouco mais confuso. new Float(85)}.exit(0). é relativamente fácil criar uma tabela funcional.primeiro botão simplesmente cria uma instância da classe FrameUm. possuindo muitos recursos para seu manuseio.098". inserção de um painel com um botão que. a classe JTable é a responsável pela tarefa de tratamento de dados em tabelas. ao ser clicado.*. no momento que este for finalizado. public TabelaFormaUm() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. Object[][] linhas = new Object [][] { {"01. P. import java. {"08. new Float(25)}. sem criar uma classe a parte. Como as duas instâncias de frame foram criadas dentro do frame principal. {"03. permitindo a manipulação de linhas e colunas.*. a definição do tamanho. setLocation(100. chamada mas faz isso internamente. localização e título.50). {"10. {"05.awt. "DVD portátil".setLayout(new BorderLayout()). JScrollPane rolagemTabela = new JScrollPane(tabela). Em Java. chamada frame.*. isso pode ser um pouco complicado de se fazer. // criação da tabela String[] colunas = new String []{"Referência". new Float(50)}. "Televisor 15 polegadas". em seu construtor.event. Talvez seja uma melhor idéia construir uma classe para cada frame a ser criado.078". new Float(15)}. setSize(500. 85 . A classe FrameUm é um frame normal.

} } Figura 3. Os nomes das colunas foram definidos em um arranjo String chamado colunas.add(pBaixo. esta é criada com a passagem dos parâmetros linhas e colunas. para perimitir a existência de barras de rolagem. visto no exemplo posterior. No painel de baixo é inserido o botão BSair no painel pBaixo. como um JComboBox.add(BSair).26."South"). if (origem == BSair) { System. fr.26. Após definir os arranjos. A criação dela foi baseada em um arranjo bidimensional. pBaixo.setVisible(true). 86 . como é o usual e mais indicado. por exemplo. e não em um modelo de tabela. } } public static void main(String args[]) { TabelaFormaUm fr = new TabelaFormaUm(). sendo depois inserida em um JScrollPane. BSair = new JButton("Sair").add(rolagemTabela. O arranjo é do tipo Object pelo fato de que é possível ter muitos tipos de objeto em uma coluna. que possui a tarefa de finalizar a aplicação. // criação do painel de baixo JPanel pBaixo = new JPanel(). base da construção da tabela. Os dados da tabela são armazenados em um arranjo bidimensional do tipo Object chamado linhas.P. sendo inserido no contêiner. BSair.addActionListener(this).getSource(). Uma tabela simples A execução do exemplo apresenta a tabela da figura 3.exit(0). } public void actionPerformed(ActionEvent evt) { Object origem = evt. por fim. e este."Center"). P.

13. com a tecla Shift. setTitle("Tabela . no caso de existência de barras de rolagem. que se responsabilizará em manipular os dados. se o valor não couber na célula.. setLocation(100. java.event.*. redimensionamento das colunas.. O exemplo a seguir cria uma tabela com características particulares. reticências (. Tais modelos são implementados pela interface TableModel (AbstractTableModel e DefaultTableModel). 3. bastando posicionar o cursor na linha separatória de duas colunas. private int incCod = 0. como: • • • • • • • cabeçalhos das colunas formatados automaticamente.Forma Dois").*. seleção de linhas. public TabelaFormaDois() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. private JButton btnMostrar. java.1 Modelos de Tabela Apesar de fácil de ser criada.exit(0).table. private JButton btnIncluir. onde uma coluna pode ser trocada com outra através do ato de arrastarsoltar. sendo que. no cabeçalho. é necessário criar um modelo de tabela.*.Na execução. algumas características são pré-definidas. javax.swing. indicando essa situação. Container P = getContentPane().}}). com o mouse posicionado no cabeçalho da coluna desejada. permanecendo o cabeçalho em seu lugar de origem.) são apresentadas. P. 87 . com a tecla Ctrl. permissão para digitação dos dados.250).50). baseado no DefaultTableModel. largura das colunas distribuídas igualmente. troca de colunas.setLayout(new BorderLayout()). e arrastar para o local desejado. e de linhas intercaladas.*. Para que se possa ter maior controle sobre a tabela.awt. permitindo a seleção de múltiplas linhas. setSize(430. apenas os dados da tabela são movimentados. private JTable tabela.awt. public class TabelaFormaDois extends JFrame implements ActionListener { private JButton btnExcluir. import import import import javax. private JTextField texto. geralmente a maneira apresentada no primeiro exemplo não é a mais indicada para criação de tabelas.swing.

getColumn(2)."Center").getColumn(1). "Endereço " + incCod. btnExcluir = new JButton("Excluir").getColumnModel(). tabela. tabela. btnMostrar = new JButton("Mostrar").getColumn(2).String[] tipos = {"Sim".setModel(new DefaultTableModel( new Object [][] { }. "South"). PTabSul. P. texto = new JTextField("Nome Selecionado").setResizable(true). if (origem == btnIncluir) { DefaultTableModel dtm = (DefaultTableModel)tabela.add(texto).AUTO_RESIZE_OFF). btnIncluir.setResizable(true). } if (origem == btnExcluir) { 88 .getColumn(0).setResizable(true).addActionListener(this).setResizable(true). tabela. new Double(999. new String [] { "ID". JScrollPane rolagemTabela = new JScrollPane(tabela).getModel().getColumn(3). "Ativo" } )).setPreferredWidth(20). PTabSul. tabela. btnExcluir. } public void actionPerformed(ActionEvent evt) { Object origem = evt. "Limite".getColumnModel().setPreferredWidth(150). btnIncluir = new JButton("Incluir").getColumn(1).setCellEditor (new DefaultCellEditor(cbAtivo)).getColumn(tabela. tabela.addActionListener(this).setReorderingAllowed(false). tabela. "Sim" }).setPreferredWidth(60).getColumnModel(). dtm.getColumn(3). P.addActionListener(this). "Cliente " + incCod.getSource(). tabela.setAutoResizeMode(JTable.getColumn(4). tabela.getColumnModel(). PTabSul. tabela.getColumnModel().getColumn(4).add(btnExcluir).getColumn(0). btnMostrar. tabela.getColumnModel(). // criação do Painel de baixo JPanel PTabSul = new JPanel(). PTabSul. JComboBox cbAtivo = new JComboBox(tipos).add(btnIncluir). "Sobrenome".getColumnModel().getColumnName(4)).getColumnModel(). tabela = new JTable().getColumnModel().setPreferredWidth(50).99).add(PTabSul."Não"}.setPreferredWidth(150).getTableHeader(). tabela. "Nome".addRow(new Object[]{ new Integer(++incCod).add(rolagemTabela. tabela. tabela.getColumnModel().add(btnMostrar). tabela.setResizable(false).

length . DefaultTableModel dtm = (DefaultTableModel)tabela. A coluna Ativo é diferente das demais. Após isso.1). } } Figura 3. i--) dtm.setVisible(true). Uma tabela baseada no DefaultTableModel A figura 3. sendo que o AUTO_RESIZE_OFF desliga esse redimensionamento.removeRow(linhas[i]). posteriormente. Os outros modos existentes são: As colunas deixaram 89 . i >= 0. a partir do método setPreferredWidth() e se é redimensinável ou não. Para que isso seja possível. Para cada coluna foi configurado o seu tamanho. Nenhum dado é apresentado inicialmente porque isso é uma tarefa do botão Incluir.26 apresenta o resultado da execução após clicar em alguns botões.getModel(). a partir do método setResizable(). } } public static void main(String args[]) { TabelaFormaDois fr = new TabelaFormaDois(). } if (origem == btnMostrar) { if (tabela.27.toString()). de ser passíveis de reorganização a partir do método setReorderingAllowed(). pois apresenta um caixa de seleção. fr. baseada no JTable.getSelectedRow()>=0) texto.setText(tabela. foi setado o modelo pelo método setModel(). O método setAutoResizeMode() configura o modo de redimensionamento automático das colunas da tabela. for(int i = (linhas.int linhas[] = tabela.getSelectedRow(). setado para false. foi inserido na tabela a partir do método setCellEditor(). do tipo JComboBox. iniciando com um arranjo bidimensional vazio e um arranjo String com os nomes das colunas.1).getValueAt (tabela. que. cujo parâmetro é a criação de um objeto DefaultTableModel. A tabela foi criada normalmente.getSelectedRows(). foi definido um objeto cbAtivo.

o método getColumnName() atribuirá os nomes A. além de utilizar o getSelectedRows() para alimentar o arranjo int linhas com as linhas selecionadas. Uma opção mais avançada é criar uma classe própria. para perimitir a existência de barras de rolagem. Tal objeto possui o método addRow(). etc. int col): retorna o objeto contido na célula determinado por row e col. controlada pela variável inteira incCod. mostra na caixa de texto o conteúdo da célula 1 (Nome) da linha selecionada (getSelectedRow()). O código a seguir implementa várias sobreposições de métodos para exemplificar a criação de um modelo e de uma tabela baseada nesse modelo. do tipo DefaultTableModel. Na verdade. utiliza o método getModel() para criar o objeto dtm.2 Modelo AbstractTableModel A classe DefaultTableModel é uma classe com métodos básicos para trabalhar com os dados da JTable. AUTO_RESIZE_SUBSEQUENT_COLUMNS: redimensiona todas as colunas subseqüentes. 90 . public int getRowCount(): retorna o número de linhas da tabela.table.13. apenas mudando a numeração. C. Isso é capturado a partir do método getValueAt().*. Muitos outros métodos existem. retorna o número de colunas da tabela. Incluir. ao ser clicado. a tabela é inserida em um JScrollPane. O segundo botão. B.*. por fim. Excluir. obrigatoriamente. AUTO_RESIZE_LAST_COLUMN: redimensiona apenas a última coluna. também cria um objeto dtm. 3. que fornece diversos métodos prontos. import javax. é necessário sobrepor os métodos existentes na classe AbstractTableModel da melhor forma possível. para que atenda às necessidades do modelo específico da tabela que será implementada.swing.swing. public int getColumnCount(): A classe criada é o próprio modelo da tabela e os métodos apresentados devem ser implementados. import javax. Por exemplo. Um for percorrendo as linhas selecionadas foi feito para excluí-las a partir do método removeRow(). sempre com os mesmos campos. sendo o padrão. uma vez tendo o modelo bem elaborado. é possível utiliza-lo na criação de várias tabelas. O primeiro botão. Mostrar. O painel de baixo contém três botões e uma caixa de texto. aos nomes das colunas. é inserido no contêiner. Após. estendendo a classe AbstractTableModel. AUTO_RESIZE_ALL_COLUMNS: redimensiona todas as colunas da tabela. exceto: • • • public Object getValueAt(int row. que é usado para inserir uma linha na tabela.• • • • AUTO_RESIZE_NEXT_COLUMN: redimensiona apenas a próxima coluna. e eles podem ser sobrepostos para realizar as ações desejadas para a tabela específica. o terceiro botão. a não ser que ele seja sobreposto para que atribua nomes significativos. Assim. Por fim. e este.

true.setResizable(true).getColumnModel(). tabela. tabela. Container P = getContentPane().getColumn(0). private ModeloTabela modelo. tabela. public TabelaFormaTres() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. edicao).getColumnModel().setResizable(true). setSize(600.exit(0).getColumnModel(). tabela = new JTable(modelo). true}.setPreferredWidth(80).awt.getColumnModel().SINGLE_SELECTION). // criação de um arranjo para identificar se a célula é editável ou não boolean[] edicao = {false.AUTO_RESIZE_OFF). "Sobrenome".99). new Boolean(true) }).setReorderingAllowed(false). false. // criação de um arranjo sem tamanho definido para inserção // dinâmica de objetos ArrayList dados = new ArrayList(). tabela.getColumnModel().}}).Forma Três").getColumn(0). // Inserção da primeira linha da tabela dados.*.getColumn(2). private JButton btnMostrar. private JTable tabela. // criação da tabela baseada no modelo ModeloTabela modelo = new ModeloTabela(dados. private JButton btnMostrarClasse. P. private JButton btnAlterar. "Nome". tabela. private JButton btnIncluir.getColumn(3). tabela.import java.getTableHeader(). setLocation(100.setPreferredWidth(55).setPreferredWidth(200).250). // criação de um arranjo para os títulos no cabeçalho String[] colunas = new String[] { "ID".getColumn(2). setTitle("Tabela .getColumnModel(). import java. public class TabelaFormaTres extends JFrame implements ActionListener { private JButton btnExcluir.getColumn(4). "Ativo" }.getColumnModel(). tabela.getColumn(3).setLayout(new BorderLayout()). "Limite".getColumn(1). import java.50).add(new Object[]{ new Integer(++incCod). new Double(999.util.getColumn(4).setResizable(false).getColumnModel().getColumn(1).event.setResizable(true).awt. "Endereço " + incCod.*. private int incCod = 0. "Cliente " + incCod. tabela. 91 .setSelectionMode(ListSelectionModel.setPreferredWidth(200). tabela. true.setPreferredWidth(50).setAutoResizeMode(JTable.*.setResizable(true).getColumnModel(). private JTextField texto. tabela.getColumnModel(). tabela. tabela. colunas. tabela.

tabela. btnIncluir = new JButton("Incluir"). texto = new JTextField(15).addActionListener(this).toString()). new Boolean(true) }).removeRow(tabela. "Cliente " + incCod.getSelectedColumn()). PTabSul.JScrollPane rolagemTabela = new JScrollPane(tabela). btnMostrar = new JButton("Mostrar")."Center"). PTabSul. btnMostrarClasse = new JButton("Classe").getColumnClass( 92 . // criação do Painel de baixo JPanel PTabSul = new JPanel(). "Endereço " + incCod.add(btnExcluir).getSelectedRow()>=0) modelo. PTabSul. btnIncluir. btnAlterar. PTabSul.getSelectedRow()>=0) texto.getSelectedRow()). } if (origem == btnAlterar) { if (tabela. } if (origem == btnExcluir) { modelo.getSource().add(btnAlterar).add(btnMostrar). PTabSul.add(PTabSul. "South").99).addActionListener(this).addActionListener(this). new Double(999.setText(modelo.tabela.add(texto). tabela.add(btnIncluir). PTabSul. btnExcluir = new JButton("Excluir").getSelectedColumn()). P.addActionListener(this). btnAlterar = new JButton("Alterar"). btnMostrarClasse. P.addRow(new Object[]{ new Integer(++incCod).getValueAt(tabela.getSelectedRow(). } if (origem == btnMostrar) { if (tabela.getText().add(btnMostrarClasse).getSelectedRow()>=0) texto.add(rolagemTabela. btnMostrar. btnExcluir.getSelectedRow().setValueAt(texto.setText(modelo. } public void actionPerformed(ActionEvent evt) { Object origem = evt.addActionListener(this). } if (origem == btnMostrarClasse) { if (tabela. if (origem == btnIncluir) { modelo.

length.getSelectedColumn()). } } public static void main(String args[]) { TabelaFormaTres fr = new TabelaFormaTres(). fr. } public int getRowCount() { return linhas.tabela.setVisible(true). } public String[] getColunas() { return colunas. } public void setLinhas(ArrayList dados) { linhas = dados. colEditavel = editavel. public ModeloTabela(ArrayList lin. 93 .size(). private boolean[] colEditavel. } public int getColumnCount() { return colunas. setColunas(col).toString()). String[] col. } public ArrayList getLinhas() { return linhas. } } class ModeloTabela extends AbstractTableModel { private ArrayList linhas = null. boolean[] editavel) { setLinhas(lin). private String[] colunas = null. } public void setColunas(String[] nomes) { colunas = nomes. } public String getColumnName(int numCol) { return colunas[numCol].

int numLin. } public void setValueAt(Object dado. } public void removeRow(int numLin) { getLinhas(). int numCol) { Object[] linha = (Object[])getLinhas().getClass(). int numCol) { if (isCellEditable(numCol)) { Object[] linha = (Object[])getLinhas(). fireTableDataChanged(). } public Object getValueAt(int numLin. } } public void addRow(Object[] dados) { getLinhas().get(0).add(dados).remove(numLin).get(numLin). return linha[numCol]. } public Class getColumnClass(int numCol) { Object[] linha = (Object[])getLinhas(). return linha[numCol]. } } 94 . fireTableDataChanged().} public boolean isCellEditable(int numCol) { return colEditavel[numCol]. fireTableDataChanged().get(numLin). linha[numCol] = dado.

que é derivada de AbstractTableModel. esses dados devem ser passados para que a tabela tenha uma situação inicial. Assim. do tipo ArrayList. do tipo boolean. No momento da instanciação em alguma aplicação. conforme a coluna possa ser editável ou não. do tipo String. Dois outros arranjos são criados: colunas. public void setColunas(String[] nomes): alimenta o public String[] getColunas(): retorna o arranjo das colunas. será possível inserir ou excluir linhas a qualquer momento. os dois métodos obrigatórios getRowCount()e getColumnCount() são implementados. para iniciar a tabela com as linhas desejadas. colEditavel. é importante entender a classe ModeloTabela. retornando o número de linhas e colunas do modelo. os nomes das colunas não seriam atribuídos se não fosse sobreposto o método getColumnName(). que são os nomes das colunas. com a indicação da possibilidade de edição de cada uma das colunas. ou seja. um arranjo String. O conteúdo das linhas é armazenado em um objeto linhas. não é necessário determinar o tamanho dele na sua declaração. que armazena true ou false. arranjo das colunas. que armazena o nome das colunas.28. Além disso. Os primeiros quatro métodos realizam o tratamento dos dados dos arranjos linhas e colunas. O contrutor da classe recebe três parâmetros: um ArrayList. São eles: • • • • public void setLinhas(ArrayList dados): public ArrayList getLinhas(): alimenta o arranjo das linhas retorna o arranjo das linhas. Uma tabela baseada no modelo criado a partir do AbstractTableModel Antes de tudo. que retorna exatamente o conteúdo atribuído ao arranjo colunas. e. Como explicado anteriormente. um arranjo boolean. Um ArrayList permite armazenar qualquer tipo de objeto de uma forma dinâmica. a ser mostrado no cabeçalho da tabela e. Os demais métodos implementados são: 95 .Figura 3.

retorna a classe do objeto contido na public Class getColumnClass(int numCol): coluna numCol. As ações desses botões foram implementadas no ActionPerformed: • Incluir: utiliza o método addRow() do modelo para incluir uma nova linha no final da tabela. setado para false. numCol.• • • public boolean isCellEditable(int numCol): retorna true se a coluna numCol for obrigatória. Os outros dois valores possíveis são: MULTIPLE_INTERVAL_SELECTION. o arranjo colunas é criado e alimentado com os nomes das colunas da tabela. e. e false. public void removeRow(int numLin): exclui a linha numLin da tabela.28. de forma contígua ou não. e este serve como parâmetro na criação da JTable. A criação da tabela baseada nesse modelo. Alterar e Classe são inseridos. A tabela criada é. que tem a função de realizar a efetiva alteração dos dados da tabela. é invocado o método fireTableDataChanged(). que resulta na aplicação mostrada na figura 3. SINGLE_INTERVAL_SELECTION. Excluir. editável. Tais arranjos são passados como parâmetro na criação do objeto da classe ModeloTabela. e é configurado o modo de redimensionamento automático das colunas da tabela. • • • public void addRow(Object[] dados): inclui uma linha na tabela a partir de um arranjo de objetos. int numCol): Implementação Obtém o valor contido na célula de coordenadas numLin. é feita na classe TabelaFormaTres. Mostrar. Além de dados. Adicionalmente. além do JTextField texto. Percebe-se que. caso contrário. a partir do método setAutoResizeMode(). e se elas são redimensionáveis ou não (setResizable()). que é um arranjo de vários objetos de tipos diferentes. que permite a seleção de uma ou mais linhas. int numCol): define um novo valor para a célula de coordenadas numLin. 96 . numCol. e o arranjo edicao é criado com a indicação se cada coluna é editável ou não. public void setValueAt(Object dado. chamado modelo. Após. jogada em um JScrollPane e esse no contêiner. int numLin. explicado anteriormente. se esta for editável (testado a partir do método isCellEditable()). public Object getValueAt(int numLin. as colunas deixam de ser reorganizáveis. após inserido o objeto na célula. são definidos os tamanhos de cada coluna (setPreferredWidth()). o setSelectionMode() determina que só é possível selecionar uma linha por vez (SINGLE_SELECTION). então. desde que seja de forma contígua. O ArrayList dados é criado e é adicionado a ele apenas uma única linha. Também igualmente ao exemplo anterior. que permite a seleção de uma ou mais linhas. como no exemplo anterior. a partir do método setReorderingAllowed(). Após. os botões Incluir.

setLocation(100. private JList lista. o conteúdo da célula selecionada é alterado pelo valor contido no campo texto. caso haja uma linha selecionada. java. private JPasswordField senha.320). Container P = getContentPane(). public CriaTabelas() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. private JButton btnIncluir. a partir do método setValueAt().*. Mostrar: • • 3. private JButton btnCriar.util.• • Excluir: utiliza o método removeRow() do modelo para excluir a linha que está selecionada. P. java. private JTextField tipoCampo.100).swing. capturada a partir do método getSelectedRow(). Banco de Dados: Conectividade Utilizando JDBC A pa import import import import import import javax. setSize(500. javax.sql. private JTextField nomeCampo.*. mostrando no campo texto. mostra o conteúdo da célula no campo texto.*. Alterar: Se houver linha selecionada. private Vector campos. private JButton btnDesconectar. private JTextField nomeTabela.border.setLayout(new BorderLayout()). private JButton btnConectar. private Connection con. passando como parâmetro o número da linha (getSelectedRow()) e coluna (getSelectedColumn()) referente à célula selecionada. Isso é feito pelo método getValueAt().awt. campos = new Vector(). private String chavePrimaria.*.*.event. private JTextField fonteDados.swing.awt. public class CriaTabelas extends JFrame implements ActionListener { private JButton btnExcluir. setTitle("Wizard para criação de tabelas de BD").}}). private JTextField usuario. private JButton btnLimpar. 97 .exit(0).*. private JLabel lblCon. java. Classe: utiliza o método getSelectedColumn() para capturar a classe da célula selecionada. java.

add(btnCriar). PNorteNorte.add(nomeTabela). lista = new JList().add(PNorteNorte.add(btnConectar). btnDesconectar. btnIncluir = new JButton("Incluir").add(btnExcluir). lista. senha = new JPasswordField(5). PNorteNorte.addActionListener(this). PNorte.setFixedCellWidth(200).add(new JLabel("Nome")). tipoCampo = new JTextField(10). PNorteCentro.add(btnDesconectar). P.add(btnLimpar).add(new JLabel("Tipo")). PSul. btnDesconectar = new JButton("Desconectar Banco"). PCentro. PCentro. btnLimpar = new JButton("Limpar lista"). nomeTabela = new JTextField(10). PSul.setVisibleRowCount(8). PNorte. PNorteNorte. PNorteNorte.addActionListener(this). PSul.add(PNorteCentro. JPanel PNorteCentro = new JPanel(). PNorte.setSelectionMode(ListSelectionModel.setFixedCellHeight(15).addActionListener(this).add(lblCon). lista.add(PCentro. lista. Border borda = BorderFactory. // criação do terceiro painel JPanel PSul = new JPanel().add(new JLabel("Nome da Tabela")). btnExcluir = new JButton("Excluir"). PSul.createEtchedBorder().add(nomeCampo). nomeCampo = new JTextField(10). PNorteCentro.add(tipoCampo).add(new JLabel("Fonte de Dados")). "Center").add(btnIncluir). btnConectar = new JButton("Conectar Banco").add(new JLabel("Senha"))."North"). btnCriar. JPanel PNorteNorte = new JPanel().// criação do primeiro painel JPanel PNorte = new JPanel(). // criação do segundo painel JPanel PCentro = new JPanel(). PNorteNorte.add(new JScrollPane(lista)).add(PNorte. P. "North").add(usuario). PCentro. PSul.add(new JLabel("Usuário")). PCentro. btnCriar = new JButton("Criar Tabela").setLayout(new BorderLayout()). btnConectar.add(senha)."Center"). PCentro. 98 . lblCon = new JLabel("Não Conectado"). fonteDados = new JTextField(13).add(fonteDados). btnLimpar. PNorteCentro. usuario = new JTextField(7).setBorder(borda).addActionListener(this). PCentro. PSul. PNorteNorte. lista.SINGLE_SELECTION).

}catch (SQLException eSQL) { // exceções de SQL eSQL.isEmpty()) { JOptionPane. String sSenha = senha. try { System.WARNING_MESSAGE). }catch (Exception e) { // demais exceções e.jdbc. } } if (origem == btnIncluir) { String item = nomeCampo.trim().setText("Conectado"). JOptionPane. "Erro". sSenha). lblCon.showMessageDialog(this. JOptionPane.ERROR_MESSAGE).getConnection(sFonte. JOptionPane. if (campos. "Erro".addActionListener(this).close(). JOptionPane.add(PSul. "South"). JOptionPane.showMessageDialog(this. JOptionPane. btnExcluir. String sUsuario = usuario.drivers".addActionListener(this). if (origem == btnConectar) { String sFonte = "jdbc:odbc:" + fonteDados. "O primeiro campo será a chave primária da tabela". JOptionPane. "Mensagem". "Erro".getMessage().trim().getText() + " " + tipoCampo.getText().setText("Desconectado"). con = DriverManager.trim(). }catch (SQLException eSQL) { // exceções de SQL eSQL.getText().getText().showMessageDialog(this.showMessageDialog(this. "Não foi possível desconectar o banco!\n" + "Mensagem: " + eSQL.getText().showMessageDialog(this.printStackTrace().printStackTrace(). } public void actionPerformed(ActionEvent evt) { Object origem = evt.ERROR_MESSAGE)."sun. JOptionPane. lblCon.setProperty("jdbc. "Falha na conexão com o banco!\n" + "Mensagem: " + e.P. sUsuario.getMessage().getSource().printStackTrace().odbc.getMessage().JdbcOdbcDriver"). 99 . "Falha na conexão com o banco!\n" + "Mensagem: " + eSQL. btnIncluir. "Banco conectado com sucesso!".ERROR_MESSAGE). } } if (origem == btnDesconectar) { try { con.

WARNING_MESSAGE).showMessageDialog(this.removeElementAt(lista.setListData(campos).addElement(item).getText(). } if (origem == btnCriar) { String itens = campos.createStatement()."Mensagem". } } if (origem == btnLimpar) { campos.trim() + " (" + itens + ".printStackTrace().executeUpdate(sentencaSQL). JOptionPane.getSelectedIndex()>= 0) { campos. }catch (SQLException eSQL) { eSQL.setListData(campos).ERROR_MESSAGE).getSelectedIndex()). lista.toString(). lista. "Tabela criada com sucesso!". "Erro". String sentencaSQL = "CREATE TABLE " + nomeTabela. JOptionPane.showMessageDialog(this. } } } public static void main(String args[]) { CriaTabelas fr = new CriaTabelas(). JOptionPane.setListData(campos). PRIMARY KEY (" + chavePrimaria + "))" . try{ Statement st = con. st. JOptionPane. } campos. itens = itens.removeAllElements(). "Mensagem". } if (origem == btnExcluir) { if (lista.itens.getText(). chavePrimaria = nomeCampo. lista. } } 100 . JOptionPane.length()-1). fr.WARNING_MESSAGE). "Não foi possível criar a tabela!\n" + "Mensagem: " + eSQL.setVisible(true).getMessage().substring(1.

private ResultSet registros.*. private ModeloTabelaBD modelo. private JTextField nome.*. null).*. 101 . public class Consulta extends JFrame implements ActionListener { private JButton btnSair.*. setTitle("Consulta a Banco de Dados"). null.}}). java.event.*. setLocation(100. java. java. // criação do primeiro painel JPanel PNorte = new JPanel().awt.A import import import import import import javax. public Consulta() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. private JButton btnPesqNome. private JButton btnPesqCod.swing. java. P.setLayout(new BorderLayout()). javax. Container P = getContentPane().100). // conecta o banco con = conectaBanco("jdbc:odbc:ODBCBancoExemplo". private JTextField codigo. private JTable tabela.sql.util.table.swing.exit(0).*.awt. private Statement sentenca. private Connection con.320). setSize(500.

sentenca = con. // criação de um array para os títulos no cabeçalho String[] colunas = new String[] { "Código". sentenca. btnPesqNome. PNorteCentro.getMessage()."Center").add(btnPesqCod). btnPesqCod = new JButton("Pesquisar por código").showMessageDialog(this.addActionListener(this).add(new JLabel("Digite nome")). "Nenhum registro foi encontrado!".getString("Codigo"))). registros. if (!proximoRegistro) { JOptionPane.executeQuery(sentencaSQL). JOptionPane.ERROR_MESSAGE). 102 .PNorte.getColumn(0). JOptionPane. // criação de um array para identificar se a célula é editável ou não boolean[] edicao = {false. "Não foi possível carregar os dados!\n" + "Mensagem: " + eSQL. codigo = new JTextField(7). "Mensagem".showMessageDialog(this.WARNING_MESSAGE). PNorte. registros = sentenca. "North"). JPanel PNorteNorte = new JPanel(). PNorteCentro. PNorteNorte. P.close(). "Nome". boolean proximoRegistro = registros.next().setPreferredWidth(50). colunas. btnPesqCod. // seleciona todos os registros da tabela Clientes e joga no ArrayList try { String sentencaSQL = "SELECT * FROM Clientes ORDER BY Codigo".add(PNorteNorte. edicao). PNorteCentro.next()).add(nome).add(codigo). PNorteNorte.setLayout(new BorderLayout()). "Erro"."North").add(new Object[]{ new Integer(Integer.add(PNorteCentro. JPanel PNorteCentro = new JPanel(). tabela = new JTable(modelo).parseInt(registros.getString("Endereco") }).add(new JLabel("Digite código")). false. registros.add(btnPesqNome). // criação da tabela // criação de um array para inserção dinâmica de objetos ArrayList dados = new ArrayList(). "Endereço"}.getString("Nome"). } while (registros. btnPesqNome = new JButton("Pesquisar por nome"). false}. PNorteNorte. nome = new JTextField(13).addActionListener(this).createStatement(). } else do { dados. } // criação da tabela baseada no modelo ModeloTabelaBD modelo = new ModeloTabelaBD(dados.printStackTrace(). PNorte. }catch (SQLException eSQL) { eSQL.add(PNorte. tabela.getColumnModel(). JOptionPane.

try { sentenca = con.getColumn(1).getRowCount()-1.getMessage().printStackTrace().createStatement().getColumnModel().setSelectionMode(ListSelectionModel. P.tabela. boolean proximoRegistro = registros. registros = sentenca.next(). tabela. if (origem == btnPesqNome) { Selecao("SELECT * FROM Clientes WHERE NOME LIKE '%" + nome.getColumn(0). tabela.getColumn(1). "Center"). P.getColumnModel(). "Erro".getSource().setResizable(true). System.setResizable(true). } public void actionPerformed(ActionEvent evt) { Object origem = evt. // criação do terceiro painel JPanel PSul = new JPanel().getColumn(2). tabela.showMessageDialog(this.getColumn(2). } if (origem == btnPesqCod) { Selecao("SELECT * FROM Clientes WHERE CODIGO = " + codigo.getColumnModel().executeQuery(sentencaSQL). PSul. if (!proximoRegistro) 103 . tabela.addActionListener(this). } } } public void Selecao(String sentencaSQL) { // apaga todas as linhas da tabela for (int i= modelo.getColumnModel(). "South").add(PSul. JOptionPane. i--) modelo. btnSair.setPreferredWidth(200). btnSair = new JButton("Sair").AUTO_RESIZE_OFF).add(rolagemTabela. tabela. tabela.close(). JOptionPane.getText() + " ORDER BY CODIGO"). i >= 0. }catch (SQLException eSQL) { // exceções de SQL eSQL.add(btnSair).exit(0).setAutoResizeMode(JTable.getColumnModel(). JScrollPane rolagemTabela = new JScrollPane(tabela).ERROR_MESSAGE).setResizable(false). "Não foi possível desconectar o banco!\n" + "Mensagem: " + eSQL.getTableHeader().getText() + "%' ORDER BY NOME").SINGLE_SELECTION). tabela.setPreferredWidth(240).removeRow(i). } if (origem == btnSair) { try { con.setReorderingAllowed(false).

ERROR_MESSAGE).printStackTrace().jdbc.getMessage().showMessageDialog(this.printStackTrace(). try { System.getMessage().ERROR_MESSAGE). } else do { modelo.getString("Nome").setVisible(true)."sun.setProperty("jdbc.drivers".getString("Endereco") }). } } class ModeloTabelaBD extends AbstractTableModel { private ArrayList linhas = null. JOptionPane.odbc. sUsuario.{ JOptionPane. } public static void main(String args[]) { Consulta fr = new Consulta(). "Nenhum registro foi encontrado!".String sSenha) { Connection conexao = null.next()). JOptionPane. }catch (SQLException eSQL) { // exceções de SQL eSQL. "Erro". JOptionPane.getMessage().showMessageDialog(this. JOptionPane.showMessageDialog(this. "Não foi possível carregar os dados!\n" + "Mensagem: " + eSQL. }catch (SQLException eSQL) { eSQL. } } public Connection conectaBanco(String sFonte. "Erro". sSenha).addRow(new Object[]{ new Integer(Integer. "Falha na conexão com o banco!\n" + "Mensagem: " + eSQL.close().getString("Codigo"))).String sUsuario. JOptionPane.printStackTrace().parseInt(registros. sentenca. JOptionPane. JOptionPane. fr. "Erro". }catch (Exception e) { // demais exceções e. conexao = DriverManager. 104 .getConnection(sFonte.JdbcOdbcDriver"). "Mensagem".WARNING_MESSAGE).showMessageDialog(this. } return conexao. } while (registros. registros. "Falha na conexão com o banco!\n" + "Mensagem: " + e.ERROR_MESSAGE). registros.

} public int getColumnCount() { return colunas. } public String getColumnName(int numCol) { return colunas[numCol]. return linha[numCol]. public ModeloTabelaBD(ArrayList lin.private String[] colunas = null.size(). } public ArrayList getLinhas() { return linhas. int numCol) { Object[] linha = (Object[])getLinhas().get(numLin). String[] col. } public Object getValueAt(int numLin. int numLin. boolean[] editavel) { setLinhas(lin). } public int getRowCount() { return linhas. } public void setLinhas(ArrayList dados) { linhas = dados.length. setColunas(col). } public void setValueAt(Object dado. private boolean[] colEditavel. colEditavel = editavel. } public void setColunas(String[] nomes) { colunas = nomes. } public boolean isCellEditable(int numCol) { return colEditavel[numCol]. } public String[] getColunas() { return colunas. int numCol) 105 .

106 . fireTableDataChanged().add(dados).get(numLin).getClass().*.get(0). } public void removeRow(int numLin) { getLinhas(). } } D D import javax.*. fireTableDataChanged(). import java. return linha[numCol].{ if (isCellEditable(numCol)) { Object[] linha = (Object[])getLinhas(). fireTableDataChanged().awt.remove(numLin).swing. linha[numCol] = dado. } public Class getColumnClass(int numCol) { Object[] linha = (Object[])getLinhas(). } } public void addRow(Object[] dados) { getLinhas().

edicao). tabela. null.table. tabela.awt.getColumnModel().setLayout(new FlowLayout()).*. setTitle("Consulta a Banco de Dados").add(PNorte. public Cadastro() { addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System. false.getTableHeader(). P.getColumn(0).getColumnModel(). PNorte. java.util. private JButton btnExcluir. 107 . setSize(500. private JButton btnPesqNome.setResizable(true).add(new JLabel("Digite nome")).setResizable(false). tabela. "Endereço"}.setReorderingAllowed(false). java. tabela. javax. tabela. P. tabela.getColumn(2). tabela = new JTable(modelo).setPreferredWidth(200).setResizable(true). // criação da tabela baseada no modelo ModeloTabelaBD modelo = new ModeloTabelaBD(dados. null). // criação do primeiro painel JPanel PNorte = new JPanel(). // criação de um array para os títulos no cabeçalho String[] colunas = new String[] { "Código". private Connection con. private ModeloTabelaBD modelo.*.100). // criação de um array para identificar se a célula é editável ou não boolean[] edicao = {false.}}). PNorte. Container P = getContentPane(). nome = new JTextField(13). PNorte. "North"). private JTable tabela.*.getColumnModel().getColumn(1).event.add(btnPesqNome). public class Cadastro extends JFrame implements ActionListener { private JButton btnSair.setPreferredWidth(240). tabela.sql. btnPesqNome.getColumnModel(). btnPesqNome = new JButton("Pesquisar").getColumnModel().addActionListener(this). private JButton btnAlterar. colunas. private JTextField nome.*.getColumnModel().getColumn(2).setPreferredWidth(50).getColumn(1). private ResultSet registros. false}. private JButton btnIncluir. PNorte. setLocation(100.320). // criação da tabela // criação de um array para inserção dinâmica de objetos ArrayList dados = new ArrayList().add(nome).getColumn(0).import import import import java.setLayout(new BorderLayout()). private Statement sentenca. // conecta o banco con = conectaBanco("jdbc:odbc:ODBCBancoExemplo". "Nome".swing.exit(0).

getSelectedRow(). btnExcluir = new JButton("Excluir").getValueAt(tabela.add(btnSair).getValueAt(tabela. btnExcluir.addActionListener(this). btnSair.toString().setSelectionMode(ListSelectionModel.add(rolagemTabela. JOptionPane.YES_NO_OPTION. btnIncluir. btnSair = new JButton("Sair").getText() + "%' ORDER BY NOME"). PSul. modelo. // criação do terceiro painel JPanel PSul = new JPanel(). P. if (origem == btnPesqNome) { Selecao("SELECT * FROM Clientes WHERE NOME LIKE '%" + nome.getSelectedRow().2). "Center").toString(). } public void actionPerformed(ActionEvent evt) { Object origem = evt. PSul. btnAlterar = new JButton("Alterar"). modelo. "Não existe registro selecionado!\n".setAutoResizeMode(JTable. PSul. frame. "Mensagem". "Confirmação". JScrollPane rolagemTabela = new JScrollPane(tabela).addActionListener(this).tabela. } else JOptionPane.SINGLE_SELECTION).1). 'A').addActionListener(this).getSource(). } if (origem == btnIncluir) { FrameCadastro frame = new FrameCadastro(con.WARNING_MESSAGE) == 0) { sentenca = con. btnAlterar. 'I'). null. tabela. btnIncluir = new JButton("Incluir").getValueAt(tabela. } if (origem == btnExcluir) { try { if (JOptionPane.add(PSul. null.toString(). null.createStatement(). 108 . frame.add(btnAlterar).show(). "South").add(btnExcluir).add(btnIncluir).getSelectedRow(). JOptionPane. PSul.showConfirmDialog(null.getSelectedRow()>=0) { FrameCadastro frame = new FrameCadastro(con.show(). } if (origem == btnAlterar) { if (tabela.addActionListener(this).WARNING_MESSAGE). JOptionPane.AUTO_RESIZE_OFF)."Confirma Exclusão?".0).showMessageDialog(this. P. modelo.

}catch (SQLException eSQL) { eSQL.executeUpdate(sentencaSQL). try { sentenca = con.parseInt(registros.createStatement(). i--) modelo.getString("Endereco") }). registros = sentenca.showMessageDialog(this.printStackTrace().close(). } } if (origem == btnSair) { try { con.getValueAt(tabela. Selecao("SELECT * FROM Clientes WHERE NOME LIKE '%" + nome. "Não foi possível realizar a operação!\n" + "Mensagem: " + eSQL. "Mensagem". JOptionPane. sentenca.showMessageDialog(this.WARNING_MESSAGE).String sentencaSQL ="DELETE FROM Clientes WHERE Codigo= " + modelo. sentenca. if (!proximoRegistro) { JOptionPane. registros. System.getMessage().next().close(). "Erro". } } } public void Selecao(String sentencaSQL) { // apaga todas as linhas da tabela for (int i= modelo.executeQuery(sentencaSQL). } }catch (SQLException eSQL) { eSQL.getSelectedRow(). } while (registros.getString("Codigo"))).addRow(new Object[]{ new Integer(Integer. boolean proximoRegistro = registros. JOptionPane. sentenca.printStackTrace().getMessage(). "Não foi possível desconectar o banco!\n" + "Mensagem: " + eSQL. "Erro".ERROR_MESSAGE).next()).0). 109 . JOptionPane.toString().close(). JOptionPane.getRowCount()-1. "Nenhum registro foi encontrado!".getText() + "%' ORDER BY NOME"). registros.exit(0).getString("Nome"). i >= 0. JOptionPane.removeRow(i). }catch (SQLException eSQL) { // exceções de SQL eSQL.printStackTrace().showMessageDialog(this. } else do { modelo.ERROR_MESSAGE).

"Não foi possível carregar os dados!\n" + "Mensagem: " + eSQL. char Tipo) { conexao = con. setSize(250.JdbcOdbcDriver").showMessageDialog(this. private JTextField txtEndereco. "Falha na conexão com o banco!\n" + "Mensagem: " + eSQL. Container P = getContentPane(). "Erro". public FrameCadastro(Connection con.odbc. String Nome.190). private JButton Cancelar."sun. TipoOperacao = Tipo.printStackTrace().ERROR_MESSAGE).String sUsuario. private JTextField txtCodigo.printStackTrace(). 110 .getMessage().drivers". "Erro".ERROR_MESSAGE). fr.showMessageDialog(this.JOptionPane. String Cod. }catch (Exception e) { // demais exceções e. JOptionPane. } return conexao.140).ERROR_MESSAGE).setProperty("jdbc. sSenha). private JTextField txtNome. private Connection conexao. JOptionPane.getMessage().getMessage(). private char TipoOperacao. conexao = DriverManager.setVisible(true).String sSenha) { Connection conexao = null. } } public Connection conectaBanco(String sFonte. JOptionPane.jdbc. try { System. } } class FrameCadastro extends JFrame implements ActionListener { private JButton OK. } public static void main(String args[]) { Cadastro fr = new Cadastro(). "Erro". }catch (SQLException eSQL) { // exceções de SQL eSQL. sUsuario. "Falha na conexão com o banco!\n" + "Mensagem: " + e. JOptionPane. JOptionPane.getConnection(sFonte. setLocation(220. JPanel painelFC = new JPanel().showMessageDialog(this. String Endereco.

getText())+".setText(Endereco).addActionListener(this). txtNome. txtEndereco = new JTextField(15).setText(Cod).getText()+"')".add(Cancelar). txtNome = new JTextField(15). "Erro". } public void actionPerformed(ActionEvent evt) { if (evt. txtCodigo = new JTextField(15).parseInt(txtCodigo.add(new JLabel("Endereço")). "Campos Código e Nome devem ser preenchidos!\n". '"+ txtNome.add(new JLabel("Nome")). } else setTitle("Inclusão").trim().getText()+"' WHERE Codigo = " + Integer. painelFC.add(txtNome). painelFC.parseInt(txtCodigo.setText(Nome).ERROR_MESSAGE). painelFC. } else { try { Statement sentenca = conexao.add(painelFC.add(OK).painelFC. Cancelar. P.createStatement(). painelFC. 111 . Endereco) "+ "VALUES ("+ Integer. painelFC. painelFC. Endereco = '" + txtEndereco. Cancelar = new JButton("Cancelar"). txtEndereco. else sentencaSQL = "UPDATE Clientes SET Nome = '" + txtNome.add(txtEndereco). if (Tipo == 'A') { txtCodigo. Nome.addActionListener(this).getText().showMessageDialog(this. OK = new JButton("OK"). JOptionPane. painelFC. String sentencaSQL = null. setTitle("Alteração")."Center"). '" + txtEndereco.setLayout(new FlowLayout()).getText() + "'.getSource() == OK) { if (txtCodigo. txtCodigo.add(txtCodigo).equals("")) { JOptionPane. OK.add(new JLabel("Código")).getText().equals("") || txtNome.setEditable(false). painelFC.getText() + "'.trim().getText()). if (TipoOperacao == 'I') sentencaSQL = "INSERT INTO Clientes (" + "Codigo.

}catch (SQLException eSQL) { eSQL.getMessage(). sentenca. 112 . AWT Avançado Imagens e desenhos mais complexos não podem ser feitos a partir da classe Graphics. } } } D D D d 3. JOptionPane. JOptionPane.getSource() == Cancelar) { dispose(). "Não foi possível realizar a operação!\n" + "Mensagem: " + eSQL.showMessageDialog(this.close().printStackTrace().ERROR_MESSAGE). "Erro". dispose(). } } } if (evt.sentenca.executeUpdate(sentencaSQL). que permite produzir desenhos de mais alta qualidade. É necessário utilizar pacotes existentes na API Java 2D.

3. java. Com o Java 2D é possível produzir uma variedade maior de figuras geométricas. java.awt.print. podendo move-los.awt.image. com padrões diferentes de preenchimento.14 Java 2D O Java 2D apresenta pacotes de classes com métodos para desenhos gráficos com um nível maior de complexidade.awt.3. além de ter controle sobre os desenhos criados.awt. java.Graphics2D.geom. gira-los ou alonga-los.15 Imagens A classe Image é a responsável pelo carregamento de imagens armazenadas em disco. Novam d 113 . Alguns desses pacotes: java.

Instituto de Computação.com .com. Rogers. Aprenda Java agora. Rio de Janeiro : Campus. 1997. David.dm. Rio de Janeiro : Campus. 114 . Disponível em http://www. Java : o guia essencial. Sadao.sun. Laura. 718 p. Stephen R.br/~waldeck/curso/java/ Sites de Interesse www.ufscar. 1996. Harvey M. 2001. André Augusto.java. www. Lemay. UNICAMP.br .javafree.br Davis. Aprenda em 21 dias Java 2.br . Departamento de Matemática Universidade Federal de São Carlos – UFSCar. Schützer. 2.Bibliografia Cesta. 3. Tutorial: “A Linguagem de Programação JAVA”.dcc. 1999. 661p. 1999. Flanagan.com. Programação Java. 2000. Disponível em: http://www2. 401p.Comunidade de desenvolvedores Java.Site ofical do Java. Deitel. Porto Alegre : Bookman.ed. Waldeck. Cadenhead. www.Comunidade de desenvolvedores Java. Java : como programar. 1201p.unicamp. Massago. Rio de Janeiro : Campus.portaljava.ed.

Sign up to vote on this title
UsefulNot useful