Componentes Swing

Embed Size (px)

Citation preview

1

22Componentes GUI: Parte 2 2005 by Pearson Education do Brasil

2

OBJETIVOS Neste captulo, voc aprender: Como criar e manipular controles deslizantes, menus, menus pop-up e janelas. Como alterar a aparncia e o comportamento de uma GUI utilizando a aparncia e o comportamento plugveis do Swing. Como criar uma interface de mltiplos documentos com JdesktopPane e JInternalFrame. Como utilizar gerenciadores adicionais de layout.

2005 by Pearson Education do Brasil

3

22.1 22.2 22.3 22.4 22.5 22.6 22.7 22.8 22.9

Introduo JSlider Windows: Notas adicionais Utilizando menus com frames JPopupMenu Aparncia e comportamento plugveis JDesktopPane e JInternalFrame JTabbedPane Gerenciadores de layout: BoxLayout e GridBagLayout

22.10 Concluso

2005 by Pearson Education do Brasil

4

22.1 Introduo Aparncia e funcionamento plugveis (pluggable look-and-feel PLAF). O Swing pode personalizar a aparncia e o comportamento da GUI. Motif: Aparncia e comportamento populares do UNIX.

Interface de mltiplos documentos (multiple document interface MDI). Uma janela principal (a janela-pai) contendo outras janelas (janelas-filhas). Gerencia vrios documentos abertos em paralelo.

2005 by Pearson Education do Brasil

5

22.2 JSliderJslider: Permite ao usurio selecionar a partir de um intervalo de valores inteiros. Herda de Jcomponent. Contm: Marcas de medida: Pode exibir marcas de medida principais, marcas de medida secundrias e rtulos para marcas de medida. No so exibidas por padro. Marcador: Permite que o usurio selecione um valor.

Aderncia s marcas: Faz o marcador ser atrado para a marca de medida mais prxima.

2005 by Pearson Education do Brasil

6

marcador

marca de medida

Figura 22.1 | Componente JSlider com orientao horizontal.

2005 by Pearson Education do Brasil

7

22.2 JSlider (Continuao) Se o foco estiver em um JSlider ( o componente GUI atualmente selecionado na interface com o usurio). As teclas de seta para a esquerda/direita fazem com que o marcador do JSlider diminua/aumente por 1. As teclas de seta para baixo/para cima fazem com que o marcador do JSlider diminua/aumente por 1. A tecla PgDn (page down) e a tecla PgUp (page up) fazem com que o marcador do JSlider diminua ou aumente por incrementos de bloco de um dcimo da faixa de valores, respectivamente. As teclas End/Home movem o marcador do JSlider para o valor mnimo/mximo do Jslider.

2005 by Pearson Education do Brasil

8

22.2 JSlider (Continuao) Pode ter orientao horizontal ou vertical: O valor mnimo est esquerda ou na parte inferior do Jslider. Valor mximo est direita ou na parte superior do Jslider. O mtodo JSlider setInverted inverte as posies dos valores mnimos e mximos.

Gera ChangeEvents em resposta a interaes de usurio: Um objeto de uma classe que implementa a interface ChangeListener e declara o mtodo stateChanged para responder a ChangeEvents.

2005 by Pearson Education do Brasil

9

Observao sobre aparncia e comportamento 22.1Se um novo componente GUI tiver uma largura e altura mnimas (isto , se as pequenas dimenses resultarem em um componente ineficiente na tela), sobrescreva o mtodo getMinimumSize para retornar a largura e a altura mnimas como uma instncia da classe Dimension.

2005 by Pearson Education do Brasil

10

Observao de engenharia de software 22.1Para muitos componentes GUI, o mtodo getMinimumSize implementado para retornar o resultado de uma chamada ao mtodo getPreferredSize desse componente.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

// Fig. 22.2: OvalPanel.java // Uma classe personalizada de JPanel. import java.awt.Graphics; import java.awt.Dimension; import javax.swing.JPanel; public class OvalPanel extends JPanel { private int diameter = 10; // dimetro padro de 10 // desenha uma oval do dimetro especificado public void paintComponent( Graphics g ) { super.paintComponent( g );

11

ResumoUtilizado como a largura e altura do quadro delimitador em que o crculo exibidoOvalPanel.java

(1 de 2)

Desenha um crculo preenchido.

g.fillOval( 10, 10, diameter, diameter ); // desenha um crculo } // fim do mtodo paintComponent // valida e configura o dimetro, ento pinta novamente public void setDiameter( int newDiameter ) { // se o dimetro for invlido, assume o padro de 10 diameter = ( newDiameter >= 0 ? newDiameter : 10 ); repaint(); // pinta o painel novamente } // fim do mtodo setDiameter

Altera o diameter do crculo e o redesenha (repaint)

2005 by Pearson Education do Brasil

27 28 29 30 31 32 33 34 35 36 37

// utilizado pelo gerenciador de layout para determinar o tamanho preferido public Dimension getPreferredSize() { return new Dimension( 200, 200 ); } // fim do mtodo getPreferredSize

12

Retorna a largura e altura preferidas de um OvalPanel

ResumoOvalPanel.java

// utilizado pelo gerenciador de layout para determinar o tamanho mnimo public Dimension getMinimumSize() { return getPreferredSize(); } // fim do mtodo getMinimumSize

(2 de 2) Retorna a largura e altura mnimas de um OvalPanel

38 } // fim da classe OvalPanel

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9

// Fig. 22.3: SliderFrame.java // Utilizando JSliders para dimensionar uma oval. import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JSlider; import javax.swing.SwingConstants; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent;

13

ResumoSliderFrame.java

(1 de 2)

10 11 public class SliderFrame extends JFrame 12 { 13 private JSlider diameterJSlider; // controle deslizante p/ selecionar o dimetro 14 private OvalPanel myPanel; // painel para desenhar o crculo 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // construtor sem argumentos public SliderFrame() { super( "Slider Demo" );

Cria objeto OvalPanel myPanel

myPanel = new OvalPanel(); // cria painel para desenhar o crculo myPanel.setBackground( Color.YELLOW ); // configura o fundo como amarelo

Cria um objeto JSlider diameterSlider como um diameterJSlider = JSlider horizontal com um intervalo new JSlider( SwingConstants.HORIZONTAL, 0, 200, 10 ); entre 0-200 e um valor inicial de 10 diameterJSlider.setMajorTickSpacing( 10 ); // cria uma marca de medida a cada 10// configura o JSlider para controlar o valor do dimetro diameterJSlider.setPaintTicks( true ); // pinta marcas no controle deslizante

Indica que cada marca de medida principal representa 10 valores e que as marcas de medida devem ser exibidas

2005 by Pearson Education do Brasil

30 31 32 33 34 35 36 37 38 39 40 41

// registra o ouvinte de evento do JSlider diameterJSlider.addChangeListener( new ChangeListener() // classe interna annima { // trata da alterao de valor do controle deslizante public void stateChanged( ChangeEvent e ) { myPanel.setDiameter( diameterJSlider.getValue() ); } // fim do mtodo stateChanged } // fim da classe interna annima ); // fim da chamada para addChangeListener

14

Registra um ChangeListener para tratar eventos do diameterSlider

Resumo

SliderFrame.java

O mtodo stateChanged (2 de 2) chamado em resposta a uma interao de usurio

42 Chama o mtodo myPanel setDiameter e 43 add( diameterJSlider, BorderLayout.SOUTH ); // adiciona o controle deslizante ao frame passa o valor atual da posio do marcador 44 add( myPanel, BorderLayout.CENTER ); // adiciona o painel ao frame retornado pelo mtodo getValue JSlider 45 } // fim do construtor SliderFrame 46 } // fim da classe SliderFrame

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.4: SliderDemo.java // Testando SliderFrame. import javax.swing.JFrame; public class SliderDemo { public static void main( String args[] ) { SliderFrame sliderFrame = new SliderFrame(); sliderFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); sliderFrame.setSize( 220, 270 ); // configura o tamanho do frame sliderFrame.setVisible( true ); // exibe o frame } // fim de main

15

ResumoSliderDemo.java

14 } // fim da classe SliderDemo

