COMPONENTES GUI (capítulo 11 Deitel) Roberto Willrich INE-CTC-UFSC Carla Merkle Westphall INE-CTC-UFSC E-Mail: [email protected] URL: http://moodle.inf.ufsc.br INE5605-Turma 0238A 1 2 Objetivos Neste capítulo aprenderemos: Construir interfaces gráficas e tratar eventos gerados pelas interações do usuário. Entender os pacotes contendo componentes GUI, classes de tratamento de eventos e interfaces. Criar e manipular botões, labels, listas, campos de texto e painéis. Tratar eventos de manipulação do mouse e de teclado. Usar o layout managers para organizar os componentes GUI 2005 Pearson Education, Inc. All rights reserved. 3 Introdução • Interfaces gráficas (GUI) – Oferecem um mecanismo amigável de interação com as aplicações – Normalmente contém barra de título, barra de menu contendo menus, botões e campos de texto – Construídos a partir de componentes GUI 2005 Pearson Education, Inc. All rights reserved. 4 Botão Menus Barra de título Barra de menus Campo de texto Barras de rolagem Internet Explorer com componentes GUI. 2005 Pearson Education, Inc. All rights reserved. 5 Entrada/Saída Simples Baseada em GUI comJOptionPane • Caixas de diálogo – Usada pelas aplicações para interagir com o usuário – Oferecida pela classe Java JOptionPane • Contém diálogos de entrada e de mensagem 2005 Pearson Education, Inc. All rights reserved. 1 2 // Arquivo: Adicao.java // Programa Adicao que usa JOptionPane para entrada e saída. 3 import javax.swing.JOptionPane; // programa usa JOptionPane 6 Resumo 4 5 public class Adicao 6 { 7 8 public static void main( String args[] ) { Mostra caixa de entrada para receber o primeiro inteiro Adicao.java (1 de 2) 9 // Obtém entradas do usuário a partir do diálogos de entrada JOptionPane 10 11 12 String primeiroNumero = Mostra caixa de entrada para JOptionPane.showInputDialog( "Digite primeiro numero" ); receber o segundo inteiro String segundoNumero = 13 14 15 16 17 18 19 20 21 22 23 JOptionPane.showInputDialog( "Digite segundo numero" ); // converte entrada em String para um valor int para usar no cálculo int numero1 = Integer.parseInt( primeiroNumero ); int numero2 = Integer.parseInt( segundoNumero ); int soma = numero1 + numero2; // adiciona os números Mostra caixa de mensagem para apresentar a soma ao usuário // Apresenta o resultado em uma janela de diálogo JOptionPane x JOptionPane.showMessageDialog( null, "A soma é " + soma, "Soma de dois inteiros", JOptionPane.PLAIN_MESSAGE ); 24 } // fim do método main 25 } // fim da classe Adição 2005 Pearson Education, Inc. All rights reserved. Caixa de Dialogo: Caixa de Mensagem 7 • Classe JOptionPane – Método JOptionPane.showMessageDialog • Argumentos – Primeiro usado para posicionamento na tela • Null para colocar a caixa no centro da tela do frame default – Segundo é a String a apresentar – Terceiro é o titulo da janela – Quarto é o tipo de mensagem // Imprime linhas na caixa de dialogo import javax.swing.JOptionPane; // importa classe JOptionPane public class Dialog2 { public static void main( String args[] ) { // apresenta um dialogo com a mensagem JOptionPane.showMessageDialog( null, "Bem vindo\na\nJava" , "Titulo", JOptionPane.INFORMATION_MESSAGE); } } 2005 Pearson Education, Inc. All rights reserved. 8 Caixas de diálogos apresentadas pelas linhas 10–11 Prompt para o usuário Campo de texto em que o usuário digita um valor Quando o usuário clica em OK, showInputDialog retorna para o programa o 2 digitado pelo usuário como uma String. O programa deve converter o String para um int Adicao.java (2 de 2) Caixa de entrada apresentada pelas linhas 12–13 Barra de titulo Caixa de mensagem apresentada pelas linhas 22–23 Quando o usuário clica em OK, a caixa de mensagem desaparece 2005 Pearson Education, Inc. All rights reserved. 9 Tipo de mensagens Icone Descrição ERROR_MESSAGE Um diálogo que indica um erro ao usuario. INFORMATION_MESSAGE Um diálogo com uma mensagem informacional para o usuário. WARNING_MESSAGE Um diálogo de advertência indicando um problema potencial. QUESTION_MESSAGE Um diálogo que questiona o usuário. Ela normalmente requer uma resposta, tal como clicar um botão Sim ou um Não. PLAIN_MESSAGE sem icone Um diálogo que contém uma mensagem, mas sem icone. Constantes static JOptionPane para caixas de dialogo. 2005 Pearson Education, Inc. All rights reserved. 10 Visão Geral dos Componentes Swing • Componentes GUI Swing – Declarados no pacote javax.swing – Muitos deles são componentes Java puros – Parte das Java Foundation Classes (JFC) • É um framework gráfico para construir interfaces gráficas (GUIs) portáveis baseadas em Java. JFC consiste do AWT (Abstract Window Toolkit), Swing e Java 2D. Juntos, eles oferecem uma interface gráfica para programas em Java que rodam em plataformas populares como Microsoft Windows, Linux, e Mac OSX. 2005 Pearson Education, Inc. All rights reserved. 11 Componente Descrição JLabel Apresenta ícones e textos não editáveis. JTextField Permite ao usuário digitar dados a partir do teclado. Ela pode também ser usada para apresentar texto editável ou não editável. JButton Ativa um evento quando clicado com o mouse. JCheckBox Componente GUI que pode estar no estado selecionado ou não selecionado. JComboBox Fornece uma lista escamoteável de itens a partir da qual o usuário pode fazer uma seleção clicando um item ou possivelmente digitando na caixa. JList Fornece uma lista de itens no qual o usuário pode fazer uma seleção clicando em qualquer item na lista. Vários elementos podem ser selecionados. JPanel Fonece uma área na qual componentes podem ser colocados e organizados. Podem também ser usados como uma área de desenho para grafismos. Alguns componentes gráficos básicos. 2005 Pearson Education, Inc. All rights reserved. 12 Swing vs. AWT • Abstract Window Toolkit (AWT) – Precursor do Swing – Declarado no pacote java.awt – Não oferece uma apresentação multi-plataforma consistente 2005 Pearson Education, Inc. All rights reserved. 13 Tópico de portabilidade Componentes Swing são implementados em Java, assim elas são mais portáveis e flexíveis que os componentes GUI Java do pacote java.awt, que foram baseadas nos componentes GUI da plataforma de base. Por esta razão, componentes Swing são geralmente preferidos. 2005 Pearson Education, Inc. All rights reserved. 14 Componentes GUI Leves vs. Pesados • Componentes leves – Não depende diretamente de componentes GUI suportados pela plataforma de base • Componentes pesados – Dependentes diretamente da plataforma local (S.O.) – Componentes AWT – Alguns componentes Swing 2005 Pearson Education, Inc. All rights reserved. 15 Observação A forma de apresentação da interface definida por componentes GUI pesados a partir do pacote java.awt varia de acordo com a plataforma. Como componentes pesados são ligados a GUI da plataforma local, a forma de apresentação varia de plataforma para plataforma. 2005 Pearson Education, Inc. All rights reserved. 16 Superclasses dos componentes GUI leves do Swing • Classe Component (pacote java.awt) – Subclasse de Object – Declara muitos comportamentos e atributos comuns aos componentes GUI • Classe Container (pacote java.awt) – Subclasse de Component – Organiza Components • Classe JComponent (pacote javax.swing) – Subclasse de Container – Superclasse de todos os componentes Swing leves 2005 Pearson Education, Inc. All rights reserved. Apresentação de Textos e Imagens em uma Janela 17 • Classe JFrame – Muitas janelas são instancias ou subclasse desta classe – Oferece uma barra de título – Oferece botões para minimizar, maximizar ou fechar a aplicação 2005 Pearson Education, Inc. All rights reserved. 18 Nomeando componentes GUI • Label – Instruções ou informações textuais indicando o propósito de cada componentes – Criado com a classe JLabel 2005 Pearson Education, Inc. All rights reserved. 19 Especificando o Layout • Containers de layout (Layout Containers) – Determina onde os componentes são colocados no container – Feito em Java com gerenciadores de layout (layout managers) • Uma destas classes é FlowLayout – Configurado com o método setLayout da classe JFrame 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: LabelFrame.java 2 3 4 // Demonstrando a classe Jlabel. import java.awt.FlowLayout; // especifica como componentes são arranjados import javax.swing.JFrame; // prove as caracteristicas basicas da janela 5 6 7 8 9 import import import import 20 Resumo javax.swing.JLabel; // apresenta textos e imagens javax.swing.SwingConstants; // Constantes comuns usadas com Swing javax.swing.Icon; // interface usada para processar imagens javax.swing.ImageIcon; // carrega imagens LabelFrame.java (1 de 2) 10 public class LabelFrame extends JFrame 11 { 12 private JLabel label1; // JLabel com apenas um texto 13 14 15 16 17 private JLabel label2; // JLabel construido com texto e icone private JLabel label3; // JLabel com texto adicionado com icone 18 { 19 20 // construtor LabelFrame adiciona JLabels a JFrame public LabelFrame() super( "Testando JLabel" ); // construtor de JFrame passando o título setLayout( new FlowLayout() ); // define o frame layout 21 22 // construtor JLabel com um argumento string 23 24 label1 = new JLabel( "Label com texto" ); label1.setToolTipText( "Este é o label1" ); 25 26 add( label1 ); // adiciona label1 ao JFrame 2005 Pearson Education, Inc. All rights reserved. 27 28 29 30 // construtor JLabel com argumentos string, Icon e alinhamento 21 Resumo Icon bug = new ImageIcon( getClass().getResource( "bug1.gif" ) ); label2 = new JLabel( "Label com texto e icone", bug, SwingConstants.LEFT ); 31 32 33 34 label2.setToolTipText( "Este é label2" ); add( label2 ); // adiciona label2 ao JFrame 35 36 label3.setText( "Label com icone e texto no botão " ); label3.setIcon( bug ); // adiciona icone ao JLabel 37 38 39 label3.setHorizontalTextPosition( SwingConstants.CENTER ); label3.setVerticalTextPosition( SwingConstants.BOTTOM ); label3.setToolTipText( "Este é label3" ); LabelFrame.java label3 = new JLabel(); // construtor JLabel sem argumentos (2 de 2) 40 add( label3 ); // adiciona label3 ao JFrame 41 } // fim do construtor LabelFrame 42 } // fim da classe LabelFrame 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: TesteLabel.java 2 // Testando LabelFrame. 3 import javax.swing.JFrame; 22 Resumo 4 5 public class TesteLabel 6 { TesteLabel.java 7 public static void main( String args[] ) 8 { 9 LabelFrame labelFrame = new LabelFrame(); // cria LabelFrame 10 labelFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 labelFrame.setSize( 275, 180 ); // define tamanho do frame 12 labelFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe TesteLabel 2005 Pearson Education, Inc. All rights reserved. 23 Criando e anexando label1 • Construtor tendo como argumento o texto • Método setToolTipText da classe JComponent – Especifica o texto de ajuda (tool tip) • Método add da classe Container – Adiciona um componente em um container label1 = new JLabel( "Label com texto" ); label1.setToolTipText( "Este é o label1" ); add( label1 ); // adiciona label1 ao JFrame 2005 Pearson Education, Inc. All rights reserved. 24 Observação Use tool tips para adicionar um texto descritivo nos seus componentes gráficos. Este texto ajuda o usuário na determinação dos objetivos dos componentes da interface. 2005 Pearson Education, Inc. All rights reserved. 25 Erro comum de programação Se você esquece de adicionar um componente no container, este componente não será apresentado quando o container aparecer na tela. 2005 Pearson Education, Inc. All rights reserved. 26 Criando e Anexando label2 • Texto, ícone e posicionamento são passados no construtor de JLabel – Interface Icon: • Pequena imagem de tamanho fixo • IconImage é uma implementação da interface Icon que apresenta ícones a partir de Images – Images são criadas a partir de URL, nome do arquivo ou array de bytes pré-carregados com MediaTracker – No exemplo é passado o URL (getClass().getRessource()) Icon bug = new ImageIcon( getClass().getResource( "bug1.gif" ) ); label2 = new JLabel( "Label com texto e icone", bug, SwingConstants.LEFT ); label2.setToolTipText( "Este é label2" ); add( label2 ); // adiciona label2 ao JFrame 2005 Pearson Education, Inc. All rights reserved. 27 Criando e Anexando label3 • Construtor default e uso de métodos JLabel – getText e setText • Para definir e recuperar o texto de um label – getIcon e setIcon • Para definir e recuperar o ícone apresentado no label – getHorizontalTextPosition e setHorizontalTextPosition • Para definir e recuperar a posição horizontal do texto apresentado no label label3 = new JLabel(); // construtor JLabel sem argumentos label3.setText( "Label com icone e texto no botão " ); label3.setIcon( bug ); // adiciona icone ao JLabel label3.setHorizontalTextPosition( SwingConstants.CENTER ); label3.setVerticalTextPosition( SwingConstants.BOTTOM ); label3.setToolTipText( "Este é label3" ); add( label3 ); // adiciona label3 ao JFrame 2005 Pearson Education, Inc. All rights reserved. 28 Criando e Anexando label2 • Interface SwingConstants – Declara um conjunto de constantes inteiras comuns tal como aquela usada para definir o alinhamento dos componentes – Pode ser usada com métodos setHorizontalAlignment e setVerticalAlignment 2005 Pearson Education, Inc. All rights reserved. 29 Constante Descrição Constantes de posicionamento horizontal SwingConstants.LEFT SwingConstants.CENTER SwingConstants.RIGHT Coloca texto na esquerda. Coloca texto no centro. Coloca texto na direita. Constantes de posicionamento vertical SwingConstants.TOP SwingConstants.CENTER SwingConstants.BOTTOM Coloca texto no topo. Coloca texto no centro. Coloca texto em baixo. Alguns componentes GUI básicos 2005 Pearson Education, Inc. All rights reserved. 30 Criando e Apresentando a janela LabelFrame • Outros métodos JFrame – setDefaultCloseOperation • Indica como a aplicação reage quando o usuário clica no botão fechar – setSize • Especifica a altura e largura da janela – setVisible • Determina se a janela é apresentada (true) ou não (false) public static void main( String args[] ) { LabelFrame labelFrame = new LabelFrame(); // cria LabelFrame labelFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); labelFrame.setSize( 275, 180 ); // define tamanho do frame labelFrame.setVisible( true ); // apresenta frame } // fim do main 2005 Pearson Education, Inc. All rights reserved. Campos de texto e uma introdução a tratamento de eventos com classes aninhadas 31 • GUIs são orientadas a eventos – Uma interação do usuário cria um evento • Eventos comuns são clicar um botão, digitar em um campo de texto, selecionar um item em um menu, fechar uma janela, mover o mouse, etc. – O evento causa uma chamada a um método chamado de tratador de eventos (event handler) 2005 Pearson Education, Inc. All rights reserved. Campos de texto e uma introdução a tratamento de eventos com classes aninhadas 32 • Classe JTextComponent – Superclasse de JTextField • Superclasse de JPasswordField – Adiciona o caractere echo para esconder a entrada de texto no componente 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: FrameCampoDeTexto.java 2 3 // Demonstrando a classe JTextField. import java.awt.FlowLayout; 4 import java.awt.event.ActionListener; 5 6 7 8 9 import import import import import 33 Resumo java.awt.event.ActionEvent; javax.swing.JFrame; javax.swing.JTextField; javax.swing.JPasswordField; javax.swing.JOptionPane; FrameCampoDe Texto.java (1 de 3) 10 11 public class FrameCampoDeTexto extends JFrame 12 { 13 private JTextField campoDeTexto1; // campo de texto com tamanho definido 14 private JTextField campoDeTexto2; // campo de texto construido com texto 15 16 private JTextField campoDeTexto3; // campo de texto com texto e tamanho private JPasswordField campoPassword; // campo password com texto 17 18 19 20 21 22 // Construtor FrameCampoDeTexto adiciona JTextFields a JFrame public FrameCampoDeTexto () { super( "Testando JTextField e JPasswordField" ); // título do JFrame setLayout( new FlowLayout() ); // atribui frame layout 23 24 25 26 Cria um novo JTextField // Constroi textfield com 10 colunas campoDeTexto1 = new JTextField( 10 ); add( campoDeTexto1 ); // adiciona campoDeTexto1 ao JFrame 27 2005 Pearson Education, Inc. All rights reserved. 28 29 30 31 32 33 // Constroi campo de texto com texto default campoDeTexto2 = new JTextField( "Digite um texto aqui " ); Resumo 34 add( campoDeTexto2 ); // adiciona campoDeTexto2 ao JFrame Cria um novo JTextField // constroi campo de texto com texto default e 21 colunas campoDeTexto3 = new JTextField( "Texto de campo não editavel", 21 ); FrameCampoDe Texto.java novo JTextField não (2 de 3) editável 34 35 36 37 campoDeTexto3.setEditable( false ); // desabilita edição add( campoDeTexto3 ); // adiciona campoDeTexto ao JFrame Cria um 38 39 40 campoPassword = new JPasswordField( "Texto Escondido" ); add( campoPassword ); // adiciona campoPassword ao JFrame 41 42 // registra tratador de evento TratadorCampoDeTexto tratador = new TratadorCampoDeTexto(); 43 44 campoDeTexto1.addActionListener( tratador ); campoDeTexto2.addActionListener( tratador ); 45 46 47 48 49 50 51 52 53 campoDeTexto3.addActionListener( tratador ); campoPassword.addActionListener( tratador ); } // fim do construtor FrameCampoDeTexto 54 55 56 // constroi campoPassword com texto default Cria um novo JPasswordField Criar tratador de evento Registra tratador de evento // classe interna privada para tratamento de eventos private class TratadorCampoDeTexto implements ActionListener Cria uma classe tratador de evento { pela implementação da interface // processa eventos no campo de texto ActionListener public void actionPerformed( ActionEvent event ) { String string = ""; // declara string a apresentar Declara método actionPerformed 2005 Pearson Education, Inc. All rights reserved. 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 // usuario clicou Enter no JTextField campoDeTexto1 Outline if ( event.getSource() == campoDeTexto1 ) 35 Testa se a fonte do evento é o primeiro campo de texto string = String.format( "campoDeTexto1: %s", event.getActionCommand() ); Obtém texto do campo de texto // usuario clicou Enter no JTextField campoDeTexto2 FrameCampoDe else if ( event.getSource() == campoDeTexto2 ) Testa se a fonte do eventoTexto.java éo string = String.format( " campoDeTexto2: %s", segundo campo de texto event.getActionCommand() ); (3 de 3) Obtém texto do campo de texto // usuario clicou Enter no JTextField campoDeTexto3 else if ( event.getSource() == campoDeTexto3 ) Testa string = String.format( " campoDeTexto3: %s", event.getActionCommand() ); se a fonte do evento é o terceiro campo de texto Obtém texto do campo de texto // usuario clicou Enter no JTextField campoPassword else if ( event.getSource() == campoPassword ) Testa se a fonte do evento é o string = String.format( "campoPassword: %s", campo password new String(campoPassword.getPassword() ) ); // apresenta conteudo do JtextField JOptionPane.showMessageDialog( null, string ); } // fim do método actionPerformed Obtém password do campo password 80 } // fim da classe interna privada TratadorCampoDeTexto 81 } // fim da classe FrameCampoDeTexto 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: TesteCampoDeTexto.java 2 // Testando FrameCampoDeTexto. 3 import javax.swing.JFrame; 36 Outline 4 5 public class TesteCampoDeTexto 6 { 7 public static void main( String args[] ) 8 { TesteCampoDe Texto.java 9 FrameCampoDeTexto frameCampoDeTexto = new FrameCampoDeTexto (); 10 frameCampoDeTexto.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 frameCampoDeTexto.setSize( 325, 120 ); // define tamanho do frame 12 frameCampoDeTexto.setVisible( true ); // apresenta frame 13 (1 de 2) } // fim do main 14 } // fim da classe TesteCampoDeTexto 2005 Pearson Education, Inc. All rights reserved. 37 Resumo TesteCampoDe Texto.java (2 de 2) 2005 Pearson Education, Inc. All rights reserved. Passos necessários para configurar um tratador de eventos para um componente gráfico 38 • Vários passos são necessários para uma aplicação responder eventos – Criar uma classe para um tratador de evento • Implementa uma interface event-listener apropriada – Registrar o tratador de eventos TratadorCampoDeTexto tratador = new TratadorCampoDeTexto(); campoDeTexto1.addActionListener( tratador ); //... private class TratadorCampoDeTexto implements ActionListener { // processa eventos no campo de texto public void actionPerformed( ActionEvent event ) { //... } } 2005 Pearson Education, Inc. All rights reserved. 39 Usando uma classe aninhada para implementar um tratador de eventos • Classe de alto-nível (classe externa) – Não declarada dentro de outra classe • Classes aninhada – Declarada dentro de outra classe – Classes aninhadas não-static são chamadas classes internas • Com freqüência usadas para tratamento de eventos public class FrameCampoDeTexto extends JFrame { //... private class TratadorCampoDeTexto implements ActionListener { //... } } 2005 Pearson Education, Inc. All rights reserved. 40 Observação Um classe interna pode acessar diretamente os atributos e métodos da classe externa, mesmo se eles são private. 2005 Pearson Education, Inc. All rights reserved. 41 Usando uma classe aninhada para implementar um tratador de eventos •JTextFields e JPasswordFields – Digitando “enter” dentro destes campos causa um ActionEvent • Processado pelos objetos que implementam a interface ActionListener 2005 Pearson Education, Inc. All rights reserved. 42 Registrando o tratador de eventos para cada campo de texto • Registrando um tratador de evento – Chamando método addActionListener para registrar um objeto ActionListener – ActionListener observa eventos no objeto TratadorCampoDeTexto tratador = new TratadorCampoDeTexto(); campoDeTexto1.addActionListener( tratador ); 2005 Pearson Education, Inc. All rights reserved. 43 Erro comum de programação Esquecer de registrar um objeto tratador de evento para tratar um evento particular de componente gráfico faz com que os eventos sejam ignorados. 2005 Pearson Education, Inc. All rights reserved. Detalhes do método actionPerformed da classe TratadorCampoDeTexto 44 • Fonte do evento – Componente na qual o evento foi originado – Pode ser determinada usando o método getSource – Texto de um JTextField pode ser obtido usando getActionCommand – Texto de um JPasswordField pode ser obtido usando getPassword (retorna um char[]) private class TratadorCampoDeTexto implements ActionListener { // processa eventos no campo de texto public void actionPerformed( ActionEvent event ) { String string = ""; // declara string a apresentar // usuario clicou Enter no JTextField campoDeTexto1 if ( event.getSource() == campoDeTexto1 ) string = String.format( "campoDeTexto1: %s", event.getActionCommand() ); 2005 Pearson Education, Inc. All rights reserved. Tipos de eventos gráficos comuns e interfaces Listener 45 • Tipos de eventos – Todos são subclasses de AWTEvent – Alguns declarados no pacote java.awt.event – Aqueles específicos dos componentes Swing são declarados em javax.swing.event • Modelo de evento de delegação: – A origem do evento é o componente com o qual o usuário interage. – O objeto do evento é criado e contém as informações sobre o evento que aconteceu. – O ouvinte de evento é notificado quando um evento acontece. 2005 Pearson Education, Inc. All rights reserved. 46 Algumas classes de evento do pacote java.awt.event. 2005 Pearson Education, Inc. All rights reserved. 47 Algumas interfaces comuns do pacote java.awt.event. 2005 Pearson Education, Inc. All rights reserved. 48 Invocação do tratamento de evento • Eventos são notificados para apenas um tratador de evento que casa com o tipo de evento – Eventos tem um único event ID especificando o tipo de evento • ActionEvents são manipulados pelos ActionListeners • MouseEvents são manipulados pelos MouseListeners e MouseMotionsListeners • KeyEvents são manipulados por KeyListeners 2005 Pearson Education, Inc. All rights reserved. 49 Tratamento de evento • Perguntas remanescentes: – Como o handler de evento ficou registrado? – Como o componente GUI sabe chamar actionPerformed em vez de algum outro método de tratamento de evento? • Cada JComponent tem uma variável de instância listenerList: – Objeto do tipo EventListenerList. – Mantém referências a todos os seus ouvintes registrados. 2005 Pearson Education, Inc. All rights reserved. Registro de evento para JTextField textField1 50 2005 Pearson Education, Inc. All rights reserved. 51 JButton • Botão – Componente que o usuário clica para lançar uma ação específica – Pode ser botões de comando, caixas de marcação (check box), botões de alternância e botões de opção – Tipos de botões são subclasses de AbstractButton 2005 Pearson Education, Inc. All rights reserved. 52 Hierarquia do Botão Swing. 2005 Pearson Education, Inc. All rights reserved. 53 JButton • Botões de comando – Criado com a classe JButton – Texto na face do botão é chamado de rótulo (label) do botão – Gera um ActionEvent quando ele é clicado 2005 Pearson Education, Inc. All rights reserved. 1 2 3 // Arquivo: FrameBotao.java // Cria JButtons. import java.awt.FlowLayout; 4 5 6 7 8 9 import import import import import import Resumo java.awt.event.ActionListener; java.awt.event.ActionEvent; javax.swing.JFrame; javax.swing.JButton; javax.swing.Icon; javax.swing.ImageIcon; 10 import javax.swing.JOptionPane; 11 12 public class FrameBotao extends JFrame 13 { 14 private JButton plainJButton; // botão com um texto 15 private JButton fancyJButton; // botão com icones 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 54 FrameBotao.java (1 de 2) Declara dois atributos JButton // FrameBotao adiciona JButtons ao JFrame public FrameBotao() { super( "Testando botões " ); setLayout( new FlowLayout() ); // define frame layout Cria novo JButton dois ImageIcons plainJButton = new JButton( "Plain Button" ); // botão Cria com texto add( plainJButton ); // adiciona plainJButton ao JFrame Cria novo JButton Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) ); Icon bug2 = new ImageIcon( getClass().getResource( "bug2.gif" ) ); Define rollover icon para fancyJButton = new JButton( "Fancy Button", bug1 ); // set image fancyJButton.setRolloverIcon( bug2 ); // set rollover image JButton add( fancyJButton ); // adiciona fancyJButton ao JFrame 2005 Pearson Education, Inc. All rights reserved. 31 32 33 34 Resumo TratadorBotao tratador = new TratadorBotao(); fancyJButton.addActionListener(tratador); 35 36 37 38 39 plainJButton.addActionListener(tratador); } // fim do construtor FrameBotao 40 { Cria tratador para botões // classe interna para tratar eventos do botão private class TratadorBotao implements ActionListener 41 42 // trata eventos do botão public void actionPerformed( ActionEvent event ) 43 { 44 45 46 47 55 // cria novo ButtonHandler para tratar eventos do botão FrameBotao.java (2 de 2) Registra tratador de eventos Classe interna implementa ActionListener JOptionPane.showMessageDialog( FrameBotao.this, String.format( "Você clicou: %s", event.getActionCommand() ) ); } // fim do método actionPerformed Acesso a atributo } // fim da classe interna TratadorBotao 48 } // fim da classe FrameBotao da classe externa usando a referência this Obtém texto do JButton clicado 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: TesteBotao.java 2 // Testando FrameBotao. 3 import javax.swing.JFrame; 56 Resumo 4 5 public class TesteBotao 6 { 7 public static void main( String args[] ) 8 { TesteBotao.java (1 de 1) 9 FrameBotao frameBotao = new FrameBotao (); // cria FrameBotao 10 frameBotao.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 frameBotao.setSize( 275, 110 ); // define o tamanho do frame 12 frameBotao.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe TesteBotao 2005 Pearson Education, Inc. All rights reserved. 57 JButton •JButtons pode ter um ícone de alternância (rollover icon) – Aparece quando o mouse é posicionado sobre o botão – Adicionado ao JButton com o método setRolloverIcon Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) ); Icon bug2 = new ImageIcon( getClass().getResource( "bug2.gif" ) ); fancyJButton = new JButton( "Fancy Button", bug1 ); // set image fancyJButton.setRolloverIcon( bug2 ); // set rollover image add( fancyJButton ); // adiciona fancyJButton ao JFrame 2005 Pearson Education, Inc. All rights reserved. 58 Observação Quando usado na classe interna, a palavra-chave this referencia o objeto da classe interna atualmente sendo manipulado. Um método da classe interna pode acessar o objeto da classe externa precedendo o this do nome da classe externa e um ponto, como em FrameBotao.this. 2005 Pearson Education, Inc. All rights reserved. 59 Botões que mantém um estado • Botões com estado – Swing contém três tipos de botões com estado – JToggleButton, JCheckBox and JRadioButton – JCheckBox e JRadioButton são subclasses de JToggleButton 2005 Pearson Education, Inc. All rights reserved. 60 JCheckBox •JCheckBox – Contém um rótulo que aparece na direita do check box por default – Gera um ItemEvent quando este é clicado • ItemEvents são tratados por ItemListener • Passado para o método itemStateChanged – Método isSelected retorna se o check box é selecionado (true) ou não (false) 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: CheckBoxFrame.java 2 // Criando botões JCheckBox. 3 4 import java.awt.FlowLayout; import java.awt.Font; 5 6 import java.awt.event.ItemListener; import java.awt.event.ItemEvent; 7 8 9 10 11 import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.JCheckBox; 61 Outline public class CheckBoxFrame extends JFrame CheckBoxFrame .java (1 de 3) Declara dois atributos JCheckBox 12 { 13 14 15 private JTextField campoDeTexto; // apresenta texto com fonte definida private JCheckBox boldJCheckBox; // para selecionar/não selecionar negrito private JCheckBox italicJCheckBox; // para selecionar/não selecionar italic 16 17 // Construtor CheckBoxFrame adiciona JCheckBoxes ao JFrame 18 19 20 public CheckBoxFrame() { super( "Teste de JCheckBox" ); // define titulo 21 setLayout( new FlowLayout() ); // define frame layout Define fonte do campo de texto 22 23 // Configura JTextField e define sua fonte 24 25 26 campoDeTexto = new JTextField( "Observe a troca do estilo da fonte", 20 ); campoDeTexto.setFont( new Font( "Serif", Font.PLAIN, 14 ) ); add( campoDeTexto ); // adiciona textField ao JFrame 27 2005 Pearson Education, Inc. All rights reserved. 28 29 30 boldJCheckBox = new JCheckBox( "Bold" ); // cria bold checkbox italicJCheckBox = new JCheckBox( "Italic" ); // cria italic Outline add( boldJCheckBox ); // adiciona bold checkbox ao JFrame add( italicJCheckBox ); // adiciona italic checkbox ao JFrame 31 Cria dois JCheckBoxes 32 33 // registra listeners de JCheckBoxes 34 35 CheckBoxHandler handler = new CheckBoxHandler(); boldJCheckBox.addItemListener( handler ); 36 italicJCheckBox.addItemListener( handler ); CheckBoxFrame Cria event handler .java (2 de 3) Registra event handler nos JCheckBoxes 37 38 } // fim do construtor CheckBoxFrame 39 // classe interna privada implementando ItemListener 40 private class CheckBoxHandler implements ItemListener 41 42 { Classe interna implementando ItemListener private int valBold = Font.PLAIN; // controla fonte bold 43 private int valItalic = Font.PLAIN; // controla fonte italic 44 45 46 47 48 49 50 // responde a eventos de checkbox public void itemStateChanged( ItemEvent event ) { // processa eventos em bold checkbox if ( event.getSource() == boldJCheckBox ) valBold = 51 52 62 Método itemStateChanged é chamado quando um JCheckBox é clicado boldJCheckBox.isSelected() ? Font.BOLD : Font.PLAIN; Testa se JCheckBox é selecionado 2005 Pearson Education, Inc. All rights reserved. 53 54 55 56 // processa enventos em italic checkbox 63 Outline if ( event.getSource() == italicJCheckBox ) valItalic = Testa fonte do evento italicJCheckBox.isSelected() ? Font.ITALIC : Font.PLAIN; 57 58 // define fonte do campo de texto 59 campoDeTexto.setFont( 60 61 62 Método isSelected retorna se CheckBoxFrame JCheckBox está selecionado .java new Font( "Serif", valBold + valItalic, 14 ) ); } // fim do método itemStateChanged (3 de 3) } // fim da classe privada interna CheckBoxHandler 63 } // fim da classe CheckBoxFrame 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: CheckBoxTest.java 2 // Testando CheckBoxFrame. 3 import javax.swing.JFrame; 64 Outline 4 5 public class CheckBoxTest 6 { 7 public static void main( String args[] ) 8 { CheckBoxTest .java 9 CheckBoxFrame checkBoxFrame = new CheckBoxFrame(); 10 checkBoxFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 checkBoxFrame.setSize( 275, 100 ); // configura tamanho do frame 12 checkBoxFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe CheckBoxTest 2005 Pearson Education, Inc. All rights reserved. 65 JRadioButton •JRadioButton – Tem dois estados – selecionado e não-selecionado – Normalmente aparece no grupo na qual apenas um botão pode ser selecionado por vez • Grupo mantido por um objeto ButtonGroup – Declara método add para adicionar um JRadioButton ao grupo – Usualmente representa opções múltiplas exclusivas 2005 Pearson Education, Inc. All rights reserved. 66 Erro de programação comum Adicionar um objeto ButtonGroup (ou um objeto de qualquer classe que não seja derivado de Component) ao container resulta em um erro de compilação. 2005 Pearson Education, Inc. All rights reserved. 1 2 3 // Arquivo: RadioButtonFrame.java // Criando botões radio usando ButtonGroup e JRadioButton. import java.awt.FlowLayout; 4 5 6 7 8 9 import import import import import import 67 Outline java.awt.Font; java.awt.event.ItemListener; java.awt.event.ItemEvent; javax.swing.JFrame; javax.swing.JTextField; javax.swing.JRadioButton; RadioButton Frame.java (1 de 3) 10 import javax.swing.ButtonGroup; 11 12 public class RadioButtonFrame extends JFrame 13 { 14 private JTextField textField; // usado para apresentar a troca de fontes 15 private Font plainFont; // fonte para texto plane 16 17 18 19 20 21 private private private private private private 22 23 24 25 26 27 private JRadioButton boldItalicJRadioButton; // negrito e itálico private ButtonGroup radioGroup; // buttongroup para gerenciar botões 28 29 30 Font boldFont; // fonte para texto negrito Font italicFont; // fonte para texto itálico Font boldItalicFont; // fonte para texto negrito e itálico JRadioButton plainJRadioButton; // seleciona texto plano JRadioButton boldJRadioButton; // seleciona texto negrito JRadioButton italicJRadioButton; // seleciona texto itálico Declara quatro JRadioButtons e um ButtonGroup para gerenciar eles // Construtor RadioButtonFrame adiciona JRadioButtons ao JFrame public RadioButtonFrame() { super( "Teste de RadioButton" ); setLayout( new FlowLayout() ); // define frame layout 2005 Pearson Education, Inc. All rights reserved. 31 32 33 34 textField = new JTextField( "Observe a mudança do estilo da fonte", 25 ); 68 Outline add( textField ); // adiciona textField ao JFrame // cria radio buttons 35 36 plainJRadioButton = new JRadioButton( "Plain", true ); boldJRadioButton = new JRadioButton( "Bold", false ); 37 38 39 40 41 italicJRadioButton = new JRadioButton( "Italic", false ); Frame.java boldItalicJRadioButton = new JRadioButton( "Bold/Italic", false ); add( plainJRadioButton ); // adiciona plain button ao JFrame (2 de 3) add( boldJRadioButton ); // adiciona bold button ao JFrame add( italicJRadioButton ); // adiciona italic buttonCria ao JFrame quatro JRadioButtons 42 add( boldItalicJRadioButton ); // adiciona bold e italic button 43 44 45 // cria relacionamento lógico entre JRadioButtons radioGroup = new ButtonGroup(); // cria ButtonGroup 46 radioGroup.add( plainJRadioButton ); // adiciona plain ao grupo 47 radioGroup.add( boldJRadioButton ); // adiciona bold ao grupo 48 49 50 radioGroup.add( italicJRadioButton ); // adiciona italic ao grupo radioGroup.add( boldItalicJRadioButton ); // adiciona bold and italic 51 // cria objetos font 52 53 plainFont = new Font( "Serif", Font.PLAIN, 14 ); boldFont = new Font( "Serif", Font.BOLD, 14 ); 54 55 56 italicFont = new Font( "Serif", Font.ITALIC, 14 ); boldItalicFont = new Font( "Serif", Font.BOLD + Font.ITALIC, 14 ); textField.setFont( plainFont ); // define fonte inicial como plain Font RadioButton Cria o ButtonGroup Adiciona cada JRadioButton ao ButtonGroup 57 2005 Pearson Education, Inc. All rights reserved. 58 59 60 61 62 // Registra observadores de eventos aos JRadioButtons Outline plainJRadioButton.addItemListener( new RadioButtonHandler( plainFont ) ); boldJRadioButton.addItemListener( new RadioButtonHandler( boldFont ) ); 69 Registra um event handler a cada JRadioButton 63 64 65 66 67 italicJRadioButton.addItemListener( new RadioButtonHandler( italicFont ) ); boldItalicJRadioButton.addItemListener( new RadioButtonHandler( boldItalicFont ) ); } // fim do construtor RadioButtonFrame 68 69 // classe interna privada que trata os eventos dos radio button 70 71 72 private class RadioButtonHandler implements ItemListener { Classe private Font font; // fonte associada com este listener RadioButton Frame.java (3 of 3) interna Event handler implementa ItemListener 73 74 public RadioButtonHandler( Font f ) 75 { 76 77 78 font = f; // define o fonte deste listener } // fim do construtor RadioButtonHandler 79 80 // trata eventos dos radio button public void itemStateChanged( ItemEvent event ) 81 { Quando radio button é selecionado, a fonte do campo de texto será alterada para o valor passa text field’s font will be set to the value passed to the constructor 82 textField.setFont( font ); // define a fonte de textField 83 } // fim do método itemStateChanged 84 } // fim da classe interna privada RadioButtonHandler 85 } // fim da classe RadioButtonFrame 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: RadioButtonTest.java 2 // Testando RadioButtonFrame. 3 import javax.swing.JFrame; 70 Outline 4 5 public class RadioButtonTest 6 { 7 public static void main( String args[] ) 8 { RadioButtonTest .java 9 RadioButtonFrame radioButtonFrame = new RadioButtonFrame(); 10 radioButtonFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 radioButtonFrame.setSize( 300, 100 ); // define tamanho do frame 12 radioButtonFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe RadioButtonTest 2005 Pearson Education, Inc. All rights reserved. JComboBox e o uso de classe interna anônima para tratamento de eventos 71 • Combo box – Implementada pela classe JComboBox – Cada item na lista tem um índice – setMaximumRowCount define o número máximo de linhas mostrada por vez – JComboBox oferece uma barra de rolagem e setas cima e baixo para se navegar na lista 2005 Pearson Education, Inc. All rights reserved. 72 Usando uma classe interna anônima para tratamento de eventos • Classe interna anônima – Forma especial de classe interna – Declarada sem um nome – Normalmente aparece dentro de um método – Tem um acesso limitado às variáveis locais 2005 Pearson Education, Inc. All rights reserved. 1 2 3 // Arquivo: ComboBoxFrame.java // Usando um JComboBox para selecionar uma imagem a apresentar. import java.awt.FlowLayout; 4 5 6 7 8 9 import import import import import import 73 Outline java.awt.event.ItemListener; java.awt.event.ItemEvent; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JComboBox; javax.swing.Icon; ComboBoxFrame .java (1 of 2) 10 import javax.swing.ImageIcon; 11 12 public class ComboBoxFrame extends JFrame 13 { 14 private JComboBox imagesJComboBox; // combobox para manter nomes dos ícones 15 private JLabel label; // label para apresentar o ícone selecionado 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Declara um atributo JComboBox private String names[] = { "bug1.gif", "bug2.gif", "travelbug.gif", "buganim.gif" }; private Icon icons[] = { new ImageIcon( getClass().getResource( names[ 0 ] ) ), new ImageIcon( getClass().getResource( names[ 1 ] ) ), new ImageIcon( getClass().getResource( names[ 2 ] ) ), new ImageIcon( getClass().getResource( names[ 3 ] ) ) }; // construtor do ComboBoxFrame adiciona JComboBox ao JFrame public ComboBoxFrame() { super( "Testando JComboBox" ); setLayout( new FlowLayout() ); // define frame layout 2005 Pearson Education, Inc. All rights reserved. 31 32 33 34 35 36 imagesJComboBox = new JComboBox( names ); // define o JComboBox Cria JComboBox imagesJComboBox.setMaximumRowCount( 3 ); // apresenta três linhas e define número máximo de linhas Outline imagesJComboBox.addItemListener( new ItemListener() // classe interna anônima { Cria classe interna anônima como ComboBoxFrame event handler .java event ) 37 38 // trata eventos JComboBox public void itemStateChanged( ItemEvent 39 40 41 { 42 43 44 label.setIcon( icons[ imagesJComboBox.getSelectedIndex() ] ); Testa } // fim do método itemStateChanged 45 46 47 74 Declara método (2 of 2) // determina se o check box é selecionado itemStateChanged if ( event.getStateChange() == ItemEvent.SELECTED ) } // fim da classe interna anônima ); // fim chamada ao addItemListener alteração de estado do JComboBox Método getSelectedIndex localiza item selecionado 48 add( imagesJComboBox ); // adiciona combobox ao JFrame 49 label = new JLabel( icons[ 0 ] ); // apresenta primeiro ícone 50 add( label ); // adiciona label ao JFrame 51 } // fim do construtor ComboBoxFrame 52 } // fim da classe ComboBoxFrame 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: ComboBoxTest.java 2 // Testando ComboBoxFrame. 3 import javax.swing.JFrame; 75 Outline 4 5 public class ComboBoxTest 6 { 7 public static void main( String args[] ) 8 { ComboBoxTest .java 9 ComboBoxFrame comboBoxFrame = new ComboBoxFrame(); 10 comboBoxFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 12 13 comboBoxFrame.setSize( 350, 150 ); // define tamanho do frame comboBoxFrame.setVisible( true ); // apresenta frame } // fim do main 14 } // fim da classe ComboBoxTest Barra de rolagem para visualizar itens na lista Setas de rolagem Caixa de rolagem 2005 Pearson Education, Inc. All rights reserved. 76 Observação Uma classe interna anônima declarada em um método pode acessar atributos e métodos do objeto da classe externa que declara ela, tão bem quanto variáveis locais final do método, mas não podem acessar variáveis não-final do método. 2005 Pearson Education, Inc. All rights reserved. 77 JList • Lista – Apresenta uma série de itens na qual pode-se selecionar um ou mais itens – Implementada pela classe JList – Permite uma lista de seleção simples ou múltipla – Um ListSelectionEvent ocorre quando um item é selecionado • Tratado por um ListSelectionListener e passado ao método valueChanged 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: ListFrame.java 2 3 // Selecionando cores de uma JList. import java.awt.FlowLayout; 4 5 import java.awt.Color; import javax.swing.JFrame; 6 7 8 9 10 import import import import import 78 Outline javax.swing.JList; javax.swing.JScrollPane; javax.swing.event.ListSelectionListener; javax.swing.event.ListSelectionEvent; javax.swing.ListSelectionModel; ListFrame.java (1 of 2) 11 12 public class ListFrame extends JFrame 13 { 14 15 private JList colorJList; // lista apresentando as cores private final String colorNames[] = { "Black", "Blue", "Cyan", 16 "Dark Gray", "Gray", "Green", "Light Gray", "Magenta", 17 "Orange", "Pink", "Red", "White", "Yellow" }; 18 Declara um atributo JList private final Color colors[] = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW }; 19 20 21 22 23 // Construtor ListFrame adiciona JScrollPane contendo JList ao JFrame 24 public ListFrame() 25 26 27 28 { super( "Teste de Lista" ); setLayout( new FlowLayout() ); // define frame layout 2005 Pearson Education, Inc. All rights reserved. 29 30 31 32 33 34 colorJList = new JList( colorNames ); // cria com colorNames colorJList.setVisibleRowCount( 5 ); // apresenta 5 linhas de uma vez Outline Cria JList // Impede seleções múltiplas colorJList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); ListFrame.java modo de seleção do JList (2 de 2) 35 36 Define // adiciona um JScrollPane contendo o JList ao frame add( new JScrollPane( colorJList ) ); 37 38 39 colorJList.addListSelectionListener( new ListSelectionListener() // classe interna Adiciona anônima 40 41 42 43 44 45 79 JList ao ScrollPane e o adiciona à aplicação { // trata eventos de seleção na lista public void valueChanged( ListSelectionEvent event ) { getContentPane().setBackground( colors[ colorJList.getSelectedIndex() ] ); 46 } // fim do método valueChanged 47 } // fim da classe interna anônima 48 ); // fim da chamada a addListSelectionListener 49 } // fim do construtor ListFrame 50 } // fim da classe ListFrame Obtém índice do item selecionado 2005 Pearson Education, Inc. All rights reserved. 1 // Arqyuvi: ListTest.java 2 // Selecionando cores a partir de uma JList. 3 import javax.swing.JFrame; 80 Outline 4 5 public class ListTest 6 { ListTest.java 7 public static void main( String args[] ) 8 { 9 ListFrame listFrame = new ListFrame(); // cria ListFrame 10 listFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 listFrame.setSize( 350, 150 ); // define tamanho do frame 12 listFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe ListTest 2005 Pearson Education, Inc. All rights reserved. 81 Lista de seleção múltipla • Lista de seleção múltipla – Permite aos usuários selecionarem vários itens – Seleção de intervalo simples permite apenas um faixa contínua de itens – Seleção de intervalo múltiplos permite que qualquer conjunto seja selecionado 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: MultipleSelectionFrame.java 2 // Copiando itens de uma lista para outra. 3 import java.awt.FlowLayout; 4 import java.awt.event.ActionListener; 5 6 import java.awt.event.ActionEvent; import javax.swing.JFrame; 7 8 9 10 11 import import import import 82 Outline Multiple SelectionFrame .java javax.swing.JList; javax.swing.JButton; javax.swing.JScrollPane; javax.swing.ListSelectionModel; (1 de 3) 12 public class MultipleSelectionFrame extends JFrame 13 { 14 private JList colorJList; // lista que mantém nome das cores 15 private JList copyJList; // lista que terá as cores transferidas 16 private JButton copyJButton; // botão para copiar os nomes selecionados 17 18 19 20 21 22 23 24 private final String colorNames[] = { "Black", "Blue", "Cyan", "Dark Gray", "Gray", "Green", "Light Gray", "Magenta", "Orange", "Pink", "Red", "White", "Yellow" }; 25 26 // construtor MultipleSelectionFrame public MultipleSelectionFrame() { super( "Multiple Selection Lists" ); setLayout( new FlowLayout() ); // define frame layout 2005 Pearson Education, Inc. All rights reserved. 27 28 29 colorJList = new JList( colorNames ); // mantém nome de todas as cores colorJList.setVisibleRowCount( 5 ); // mostra cinco linhas colorJList.setSelectionMode( Outline 30 31 ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); add( new JScrollPane( colorJList ) ); // adiciona a lista com lista scrollpane Usa uma de seleção 32 33 34 35 copyJButton = new JButton( "Copy >>>" ); // Cria o botão copy copyJButton.addActionListener( 36 37 38 39 40 41 42 43 44 45 46 83 de intervalo múltiplo Multiple SelectionFrame .java new ActionListener() // classe interna anônima { // manipula eventos do botão public void actionPerformed( ActionEvent event ) (2 de 3) { // coloca valores selecionados na copyJList copyJList.setListData( colorJList.getSelectedValues() ); } // fim do método actionPerformed } // fim da classe interna anônima Usa método setListData e ); // fim do addActionListener getSelectedValues para copiar de uma JList para a outra 2005 Pearson Education, Inc. All rights reserved. 47 48 49 add( copyJButton ); // adiciona botão copia ao JFrame Outline copyJList = new JList(); //cria lista que mantem nomes das cores Definecopiadas largura 50 copyJList.setVisibleRowCount( 5 ); // mostra 5 linhas 51 copyJList.setFixedCellWidth( 100 ); // define largura 52 copyJList.setFixedCellHeight( 15 ); // define altura 53 copyJList.setSelectionMode( 54 55 56 84 Define altura ListSelectionModel.SINGLE_INTERVAL_SELECTION ); Multiple SelectionFrame .java add( new JScrollPane( copyJList ) ); // adiciona lista com scrollpane } // fim do construtor MultipleSelectionFrame 57 } // fim da classe MultipleSelectionFrame (3 de 3) Define modo de seleção para seleção de intervalo simples 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: MultipleSelectionTest.java 2 3 // Testando MultipleSelectionFrame. import javax.swing.JFrame; 4 5 public class MultipleSelectionTest 6 7 8 Outline { Multiple SelectionTest .java public static void main( String args[] ) { 9 10 MultipleSelectionFrame multipleSelectionFrame = new MultipleSelectionFrame(); 11 multipleSelectionFrame.setDefaultCloseOperation( 12 85 JFrame.EXIT_ON_CLOSE ); 13 multipleSelectionFrame.setSize( 350, 140 ); // define tamanho do frame 14 multipleSelectionFrame.setVisible( true ); // apresenta frame 15 } // fim do main 16 } // fim da classe MultipleSelectionTest 2005 Pearson Education, Inc. All rights reserved. 86 Tratamento de evento de mouse • Eventos de mouse: – Cria um objeto MouseEvent. – Tratado por MouseListeners e MouseMotionListeners. – MouseInputListener combina as duas interfaces. – A interface MouseWheelListener declara o método mouseWheelMoved para tratar MouseWheelEvents. 2005 by Pearson Education do Brasil 87 M étodosdeinterfaceMouseListenereMouseMotionListener M étodosdeinterfaceMouseListener public void mousePressed( MouseEvent event ) Cham adoquandoumbotãodom ouseépressionadoenquantoo cursordem ouseestiversobreumcom ponente. public void mouseClicked( MouseEvent event ) Cham adoquandoumbotãodom ouseépressionadoeliberado enquantoocursordom ousepairarsobreumcom ponente. Esse eventoésem preprecedidoporum acham adaparamousePressed. public void mouseReleased( MouseEvent event ) Cham adoquandoumbotãodom ouseéliberadodepoisdeser pressionado. Esseeventosem preéprecedidoporum acham adapara m ousePressedeumoum aischam adasparamouseDragged. public void mouseEntered( MouseEvent event ) Cham adoquandoocursordom ouseentranoslim itesdeum com ponente. Métodos de interface MouseListener e MouseMotionListener. (Parte 1 de 2.) 2005 by Pearson Education do Brasil 88 M étodosdeinterfaceMouseListenereMouseMotionListener public void mouseExited( MouseEvent event ) Cham adoquandoocursordom ousedeixaoslim itesdeum com ponente. M étodosdeinterfaceMouseMotionListener public void mouseDragged( MouseEvent event ) Cham adoquandoobotãodom ouseépressionadoenquantoocursorde m ouseestiversobreumcom ponenteeom ouseém ovidoenquantoo botãodom ouseperm anecerpressionado. Esseeventoésem pre precedidoporum acham adaparamousePressed. Todososeventosde arrastarsãoenviadosparaocom ponenteemqueousuáriocom eçoua arrastarom ouse. public void mouseMoved( MouseEvent event ) Cham adoquandoom ouseém ovidoquandoocursordem ouseestiver sobreumcom ponente. Todososeventosdem ovim entosãoenviados paraocom ponentesobreoqual om ouseatualm enteestáposicionado. Métodos de interface MouseListener e MouseMotionListener. (Parte 2 de 2.) 2005 by Pearson Education do Brasil 1 2 // Fig. 11.28: MouseTrackerFrame.java // Demonstrando eventos de mouse. 3 import java.awt.Color; 4 import java.awt.BorderLayout; 5 6 import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; 7 8 import java.awt.event.MouseEvent; import javax.swing.JFrame; 9 import javax.swing.JLabel; 89 Resumo MouseTracker Frame.java (1 de 4) 10 import javax.swing.JPanel; 11 12 public class MouseTrackerFrame extends JFrame 13 { 14 15 private JPanel mousePanel; // painel em que eventos de mouse ocorrerão private JLabel statusBar; // rótulo que exibe informações sobre evento 16 17 // construtor MouseTrackerFrame configura GUI e 18 19 20 21 // registra handlers de evento de mouse public MouseTrackerFrame() { super( "Demonstrating Mouse Events" ); Cria JPanel para capturar eventos de mouse Configura o fundo como branco 22 23 mousePanel = new JPanel(); // cria painel 24 mousePanel.setBackground( Color.WHITE ); // configura cor de fundo 25 JLabel eo add( mousePanel, BorderLayout.CENTER ); // adiciona Cria painel ao JFrame 26 27 statusBar = new JLabel( "Mouse outside JPanel" ); 28 29 adiciona à aplicação add( statusBar, BorderLayout.SOUTH ); // adiciona rótulo ao JFrame 2005 by Pearson Education do Brasil 30 31 // cria e registra listener para mouse e eventos de movimento de mouse MouseHandler handler = new MouseHandler(); 32 mousePanel.addMouseListener( handler ); 33 mousePanel.addMouseMotionListener( handler ); 34 } // fim do construtor MouseTrackerFrame 35 36 37 private class MouseHandler implements MouseListener, MouseMotionListener 38 { 90 Resumo Cria handler de evento para eventos de mouse Registra um handler de evento MouseTracker Frame.java Implementa interfaces ouvintes de mouse (2 de 4) 39 40 41 42 43 // handlers de evento MouseListener // trata evento quando o mouse é liberado logo depois de pressionado public void mouseClicked( MouseEvent event ) { Declara o método mouseClicked statusBar.setText( String.format( "Clicked at [%d, %d]", 44 45 event.getX(), event.getY() ) ); } // fim do método mouseClicked 46 47 48 49 // trata evento quando mouse é pressionado public void mousePressed( MouseEvent event ) { Determina a localização do clique de mouse Declara o método mousePressed statusBar.setText( String.format( "Pressed at [%d, %d]", 50 51 52 53 54 event.getX(), event.getY() ) ); } // fim do método mousePressed 55 public void mouseReleased( MouseEvent event ) 56 57 58 59 { // trata evento quando mouse é liberado depois da operação de arrastar Declara o método mouseReleased statusBar.setText( String.format( "Released at [%d, %d]", event.getX(), event.getY() ) ); } // fim do método mouseReleased 2005 by Pearson Education do Brasil 60 91 61 62 // trata evento quando mouse entra na área public void mouseEntered( MouseEvent event ) 63 { statusBar.setText( String.format( "Mouse entered at [%d, %d]", event.getX(), event.getY() ) ); 64 65 66 67 mousePanel.setBackground( Color.GREEN ); } // fim do método mouseEntered 68 69 70 // trata evento quando mouse sai da área public void mouseExited( MouseEvent event ) 71 { 72 73 74 Resumo Declara o método mouseEntered MouseTracker Frame.java Configura o segundo plano de JPanel (3 de 4) Declara o método mouseExited statusBar.setText( "Mouse outside JPanel" ); mousePanel.setBackground( Color.WHITE ); } // fim do método mouseExited Configura o segundo plano de JPanel 75 2005 by Pearson Education do Brasil 76 // MouseMotionListener event handlers 77 // trata evento MouseMotionListener 78 79 public void mouseDragged( MouseEvent event ) { 80 81 92 Resumo Declara o método mouseDragged statusBar.setText( String.format( "Dragged at [%d, %d]", event.getX(), event.getY() ) ); 82 83 84 } // fim do método mouseDragged MouseTracker Frame.java // trata evento quanto usuário move o mouse (4 de 4) 85 86 public void mouseMoved( MouseEvent event ) { 87 88 89 statusBar.setText( String.format( "Moved at [%d, %d]", event.getX(), event.getY() ) ); } // fim do método mouseMoved Declara o método mouseMoved 90 } // fim da classe MouseHandler interna 91 } // fim da classe MouseTrackerFrame 2005 by Pearson Education do Brasil 1 // Fig. 11.29: MouseTrackerFrame.java 2 // Testando MouseTrackerFrame. 3 import javax.swing.JFrame; 93 Resumo 4 5 public class MouseTracker 6 { 7 public static void main( String args[] ) 8 { MouseTracker Frame.java (1 de 2) 9 MouseTrackerFrame mouseTrackerFrame = new MouseTrackerFrame(); 10 mouseTrackerFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 mouseTrackerFrame.setSize( 300, 100 ); // configura o tamanho do frame 12 mouseTrackerFrame.setVisible( true ); // exibe o frame 13 } // fim de main 14 } // fim da classe MouseTracker 2005 by Pearson Education do Brasil 94 Classes adaptadoras • Classe adaptadora: – Implementa interface ouvinte de evento. – Fornece implementação-padrão (corpo do método vazio) para todos os métodos de tratamento de eventos. 2005 by Pearson Education do Brasil 95 Observação de engenharia de software Quando uma classe implementa uma interface, a classe tem um relacionamento ‘é um’ com essa interface. Todas as subclasses diretas e indiretas dessa classe herdam essa interface. Portanto, um objeto de uma classe que estende uma classe adaptadora de evento é um objeto do tipo ouvinte de eventos correspondente (por exemplo, um objeto de uma subclasse de MouseAdapter é um MouseListener). 2005 by Pearson Education do Brasil 96 Herdando MouseAdapter • MouseAdapter: – Classe adaptadora para as interfaces MouseListener e MouseMotionListener. – Estender a classe permite sobrescrever somente os métodos que você deseja utilizar. 2005 by Pearson Education do Brasil 97 Erro comum de programação Se você estender uma classe adaptadora e digitar incorretamente o nome do método que você está sobrescrevendo, o método simplesmente tornase outro método na classe. Esse é um erro de lógica difícil de ser detectado, visto que o programa chamará a versão vazia do método herdado da classe adaptadora. 2005 by Pearson Education do Brasil 98 C l a s s e a d a p t a d o r a d e e v e n t o e m j a v a . a w t . e v e n t I m p l e m e n t a i n t e r f a c e C o m p o n e n t A d a p t e r C o n t a i n e r A d a p t e r F o c u s A d a p t e r K e y A d a p t e r M o u s e A d a p t e r M o u s e M o t i o n A d a p t e r W i n d o w A d a p t e r C o m p o n e n t L i s t e n e r C o n t a i n e r L i s t e n e r F o c u s L i s t e n e r K e y L i s t e n e r M o u s e L i s t e n e r M o u s e M o t i o n L i s t e n e r W i n d o w L i s t e n e r Classes adaptadoras de evento e as interfaces que elas implementam no pacote java.awt.event. 2005 by Pearson Education do Brasil 1 2 // Fig. 11.31: MouseDetailsFrame.java // Demonstrando cliques de mouse e distinguindo entre botões do mouse. 3 4 import java.awt.BorderLayout; import java.awt.Graphics; 5 import java.awt.event.MouseAdapter; 6 7 8 import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; 99 Resumo MouseDetails Frame.java (1 de 2) 9 10 public class MouseDetailsFrame extends JFrame 11 { 12 private String details; // representação String 13 private JLabel statusBar; // JLabel que aparece no botão de janela 14 15 // construtor configura barra de título String e registra o listener de mouse 16 17 18 19 20 21 22 public MouseDetailsFrame() { super( "Mouse clicks and buttons" ); 23 24 } // fim do construtor MouseDetailsFrame statusBar = new JLabel( "Click the mouse" ); add( statusBar, BorderLayout.SOUTH ); addMouseListener( new MouseClickHandler() ); // adiciona handler Registra um handler de evento 2005 by Pearson Education do Brasil 25 // classe interna para tratar eventos de mouse 26 private class MouseClickHandler extends MouseAdapter 27 { 28 29 30 31 32 100 // trata evento de clique de mouse e determina qual botão foi pressionado public void mouseClicked( MouseEvent event ) { int xPos = event.getX(); // obtém posição x do mouse int yPos = event.getY(); // obtém posição y do mouse MouseDetails Frame.java (2 de 2) 33 34 35 details = String.format( "Clicked %d time(s)", event.getClickCount() ); Obtém 36 37 if ( event.isMetaDown() ) // botão direito do mouse 38 Resumo o número de vezes que o botão do mouse foi clicado details += " with right mouse button"; Testa se o botão direito do mouse foi clicado 39 40 else if ( event.isAltDown() ) // botão do meio do mouse details += " with center mouse button"; Testa se o 41 42 else // botão esquerdo do mouse details += " with left mouse button"; 43 44 statusBar.setText( details ); // exibe mensagem na statusBar botão do meio do mouse foi clicado 45 } // fim do método mouseClicked 46 } // fim da classe interna private MouseClickHandler 47 } // fim da classe MouseDetailsFrame 2005 by Pearson Education do Brasil 1 // Fig. 11.32: MouseDetails.java 2 // Testando MouseDetailsFrame. 3 4 import javax.swing.JFrame; 5 6 public class MouseDetails { 7 8 101 Resumo MouseDetails .java public static void main( String args[] ) { 9 10 MouseDetailsFrame mouseDetailsFrame = new MouseDetailsFrame(); mouseDetailsFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 12 mouseDetailsFrame.setSize( 400, 150 ); // configura o tamanho do frame mouseDetailsFrame.setVisible( true ); // obtém o frame 13 (1 de 2) } // fim de main 14 } // fim da classe MouseDetails 2005 by Pearson Education do Brasil Tabela de Tratamento de Eventos Origem Evento Listener JTextField JPasswordField Jbutton ActionEvent ActionListener JCheckBox JRadioButton ItemEvent ItemListener itemStateChanged(ItemEvent e) JList ListSectionEvent ListSelectionListener actionPerformed(ActionEvent e) valueChanged(ListSelectionEve nt e) Subclasses de java.awt.Compone nt MouseEvent MouseListener mouseClicked(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) Subclasses de java.awt.Compone nt MouseMotionEvent MouseMotionListener mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) 102 Tabela de Tratamento de Eventos Origem Evento Listener Subclasses de java.awt.window WindowEvent WindowListener windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e) Subclasses de java.awt.Compon ent FocusEvent FocusListener focusGained(FocusEvent e) focusLost(FocusEvent e) JScrollBar AdjustmentEven t AdjustmentListener adjustmentValueChanged( AdjustmentEvent e) JMenu MenuEvent MenuListener menuCanceled(MenuEvent e) menuDeselected(MenuEvent e) 103 104 Gerenciadores de Layout • Gerenciadores de Layout – É oferecida uma forma básica de organização dos componentes gráficos no container – Implementam a interface LayoutManager 2005 Pearson Education, Inc. All rights reserved. 105 Observação Muitos ambientes de programação oferecem ferramentas de projeto de interfaces que ajudam o programador a graficamente definir sua interface; a ferramenta de projeto em seguida escreve o código java que implementa a interface. Tais ferramentas com freqüência oferecem um controle maior quanto ao tamanho, posição e alinhamento dos componentes gráficos que os gerenciadores de layout básicos. 2005 Pearson Education, Inc. All rights reserved. 106 Gerenciador de Descrição layout FlowLayout Default para javax.swing.JPanel. Coloca componentes sequencialmente (da esquerda para a direita) na ordem em que são adicionados. Também é possível especificar a ordem dos componentes usando o método add do Container, que tem o Component e um índice inteiro (definindo a posição) como argumentos BorderLayout Default para JFrames (e outras janelas). Arranja os componentes em cinco áreas: NORTH, SOUTH, EAST, WEST and CENTER. GridLayout Arranja os componentes em linhas e colunas. Alguns Gerenciadores de Layout. 2005 Pearson Education, Inc. All rights reserved. 107 FlowLayout •FlowLayout – Gerenciador de layout mais simples – Componentes são colocados da esquerda para a direita na ordem em que são adicionados – Componentes podem ser alinhados a esquerda, centrado ou a direita 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: FlowLayoutFrame.java 2 // Demonstração do alinhamento de FlowLayout. 3 import java.awt.FlowLayout; 4 import java.awt.Container; 5 6 import java.awt.event.ActionListener; import java.awt.event.ActionEvent; 7 8 9 10 11 import javax.swing.JFrame; import javax.swing.JButton; 108 Outline FlowLayoutFrame .java (1 de 3) public class FlowLayoutFrame extends JFrame { 12 13 14 15 private private private private 16 private Container container; // container a configurar layout 17 18 19 20 21 22 23 24 25 26 JButton leftJButton; // botão para configurar alinhamento a esquerda JButton centerJButton; // botão para configurar alinhamento ao centro JButton rightJButton; // botão para configurar alinhamento a direita FlowLayout layout; // objeto layout // Configurar interface e registrar tratamento de eventos public FlowLayoutFrame() { super( "FlowLayout Demo" ); Cria FlowLayout layout = new FlowLayout(); // cria FlowLayout container = getContentPane(); // obtém container para layout setLayout( layout ); // define frame layout Define layout da aplicação 2005 Pearson Education, Inc. All rights reserved. 27 28 29 30 // configura leftJButton e registra listener 109 Outline leftJButton = new JButton( "Left" ); // cria botão Left add( leftJButton ); // adiciona botão Left button ao frame leftJButton.addActionListener( 31 32 33 34 35 36 37 new ActionListener() // classe interna anônima { // processa evento em leftJButton public void actionPerformed( ActionEvent event ) Adiciona JButton; FlowLayout tratará FlowLayoutFrame posicionametno .java (2 of 3) { layout.setAlignment( FlowLayout.LEFT ); 38 39 // realinha componentes anexados 40 layout.layoutContainer( container ); Define alinhamento a esquerda 41 42 43 44 } // fim do método actionPerformed } // fim da classe interna anônima ); // fim de addActionListener 45 46 47 48 49 50 51 // configura centerJButton e registra listener centerJButton = new JButton( "Center" ); // cria botão Center add( centerJButton ); // adiciona botão Center ao frame centerJButton.addActionListener( 52 53 54 55 56 new ActionListener() // classe interna anônima { // processa evento em centerJButton Ajusta layout Adiciona JButton; FlowLayout tratará o posicionamento Define public void actionPerformed( ActionEvent event ) { layout.setAlignment( FlowLayout.CENTER ); alinhamento ao centro 2005 Pearson Education, Inc. All rights reserved. 57 58 59 60 // realinha componentes anexados 110 Outline layout.layoutContainer( container ); } // fim do método actionPerformed Reajusta alinhamento } // fim da classe anônima interna 61 ); // fim de addActionListener 62 63 64 65 66 // configura botão rightJButton e registra listener rightJButton = new JButton( "Right" ); // cria botão Right add( rightJButton ); // adiciona botão Right ao frame rightJButton.addActionListener( 67 68 69 70 71 72 73 74 75 76 77 78 79 80 new ActionListener() // classe interna anônima { // processa evento rightJButton public void actionPerformed( ActionEvent event ) { FlowLayoutFrame .java (3 de 3) Adiciona JButton; FlowLayout tratará posicionamento layout.setAlignment( FlowLayout.RIGHT ); // realinha componentes anexados layout.layoutContainer( container ); } // fim do método actionPerformed } // fim da classe interna anônima ); // fim de addActionListener } // fim do construtor FlowLayoutFrame Define alinhamento a direita Reajusta alinhamento 81 } // fim da classe FlowLayoutFrame 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: FlowLayoutDemo.java 2 // Testando FlowLayoutFrame. 3 import javax.swing.JFrame; 111 Outline 4 5 public class FlowLayoutDemo 6 { 7 public static void main( String args[] ) 8 { FlowLayoutDemo .java 9 FlowLayoutFrame flowLayoutFrame = new FlowLayoutFrame(); 10 flowLayoutFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 flowLayoutFrame.setSize( 300, 75 ); // configura tamanho do frame 12 flowLayoutFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe FlowLayoutDemo 2005 Pearson Education, Inc. All rights reserved. 112 BorderLayout •BorderLayout – Organiza componentes em cinco regiões – north, south, east, west e center – Implementa a interface LayoutManager2 – Fornece espaçamento horizontal e vertical 2005 Pearson Education, Inc. All rights reserved. 113 Observação Se nenhuma região é especificada durante a adição de um Component ao BorderLayout, o gerenciador posicionará este componente na região BorderLayout.CENTER. 2005 Pearson Education, Inc. All rights reserved. 114 Observação Cada container pode ter apenas um gerenciador de layout. Containers separados na mesma aplicação podem usar diferentes gerenciadores de layout. 2005 Pearson Education, Inc. All rights reserved. 115 Erro de programação comum Quando mais de um componente é adicionado em uma região no BorderLayout, apenas o último componente adicionado a esta região será apresentado. Nenhum erro indicará este problema. 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: BorderLayoutDemo.java 2 // Testando BorderLayoutFrame. 3 import javax.swing.JFrame; 116 Outline 4 5 public class BorderLayoutDemo 6 { 7 public static void main( String args[] ) 8 { BorderLayout Demo.java 9 BorderLayoutFrame borderLayoutFrame = new BorderLayoutFrame(); 10 borderLayoutFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 borderLayoutFrame.setSize( 300, 200 ); // define tamanho do frame 12 borderLayoutFrame.setVisible( true ); // apresenta frame 13 (1 de 2) } // fim do main 14 } // fim da classe BorderLayoutDemo Espaço horizontal Espaço vertical 2005 Pearson Education, Inc. All rights reserved. 117 Outline BorderLayout Demo.java (2 of 2) 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: BorderLayoutFrame.java 2 // Demonstrando BorderLayout. 3 4 import java.awt.BorderLayout; import java.awt.event.ActionListener; 5 import java.awt.event.ActionEvent; 6 7 8 9 import javax.swing.JFrame; import javax.swing.JButton; 118 Outline BorderLayout Frame.java public class BorderLayoutFrame extends JFrame implements ActionListener 10 { 11 private JButton buttons[]; // array de botões para esconder porções 12 13 private final String names[] = { "Hide North", "Hide South", "Hide East", "Hide West", "Hide Center" }; 14 private BorderLayout layout; // objeto borderlayout 15 16 17 18 // configura GUI e tratametno de evento public BorderLayoutFrame() { (1 de 2) Declara atributo BorderLayout super( "BorderLayout Demo" ); Cria BorderLayout 19 20 21 22 23 24 25 Define layout = new BorderLayout( 5, 5 ); // espaço de 5 pixel setLayout( layout ); // configura frame layout buttons = new JButton[ names.length ]; // define tamanho do array 26 for ( int count = 0; count < names.length; count++ ) 27 28 29 30 { layout // cria JButtons e registra tratadores de eventos para eles Registra tratador de evento buttons[ count ] = new JButton( names[ count ] ); buttons[ count ].addActionListener( this ); } // fim do for 2005 Pearson Education, Inc. All rights reserved. 31 32 33 119 Outline add( buttons[ 0 ], BorderLayout.NORTH ); // adiciona botão no north add( buttons[ 1 ], BorderLayout.SOUTH ); // adiciona botão no south 34 add( buttons[ 2 ], BorderLayout.EAST ); // adiciona botão no east 35 36 add( buttons[ 3 ], BorderLayout.WEST ); // adiciona botão no west add( buttons[ 4 ], BorderLayout.CENTER ); // adiciona botão no center 37 38 } // fim do construtor BorderLayoutFrame 39 40 41 // trata eventos do botão public void actionPerformed( ActionEvent event ) { BorderLayout Adiciona botões à aplicação usando Frame.java constantes do gerenciador de layout (2 de 2) 42 // Checa a fonte do evento e layout content pane correspondente 43 for ( JButton button : buttons ) 44 45 46 47 48 49 50 { 51 layout.layoutContainer( getContentPane() ); // organiza content pane Torna os botões invisíveis if ( event.getSource() == button ) button.setVisible( false ); // esconde botão clicado Torna else button.setVisible( true ); // mostra outros botões } // end for 52 } // fim do método actionPerformed 53 } // fim da classe BorderLayoutFrame os botões visíveis Atualiza layout 2005 Pearson Education, Inc. All rights reserved. 120 GridLayout •GridLayout – Organização na forma de uma grade (linhas e colunas) – Todo componente tem a mesma altura e largura 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: GridLayoutDemo.java 2 // Testando GridLayoutFrame. 3 import javax.swing.JFrame; 121 Outline 4 5 public class GridLayoutDemo 6 { 7 public static void main( String args[] ) 8 { GridLayoutDemo .java 9 GridLayoutFrame gridLayoutFrame = new GridLayoutFrame(); 10 gridLayoutFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 gridLayoutFrame.setSize( 300, 200 ); // configura tamanho do frame 12 gridLayoutFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe GridLayoutDemo 2005 Pearson Education, Inc. All rights reserved. 1 2 // Arquivo: GridLayoutFrame.java // Demonstrando GridLayout. 3 4 5 6 import import import import 122 Outline java.awt.GridLayout; java.awt.Container; java.awt.event.ActionListener; java.awt.event.ActionEvent; 7 import javax.swing.JFrame; 8 import javax.swing.JButton; 9 10 public class GridLayoutFrame extends JFrame implements ActionListener 11 { 12 13 private JButton buttons[]; // array de botões private final String names[] = 14 15 { "one", "two", "three", "four", "five", "six" }; private boolean toggle = true; // inverter layouts 16 17 private Container container; // frame container private GridLayout gridLayout1; // primeiro gridlayout 18 19 20 21 22 23 24 25 26 private GridLayout gridLayout2; // segundo gridlayout 27 28 29 GridLayout Frame.java (1 de 2) Declara dois atributos GridLayout // construtor sem argumentos public GridLayoutFrame() Cria GridLayout { super( "GridLayout Demo" ); gridLayout1 = new GridLayout( 2, 3, 5, 5 ); // 2 por 3; espaço de 5 gridLayout2 = new GridLayout( 3, 2 ); // 3 por 2; sem espaços container = getContentPane(); // obtém content pane setLayout( gridLayout1 ); // define JFrame layout buttons = new JButton[ names.length ]; // cria array de JButtons Configura layout 2005 Pearson Education, Inc. All rights reserved. for ( int count = 0; count < names.length; count++ ) 30 31 32 123 Outline { buttons[ count ] = new JButton( names[ count ] ); 33 buttons[ count ].addActionListener( this ); // registra listener 34 add( buttons[ count ] ); // adiciona botão ao JFrame } // fim do for 35 36 } // fim do construtor GridLayoutFrame GridLayout Adiciona botões ao JFrame Frame.java 37 38 // trata eventos de botão alterando os layouts 39 public void actionPerformed( ActionEvent event ) 40 { 41 42 43 44 (2 de 2) Usa segundo layout if ( toggle ) container.setLayout( gridLayout2 ); // configura layout para o secondo else Usa primeiro layout container.setLayout( gridLayout1 ); // configura layout para o primeiro 45 46 toggle = !toggle; // inverte valor de toggle 47 container.validate(); // re-layout do container 48 } // fim do método actionPerformed Atualiza layout 49 } // fim da classe GridLayoutFrame 2005 Pearson Education, Inc. All rights reserved. 124 GridBagLayout • Gerenciador do Layout GridBagLayout – É o mais poderoso dos gerenciadores de layout – Semelhante a GridLayout • Mas permite que o tamanho de cada componente varie e que estes possam ser definidos em qualquer ordem. • Componentes podem ocupar múltiplas linhas e colunas – Gerenciador mais utilizado e também o mais complexo • Dado que os demais não têm os facilidades para elaboração de interfaces mais sofisticadas. 2005 Pearson Education, Inc. All rights reserved. 125 GridBagLayout (Cont.) • Tela é dividida em linhas e colunas – representando as células que serão ocupadas pelos componentes; 0 1 2 3 0 1 2 3 4 5 2005 Pearson Education, Inc. All rights reserved. 126 GridBagLayout (Cont.) • Método importante da classe GridBagLayout – public void setConstraints(Component comp, GridBagConstraints constraints) • Define as características de apresentação (restrições) do component comp no layout. 2005 Pearson Education, Inc. All rights reserved. 127 GridBagLayout (Cont.) • Duas classes são importantes para definição do layout – GridBagConstraints • GridBagConstraints() • GridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady) – Insets • Ajustes extras 2005 Pearson Education, Inc. All rights reserved. 128 GridBagLayout (Cont.) gridx especifica a coluna gridy especifica a linha gridwidth especifica o número de células ocupadas na linha pelo componente gridheight especifica o número de células ocupadas na coluna pelo componente weightx especifica como distribuir o espaço horizontal extra weighty especifica como distribuir o espaço vertical extra anchor determina o alinhamento do objeto. CENTER, NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, e NORTHWEST. O padrão é CENTER fill permite o redimensionamento do componente quando este é maior que célula. NONE, HORIZONTAL, VERTICAL, BOTH insets permite realizar ajustes extras no posicionamento dos componentes ipadx permite ajustes adicionais na linha ipady permite ajustes adicionais na coluna 2005 Pearson Education, Inc. All rights reserved. 129 GridBagLayout (Cont.) • Um método útil para simplificar o entendimento – Sendo constraints = new GridBagConstraints(); // Método para definir posicionamento e adição de componente private void addComponent( Component component, int linha, int coluna, int largura, int altura ) { constraints.gridx = coluna; // set gridx constraints.gridy = linha; // set gridy constraints.gridwidth = largura; // set gridwidth constraints.gridheight = altura; // set gridheight layout.setConstraints( component, constraints ); // set constraints add( component ); // adiciona componente } // fim do método addComponent 2005 Pearson Education, Inc. All rights reserved. 130 GridBagLayout (Cont.) • Exemplo de construção da interface private private private private JLabel JLabel JLabel JLabel lblNome = new JLabel("Nome:"); lblSobrenome = new JLabel("Sobrenome:"); lblnumCarteiraTrabalho = new JLabel(“NCT:"); lblSalario = new JLabel("Salario Mensal:"); //Campos de edição private JTextField private JTextField private JTextField private JTextField edtNome = new JTextField(); edtSobrenome = new JTextField(); edtnumCarteiraTrabalho = new JTextField(); edtSalario = new JTextField(); private JButton btnConfirmar = new JButton("Confirmar"); private JButton btnCancelar = new JButton("Cancelar"); 2005 Pearson Education, Inc. All rights reserved. 131 GridBagLayout (Cont.) • Exemplo de construção da interface layout = new GridBagLayout(); setLayout(layout); constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.BOTH; constraints.insets = new Insets(10, 10, 0, 10); addComponent(lblNome, 0, 0, 1, 1); addComponent(edtNome, 0, 1, 3, 1); addComponent(lblSobrenome, 1, 0, 1, 1); addComponent(lblnumCarteiraTrabalho, 2, 0, 1, 1); addComponent(lblSalario, 3, 0, 1, 1); addComponent(edtSobrenome, 1, 1, 3, 1); addComponent(edtnumCarteiraTrabalho, 2, 1, 3, 1); addComponent(edtSalario, 3, 1, 3, 1); addComponent(btnConfirmar, 4, 2, 1, 1); addComponent(btnCancelar, 4, 3, 1, 1); 2005 Pearson Education, Inc. All rights reserved. 132 GridBagLayout (Cont.) • Insets(int top, int left, int bottom, int right) top a distância em relação ao topo left a distância em relação a esquerda bottom a distância em relação a base right a distância em relação a direita top left right bottom 2005 Pearson Education, Inc. All rights reserved. 133 GridBagLayout (Cont.) • Insets(int top, int left, int bottom, int right) – constraints.insets = new Insets(20, 12, 15, 25); 20 25 12 15 2005 Pearson Education, Inc. All rights reserved. Usando Panels para gerenciar layouts mais complexos 134 • Interfaces gráficas complexas com freqüência requerem vários painéis para organizar seus componentes de modo apropriado 2005 Pearson Education, Inc. All rights reserved. 1 2 // Arquivo: PanelFrame.java // Usando um Jpanel para ajudar organizar componentes. 3 4 5 6 import import import import 7 8 9 import javax.swing.JButton; 135 Outline java.awt.GridLayout; java.awt.BorderLayout; javax.swing.JFrame; javax.swing.JPanel; PanelFrame.java (1 de 2) public class PanelFrame extends JFrame 10 { 11 private JPanel buttonJPanel; // painél para apresentar botões 12 13 private JButton buttons[]; // array de botões 14 15 16 // construtor sem argumentos public PanelFrame() { 17 super( "Panel Demo" ); 18 19 20 21 buttons = new JButton[ 5 ]; // cria o array de botões buttonJPanel = new JPanel(); // configura painél buttonJPanel.setLayout( new GridLayout( 1, buttons.length ) ); Declara um JPanel para apresentar botões Cria JPanel Configura layout 2005 Pearson Education, Inc. All rights reserved. 22 23 24 25 // cria e adiciona botões 136 Outline for ( int count = 0; count < buttons.length; count++ ) { buttons[ count ] = new JButton( "Button " + ( count + 1 ) ); 26 27 buttonJPanel.add( buttons[ count ] ); // adiciona botões ao JPanel } // end for 28 29 add( buttonJPanel, BorderLayout.SOUTH ); // 30 } // fim do construtor PanelFrame 31 } // fim da classe PanelFrame PanelFrame.java Adiciona o painel de botões adicional Jpanel ao JFrame (2 de 2) Adiciona painel à aplicação 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: PanelDemo.java 2 // Testando PanelFrame. 3 import javax.swing.JFrame; 137 Outline 4 5 public class PanelDemo extends JFrame 6 { PanelDemo.java 7 public static void main( String args[] ) 8 { 9 PanelFrame panelFrame = new PanelFrame(); 10 panelFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 panelFrame.setSize( 450, 200 ); // configura tamanho do frame 12 panelFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe PanelDemo 2005 Pearson Education, Inc. All rights reserved. 138 Usando Menus com Frames • Menus – Permite ao usuário solicitar ações – Pode ser anexado apenas a objetos da classe que têm o método setMenuBar, tal como JFrame e JApplet – Classe MenuBar • Contém métodos necessários para gerenciar uma barra de menu – Classe JMenu • Contém os métodos necessário para gerenciar menus – Classe JMenuItem • Contém os métodos necessários para gerenciar itens de menu 2005 Pearson Education, Inc. All rights reserved. 139 Usando Menus com Frames (Cont.) – Classe JCheckBoxMenuItem • Contém os métodos necessários para gerenciar itens de menus que pode ser colocados como on ou off – Classe JRadioButtonMenuItem • Contém os métodos necessários para gerenciar itens de menu que podem ser on ou off como em JCheckBoxMenuItems • Quando vários JRadioButtonMenuItems são mantidos como parte de um ButtonGroup, apenas um item no grupo pode ser selecionado – Mnemônicos • Caracteres especiais que podem oferecer acesso rápido ao menu ou item do menu a partir do teclado 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: MenuTest.java 2 // Testando MenuFrame. 3 import javax.swing.JFrame; 140 Outline 4 5 public class MenuTest 6 { MenuTest.java 7 public static void main( String args[] ) 8 { (1 de 2) 9 MenuFrame menuFrame = new MenuFrame(); // cria MenuFrame 10 menuFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 menuFrame.setSize( 500, 200 ); // define tamanho do frame 12 menuFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe MenuTest Menu Caracteres mnemônicos Barra de menu 2005 Pearson Education, Inc. All rights reserved. 141 Outline Submenu expandido MenuTest.java (2 de 2) Menu items Linha separadora 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: MenuFrame.java 2 3 // Demonstrando menus. import java.awt.Color; 4 import java.awt.Font; 5 6 7 8 9 10 import import import import import import 142 Outline java.awt.BorderLayout; java.awt.event.ActionListener; java.awt.event.ActionEvent; java.awt.event.ItemListener; java.awt.event.ItemEvent; javax.swing.JFrame; MenuFrame.java (1 de 8) 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 2005 Pearson Education, Inc. All rights reserved. 21 public class MenuFrame extends JFrame 22 { 23 24 143 Outline private final Color colorValues[] = { Color.BLACK, Color.BLUE, Color.RED, Color.GREEN }; 25 26 private JRadioButtonMenuItem colorItems[]; // itens do menu: cores private JRadioButtonMenuItem fonts[]; // itens de menu: fontes 27 28 29 private JCheckBoxMenuItem styleItems[]; // itens de menu: estilo da fonte private JLabel displayJLabel; // apresenta texto de teste private ButtonGroup fontButtonGroup; // gerencia itens do menu fonte 30 31 private ButtonGroup colorButtonGroup; // gerencia itens do menu cores private int style; // usado para criar estilo para a fonte 32 33 // construtor sem argumentos que configura a interface 34 35 public MenuFrame() { 36 37 38 39 40 41 42 43 44 45 46 MenuFrame.java (2 de 8) Cria um JMenu super( "Using JMenus" ); JMenu fileMenu = new JMenu( "File" ); // cria menu file fileMenu.setMnemonic( 'F' ); // configura mnemonico para F Chama método JMenu setMnemonic // cria item do menu About... JMenuItem aboutItem = new JMenuItem( "About..." ); Adiciona the JMenuItem aboutItem.setMnemonic( 'A' ); // configura mnemonico para A “About…” ao fileMenu fileMenu.add( aboutItem ); // adiciona item about ao menu file aboutItem.addActionListener( 2005 Pearson Education, Inc. All rights reserved. 47 48 49 new ActionListener() // classe interna anônima Outline { // apresenta o caixa de mensagem quando o usuario 50 public void actionPerformed( ActionEvent event ) 51 { 52 53 54 55 JOptionPane.showMessageDialog( MenuFrame.this, "This is an example\nof using menus", "About", JOptionPane.PLAIN_MESSAGE ); } // fim do método actionPerformed 56 57 58 59 60 61 } // fim da classe interna anônima ); // fim de addActionListener 62 63 64 65 66 67 exitItem.addActionListener( 68 69 70 71 72 73 Cria um ActionListener para 144 processar eventos de ação em seleciona About... aboutItem Apresenta uma caixa de mensagem de dialogo MenuFrame.java (3 de 8) JMenuItem exitItem = new JMenuItem( "Exit" ); // Cria item exit exitItem.setMnemonic( 'x' ); // configura mnemonico x fileMenu.add( exitItem ); // adiciona item exit ao menu file Cria e adiciona o item de menu exitItem Registra um ActionListener que encerra a aplicação new ActionListener() // classe interna anônima { // termina aplicação quando o usuario clica em exitItem public void actionPerformed( ActionEvent event ) { System.exit( 0 ); // fim da aplicação } // fim do método actionPerformed } // fim da classe anônima interna ); // fim de addActionListener 2005 Pearson Education, Inc. All rights reserved. 74 75 76 JMenuBar bar = new JMenuBar(); // cria barra de menu Outline Adiciona fileMenu ao JMenuBar e anexa o JMenuBar à janela da formataplicação 77 78 JMenu formatMenu = new JMenu( "Format" ); // cria menu 79 80 81 82 83 formatMenu.setMnemonic( 'r' ); // configura mnemonico r MenuFrame.java (4 de 8) Cria menu formatMenu // array dos nomes das cores String colors[] = { "Black", "Blue", "Red", "Green" }; 84 JMenu colorMenu = new JMenu( "Color" ); // cria menu color 85 86 colorMenu.setMnemonic( 'C' ); // configura mnemonico C 87 // cria menu de itens radiobutton para as cores 88 89 90 colorItems = new JRadioButtonMenuItem[ colors.length ]; colorButtonGroup = new ButtonGroup(); // gerencia cores Cria array ItemHandler itemHandler = new ItemHandler(); // trata eventos para cores JRadioButtonMenuItem 91 92 93 94 95 // cria itens do menu color com botão radio for ( int count = 0; count < colors.length; count++ ) { colorItems[ count ] = 96 97 98 99 100 101 145 setJMenuBar( bar ); // adiciona barra de menu à aplicação bar.add( fileMenu ); // adiciona menu file à barra de menu cria submenu colorMenu colorItems Cria um ButtonGroup para assegurar que apenas um dos itens de menu seja selecionado item por vez new JRadioButtonMenuItem( colors[ count ] ); // cria colorMenu.add( colorItems[ count ] ); // adiciona item ao menu color colorButtonGroup.add( colorItems[ count ] ); // adiciona ao grupo colorItems[ count ].addActionListener( itemHandler ); } // fim do for Adiciona JRadioButtonMenuItems ao colorMenu e registra ActionListeners 2005 Pearson Education, Inc. All rights reserved. 102 103 104 colorItems[ 0 ].setSelected( true ); // seleciona primeiro item de Color Outline Chama formatMenu.add( colorMenu ); // adiciona menu color ao menu format 105 formatMenu.addSeparator(); // adiciona separador no menu 106 107 // array com nomes das fontes método AbstractButton setSelected MenuFrame.java 108 109 110 111 112 String fontNames[] = { "Serif", "Monospaced", "SansSerif" }; JMenu fontMenu = new JMenu( "Font" ); // cria menu font fontMenu.setMnemonic( 'n' ); // define mnemonico n 113 114 115 116 fonts = new JRadioButtonMenuItem[ fontNames.length ]; fontButtonGroup = new ButtonGroup(); // gerencia nomes das fontes Cria 117 118 119 120 121 122 123 124 125 126 127 146 // cria itens de menu radiobutton para nomes das fontes (5 de 8) Adiciona colorMenu ao formatMenu e adiciona uma linha de separação horizontal array de JRadioButtonMenuItem // cria itens de menu Font radio button fonts for ( int count = 0; count < fonts.length; count++ ) Cria um ButtonGroup para { assegurar que apenas um dos fonts[ count ] = new JRadioButtonMenuItem( fontNames[ count ] ); fontMenu.add( fonts[ count ] ); // adiciona fonte ao menu font itens do menu sejam selecionados por vez fontButtonGroup.add( fonts[ count ] ); // adiciona ao button group fonts[ count ].addActionListener( itemHandler ); // adiciona handler } // end for fonts[ 0 ].setSelected( true ); // seleciona primeiro item do menu Font fontMenu.addSeparator(); // adiciona separador ao menu Font Adiciona JRadioButtonMenuItems ao colorMenu e registra ActionListeners Configura seleção default e adiciona separador horizontal 2005 Pearson Education, Inc. All rights reserved. 128 129 130 String styleNames[] = { "Bold", "Italic" }; // nomes dos estilos Outline 147 styleItems = new JCheckBoxMenuItem[ styleNames.length ]; StyleHandler styleHandler = new StyleHandler(); // handler para estilos 131 132 // cria itens do menu Style como checkbox 133 134 135 136 137 for ( int count = 0; count < styleNames.length; count++ ) MenuFrame.java { Cria JCheckBoxMenuItems styleItems[ count ] = (6 de 8) new JCheckBoxMenuItem( styleNames[ count ] ); // para estilo fontMenu.add( styleItems[ count ] ); // adiciona ao menu font 138 styleItems[ count ].addItemListener( styleHandler ); // handler 139 140 141 142 143 } // fim do for 144 // Configura label para apresentar o texto 145 146 147 148 149 150 151 displayJLabel = new JLabel( "Sample Text", SwingConstants.CENTER ); displayJLabel.setForeground( colorValues[ 0 ] ); displayJLabel.setFont( new Font( "Serif", Font.PLAIN, 72 ) ); formatMenu.add( fontMenu ); // adiciona bar.add( formatMenu ); // adiciona menu Adiciona fontMenu ao e formatMenu ao menu Font ao menu formatMenu Format Format à barra de JMenuBar menu getContentPane().setBackground( Color.CYAN ); // configura cor de fundo add( displayJLabel, BorderLayout.CENTER ); // adiciona displayJLabel } // fim do construtor de MenuFrame 152 2005 Pearson Education, Inc. All rights reserved. 153 // classe interna tratando eventos action dos itens do menu 154 Outline 155 148 private class ItemHandler implements ActionListener { 156 // processa seleção de fontes e cores 157 158 public void actionPerformed( ActionEvent event ) { 159 160 161 162 163 // processa seleção de cores for ( int count = 0; count < colorItems.length; count++ ) { if ( colorItems[ count ].isSelected() ) { 164 165 166 167 displayJLabel.setForeground( colorValues[ count ] ); break; } // fim do if } // fim do for MenuFrame.java (7 de 8) Determina o JRadioButtonMenuItem selecionado 168 169 170 171 172 173 174 175 176 // processa seleção da fonte for ( int count = 0; count < fonts.length; count++ ) { Método getSource retorna uma if ( event.getSource() == fonts[ count ] ) referência ao { JRadioButtonMenuItem que displayJLabel.setFont( new Font( fonts[ count ].getText(), style, 72 gerou ) ); o evento } // fim do if 177 178 } // fim do for 2005 Pearson Education, Inc. All rights reserved. repaint(); // desenha novamente a aplicação 179 180 181 149 Outline } // fim do método actionPerformed } // fim da classe ItemHandler 182 183 184 // classe interna para tratar item events dos itens do menu check box private class StyleHandler implements ItemListener 185 186 187 188 189 { 190 191 192 193 // processa seleção de fonte e estilo public void itemStateChanged( ItemEvent e ) { style = 0; // inicializa style // checa se bold é selecionado if ( styleItems[ 0 ].isSelected() ) style += Font.BOLD; // adiciona bold ao style 194 195 196 197 198 199 200 201 202 MenuFrame.java Chamado se o usuário seleciona um8) (8 de JCheckBoxMenuItem em fontMenu Determina se um ou os dois JCheckBoxMenuItems estão selecionados // checa se italic é selecionado if ( styleItems[ 1 ].isSelected() ) style += Font.ITALIC; // adiciona italic ao style displayJLabel.setFont( new Font( displayJLabel.getFont().getName(), style, 72 ) ); repaint(); // desenha novamente a aplicação } // fim do método itemStateChanged 203 } // fim da classe StyleHandler 204 } // fim da classe MenuFrame 2005 Pearson Education, Inc. All rights reserved. 150 JTabbedPane •JTabbedPane – Organiza componentes gráficos em camadas em que apenas uma camada é visível por vez • Quando o usuário clica na guia, a camada apropriada é apresentada – As guias podem ser posicionados no topo (default), esquerda, direita ou embaixo – Qualquer componente pode ser colocado em uma guia – Se as guias não couberem em uma linha, eles serão colocados em linhas adicionais 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: JTabbedPaneDemo.java 2 // Demonstrando JTabbedPane. 3 import javax.swing.JFrame; 151 Outline 4 5 public class JTabbedPaneDemo 6 { 7 public static void main( String args[] ) 8 { JTabbedPane Demo.java 9 JTabbedPaneFrame tabbedPaneFrame = new JTabbedPaneFrame(); 10 tabbedPaneFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 tabbedPaneFrame.setSize( 250, 200 ); // define tamanho do frame 12 tabbedPaneFrame.setVisible( true ); // apresenta frame 13 } // fim do main 14 } // fim da classe JTabbedPaneDemo 2005 Pearson Education, Inc. All rights reserved. 1 // Arquivo: JTabbedPaneFrame.java 2 // Demonstrando JTabbedPane. 3 import java.awt.BorderLayout; 4 import java.awt.Color; 5 6 import javax.swing.JFrame; import javax.swing.JTabbedPane; 7 8 9 10 11 import import import import 152 Outline JTabbedPane Frame.java javax.swing.JLabel; javax.swing.JPanel; javax.swing.JButton; javax.swing.SwingConstants; (1 de 2) 12 public class JTabbedPaneFrame extends JFrame 13 { 14 // configura interface Cria 15 public JTabbedPaneFrame() 16 17 18 19 20 21 22 23 24 25 26 um JTabbedPane vazio com as configurações default { super( "JTabbedPane Demo " ); JTabbedPane tabbedPane = new JTabbedPane(); // cria JTabbedPane // configura pane11 e adiciona este ao JTabbedPane JLabel label1 = new JLabel( "panel one", SwingConstants.CENTER ); JPanel panel1 = new JPanel(); // cria primeiro painel panel1.add( label1 ); // adiciona label ao painel tabbedPane.addTab( "Tab One", null, panel1, "First Panel" ); Chama método JTabbedPane addTab com argumentos que especificam o título da guia, uma referência a interface Icon para apresentar na guia, o COMPONENT a apresentar quando o usuário clica na guia e a string tooltip da guia 2005 Pearson Education, Inc. All rights reserved. 27 28 29 // configura panel2 e o adiciona JTabbedPane JLabel label2 = new JLabel( "panel two", SwingConstants.CENTER ); 153 Outline JPanel panel2 = new JPanel(); // cria segundo painel 30 31 panel2.setBackground( Color.YELLOW ); // configura fundo amarelo panel2.add( label2 ); // adiciona label ao panel 32 33 34 35 tabbedPane.addTab( "Tab Two", null, panel2, "Second Panel" ); // configura panel3 e o adiciona ao JTabbedPane JLabel label3 = new JLabel( "panel three" ); 36 37 38 39 JPanel panel3 = new JPanel(); // cria terceiro panel3.setLayout( new BorderLayout() ); // usa borderlayout panel3.add( new JButton( "North" ), BorderLayout.NORTH ); panel3.add( new JButton( "West" ), BorderLayout.WEST ); 40 41 42 panel3.add( new JButton( "East" ), BorderLayout.EAST ); panel3.add( new JButton( "South" ), BorderLayout.SOUTH ); panel3.add( label3, BorderLayout.CENTER ); 43 tabbedPane.addTab( "Tab Three", null, panel3, "Third Panel" ); Adiciona panel2 ao tabbedPane painel JTabbedPane Frame.java (2 de 2) 44 45 add( tabbedPane ); // adiciona JTabbedPane ao frame 46 } // fim do construtor JTabbedPaneFrame Adiciona 47 } // fim da classe JTabbedPaneFrame panel3 ao tabbedPane 2005 Pearson Education, Inc. All rights reserved. 154 JMenu e CardLayout •CardLayout – Gerenciador de layout que empilha os componentes de um container de tal forma que apenas o componente que está no topo permanece visível – Métodos de navegação first(), next(), previous() e last() • Permitem "navegar" entre os componentes empilhados – determinando qual item deve estar visível em um dado momento – permitem realizar uma varredura seqüencial pelos componentes de container especificado 2005 Pearson Education, Inc. All rights reserved. 155 JMenu e CardLayout •CardLayout – Método show() • permite selecionar um componente para exposição diretamente através de uma string – String especificada como uma restrição quando da adição do componente ao container 2005 Pearson Education, Inc. All rights reserved. // Arquivo: JTabbedPaneDemo.java // Demonstrando CardLayout. import javax.swing.JFrame; 156 public class CardLayoutTest { public static void main( String args[] ) { CardLayoutDemo cardLayoutDemo = new CardLayoutDemo(); cardLayoutDemo.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); cardLayoutDemo.setSize( 300, 200 ); // define tamanho do frame cardLayoutDemo.setResizable(false); cardLayoutDemo.setVisible( true ); // apresenta frame } // fim do main } // fim da classe JGridLayoutBagDemo CardLayoutTest .java 2005 Pearson Education, Inc. All rights reserved. // Arquivo CardLayoutDemo // Demonstração do CardLayout import java.awt.*; import java.awt.event.*; import javax.swing.*; 157 public class CardLayoutDemo extends JFrame implements ActionListener { private JPanel cards; //um JPanel que usa CardLayout private JMenu menu; //menu principal Panel private JMenuItem buttonItem; //item do menu Panel private JMenuItem textItem; //item do menu Panel private JMenuBar bar; //barra de menu CardLayoutTest .java // Constantes usadas para identificar os JPanels (as Cards) final static String BUTTONPANEL = "Card with JButtons"; final static String TEXTPANEL = "Card with JTextField"; public CardLayoutDemo () { // Define o título do aplicativo super("Demo de CardLayout"); // Cria Menu Panel menu = new JMenu("Panel"); // Cria itens do menu Panel buttonItem = new JMenuItem(BUTTONPANEL); textItem = new JMenuItem(BUTTONPANEL); menu.add(buttonItem); menu.add(textItem); // Associa tratador de eventos aos itens do menu buttonItem.addActionListener(this); textItem.addActionListener(this); // Define a barra de menu com o menu Panel bar = new JMenuBar(); bar.add(menu); setJMenuBar( bar ); 2005 Pearson Education, Inc. All rights reserved. 158 // Cria card de botões JPanel card1 = new JPanel(); card1.add(new JButton("Button 1")); card1.add(new JButton("Button 2")); card1.add(new JButton("Button 3")); CardLayoutTest .java // Cria card com campo de texto JPanel card2 = new JPanel(); card2.add(new JTextField("TextField", 20)); // Cria JPanel com layout CardLayout que conterá as cards cards = new JPanel(new CardLayout()); cards.add(card1, BUTTONPANEL); cards.add(card2, TEXTPANEL); // adiciona cards ao JFrame add(cards, BorderLayout.CENTER); } // Trata os eventos de seleção no menu Panel public void actionPerformed( ActionEvent event ) { // Obtém o Layout CardLayout do JPanel CardLayout cl = (CardLayout)(cards.getLayout()); // Apresenta o JPanel apropriado de acordo com a seleção no menu if (event.getSource() == buttonItem) cl.show(cards, BUTTONPANEL); else cl.show(cards, TEXTPANEL); } } 2005 Pearson Education, Inc. All rights reserved.