1.58k likes | 1.73k Views
COMPONENTES GUI (capítulo 11 Deitel). Roberto Willrich INE-CTC-UFSC Carla Merkle Westphall INE-CTC-UFSC E-Mail: carlamw@inf.ufsc.br URL: http://moodle.inf.ufsc.br INE5605-Turma 0238A. Objetivos. Neste cap í tulo aprenderemos:
E N D
COMPONENTES GUI(capítulo 11 Deitel) Roberto Willrich INE-CTC-UFSC Carla Merkle Westphall INE-CTC-UFSC E-Mail: carlamw@inf.ufsc.br URL: http://moodle.inf.ufsc.br INE5605-Turma 0238A
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 2
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 3
Internet Explorer com componentes GUI. 4 Botão Menus Barra de título Barra de menus Campo de texto Barras de rolagem
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 5
Resumo Adicao.java (1 de 2) 6 Mostra caixa de entrada para receber o primeiro inteiro Mostra caixa de entrada para receber o segundo inteiro Mostra caixa de mensagem para apresentar a soma ao usuário
Caixa de Dialogo: Caixa de Mensagem 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 7 // 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); } }
Adicao.java (2 de 2) 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, showInputDialogretorna para o programa o 2 digitado pelo usuário como uma String. O programa deve converter o String para um int 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
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. 10
Swing vs. AWT Abstract Window Toolkit (AWT) Precursor do Swing Declarado no pacote java.awt Não oferece uma apresentação multi-plataforma consistente 12
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. 13
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 14
Observação A forma de apresentação da interface definida por componentes GUI pesados a partir do pacote java.awtvaria 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. 15
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 16
Apresentação de Textos e Imagens em uma Janela 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 17
Nomeando componentes GUI Label Instruções ou informações textuais indicando o propósito de cada componentes Criado com a classe JLabel 18
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 19
Resumo LabelFrame.java (1 de 2) 20
Resumo LabelFrame.java (2 de 2) 21
Resumo TesteLabel.java 22
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 23 label1 = new JLabel( "Label com texto" ); label1.setToolTipText( "Este é o label1" ); add( label1 ); // adiciona label1 ao JFrame
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. 24
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. 25
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()) 26 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
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 27 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
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 28
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) 30 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
Campos de texto e uma introdução a tratamento de eventos com classes aninhadas 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) 31
Campos de texto e uma introdução a tratamento de eventos com classes aninhadas Classe JTextComponent Superclasse de JTextField Superclasse de JPasswordField Adiciona o caractere echo para esconder a entrada de texto no componente 32
Resumo FrameCampoDeTexto.java (1 de 3) 33 Cria um novo JTextField
Resumo FrameCampoDeTexto.java (2 de 3) 34 Cria um novo JTextField Cria um novo JPasswordField Criar tratador de evento Registra tratador de evento Cria um novo JTextField não editável Cria uma classe tratador de evento pela implementação da interface ActionListener Declara método actionPerformed
Outline FrameCampoDeTexto.java (3 de 3) 35 Testa se a fonte do evento é o primeiro campo de texto Testa se a fonte do evento é o segundo campo de texto Testa se a fonte do evento é o terceiro campo de texto Testa se a fonte do evento é o campo password Obtém texto do campo de texto Obtém texto do campo de texto Obtém texto do campo de texto Obtém password do campo password
Outline TesteCampoDeTexto.java (1 de 2) 36
Resumo TesteCampoDeTexto.java (2 de 2) 37
Passos necessários para configurar um tratador de eventos para um componente gráfico 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 38 TratadorCampoDeTexto tratador = new TratadorCampoDeTexto(); campoDeTexto1.addActionListener( tratador ); //... private class TratadorCampoDeTexto implements ActionListener { // processa eventos no campo de texto public void actionPerformed( ActionEvent event ) { //... } }
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 39 public class FrameCampoDeTexto extends JFrame { //... private class TratadorCampoDeTexto implements ActionListener { //... } }
Observação Um classe interna pode acessar diretamente os atributos e métodos da classe externa, mesmo se eles são private. 40
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 41
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 42 TratadorCampoDeTexto tratador = new TratadorCampoDeTexto(); campoDeTexto1.addActionListener( tratador );
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. 43
Detalhes do método actionPerformed da classe TratadorCampoDeTexto 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[]) 44 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() );
Tipos de eventos gráficos comuns e interfaces Listener 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. 45
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 48
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.