2005 by Pearson Education do Brasil

16

22.3 Windows: Notas adicionaisJFrame: uma janela com uma barra de ttulo e uma borda. Uma subclasse do java.awt.Frame. Que uma subclasse do java.awt.Window. Um dos poucos componentes GUI Swing que no um componente GUI leve. As janelas de aplicao Java so parecidas com qualquer outra janela exibida nessa plataforma.

2005 by Pearson Education do Brasil

17

Boa prtica de programao 22.1Janelas so um recurso caro ao sistema. Retorne-as ao sistema quando elas no forem mais necessrias.

2005 by Pearson Education do Brasil

22.3 Windows: Notas adicionais (Continuao) O mtodo JFrame setDefaultCloseOperation determina o que acontece quando o usurio fecha a janela. DISPOSE_ON_CLOSE Fecha a Window para retornar recursos ao sistema. DO_NOTHING_ON_CLOSE Indica que o programa determinar o que fazer quando o usurio indica que a janela deve ser fechada. HIDE_ON_CLOSE O padro.

18

Mtodo JFrame setVisible Exibe a janela na tela.

Mtodo JFrame setLocation Especifica a posio da janela quando ela aparece na tela. 2005 by Pearson Education do Brasil

19

Erro comum de programao 22.1Esquecer de chamar o mtodo setVisible em uma janela um erro de lgica em tempo de execuo a janela no exibida.

2005 by Pearson Education do Brasil

20

Erro comum de programao 22.2Esquecer de chamar o mtodo setSize em uma janela um erro de lgica em tempo de execuo somente a barra de ttulo aparece.

2005 by Pearson Education do Brasil

22.3 Windows: Notas adicionais (Continuao) Manipulao da janela pelo usurio gera eventos de janela: O mtodo addWindowListener registra ouvintes de evento para eventos de janela. A interface WindowListener especifica sete mtodos de tratamento de evento de janela: windowActivated chamado quando o usurio torna uma janela a janela principal. windowClosed chamado depois que a janela fechada. windowClosing chamado quando o usurio inicia o fechamento da janela.

21

2005 by Pearson Education do Brasil

22.3 Windows: Notas adicionais (Continuao) windowDeactivated chamado quando o usurio torna uma outra janela a janela principal. windowDeiconified chamado quando o usurio restaura uma janela depois de ser minimizada. windowIconified chamado quando o usurio minimiza uma janela. windowOpened chamado quando um programa exibe uma janela na tela pela primeira vez.

22

2005 by Pearson Education do Brasil

23

22.4 Utilizando menus com frames Menus: Permitem que o usurio realize aes sem poluir desnecessariamente uma GUI com componentes extras. S podem ser anexados a objetos das classes que fornecem membros setMenuBar, como JFrame e Japplet. Classe MenuBar: Contm os mtodos necessrios para gerenciar uma barra de menus.

Classe Jmenu: Contm os mtodos necessrios para gerenciar menus.

Classe JMenuItem: Contm os mtodos necessrios para gerenciar itens de menu. Pode ser utilizado para iniciar uma ao ou pode ser um submenu. 2005 by Pearson Education do Brasil

24

Observao sobre aparncia e comportamento 22.2Os menus simplificam as GUIs porque os componentes podem ser ocultos dentro deles. Esses componentes s sero visveis quando o usurio procur-los, selecionando-os no menu.

2005 by Pearson Education do Brasil

22.4 Utilizando menus com frames (Continuao) Classe JCheckBoxMenuItem: Contm os mtodos necessrios para gerenciar itens de menu que podem ser ativados ou desativados.

25

Classe JRadioButtonMenuItem. Contm os mtodos necessrios para gerenciar itens de menu que podem ser ativados ou desativados como JCheckBoxMenuItems. Quando mltiplos JRadioButtonMenuItems so mantidos como parte de um ButtonGroup, apenas um item no grupo pode ser selecionado de cada vez.

Mnemnicos: Caracteres especiais que fornecem acesso rpido a um menu ou item do menu a partir do teclado.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8

// Fig. 22.5: MenuFrame.java // Demonstrando menus. import java.awt.Color; import java.awt.Font; import import import import java.awt.BorderLayout; java.awt.event.ActionListener; java.awt.event.ActionEvent; java.awt.event.ItemListener;

26

ResumoMenuFrame.java

9 import java.awt.event.ItemEvent; 10 import javax.swing.JFrame; 11 import javax.swing.JRadioButtonMenuItem; 12 import javax.swing.JCheckBoxMenuItem; 13 import javax.swing.JOptionPane; 14 import javax.swing.JLabel; 15 import javax.swing.SwingConstants; 16 import javax.swing.ButtonGroup; 17 import javax.swing.JMenu; 18 import javax.swing.JMenuItem; 19 import javax.swing.JMenuBar; 20

(1 de 8)

2005 by Pearson Education do Brasil

21 public class MenuFrame extends JFrame 22 { 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 private final Color colorValues[] = { Color.BLACK, Color.BLUE, Color.RED, Color.GREEN }; private JRadioButtonMenuItem colorItems[]; // itens do menu Color private JRadioButtonMenuItem fonts[]; // itens do menu Font private JCheckBoxMenuItem styleItems[]; // itens do menu Font Style private JLabel displayJLabel; // exibe o texto de exemplo private ButtonGroup fontButtonGroup; // gerencia itens do menu Font private ButtonGroup colorButtonGroup; // gerencia itens do menu Color private int style; // utilizado para criar estilo para fonte // construtor sem argumentos configura a GUI public MenuFrame() { super( "Using JMenus" );

27

ResumoMenuFrame.java

(2 de 8)

Cria um JMenu

JMenu fileMenu = new JMenu( "File" ); // cria o menu File fileMenu.setMnemonic( 'F' ); // configura o mnemnico como F

Chama o mtodo JMenu setMnemonico JMenuItem About a fileMenu File

// create About... menu item JMenuItem aboutItem = new JMenuItem( "About..." ); Adiciona aboutItem.setMnemonic( 'A' ); // configura o mnemnico como A fileMenu.add( aboutItem ); // adiciona o item about ao menu aboutItem.addActionListener(

2005 by Pearson Education do Brasil

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

new ActionListener() // classe interna annima {

Cria um ActionListener para processar o evento de ao de // exibe um dilogo de mensagem quando o usurio seleciona About... aboutItem public void actionPerformed( ActionEvent event ) { Exibe uma caixa de dilogo JOptionPane.showMessageDialog( MenuFrame.this, de mensagem. MenuFrame.java

28

Resumo

"This is an example\nof using menus", "About", JOptionPane.PLAIN_MESSAGE ); } // fim do mtodo actionPerformed } // fim da classe interna annima ); // fim da chamada para addActionListener

(3 de 8) Cria e adiciona o item do menu exitItem

JMenuItem exitItem = new JMenuItem( "Exit" ); // cria o item exit exitItem.setMnemonic( 'x' ); // configura o mnemnico como x fileMenu.add( exitItem ); // adiciona o item exit ao menu File exitItem.addActionListener( new ActionListener() // classe interna annima { // termina o aplicativo quando o usurio clicar em exitItem public void actionPerformed( ActionEvent event ) { System.exit( 0 ); // encerra o aplicativo } // fim do mtodo actionPerformed } // fim da classe interna annima ); // fim da chamada para addActionListener

Registra um ActionListener que termina a aplicao

2005 by Pearson Education do Brasil

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

JMenuBar bar = new JMenuBar(); // cria a barra de menu Adiciona setJMenuBar( bar ); // adiciona a barra de menu ao aplicativo bar.add( fileMenu ); // adiciona o menu File barra de menu

fileMenu a um JMenuBar29 e anexa o JMenuBar janela da aplicao

Resumo

JMenu formatMenu = new JMenu( "Format" ); // cria o menu Format formatMenu.setMnemonic( 'r' ); // configura mnemnico como r // array listando cores de string String colors[] = { "Black", "Blue", "Red", "Green" }; JMenu colorMenu = new JMenu( "Color" ); // cria o menu Color colorMenu.setMnemonic( 'C' ); // configura mnemnico C // cria itens do menu Color com botes de opo colorItems = new JRadioButtonMenuItem[ colors.length ]; colorButtonGroup = new ButtonGroup(); // gerencia cores

MenuFrame.java

(4 de 8) Cria um menu formatMenu

Cria um submenu colorMenu Cria um array colorItems para JRadioButtonMenuItem

ItemHandler itemHandler = new ItemHandler(); // handler para cores // cria itens do menu Color com botes de opo for ( int count = 0; count < colors.length; count++ ) {

colorItems[ count ] = new JRadioButtonMenuItem( colors[ count ] ); // cria o colorMenu.add( colorItems[ count ] ); // adiciona o item ao menu Color colorButtonGroup.add( colorItems[ count ] ); // adiciona ao grupo colorItems[ count ].addActionListener( itemHandler ); } // fim de for

Cria um ButtonGroup a fim de assegurar que somente um dos itens de menu seja selecionado item em determinado momento

Adiciona JRadioButtonMenuItems a colorMenu e registra ActionListeners 2005 by Pearson Education do Brasil

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

colorItems[ 0 ].setSelected( true ); // seleciona primeiro item Color

30

Invoca formatMenu.add( colorMenu ); // adiciona o menu Color ao menu FormatformatMenu.addSeparator(); // adiciona o separador no menu // array listing font names String fontNames[] = { "Serif", "Monospaced", "SansSerif" }; JMenu fontMenu = new JMenu( "Font" ); // cria o menu Font fontMenu.setMnemonic( 'n' ); // configura o mnemnico como n

o mtodo AbstractButton setSelected

Resumo

MenuFrame.java

// cria itens do menu radiobutton para nomes de fonte fonts = new JRadioButtonMenuItem[ fontNames.length ]; fontButtonGroup = new ButtonGroup(); // gerencia nomes de fonte Cria

(5 de 8) Adiciona colorMenu ao formatMenu e adiciona uma linha separadora horizontal

um array JRadioButtonMenuItem // cria itens do menu Font com botes de opo fonts for ( int count = 0; count < fonts.length; count++ ) Cria um ButtonGroup a fim de { assegurar que somente um dos fonts[ count ] = new JRadioButtonMenuItem( fontNames[ count ] ); itens de menu seja selecionado em fontMenu.add( fonts[ count ] ); // adiciona fonte ao menu Font determinado momento fontButtonGroup.add( fonts[ count ] ); // adiciona ao grupo de botofonts[ count ].addActionListener( itemHandler ); // adiciona handler } // fim do for fonts[ 0 ].setSelected( true ); // seleciona primeiro item de menu Font fontMenu.addSeparator(); // adiciona barra separador ao menu Font

Adiciona JRadioButtonMenuItems a colorMenu e registra ActionListenersConfigura a seleo-padro e adiciona um separador horizontal

2005 by Pearson Education do Brasil

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

String styleNames[] = { "Bold", "Italic" }; // nomes de estilos styleItems = new JCheckBoxMenuItem[ styleNames.length ]; StyleHandler styleHandler = new StyleHandler(); // handler de estilos // criar itens do menu Style com caixas de seleo for ( int count = 0; count < styleNames.length; count++ ) { styleItems[ count ] =

31

ResumoMenuFrame.java

new JCheckBoxMenuItem( styleNames[ count ] ); // para fontMenu.add( styleItems[ count ] ); // adicina ao menu Font

Cria JCheckBoxMenuItems (6 de 8) estilo

styleItems[ count ].addItemListener( styleHandler ); // handler } // fim do for formatMenu.add( fontMenu ); // adiciona menu Font ao

Adiciona fontMenu a formatMenu menu e formatMenu a JMenuBar Format

bar.add( formatMenu ); // adiciona menu Format barra de menu // set up label to display text displayJLabel = new JLabel( "Sample Text", SwingConstants.CENTER ); displayJLabel.setForeground( colorValues[ 0 ] ); displayJLabel.setFont( new Font( "Serif", Font.PLAIN, 72 ) ); getContentPane().setBackground( Color.CYAN ); // configura o fundo add( displayJLabel, BorderLayout.CENTER ); // adiciona displayJLabel } // fim de construtor MenuFrame

2005 by Pearson Education do Brasil

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178

// classe interna para tratar eventos de ao dos itens de menu private class ItemHandler implements ActionListener { // processa selees de cor e fonte public void actionPerformed( ActionEvent event ) { // processa selees de cor for ( int count = 0; count < colorItems.length; count++ ) { if ( colorItems[ count ].isSelected() ) { displayJLabel.setForeground( colorValues[ count ] ); break; } // fim do if } // fim do for // processa seleo de fonte for ( int count = 0; count < fonts.length; count++ ) { if ( event.getSource() == fonts[ count ] ) { displayJLabel.setFont( new Font( fonts[ count ].getText(), style, } // fim do if } // fim do for

32

ResumoMenuFrame.java

Determina o (7 de 8) JRadioButtonMenuItem selecionado

O mtodo getSource retorna uma referncia ao JRadioButtonMenuItem que 72 gerou o evento ) );

2005 by Pearson Education do Brasil

179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201

repaint(); // desenha novamente o aplicativo } // fim do mtodo actionPerformed } // fim da classe ItemHandler

33

Resumo

// classe interna para tratar eventos dos itens de menu com caixa de seleo private class StyleHandler implements ItemListener MenuFrame.java { // processa selees de estilo da fonte Chamado se o usurio selecionar um public void itemStateChanged( ItemEvent e ) { style = 0; // inicializa estilo // verifica seleo de negrito if ( styleItems[ 0 ].isSelected() ) style += Font.BOLD; // adiciona negrito ao estilo // verifica seleo de itlico if ( styleItems[ 1 ].isSelected() )

(8 de 8) JCheckBoxMenuItem no fontMenu

Determina se um ou ambos os JCheckBoxMenuItems esto selecionados

style += Font.ITALIC; // adiciona itlico ao estilo displayJLabel.setFont( new Font( displayJLabel.getFont().getName(), style, 72 ) ); repaint(); // desenha novamente o aplicativo

202 } // fim do mtodo itemStateChanged 203 } // fim da classe StyleHandler 204 } // fim da classe MenuFrame

2005 by Pearson Education do Brasil

34

Observao sobre aparncia e comportamento 22.3Os mnemnicos fornecem acesso rpido a comandos de menu e comandos de boto pelo teclado.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.6: MenuTest.java // Testando MenuFrame. import javax.swing.JFrame; public class MenuTest { public static void main( String args[] ) { MenuFrame menuFrame = new MenuFrame(); // cria MenuFrame menuFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); menuFrame.setSize( 500, 200 ); // configura o tamanho do frame menuFrame.setVisible( true ); // exibe o frame } // fim do main

35

ResumoMenuTest.java

(1 de 2)

14 } // fim da classe MenuTest

Menu

Caractere s mnemnic os

Barra de menus

2005 by Pearson Education do Brasil

36

ResumoSubmenu expandido Itens de menu

MenuTest.java

(2 de 2)

Linha separadora

2005 by Pearson Education do Brasil

37

Observao sobre aparncia e comportamento 22.4Diferentes mnemnicos devem ser utilizados para cada boto ou item de menu. Normalmente, a primeira letra do rtulo no item de menu ou boto utilizada como o mnemnico. Se diversos botes ou itens de menu iniciam com a mesma letra, escolha a prxima letra mais significativa no nome (por exemplo, x comumente escolhida para um boto ou item de menu chamado Exit).

2005 by Pearson Education do Brasil

22.4 Utilizando menus com frames (Continuao) Mtodo showMessageDialog: Especificar a janela-pai ajuda a determinar onde a caixa de dilogo ser exibida: Se especificada como null, a caixa de dilogo aparece no centro da tela. Caso contrrio, ela aparece centralizada na janela-pai especificada.

38

Caixa de dilogo modal: No permite que nenhuma outra janela na aplicao seja acessada at que a caixa de dilogo seja fechada. Em geral, caixas de dilogo so modais.

2005 by Pearson Education do Brasil

39

Erro comum de programao 22.3Esquecer de configurar a barra de menus com o mtodo JFrame setJMenuBar resulta na barra de menus no sendo exibido no JFrame.

2005 by Pearson Education do Brasil

40

Observao sobre aparncia e comportamento 22.5Os menus aparecem da esquerda para a direita na ordem em que eles so adicionados a um JMenuBar.

2005 by Pearson Education do Brasil

41

Observao sobre aparncia e comportamento 22.6Um submenu criado adicionando-se um menu como um item de menu a um outro menu. Quando o mouse posicionado sobre um submenu (ou o mnemnico do submenu pressionado), o submenu expande para mostrar seus itens de menu.

2005 by Pearson Education do Brasil

42

Observao sobre aparncia e comportamento 22.7Separadores podem ser adicionados a um menu para agrupar itens de menu logicamente.

2005 by Pearson Education do Brasil

43

Observao sobre aparncia e comportamento 22.8Qualquer componente GUI leve (isto , um componente que uma subclasse de JComponent) pode ser adicionado a um JMenu ou a um JMenuBar.

2005 by Pearson Education do Brasil

44

22.5 JPopupMenu Menu pop-up sensvel ao contexto: Fornece opes especficas do componente para o qual o evento de gatilho pop-up foi gerado. Na maioria dos sistemas, o evento de acionamento de pop-up ocorre quando o usurio pressiona e libera o boto direito do mouse.

Criado com a classe JPopupMenu.

2005 by Pearson Education do Brasil

45

Observao sobre aparncia e comportamento 22.9O evento de acionamento do pop-up especfico da plataforma. Na maioria das plataformas que utilizam um mouse com mltiplos botes, o evento de acionamento do pop-up ocorre quando o usurio clica com o boto direito do mouse em um componente que suporta um menu pop-up.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8

// Fig. 22.7: PopupFrame.java // Demonstrando JPopupMenus. import import import import java.awt.Color; java.awt.event.MouseAdapter; java.awt.event.MouseEvent; java.awt.event.ActionListener;

46

ResumoPopupFrame.java

import java.awt.event.ActionEvent; import javax.swing.JFrame;

9 import javax.swing.JRadioButtonMenuItem; 10 import javax.swing.JPopupMenu; 11 import javax.swing.ButtonGroup; 12 13 public class PopupFrame extends JFrame 14 { 15 private JRadioButtonMenuItem items[]; // armazena itens para cores 16 17 18 19 20 21 22 23 24 25 26 27 private final Color colorValues[] = { Color.BLUE, Color.YELLOW, Color.RED }; // cores a serem utilizadas private JPopupMenu popupMenu; // permite ao usurio selecionar cores // construtor sem argumentos configura a GUI public PopupFrame() { super( "Using JPopupMenus" );

(1 de 4)

Uma instncia da classe ItemHandler processar os eventos de item nos itens de menu

ItemHandler handler = new ItemHandler(); // handler para itens de menu String colors[] = { "Blue", "Yellow", "Red" }; // array de cores

2005 by Pearson Education do Brasil

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

ButtonGroup colorGroup = new ButtonGroup(); // gerencia itens de cores popupMenu = new JPopupMenu(); // cria menu pop-up items = new JRadioButtonMenuItem[ 3 ]; // itens para selecionar cor // constri item de menu, adiciona menu popup, ativa tratamento de evento for ( int count = 0; count < items.length; count++ ) { items[ count ] = new JRadioButtonMenuItem( colors[ count ] ); popupMenu.add( items[ count ] ); // adiciona item ao menum pop-up colorGroup.add( items[ count ] ); // adiciona item ao grupo de boto items[ count ].addActionListener( handler ); // adiciona handler } // fim do for setBackground( Color.WHITE ); // configura fundo como branco // declara um MouseListener para a janela exibir menu pop-up addMouseListener( new MouseAdapter() // classe interna annima { // trata evento de pressionamento de mouse public void mousePressed( MouseEvent event ) {

47

Cria um objeto JPopupMenuPopupFrame.java

Resumo

(2 de 4)

Cria e adiciona JRadioButtonMenuItem e registra ActionListeners

Registra um MouseListener para tratar os eventos de mouse da janela da aplicao

checkForTriggerEvent( event ); // verifica o acionamento } // fim do mtodo mousePressed

2005 by Pearson Education do Brasil

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

// trata eventos de liberao de boto do mouse public void mouseReleased( MouseEvent event ) { checkForTriggerEvent( event ); // verifica acionamento } // fim do mtodo mouseReleased

48

ResumoPopupFrame.java

// determina se o evento deve acionar menu popup private void checkForTriggerEvent( MouseEvent event ) (3 de 4) { Se o evento de gatilho pop-up tiver ocorrido, if ( event.isPopupTrigger() ) mtodo JPopupMenu show exibe o popupMenu.show(

o

JPopupMenu event.getComponent(), event.getX(), event.getY() );

} // fim do mtodo checkForTriggerEvent } // fim da classe interna annima ); // fim da chamada para addMouseListener O componente } // fim do construtor PopupFrame

de origem e os argumentos de coordenadas determinam onde o JPopupMenu aparecer

2005 by Pearson Education do Brasil

71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

// classe interna privada para tratar eventos de item de menu private class ItemHandler implements ActionListener { // processa selees de item de menu public void actionPerformed( ActionEvent event ) { // determina qual item de menu foi selecionado for ( int i = 0; i < items.length; i++ ) { if ( event.getSource() == items[ i ] ) { getContentPane().setBackground( colorValues[ i ] ); return; } // fim do if } // fim do for } // fim do mtodo actionPerformed

49

ResumoPopupFrame.java

(4 de 4)

87 } // fim da classe interna privada ItemHandler Determina 88 } // fim da classe PopupFrame

qual JRadioButtonMenuItem o usurio selecionou e configura a cor de segundo plano

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.8: PopupTest.java // Testando PopupFrame. import javax.swing.JFrame; public class PopupTest { public static void main( String args[] ) { PopupFrame popupFrame = new PopupFrame(); // cria PopupFrame popupFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); popupFrame.setSize( 300, 200 ); // configura o tamanho do frame popupFrame.setVisible( true ); // exibe o frame } // fim do main

50

ResumoPopupTest.java

14 } // fim da classe PopupTest

2005 by Pearson Education do Brasil

51

Observao sobre aparncia e comportamento 22.10Exibir um JPopupMenu para o evento de acionamento de pop-up de mltiplos componentes GUI requer o registro de handlers de eventos de mouse para cada um desses componentes GUI.

2005 by Pearson Education do Brasil

22.6 Aparncia e comportamento plugveis Aparncias das aplicaes Java: Um programa que utiliza componentes GUI do Abstract Window Toolkit do Java assume a aparncia e o comportamento da plataforma: Permite aos usurios da aplicao em cada plataforma utilizarem componentes GUI que eles j conhecem. Tambm introduz questes interessantes de portabilidade.

52

Os componentes GUI leves do Swing fornecem funcionalidades uniformes: Definem uma aparncia e um comportamento uniformes entre diferentes plataformas (conhecido como aparncia e comportamento metal). Tambm podem personalizar a aparncia e o comportamento como um estilo do Windows Microsoft, como um estilo Motif (UNIX) ou uma aparncia e comportamento do Macintosh. 2005 by Pearson Education do Brasil

53

Dica de portabilidade 22.1Os componentes GUI tm uma aparncia diferente em diferentes plataformas e podem exigir quantidades diferentes de espao para serem exibidos. Isso poderia alterar seus layouts e alinhamentos da GUI.

2005 by Pearson Education do Brasil

54

Dica de portabilidade 22.2Os componentes GUI em diferentes plataformas tm diferentes funcionalidades-padro (por exemplo, algumas plataformas permitem que um boto com o foco seja pressionado com a barra de espao e outras, no).

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11

// Fig. 22.9: LookAndFeelFrame.java // Alterando a aparncia e comportamento. import java.awt.GridLayout; import java.awt.BorderLayout; import import import import import import import java.awt.event.ItemListener; java.awt.event.ItemEvent; javax.swing.JFrame; javax.swing.UIManager; javax.swing.JRadioButton; javax.swing.ButtonGroup; javax.swing.JButton;

55

ResumoLookAndFeelFrame .java

(1 de 4)

12 import javax.swing.JLabel; 13 import javax.swing.JComboBox; 14 import javax.swing.JPanel; 15 import javax.swing.SwingConstants; 16 import javax.swing.SwingUtilities; 17 18 public class LookAndFeelFrame extends JFrame 19 { 20 // nomes de string das aparncias e comportamentos 21 private final String strings[] = { "Metal", "Motif", "Windows" }; 22 23 24 25 26 27 28 private UIManager.LookAndFeelInfo looks[]; // aparncia e comportamentos private JRadioButton radio[]; // botes de opo para selecionar a aparncia e comportamento private private private private ButtonGroup group; // grupo para botes de opo JButton button; // exibe a aparncia do boto JLabel label; // exibe a aparncia do rtulo JComboBox comboBox; // exibe a aparncia da caixa de combinao

2005 by Pearson Education do Brasil

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

// configura a GUI public LookAndFeelFrame() { super( "Look and Feel Demo" ); JPanel northPanel = new JPanel(); // cria o painel North northPanel.setLayout( new GridLayout( 3, 1, 0, 5 ) ); label = new JLabel( "This is a Metal look-and-feel", SwingConstants.CENTER ); // cria o rtulo northPanel.add( label ); // adiciona o rtulo ao painel button = new JButton( "JButton" ); // cria o boto northPanel.add( button ); // adiciona o boto ao painel comboBox = new JComboBox( strings ); // cria a caixa de combinao northPanel.add( comboBox ); // adiciona a caixa de combinao ao painel // cria um array para botes de opo radio = new JRadioButton[ strings.length ]; JPanel southPanel = new JPanel(); // cria o painel South southPanel.setLayout( new GridLayout( 1, radio.length ) ); group = new ButtonGroup(); // grupo de botes para a aparncia e comportamento ItemHandler handler = new ItemHandler(); // handler da aparncia e comportamento

56

ResumoLookAndFeelFrame .java

(2 de 4)

2005 by Pearson Education do Brasil

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

for ( int count = 0; count < radio.length; count++ ) { radio[ count ] = new JRadioButton( strings[ count ] ); radio[ count ].addItemListener( handler ); // adiciona handler group.add( radio[ count ] ); // adiciona botes de opo ao grupo southPanel.add( radio[ count ] ); // adiciona botes de opo ao painel } // fim do for

57

ResumoLookAndFeelFrame .java

add( northPanel, BorderLayout.NORTH ); // adiciona o painel North Obtm o array dos objetos UIManager.LookAndFeelInfo (3 de 4) add( southPanel, BorderLayout.SOUTH ); // adiciona o painel South // obtm as informaes sobre a aparncia e comportamento instaladas looks = UIManager.getInstalledLookAndFeels(); radio[ 0 ].setSelected( true ); // configura a seleo padro } // fim do construtor LookAndFeelFrame // utiliza UIManager para alterar a aparncia e comportamento da GUI private void changeTheLookAndFeel( int value ) { try // muda a aparncia e comportamento para alterar a aparncia { // configura a aparncia e comportamento para esse aplicativo UIManager.setLookAndFeel( looks[ value ].getClassName() ); // atualiza os componentes nesse aplicativo SwingUtilities.updateComponentTreeUI( this ); } // fim do try

que descrevem cada aparncia e comportamento disponvel no seu sistema

Invoca o mtodo static setLookAndFeel e comportamento

Invoca o mtodo static updateComponentTreeUI para alterar a aparncia e comportamento de cada componente GUI anexado aplicao 2005 by Pearson Education do Brasil

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

catch ( Exception exception ) { exception.printStackTrace(); } // fim do catch } // fim do mtodo changeTheLookAndFeel // classe interna private para tratar eventos de boto de opo private class ItemHandler implements ItemListener { // processa a seleo de aparncia e comportamento feita pelo usurio public void itemStateChanged( ItemEvent event ) { for ( int count = 0; count < radio.length; count++ ) { if ( radio[ count ].isSelected() ) { label.setText( String.format( "This is a %s look-and-feel", strings[ count ] ) ); comboBox.setSelectedIndex( count ); // configura o ndice da caixa de combinao changeTheLookAndFeel( count ); // muda a aparncia e comportamento } // fim do if } // fim do for } // fim do mtodo itemStateChanged

58

ResumoLookAndFeelFrame .java

(4 de 4)

106 } // fim da classe interna private 107 } // fim da classe LookAndFeelFrame

Chama o mtodo utilitrio ItemHandler changeTheLookAndFeel

2005 by Pearson Education do Brasil

59

Dica de desempenho 22.1Cada aparncia e comportamento so representados por uma classe Java. O mtodo UIManager getInstalledLookAndFeels no carrega cada classe. Em vez disso, fornece os nomes das classes de aparncia e comportamento disponveis de modo que uma escolha possa ser feita (presumivelmente, uma vez na inicializao do programa). Isso reduz o overhead de ter de carregar todas as classes de aparncia e comportamento mesmo se o programa no utilizar algumas delas.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.10: LookAndFeelDemo.java // Mudando a aparncia e o comportamento. import javax.swing.JFrame; public class LookAndFeelDemo { public static void main( String args[] ) { LookAndFeelFrame lookAndFeelFrame = new LookAndFeelFrame(); lookAndFeelFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); lookAndFeelFrame.setSize( 300, 200 ); // configura o tamanho do frame lookAndFeelFrame.setVisible( true ); // exibe o frame } // fim do main

60

ResumoLookAndFeelDemo .java

(1 de 2)

14 } // fim da classe LookAndFeelDemo

2005 by Pearson Education do Brasil

61

ResumoLookAndFeelDemo .java

(2 de 2)

2005 by Pearson Education do Brasil

22.7 JDesktopPane e JInternalFrame Interface de mltiplos documentos: Uma janela principal (chamada janela-pai) contm outras janelas (chamadas janelas-filhas). Gerencia vrios documentos abertos que esto sendo processados em paralelo. Implementada pelo JDesktopPane e JInternalFrame do Swing.

62

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9

// Fig. 22.11: DesktopFrame.java // Demonstrando JDesktopPane. import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.util.Random; import javax.swing.JFrame;

63

ResumoDeskTopFrame .java

10 import javax.swing.JDesktopPane; 11 import javax.swing.JMenuBar; 12 import javax.swing.JMenu; 13 import javax.swing.JMenuItem; 14 import javax.swing.JInternalFrame; 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import javax.swing.JPanel; import javax.swing.ImageIcon; public class DesktopFrame extends JFrame { private JDesktopPane theDesktop; // configura a GUI public DesktopFrame() { super( "Using a JDesktopPane" );

(1 de 4)

Cria um JMenuBar, um JMenu e um JMenuItem

JMenuBar bar = new JMenuBar(); // cria a barra de menu JMenu addMenu = new JMenu( "Add" ); // cria o menu Add JMenuItem newFrame = new JMenuItem( "Internal Frame" );

2005 by Pearson Education do Brasil

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

addMenu.add( newFrame ); // adiciona um novo item de frame ao menu Add bar.add( addMenu ); // adiciona o menu Add barra de menus

64

Adiciona o JMenuItem setJMenuBar( bar ); // configura a barra de menus para esse aplicativotheDesktop = new JDesktopPane(); // cria o painel de add( theDesktop ); // adiciona painel de rea de trabalho ao frame

ao JMenu, e o JMenu ao JMenuBar, e configura o rea de trabalho a janela da aplicao JMenuBar para para

Resumo

// configura o ouvinte para o item de menu newFrame O JDesktopPane ser utilizado newFrame.addActionListener( gerenciar as janelas-filhas do new ActionListener() // classe interna annima { // exibe a nova janela interna public void actionPerformed( ActionEvent event ) { Cria // cria o frame interno JInternalFrame frame = new JInternalFrame( "Internal Frame", true, true, true, true ); MyJPanel panel = new MyJPanel(); // cria um novo painel frame.add( panel, BorderLayout.CENTER ); // adiciona o painel frame.pack(); // configura frame interno de acordo c/ o tamanho do contedo

DeskTopFrame .java

JInternalFrame

(2 de 4)

um objeto JInternalFrame

Os argumentos de construtor especificam a string da barra de ttulo e se o usurio pode ou no redimensionar, fechar, maximizar e minimizar o frame interno Configura o tamanho da janela-filha

2005 by Pearson Education do Brasil

54 55 56 57 58 59

theDesktop.add( frame ); // anexa frame interno frame.setVisible( true ); // mostra o frame interno } // fim do mtodo actionPerformed } // fim da classe interna annima ); // fim da chamada para addActionListener } // fim do construtor DesktopFrame

65

60 } // fim da classe DesktopFrame 61 62 // classe para exibir um ImageIcon em um painel 63 class MyJPanel extends JPanel 64 { 65 66 67 68 69 70 71 72 73 74 75 76

Adiciona o JInternalFrame a theDesktop e exibe o JInternalFrame DeskTopFrame.java

Resumo

(3 de 4)

private static Random generator = new Random(); private ImageIcon picture; // imagem a ser exibida private String[] images = { "yellowflowers.png", "purpleflowers.png", "redflowers.png", "redflowers2.png", "lavenderflowers.png" }; // carrega a imagem public MyJPanel() { int randomNumber = generator.nextInt( 5 ); picture = new ImageIcon( images[ randomNumber ] ); // configura o cone } // fim do construtor MyJPanel

2005 by Pearson Education do Brasil

77 78 79 80 81 82 83 84 85 86 87 88 89

// exibe o imageIcon no painel public void paintComponent( Graphics g ) { super.paintComponent( g ); picture.paintIcon( this, g, 0, 0 ); // exibe o cone } // fim do mtodo paintComponent // retorna dimenses da imagem public Dimension getPreferredSize() { return new Dimension( picture.getIconWidth(), picture.getIconHeight() ); } // fim do mtodo getPreferredSize

66

ResumoEspecifica o tamanho preferido do painel para uso pelo mtodo packDeskTopFrame .java

(4 de 4)

90 } // fim da classe MyJPanel

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.12: DesktopTest.java // Demonstrando JDesktopPane. import javax.swing.JFrame; public class DesktopTest { public static void main( String args[] ) { DesktopFrame desktopFrame = new DesktopFrame(); desktopFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); desktopFrame.setSize( 600, 480 ); // configura o tamanho do frame desktopFrame.setVisible( true ); // exibe o frame } // fim do main

67

ResumoDeskTopTest.java

(1 de 3)

14 } // fim da classe DesktopTest

2005 by Pearson Education do Brasil

68

Frames internos

Minimizar

Maximizar

Fechar

ResumoDeskTopTest.java

(2 de 3)

Frame interno minimizado

Posiciona o mouse sobre um canto qualquer de uma janela-filha para redimensionar a janela (se o redimensionando for permitido).

2005 by Pearson Education do Brasil

69

Frame interno maximizado

ResumoDeskTopTest.java

(3 de 3)

2005 by Pearson Education do Brasil

70

22.8 JTabbedPaneJTabbedPane: Organiza componentes GUI em camadas em que somente uma camada visvel de cada vez. Quando o usurio clica em uma guia, a camada apropriada exibida: As guias podem ser posicionadas na parte superior (padro), esquerda, direita ou na parte inferior. Qualquer componente pode ser posicionado em uma guia. Se as guias no se ajustarem em uma linha, elas sero empacotadas a fim de formar linhas adicionais das guias.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

// Fig. 22.13: JTabbedPaneFrame.java // Demonstrando JTabbedPane. import import import import import import java.awt.BorderLayout; java.awt.Color; javax.swing.JFrame; javax.swing.JTabbedPane; javax.swing.JLabel; javax.swing.JPanel;

71

ResumoJTabbedPaneFrame .java

import javax.swing.JButton; import javax.swing.SwingConstants; public class JTabbedPaneFrame extends JFrame { // configurando GUI public JTabbedPaneFrame() { super( "JTabbedPane Demo " );

(1 de 2)

Cria um JTabbedPane vazio com as configuraes-padro

JTabbedPane tabbedPane = new JTabbedPane(); // cria JTabbedPane // configura o pane11 e o adiciona ao JTabbedPane JLabel label1 = new JLabel( "panel one", SwingConstants.CENTER ); JPanel panel1 = new JPanel(); // cria o primeiro painel panel1.add( label1 ); // adiciona o rtulo ao painel tabbedPane.addTab( "Tab One", null, panel1, "First Panel" );

Chama o mtodo JTabbedPane addTab com argumentos que especificam a string de ttulo da guia, uma referncia Icon para exibir na guia, o COMPONENT para exibir quando o usurio clica na guia e a string da dica de tela da guia

2005 by Pearson Education do Brasil

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

// configura panel2 e o adiciona ao JTabbedPane JLabel label2 = new JLabel( "panel two", SwingConstants.CENTER ); JPanel panel2 = new JPanel(); // cria o segundo panel panel2.setBackground( Color.YELLOW ); // configura o fundo como amarelo panel2.add( label2 ); // adiciona o rtulo ao painel tabbedPane.addTab( "Tab Two", null, panel2, "Second Panel" ); // configura o panel3 e o adiciona ao JTabbedPane

72

ResumoJTabbedPaneFrame .java

Adiciona panel2 JLabel label3 = new JLabel( "panel three" ); JPanel panel3 = new JPanel(); // cria o terceiro painel panel3.setLayout( new BorderLayout() ); // utiliza o borderlayoutpanel3.add( new JButton( "North" ), BorderLayout.NORTH ); panel3.add( new JButton( "West" ), BorderLayout.WEST ); panel3.add( new JButton( "East" ), BorderLayout.EAST ); panel3.add( new JButton( "South" ), BorderLayout.SOUTH ); panel3.add( label3, BorderLayout.CENTER ); tabbedPane.addTab( "Tab Three", null, panel3, "Third Panel" );

a tabbedPane (2 de 2)

45 add( tabbedPane ); // adicion a JTabbedPane ao frame 46 } // fim do construtor JTabbedPaneFrame Adiciona 47 } // fim da classe JTabbedPaneFrame

panel3 a tabbedPane

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.14: JTabbedPaneDemo.java // Demonstrando o JTabbedPane. import javax.swing.JFrame; public class JTabbedPaneDemo { public static void main( String args[] ) { JTabbedPaneFrame tabbedPaneFrame = new JTabbedPaneFrame(); tabbedPaneFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); tabbedPaneFrame.setSize( 250, 200 ); // configura o tamanho do frame tabbedPaneFrame.setVisible( true ); // exibe o frame } // fim do main

73

ResumoJTabbedPaneDemo .java

14 } // fim da classe JTabbedPaneDemo

2005 by Pearson Education do Brasil

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout Gerenciador de layout BoxLayout: Organiza componentes GUI horizontalmente ao longo de um eixo x ou verticalmente ao longo do eixo y do continer.

74

2005 by Pearson Education do Brasil

75

Gerenciador de layoutBoxLayout

DescrioUm gerenciador de layout que permite que os componentes GUI sejam organizados da esquerda para a direita ou de cima para baixo em um continer. A classe Box declara um continer com BoxLayout como seu gerenciador-padro de layout e fornece mtodos static para criar um Box com um BoxLayout horizontal ou vertical. Um gerenciador de layout semelhante a GridLayout, mas diferentemente dele pelo fato de que os componentes podem variar de tamanho e podem ser adicionados em qualquer ordem.

GridBagLayout

Figura 22.15 | Gerenciadores de layout adicionais.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9

// Fig. 22.16: BoxLayoutFrame.java // Demonstrando BoxLayout. import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.Box; import javax.swing.JButton; import javax.swing.BoxLayout; import javax.swing.JPanel; import javax.swing.JTabbedPane;

76

ResumoBoxLayoutFrame .java

10 11 public class BoxLayoutFrame extends JFrame 12 { 13 // configura a GUI 14 public BoxLayoutFrame() 15 { 16 17 18 19 20 21 22 23 24 25 26 27 28 29 super( "Demonstrating BoxLayout" ); // cria contineres Box com BoxLayout Box horizontal1 = Box.createHorizontalBox(); Box vertical1 = Box.createVerticalBox(); Box horizontal2 = Box.createHorizontalBox(); Box vertical2 = Box.createVerticalBox(); final int SIZE = 3; // nmero de botes em cada Box // adiciona botes a Box horizontal1 for ( int count = 0; count < SIZE; count++ ) horizontal1.add( new JButton( "Button " + count ) );

(1 de 3)

Cria contineres Box com os mtodos Box static createHorizontalBox e createVerticalBox

Adiciona trs JButtons a horizontal1

2005 by Pearson Education do Brasil

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

// cria a cola horizontal e adiciona botes a Box horizontal2 for ( int count = 0; count < SIZE; count++ ) { vertical1.add( Box.createVerticalStrut( 25 ) ); vertical1.add( new JButton( "Button " + count ) ); } // fim do for // cria uma rea rgida e adiciona botes a Box vertical2 for ( int count = 0; count < SIZE; count++ ) { horizontal2.add( Box.createHorizontalGlue() ); horizontal2.add( new JButton( "Button " + count ) ); } // fim do for // cria uma rea rgida e adiciona botes a Box vertical2 for ( int count = 0; count < SIZE; count++ ) { vertical2.add( Box.createRigidArea( new Dimension( 12, 8 ) ) ); vertical2.add( new JButton( "Button " + count ) ); } // fim do for // cria cola vertical e adiciona botes ao painel JPanel panel = new JPanel(); panel.setLayout( new BoxLayout( panel, BoxLayout.Y_AXIS ) );

77

ResumoAdiciona trs estruturas verticais e trs JButtons a vertical1 BoxLayoutFrame.java

(2 de 3)

Adiciona a cola horizontal e trs JButtons a horizontal2

Adiciona trs reas rgidas e trs JButtons a vertical2

Utiliza o mtodo Container setLayout para configurar o layout do painel como um BoxLayout vertical 2005 by Pearson Education do Brasil

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

for ( int count = 0; count < SIZE; count++ ) { panel.add( Box.createGlue() ); panel.add( new JButton( "Button " + count ) ); } // fim do for // cria um JTabbedPane JTabbedPane tabs = new JTabbedPane(

78

ResumoBoxLayoutFrame .java

Adiciona a cola e trs JButtons a panel

JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT );

(3 de 3)// coloca cada continer no painel com guias tabs.addTab( "Horizontal Box", horizontal1 ); tabs.addTab( "Vertical Box with Struts", vertical1 ); tabs.addTab( "Horizontal Box with Glue", horizontal2 ); tabs.addTab( "Vertical Box with Rigid Areas", vertical2 ); tabs.addTab( "Vertical Box with Glue", panel ); add( tabs ); // coloca o painel com guias no frame

Cria um JTabbedPane em que as guias devem rolar se houver muitas guias para caber em uma linha

73 } // fim do construtor BoxLayoutFrame 74 } // fim da classe BoxLayoutFrame

2005 by Pearson Education do Brasil

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout (Cont.) Estruturas verticais: Componente GUI invisvel que tem uma altura fixa de pixels: Utilizado para garantir uma quantidade fixa de espao entre componentes GUI. Mtodo Box static createVerticalStrut. Argumento int determina a altura da estrutura em pixels. Box tambm declara o mtodo createHorizontalStrut.

79

2005 by Pearson Education do Brasil

80

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout (Cont.) Cola horizontal: Um componente GUI invisvel que ocupa espao adicional entre componentes GUI de tamanho fixo. Quando o continer redimensionado, componentes separados por cola permanecem no mesmo tamanho, mas a cola se expande ou se contrai para ocupar o espao entre eles.

Mtodos Box static createHorizontalGlue e createVerticalGlue.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.17: BoxLayoutDemo.java // Demonstrando BoxLayout. import javax.swing.JFrame; public class BoxLayoutDemo { public static void main( String args[] ) { BoxLayoutFrame boxLayoutFrame = new BoxLayoutFrame(); boxLayoutFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); boxLayoutFrame.setSize( 400, 220 ); // configura o tamanho do frame boxLayoutFrame.setVisible( true ); // exibe o frame } // fim do main

81

ResumoBoxLayoutDemo .java

(1 de 2)

14 } // fim da classe BoxLayoutDemo

Setas para alternar pelas guias

2005 by Pearson Education do Brasil

82

ResumoBoxLayoutDemo .java

(2 de 2)

2005 by Pearson Education do Brasil

83

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout (Cont.) reas rgidas: Um componente GUI invisvel que sempre tem uma largura fixa e uma altura fixa em pixels. O argumento do objeto Dimension para o mtodo Box static createRigidArea especifica a largura e a altura da rea.

2005 by Pearson Education do Brasil

84

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout (Cont.) O gerenciador de layout GridBagLayout: Semelhante a GridLayout pelo fato de que organiza componentes em uma grade, porm mais flexvel. Os componentes podem variar de tamanho e podem ser adicionados em qualquer ordem.

Determinando a aparncia da GUI: Desenhe a GUI no papel. Desenhe uma grade sobre ela, dividindo os componentes em linhas e colunas. Os nmeros iniciais de linha e coluna devem ser 0. Utilizados pelo gerenciador de layout GridBagLayout para posicionar adequadamente os componentes na grade. 2005 by Pearson Education do Brasil

85

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout (Cont.) Objeto GridBagConstraints: Descreve como um componente posicionado em um GridBagLayout. Anchor especifica a posio relativa do componente em uma rea que ele no preenche. Constantes: NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, NORTHWEST e CENTER (o padro).

fill define como o componente aumenta se a rea em que pode ser exibido for maior que o componente. Constantes: NONE (o padro), VERTICAL, HORIZONTAL e BOTH.

2005 by Pearson Education do Brasil

86

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout (Cont.) gridx e gridy especificam onde o canto superior esquerdo do componente posicionado na grade. gridwidth e gridheight especificam o nmero de colunas e linhas que um componente ocupa. weightx e weighty especificam como distribuir espao extra horizontal e vertical para componentes da grade em um GridBagLayout quando o continer redimensionado. Um valor zero indica que o componente da grade no aumenta nessa dimenso por conta prpria. Entretanto, se o componente avanar sobre uma coluna/linha que contm um componente com valor de peso diferente de zero, ele aumentar na mesma proporo dos outros componentes nessa coluna/linha. Utilize valores de peso positivos diferentes de zero para evitar aglomerao. 2005 by Pearson Education do Brasil

87

Coluna0 1 2

0 1

Linha2 3

Figura 22.18 | Projetando uma GUI que utilizar GridBagLayout.

2005 by Pearson Education do Brasil

88

Campo GridBagConstraintsanchor

DescrioEspecifica a posio relativa (NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, NORTHWEST, CENTER) do componente em uma rea que ele no preenche. Redimensiona o componente na direo especificada (NONE, HORIZONTAL, VERTICAL, BOTH) quando a rea de exibio for maior que o componente. A coluna em que o componente ser colocado. A linha em que o componente ser colocado. O nmero de colunas que o componente ocupa. O nmero de linhas que o componente ocupa. A quantidade de espao extra a alocar horizontalmente. O componente na grade pode tornar-se mais largo se houver espao extra disponvel. A quantidade de espao extra a alocar verticalmente. O componente na grade pode tornar-se mais alto se houver espao extra disponvel.

fill

gridx gridy gridwidth gridheight weightx

weighty

Figura 22.19 | Campos GridBagConstraints.

2005 by Pearson Education do Brasil

89

Figura 22.20 | GridBagLayout com os pesos configurados como zero.

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9

// Fig. 22.21: GridBagFrame.java // Demonstrando GridBagLayout. import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Component; import import import import javax.swing.JFrame; javax.swing.JTextArea; javax.swing.JTextField; javax.swing.JButton;

90

ResumoGridBagFrame .java

10 import javax.swing.JComboBox; 11 12 public class GridBagFrame extends JFrame 13 { 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 private GridBagLayout layout; // layout desse frame private GridBagConstraints constraints; // restries desse layout // configura a GUI public GridBagFrame() { super( "GridBagLayout" ); layout = new GridBagLayout();

(1 de 3)

Cria um objeto GridBagLayout

setLayout( layout ); // configura o layout de frame constraints = new GridBagConstraints(); // instancia restries // cria componentes GUI JTextArea textArea1 = new JTextArea( "TextArea1", 5, 10 ); JTextArea textArea2 = new JTextArea( "TextArea2", 2, 2 );

Cria um objeto GridBagConstraints

2005 by Pearson Education do Brasil

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

String names[] = { "Iron", "Steel", "Brass" }; JComboBox comboBox = new JComboBox( names ); JTextField textField = new JTextField( "TextField" ); JButton button1 = new JButton( "Button 1" ); JButton button2 = new JButton( "Button 2" ); JButton button3 = new JButton( "Button 3" ); // weightx e weighty para textArea1 so 0: o padro // anchor para todos os componentes CENTER: o padro

91

ResumoGridBagFrame .java

(2 de 3) constraints.fill = GridBagConstraints.BOTH; Faz com que a JTextArea addComponent( textArea1, 0, 0, 1, 3 ); sempre preencha toda a sua rea alocada // weightx e weighty para button1 so 0: o padro constraints.fill = GridBagConstraints.HORIZONTAL; Chama o mtodo utilitrio addComponent com o objeto JTextArea, a linha, a coluna e os addComponent( button1, 0, 1, 2, 1 ); nmeros de colunas e linhas a distribuir so // weightx e weighty para comboBox so 0: o padro passados como argumentos// fill HORIZONTAL addComponent( comboBox, 2, 1, 2, 1 ); // button2 constraints.weightx = 1000;

// pode crescer na largura

constraints.weighty = 1; // pode crescer na altura constraints.fill = GridBagConstraints.BOTH; addComponent( button2, 1, 1, 1, 1 );

Quando a janela for redimensionada, button2 crescer.

2005 by Pearson Education do Brasil

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

// preenchimento BOTH para button3 constraints.weightx = 0; constraints.weighty = 0; addComponent( button3, 1, 2, 1, 1 );

92

button3 ainda aumentar por causa dos valores de peso do button2

Resumo

// weightx e weighty para textField so 0, preenchimento BOTH addComponent( textField, 3, 0, 2, 1 ); // weightx e weighty para textArea2 so 0, preenchimento BOTH addComponent( textArea2, 3, 2, 1, 1 ); } // fim do construtor GridBagFrame // mtodo no qual configurar as restries private void addComponent( Component component, int row, int column, int width, int height ) { constraints.gridx = column; // configura gridx constraints.gridy = row; // configura gridy constraints.gridwidth = width; // configura gridwidth constraints.gridheight = height; // configura gridheight

GridBagFrame .java

(3 de 3)

Configura restries e adiciona um componente

76 layout.setConstraints( component, constraints ); // configura constraints 77 add( component ); // adiciona component 78 } // fim do mtodo addComponent 79 } // fim da classe GridBagFrame

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.22: GridBagDemo.java // Demonstrando GridBagLayout. import javax.swing.JFrame; public class GridBagDemo { public static void main( String args[] ) { GridBagFrame gridBagFrame = new GridBagFrame(); gridBagFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); gridBagFrame.setSize( 300, 150 ); // configura tamanho gridBagFrame.setVisible( true ); // exibe o frame } // fim de main

93

ResumoGridBagDemo.java

(1 de 2)

14 } // fim da classe GridBagDemo

2005 by Pearson Education do Brasil

94

ResumoGridBagDemo.java

(2 de 2)

2005 by Pearson Education do Brasil

95

22.9 Gerenciadores de layout: BoxLayout e GridBagLayout (Cont.) Constantes GridBagConstraints: RELATIVE: Especifica que o penltimo componente em uma linha particular deve ser posicionado direita do componente anterior na linha.

REMAINDER: Especifica que um componente o ltimo componente em uma linha.

Os componentes que no so o penltimo ou o ltimo componente em uma linha devem especificar valores para gridwidth e gridheight:

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9

// Fig. 22.23: GridBagFrame2.java // Demonstrando as constantes GridBagLayout. import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import import import import java.awt.Component; javax.swing.JFrame; javax.swing.JComboBox; javax.swing.JTextField;

96

ResumoGridBagFrame2 .java

import javax.swing.JList;

10 import javax.swing.JButton; 11 12 public class GridBagFrame2 extends JFrame 13 { 14 private GridBagLayout layout; // layout desse frame 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 private GridBagConstraints constraints; // restries desse layout // configura a GUI public GridBagFrame2() { super( "GridBagLayout" ); layout = new GridBagLayout(); setLayout( layout ); // configura layout do frame constraints = new GridBagConstraints(); // instancia restries // cria componentes da GUI String metals[] = { "Copper", "Aluminum", "Silver" }; JComboBox comboBox = new JComboBox( metals ); JTextField textField = new JTextField( "TextField" );

(1 de 3)

Cria um objeto GridBagLayout

2005 by Pearson Education do Brasil

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

String fonts[] = { "Serif", "Monospaced" };T JList list = new JList( fonts ); String names[] = { "zero", "one", "two", "three", "four" }; JButton buttons[] = new JButton[ names.length ]; for ( int count = 0; count < buttons.length; count++ ) buttons[ count ] = new JButton( names[ count ] ); // define define restries dos componentes GUI para textField constraints.weightx = 1; constraints.weighty = 1; constraints.fill = GridBagConstraints.BOTH; constraints.gridwidth = GridBagConstraints.REMAINDER; addComponent( textField ); // buttons[0] -- weightx e weighty so 1: fill BOTH constraints.gridwidth = 1; addComponent( buttons[ 0 ] ); // buttons[1] -- weightx e weighty so 1: fill BOTH constraints.gridwidth = GridBagConstraints.RELATIVE; addComponent( buttons[ 1 ] ); // buttons[2] -- weightx e weighty so 1: fill BOTH constraints.gridwidth = GridBagConstraints.REMAINDER; addComponent( buttons[ 2 ] );

97

ResumoGridBagFrame2 .java

(2 de 3)

Especifica que o JTextField o ltimo componente na linha.

Especifica que JButton deve ser posicionado em relao ao componente anterior

Esse JButton o ltimo componente na linha 2005 by Pearson Education do Brasil

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

// comboBox -- weightx 1: fill BOTH constraints.weighty = 0; constraints.gridwidth = GridBagConstraints.REMAINDER; addComponent( comboBox ); // buttons[3] -- weightx 1: fill BOTH constraints.weighty = 1; constraints.gridwidth = GridBagConstraints.REMAINDER; addComponent( buttons[ 3 ] ); // buttons[4] -- weightx e weighty so 1: fill BOTH constraints.gridwidth = GridBagConstraints.RELATIVE; addComponent( buttons[ 4 ] ); // list -- weightx e weighty so 1: fill BOTH constraints.gridwidth = GridBagConstraints.REMAINDER; addComponent( list ); } // fim do construtor GridBagFrame2 // adiciona um componente ao continer private void addComponent( Component component ) { layout.setConstraints( component, constraints ); add( component ); // adiciona componente } // fim do mtodo addComponent

98

O JComboBox o nico componente na linha

Resumo

GridBagFrame2 .java

(3 de 3) Esse JButton o nico componente na linha Esse JButton o penltimo componente na linha

84 } // fim da classe GridBagFrame2

2005 by Pearson Education do Brasil

1 2 3 4 5 6 7 8 9 10 11 12 13

// Fig. 22.24: GridBagDemo2.java // Demonstrando constantes do GridBagLayout. import javax.swing.JFrame; public class GridBagDemo2 { public static void main( String args[] ) { GridBagFrame2 gridBagFrame = new GridBagFrame2(); gridBagFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); gridBagFrame.setSize( 300, 200 ); // configura o tamanho do frame gridBagFrame.setVisible( true ); // exibe o frame } // fim do main

99

ResumoGridBagDemo2 .java

(1 de 2)

14 } // fim da classe GridBagDemo2

2005 by Pearson Education do Brasil

100

ResumoGridBagDemo2 .java

(2 de 2)

2005 by Pearson Education do Brasil