roberto c. s. pacheco [email protected] professor componentes da interface gráfica deitel &...

68
Roberto C. S. Pacheco [email protected] Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke [email protected] Monitor

Upload: matheus-henrique-terra-moreira

Post on 07-Apr-2016

223 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Roberto C. S. [email protected]

Professor

Componentes da Interface GráficaDeitel & Deitel – Cap. 12

Ricardo N. [email protected]

Monitor

Page 2: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Interface Gráfica A interface gráfica com o usuário (GUI – Graphical User

Interface) fornece um conjunto de componentes facilitando primeiramente a utilização de determinada aplicação;

O browser é um exemplo de GUI. Na janela, há uma barra de menus que contém itens de menus específicos oferecendo funcionalidades aos usuários;

As GUIs são construídas a partir de componentes GUI;

Um componente GUI é um objeto com o qual o usuário interage através do mouse, do teclado ou de outra forma de entrada, como o reconhecimento de voz;

Alguns componentes do Java podem ser vistos na tabela a seguir:

Page 3: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Interface GráficaComponente DescriçãoJLabel Área em que podem ser exibidos texto não-editável.JTextField Área em que o usuário insere dados pelo teclado. Também

podem exibir informações.JButton Área em que aciona um evento quando o mouse é pressionado.

JCheckBox Componentes GUI que tem dois estados: selecionado ou não selecionado

JComboBox Lista de itens a partir do qual o usuário pode fazer uma seleção clicando em um item da lista.

JList Área em que uma lista de itens é exibida, a partir da qual o usuário pode fazer uma seleção clicando uma vez em qualquer elemento da lista.

JPanel Container em que os componentes podem ser adicionados.

Page 4: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Interface Gráfica - Swing As classes que criam os componentes GUI (vistos na tabela anterior)

fazem parte dos componentes GUI Swing do pacote javax.swing;

Esses componentes GUI se tornaram padrão em Java a partir da versão 1.2 da plataforma Java;

A maior parte dos componentes Swing são escritos, manipulados e exibidos completamente em Java;

Isso permite ao Swing manter uma aparência e um comportamento uniforme em todas as plataformas;

Os componentes GUI originais do pacote Abstract Window Toolkit java.awt (também chamado AWT) estão diretamente associados com os recursos da interface gráfica da plataforma local. Assim, seu comportamento depende do ambiente onde são executados (no Windows, a interface se assemelha a aplicações Windows, no Apple a Mac e assim por diante);

Page 5: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Interface Gráfica - Swing

java.lang.Object

java.awt.Component

java.awt.Container

javax.swing.JComponent

A classe JComponent é a superclasse para a maioria dos componentes Swing. Essa classe define os atributos e comportamentos comuns para todas as subclasses de JComponent.

Para utilizar efetivamente os componentes GUI, as hierarquias de herança javax.swing e do java.awt devem ser compreendidas – especificamente a classe Component, a classe Container e a classe JComponent, que definem os recursos comuns à maioria dos componentes Swing.

O Container é uma coleção de componentes. Em aplicativos com JFrame (e em applets), anexam-se os componentes ao painel de conteúdo, que é objeto da classe Container. Essa define os atributos e comportamentos para todas as suas subclasses (ex: método add() – adiciona componentes e método setLayout() – gerencia leiautes.)

Page 6: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Interface Gráfica - Swing Os componentes Swing têm muitos recursos, incluindo:

Uma aparência e um comportamento plugável, que podem ser utilizados para personalizar um componente;

Teclas de atalho (ou teclas mnemônicas), que dão acesso direto a componentes GUI por teclado;

Capacidades comuns de tratamento de eventos, para o caso em que vários componentes GUI iniciam as mesmas ações em um programa;

Breves descrições da finalidade de um componente GUI (dicas de ferramenta) que são exibidas quando o cursor do mouse é posicionado sobre o componente por um breve instante;

Suporte a tecnologias de auxílio ao deficiente físico, como leitores de tela em braile para pessoas cegas;

Suporte para exibir em diferentes idiomas.

Page 7: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Interface Gráfica - Swing De um modo geral para que um componente tenha

comportamento quando este sofrer determinado evento os passos abaixo devem ser seguidos:

1. Criação de uma classe que estenda de JFrame ou JApplet;2. Criação do componente visual;3. Adição desse componente para um container;4. Criação de uma classe interna (tratador de eventos) que

implemente determinado listener;5. Registro do tratador de eventos ao listener através dos métodos

disponíveis nas instâncias dos componentes GUI.

Obs: Para os componentes que não possuem eventos associados, somente os três primeiros passos são aplicáveis (ex: JLabel).

Page 8: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - JLabel Os rótulos fornecem instruções de texto ou informações em

um GUI; Os rótulos são definidos com a classe JLabel (uma

subclasse de JComponent); O rótulo exibe uma única linha de texto somente de leitura,

uma imagem, ou ambos; Os programas raramente alteram o conteúdo do rótulo,

após sua criação;

Page 9: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JLabel - Exemplo Exemplo: desenvolver um aplicativo Java que apresente um label no

rodapé de uma tela, colocando um ícone no centro da tela, associado a uma figura de sua escolha e indicando uma frase de dica para o usuário, que aparecerá quando o mouse repousar sobre a figura.

Solução: 1. Criar uma classe pública (ex: LabelTeste) estendendo JFrame e contendo

um objeto de JLabel (para guardar o label) e um objeto de Icon (para guardar o ícone com sua figura)

2. No construtor de objetos da sua classe pública invoque a superclasse JFrame (com o comando super(“texto com o título do frame”), passando como parâmetro o título da tela que criará.

3. No construtor crie uma instância da classe Container para configurar a GUI. Ajuste o objeto de Container para o layout FlowLayout

4. Inicialize o objeto de JLabel com setText (colocando seu texto), setIcon (colocando sua figura), setHorizontalTextPosition e setVerticalTextPosition para colocar no centro e no rodapé, respectivamente e setToolTipText para colocar a dica.

5. Adicione o objeto de JLabel à instância de Container e ajuste o tamanho (setSize) e a visibilidade da janela que será criada (com setVisible)

6. Na função main() crie uma instância de sua classe, chame o construtor e encerre o programa com o método setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE).

Page 10: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JLabel - Exemplo1 import java.awt.*;2 import java.awt.event.*;3 import javax.swing.*;4 public class LabelTeste extends JFrame {5 private JLabel label;6 private Icon icone = new ImageIcon( “java.jpg" );7 // Configurando a GUI8 public LabelTeste() {9 super( "Testando JLabel" );10 // Cria um container e define o modelo de layout (FlowLayout)11 Container container = getContentPane();12 container.setLayout( new FlowLayout() );14 // JLabel sem argumentos no construtor15 label = new JLabel();16 label.setText("Label com ícone e texto com alinhamento de rodapé \"bottom\"" );17 label.setIcon( icone );18 label.setHorizontalTextPosition( SwingConstants.CENTER );19 label.setVerticalTextPosition( SwingConstants.BOTTOM );20 label.setToolTipText("Este é o label" );21 container.add( label );22 setSize( 360, 150 );23 setVisible( true );24 }25 // Método principal da aplicação26 public static void main( String args[] ) {27 LabelTeste application = new LabelTeste();28 application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );29 }30 } // final da clase

Page 11: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JLabel – Explicando o ExemploLinhas 5 e 6

private JLabel label;private Icon icone = new ImageIcon( “java.jpg" );São criados os objetos label (instância de JLabel) e o objeto icone (instância de Icon). A classe Icon permite definir um ícone que poderá ser associado a vários componentes Swing.

Linha 9super( "Testando JLabel" ); : A palavra reservada super indica a classe pai. Através dessa palavra pode-se acessar atributos (quando públicos), métodos e construtores. Nesse exemplo, como a classe está derivando de JFrame, super(String) é uma chamada ao construtor da classe JFrame para redefinir o título que irá aparecer na janela.

Linha 11 e 12Container container = getContentPane();container.setLayout( new FlowLayout() );Cria um container para adicionar os componentes Swing e define o Layout. Existem vários modelos de Layout que serão discutidos na seção sobre Layout.

Page 12: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JLabel – Explicando o ExemploLinhas 15, 16 e 17

label = new JLabel();label.setText("Label com ícone e texto com alinhamento de rodapé \"bottom\"" );label.setIcon( icone );

O objeto label é instanciado através do comando new e logo em seguida é utilizado os método setText(String) para atribuir o conteúdo do label e setIcon(Icon) para atribuir o ícone ao label.

Linhas 18 e 19label.setHorizontalTextPosition( SwingConstants.CENTER );label.setVerticalTextPosition( SwingConstants.BOTTOM );

Utiliza esses métodos para definir os alinhamentos horizontal (setHorizontalTextPosition(int)) e vertical (setVerticalTextPosition(int)). Nesse caso o texto será centralizado horizontalmente e na parte inferior. Utiliza para isso as constantes definidas SwingConstants.CENTER e SwingConstants.BOTTOM.

Linhas 20 e 21label.setToolTipText("Este é o label" );container.add( label );

O método setToolTipText(String) permite definir o texto que irá aparecer quando o mouse for posicionado sobre o label. Em seguida o label é adicionado para o container.

Page 13: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JLabel – Explicando o ExemploLinhas 22 e 23

setSize( 360, 150 );setVisible( true );O método setSize(int, int) permite definir o tamanho do frame (que será o tamanho da janela) e setVisible(boolean) permite definir se o frame deve ou não aparecer. O default é false.

Linhas 28application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );O método setDefaultCloseOperation(int) do objeto global “application” permite definir uma forma de finalizar a aplicação quando se seleciona o ícone superior direito (x). Caso esse método não seja chamado a janela poderá ser fechada mas a aplicação continua na memória.

IMPORTANTE: note que até agora utilizamos System.exit(0) para finalizar um programa. Nesse exemplo, a utilização dessa abordagem finalizaria a aplicação logo após a janela ser apresentada. Portanto, torna-se necessária a definição de determinada operação ao evento de clicar no ícone para fechamento da janela.

Page 14: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JLabel - Exercício

Exercício: desenvolver um aplicativo Java que apresente um label no topo (“TOP”) de uma tela, colocando um ícone no rodapé da tela, associado a uma figura de sua escolha e indicando uma frase de dica para o usuário, que aparecerá quando o mouse repousar sobre a figura.

Page 15: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tratamento de Eventos Eventos são mapeamentos da interação do usuário com o programa.

Essas interações permitem saber que ações o usuário realizou com os periféricos do computador (mouse, teclado, etc.), que interferem no programa.

O Objeto JLabel não possui eventos; As GUIs são baseados em eventos, isto é, geram eventos quando o

usuário interage com a interface; Algumas interações são: mover o mouse, clicar no mouse, clicar em um

botão, digitar um campo de texto, selecionar um item de menu, fechar uma janela, etc;

Os eventos da GUI são enviados para o programa quando ocorre uma interação com o usuário;

O mecanismo de tratamento de eventos possui três partes: A origem do evento. O objeto do evento. O “ouvinte” (listener) do evento.

Page 16: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tratamento de Eventos A origem do evento é o componente GUI com o qual o

usuário interage; O objeto evento encapsula as informações sobre o evento

que ocorreu. As informações incluem uma referência para a origem do evento e quaisquer informações específicas que possam ser requeridas pelo listener;

O listener recebe notificações de que um evento ocorreu permitindo que este realize determinada ação;

O programador precisa executar duas tarefas para processar um evento da GUI com o usuário em um programa:

registrar um listener para determinado componente GUI;

Implementar um método de tratamento de evento, também chamados de tratadores de eventos.

Page 17: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tratamento de Eventos Modelo de Classes de Eventos do pacote java.awt.event

java.lang.Object

java.util.EventObject

java.awt.AWTEvent

ActionEvent

AdjustmentEvent

ItemEvent

ComponentEvent

ContainerEvent

FocusEvent

PaintEvent

WindowEvent

InputEvent

KeyEvent MouseEvent

Page 18: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tratamento de Eventos

Java.util.EventListener

ActionListener

AdjustmentListener

ComponentListener

ContainerListener

FocusListener

ItemListener

KeyListener

MouseListener

MouseMotionListener

TextListener

WindowListener

Interfaces listeners de eventos do pacote java.awt.event

O objeto listener de eventos “espera por” tipos específicos de eventos (normalmente componentes GUI) em um programa. O tratador de eventos é um método chamado para responder a um tipo de evento em particular. Cada interface listener de eventos especifica um ou mais métodos de tratamento de evento que devem ser definidos na classe que implementa a interface listener de eventos. As interfaces definem métodos abstratos, o que faz com que uma classe que implementa uma interface tenha que definir TODOS os seus métodos, para que possa criar instâncias (caso contrário, a classe fica abstrata). Quando ocorre um evento, o componente GUI com o qual o usuário interagiu notifica os ouvintes registrados no programa, chamando um método de tratamento de eventos apropriado a cada ouvinte.

Page 19: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tabela de Tratamento de Eventos Origem Evento ListenerJTextFieldJPasswordFieldJbutton

ActionEvent

ActionListener actionPerformed(ActionEvent e)

JCheckBoxJRadioButton

ItemEvent ItemListener itemStateChanged(ItemEvent e)

JList ListSectionEvent

ListSelectionListener valueChanged(ListSelectionEvent e)

Subclasses dejava.awt.Component

MouseEvent MouseListener mouseClicked(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e)

Subclasses dejava.awt.Component

MouseMotionEvent MouseMotionListener mouseDragged(MouseEvent e) mouseMoved(MouseEvent e)

Subclasses dejava.awt.Component

KeyEvent KeyListener keyTyped(KeyEvent e) keyPressed(KeyEvent e) keyReleasead(KeyEvent e)

Page 20: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Origem Evento ListenerSubclasses 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 dejava.awt.Compon

ent

FocusEvent FocusListener focusGained(FocusEvent e)

focusLost(FocusEvent e)

JScrollBar AdjustmentEvent

AdjustmentListener adjustmentValueChanged(

AdjustmentEvent e)

JMenu MenuEvent MenuListener menuCanceled(MenuEvent e) menuDeselected(MenuEvent e)

menuSelected(MenuEvent e)

Tabela de Tratamento de Eventos

Page 21: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - JButton O botão é um componente em que o usuário clica para disparar uma

ação específica. O programa Java pode utilizar vários tipos de botões, incluindo botões de comando, caixas de marcação, botões de alternância e botões de opção.

javax.swing.JComponent

javax.swing.AbstracButton

Javax.swing.JButton Javax.swing.ToggleButton

Javax.swing.JCheckBox Javax.swing.JRadioButton

Todos os tipos de botão são subclasses de AbstractButton (pacote javax.swing), que define muitos dos recursos comuns aos botões do Swing.

Page 22: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JButton - Exemplo Exemplo: desenvolver um aplicativo Java que apresente um botão associado a um ícone

(com figura de sua escolha) e indicando uma frase de dica para o usuário (ex: “pressione o botão”), um botão de finalização do programa e um mecanismo de tratamento do evento associado ao botão com o ícone (onde o tratamento seja apresentar uma nova tela, com uma mensagem).

Solução: 1. Criar uma classe pública (ex: ExemploButton) estendendo JFrame e contendo dois

objetos de JButton (um para cada botão) e um objeto de Icon (para guardar o ícone com sua figura) e dois objetos String (textos dos botões).

2. No construtor de objetos da sua classe pública invoque a superclasse JFrame, crie uma instância da classe Container para configurar a GUI e use o layout FlowLayout

3. Ainda no construtor crie os botões com o new JButton() passando texto e ícone (para o primeiro) e apenas o texto (para o segundo).

4. Crie o primeiro botão com o new JButton() passando texto e ícone, utilize setIcon(), para colocar o ícone no botão, setToolTipText() para colocar a dica e setActionCommand() para associar a ação do tratamento de eventos. Adicione o botão ao objeto de Container criado no construtor.

5. Crie o segundo botão com o new JButton() passando texto e setToolTipText() para colocar a dica do segundo botão. Adicione o botão ao objeto de Container criado no construtor.

6. Após criar os botões, crie um objeto da classe GerenciadorBotoes. Essa instância será capaz de tratar os eventos associados aos botões. Adicione esse objeto aos listeners dos eventos (addActionListener())

7. Implemente a classe privada GerenciadorBotoes, que deve implementar a classe abstrata ActionListeners com o tratamento dos eventos associados aos botões. Para isso, implemente os métodos getActionCommand() para cada botão.

Page 23: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JButton - Exemplo1 import java.awt.*;2 import java.awt.event.*;3 import javax.swing.*;45 public class ExemploButton extends JFrame {67 private JButton botao1, botao2;8 private Icon cafe = new ImageIcon( “java.jpg" );9 private String strIcone = "botão associado a uma imagem";10 private String strFinalizar = "Finalizar";1112 // Configura a GUI13 public ExemploButton() {14 super( "Testando Botões" );1516 // Cria o container e atribui o layout17 Container container = getContentPane();18 container.setLayout( new FlowLayout() );1920 // Cria os botões21 botao1 = new JButton( “Botão Java”, cafe );22 botao1.setIcon(cafe);23 botao1.setToolTipText("Pressione o botão");2425 container.add( botao1 );26 botao2 = new JButton( strFinalizar );27 botao2.setToolTipText("Finaliza o programa");28 container.add( botao2 ); ....

Page 24: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JButton - Exemplo....29 // Cria o objeto gestorBotoes (instância da classe interna ButtonHandler)30 // para o uso no tratamento de eventos de botão31 GerenciadorBotoes gestorBotoes = new GerenciadorBotoes();32 botao1.addActionListener( gestorBotoes );33 botao2.addActionListener( gestorBotoes );3435 setSize( 360, 150 );36 setVisible( true );37 }3839 // Classe interna para tratamento de evento de botão40 private class GerenciadorBotoes implements ActionListener {41 // Método de manipulação do evento42 public void actionPerformed( ActionEvent event ) {43 //Testa se o botão com a imagem foi pressionado44 if (event.getSource() == botao1)45 JOptionPane.showMessageDialog( null,46 "Você pressionou um botão com imagem");47 //Testa se o botão "Finalizar" foi pressionado48 else if (event.getSource() == botao2)49 System.exit(0);50 }51 } // fim da classe interna GerenciadorBotoes5253 // Método principal54 public static void main(String args[]) {55 ExemploButton application = new ExemploButton();56 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);57 }5859 } // fim da classe ExemploButton

Page 25: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JButton – Explicando o ExemploLinhas 7 e 10

private JButton botao1, botao2;private Icon cafe = new ImageIcon( “java.jpg" );private String strIcone = "botão associado a uma imagem";private String strFinalizar = "Finalizar";São criados os objetos botao1 e botao2 (instância de JButton) , o objeto cafe (instância de Icon) e duas strings. A classe Icon permite definir um ícone que poderá ser associado a vários componentes Swing.

Linha 14super( "Testando Botões" );A palavra reservada super indica a classe pai. Através dessa palavra pode-se acessar atributos (quando públicos), métodos e construtores. Nesse exemplo, como a classe está derivando de JFrame, super(String) é uma chamada ao construtor da classe JFrame para redefinir o título que irá aparecer na janela.

Linha 17 e 18Container container = getContentPane();container.setLayout( new FlowLayout() );Cria um container para adicionar os componentes Swing e define o Layout. Existem vários modelos de Layout que serão discutidos na seção sobre Layout.

Page 26: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JButton – Explicando o ExemploLinhas 21 até 28

botao1 = new JButton( “Botão Java”, cafe );botao1.setIcon(cafe);botao1.setToolTipText("Pressione o botão");

container.add( botao1 );botao2 = new JButton( strFinalizar );botao2.setToolTipText("Finaliza o programa");container.add( botao2 );

Os objetos botao1 e botao2 são criados nas linhas 21 e 26. No primeiro utiliza-se o construtor onde é informado o texto e o ícone (objeto “cafe”). Através do método setToolTipText(String) é definida a dica irá aparecer quando o mouse é passado sobre o botão.

Cada botão para se tornar visível tem que ser adicionado para um determinado container.

Linhas 31 até 33GerenciadorBotoes gestorBotoes = new GerenciadorBotoes();botao1.addActionListener( gestorBotoes );botao2.addActionListener( gestorBotoes );

Cria o objeto gestorBotoes (instância da classe interna GerenciadorBotoes) responsável por tratar o evento do click sobre os botões e adiciona esse listerner através do método addActionListener(ActionListener).

Page 27: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JButton – Explicando o ExemploLinhas 40 até 51

private class GerenciadorBotoes implements ActionListener {// Método de manipulação do eventopublic void actionPerformed( ActionEvent event ) {

//Testa se o botão com a imagem foi pressionadoif (event.getSource() == botao1)

JOptionPane.showMessageDialog( null,"Você pressionou um com imagem");

//Testa se o botão "Finalizar" foi pressionadoelse if (event.getSource() == botao2)

System.exit(0);}

} // fim da classe interna GerenciadorBotoes

Interface: especificação de atributos e métodos que devem ser implementados por uma determinada classe. Todos os métodos definidos na interface devem ser implementados na classe, ou seja, se forem especificados dois métodos na interface a classe que implementar a interface deve ter esses mesmos métodos.

A classe interna (esta classe está definida dentro de outra classe) GerenciadorBotoes é uma classe que implementa uma interface (definição) ActionListener. Nessa interface existe definido somente o método actionPerformed.

Page 28: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tratamento de Eventos – Como funciona

Objeto de JButton. Ele contém uma variável de instância do tipo EventListenerList chamada listenerList, que herdou da classe JComponent.

listenerList

botao1

Esse objeto GerenciadorBotoes implementa ActionListener e define o método actionPerformed(). public void acionPerformed(Action event) {

// evento tratado aqui

}

gestorBotoes

Referência criada pela instruçãoBotao1.addAcionListener(gestorBotoes)

Page 29: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tratamento de Eventos – Como funciona Como o tratador de eventos foi registrado?

Resposta: o registro se deu nos comandos: botao1.addActionListener( gestorBotoes ); botao2.addActionListener( gestorBotoes );

Eles adicionaram o handler de Button (gestorBotoes) como sendo um listener para os objetos botao1 e botao2.

Como o componente GUI sabe que deve chamar actionPerformed() em vez de outro método de tratamento de eventos? Resposta: Cada JComponent suporta vários tipos de eventos (de

mouse, de teclas e outros). Quando ocorre um evento, ele é despachado para os ouvintes de eventos do tipo apropriado. O despacho do evento é simplesmente uma chamada ao método de tratamento de eventos para cada ouvinte registrado para esse tipo de evento.

Cada tipo de evento tem uma interface listener de eventos correspondente. Por exemplo, ActionEvents são tratados por ActionListeners, MouseEvents por MouseListeners (e MouseMotionListeners) e KeyEvents por KeyListeners.

Page 30: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Tratamento de Eventos – Como funciona Como o componente GUI sabe que deve chamar

actionPerformed() em vez de outro método de tratamento de eventos? Quando um evento é gerado por uma interação do usuário com

um componente, esse componente recebe um ID (Identificador) de evento exclusivo, que especifica o tipo de evento que ocorreu. O componente GUI utiliza o ID de evento para decidir o tipo de ouvinte para o qual o evento deve ser despachado e o método a chamar. No caso de um ActionEvent, o evento é despachado para cada método actionPerformed de ActionListener registrado (o único método na interface ActionListener). No caso de um MouseEvent, o evento é despachado para cada MouseListener registrado (ou MouseMotionListener, dependendo do evento que ocorrer). O ID de evento do MouseEvent determina qual dos sete métodos diferentes de tratamento de eventos de mouse é chamado.

A lógica de toda essa decisão é tratada para o desenvolvedor pelos componentes GUI.

Page 31: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JButton – Exercício

• Modifique o exemplo anterior para que o mecanismo de tratamento do evento associado ao botão com o ícone apresente uma tela em que o usuário entrará com uma frase de sua escolha.

Page 32: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JTextField e JPasswordField As classes JTextField e JPasswordField em Java permitem

que o usuário insira textos de uma única linha ou simplesmente que um texto seja exibido em uma linha.

A classe JTPasswordField é utilizada para apresentação de senhas, ou seja, com o texto escondido na interface.

Quando o usuário digita textos em objetos dessas classes e, em seguida, pressionar Enter, ocorre um evento de ação no aplicativo. Se o programa implementa um ouvinte de eventos (listeners), esse processa o evento, podendo utilizar os textos que estão nos objetos de JTextField ou JPasswordField no momento em que ocorreu o evento no programa.

A classe JTextField estende a classe JTextComponent, que fornece muitos recursos comuns para os componentes baseados em texto do Swing. A classe JPasswordField estende a classe JTextField e adiciona vários métodos específicos para senhas.

Page 33: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JTextField e JPassword- Exemplo Exemplo: desenvolver um aplicativo Java que apresente quatro campos de edição,

sendo um para o usuário colocar uma frase, outro para apresentar uma frase editável, outro para apresentar um texto inalterável e um último para registrar senhas. Trate os eventos associados ao acionamento da tecla enter em cada um desses campos de edição.

Solução: 1. Criar uma classe pública (ex: ExemploJTextField) estendendo JFrame e

contendo três objetos de JTextField (para guardar os campos de edição) e um objeto de JPasswordField (para guardar o campo de senha)

2. No construtor de objetos da sua classe pública invoque a superclasse JFrame (com o comando super(“texto com o título do frame”), passando como parâmetro o título da tela que criará e crie um Container ajustando o layout para FlowLayout

3. Inicialize o 1o objeto de JTextField com dimensão default (tamanho de 10), o segundo com texto default (“digite seu texto aqui”), o terceiro com texto e visibilidade default (com texto “campo de texto não editável” e tamanho 20) e o quarto com texto default (“digite sua senha”), adicionando-os ao container.

4. Crie um gerenciador de eventos para campos de texto e adicione os quatro objetos da sua classe aos listeners (usando addActionListener())

5. Implemente a classe privada com o gerenciamento dos eventos para os botões.

6. Na função main() crie uma instância de sua classe, chame o construtor e encerre o programa com o método setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE).

Page 34: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JTextField e JPasswordField// Exemplo de JTextFieldimport java.awt.*;import java.awt.event.*;import javax.swing.*;

public class ExemploJTextField extends JFrame { private JTextField campoTexto1, campoTexto2, campoTexto3; private JPasswordField campoSenha;

// configuração da GUI public ExemploJTextField() { super("Testando JTextField e JPasswordField"); Container container = getContentPane(); container.setLayout(new FlowLayout());

// constrói o 1o campo de texto com dimensões default campoTexto1 = new JTextField(10); container.add(campoTexto1);

// constrói o 2o campo de texto com texto default campoTexto2 = new JTextField("Digite seu texto aqui:"); container.add(campoTexto2);

// constrói o 3o campo de texto com texto default e // 20 elementos visíveis, sem tratador de eventos campoTexto3 = new JTextField("Campo de texto não editável",20); campoTexto3.setEditable(false); container.add(campoTexto3);

// constrói o 4o campo de texto com texto default campoSenha = new JPasswordField("Texto oculto"); container.add(campoSenha);

...

Page 35: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

JTextField e JPasswordField - Exemplo... // registra os tratadores de evento GerenciadorTextField gerenteTexto = new GerenciadorTextField(); campoTexto1.addActionListener(gerenteTexto); campoTexto2.addActionListener(gerenteTexto); campoTexto3.addActionListener(gerenteTexto); campoSenha.addActionListener(gerenteTexto);

setSize(325,100); setVisible(true); } public static void main(String args[]) { ExemploJTextField programaTexto = new ExemploJTextField(); programaTexto.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //classe interna privativa para tratamento de eventos private class GerenciadorTextField implements ActionListener { //processa eventos de campos de texto public void actionPerformed(ActionEvent evento) { String texto = ""; // evento:Usuário pressiona ENTER no objeto de JTextField campoTexto1 if (evento.getSource() == campoTexto1) texto = "campoTexto1: " + evento.getActionCommand(); // evento:Usuário pressiona ENTER no objeto de JTextField campoTexto2 else if (evento.getSource() == campoTexto2) texto = "campoTexto2: " + evento.getActionCommand(); // evento:Usuário pressiona ENTER no objeto de JTextField campoTexto3 else if (evento.getSource() == campoTexto3) texto = "campoTexto3: " + evento.getActionCommand(); // evento:Usuário pressiona ENTER no objeto de JPasswordField campoSenha else if (evento.getSource() == campoSenha) { JPasswordField senha = (JPasswordField) evento.getSource(); texto = "campoSenha: " + new String(campoSenha.getPassword()); } JOptionPane.showMessageDialog(null,texto); } } // fim da classe interna privativa GerenciadorTextField} // fim da classe ExemploJTextField

Page 36: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JCheckBox e JRadioButton Para que o usuário interaja com um aplicativo Java,

existem diversos tipos de botões para cada situação de interface.

Os componentes GUI Swing possuem três tipos de botões de estado (que assumem valores ativados/desativados ou verdadeiro/falso):

JToggleButton – para barras de ferramentas JCheckBox – para interfaces de múltipla escolha JRadioButton – escolha única entre múltiplas alternativas

javax.swing.AbstracButton

Javax.swing.JButton Javax.swing.ToggleButton

Javax.swing.JCheckBox Javax.swing.JRadioButton

Page 37: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JCheckBox e JRadioButton - Exemplo Exemplo: aplicativo Java que permita que o usuário digite uma

frase e veja sua sentença aparecer em negrito, itálico ou em ambos, dependendo de sua escolha.

Solução: 1. Criar uma classe pública (ex: ExemploCheckBox) que tenha um

objeto de JTextField (para a frase) e dois objetos de JCheckBox (uma para cada fonte que será escolhida)

2. No construtor de objetos da classe pública criar uma instância da classe Container para configurar a GUI.

3. Ajustar o objeto de Container para o layout FlowLayout

4. Inicializar o objeto de JTextField com a criação de uma instância, passando a frase a ser modificada e usando setFont para ajustar a fonte

5. Inicializar os objetos de JCheckBox da classe com as legendas das fontes e adicioná-los ao container

6. Criar o gerenciador de CheckBox para o tratamento de eventos, com sua classe interna de tratamento, onde são colocados os eventos de troca de fontes.

Page 38: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JCheckBox e JRadioButton// Exemplo de JCheckBox e JRadioButtonimport java.awt.*;import java.awt.event.*;import javax.swing.*;

public class ExemploCheckBoxRadio extends JFrame {

private JCheckBox checkB, checkI; private JRadioButton rbotao1, rbotao2, rbotao3; private ButtonGroup grupoRadio; private JPanel painel1, painel2;

// Configura a GUI public ExemploCheckBoxRadio() { super( "Testando CheckBox e RadioButton" );

// Cria o container e atribui o layout Container container = getContentPane(); container.setLayout( new FlowLayout() ); // Cria os painéis painel1 = new JPanel(); painel2 = new JPanel();

// Cria os objetos CheckBox, adiciona para o painel e // adiciona o painel para o container checkB= new JCheckBox("Bold"); painel1.add(checkB); checkI = new JCheckBox("Itálico"); painel1.add(checkI); container.add(painel1);...

Page 39: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JCheckBox e JRadioButton // Cria os objetos RadioButton, adiciona para o painel e //adiciona o painel para o container rbotao1 = new JRadioButton("Plain", true); painel2.add(rbotao1); rbotao2 = new JRadioButton("Bold", false); painel2.add(rbotao2); rbotao3 = new JRadioButton("Itálico", false); painel2.add(rbotao3); container.add(painel2);

//Cria o relacionamento lógico entre os objetos JRadioButton grupoRadio = new ButtonGroup(); grupoRadio.add(rbotao1); grupoRadio.add(rbotao2); grupoRadio.add(rbotao3);

//Registra os tratadores de evento Gerenciador gerente = new Gerenciador(); checkB.addItemListener( gerente ); checkI.addItemListener( gerente ); rbotao1.addItemListener( gerente ); rbotao2.addItemListener( gerente ); rbotao3.addItemListener( gerente );

setSize( 300, 100 ); setVisible( true ); }...

Page 40: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JCheckBox e JRadioButton // Classe interna para tratamento de evento private class Gerenciador implements ItemListener { // Método de manipulação do evento public void itemStateChanged( ItemEvent event ) { //Testa qual objeto foi pressionado if (event.getSource() == checkB) { JOptionPane.showMessageDialog( null, "O check box Bold foi selecionado" ); } else if (event.getSource() == checkI) { JOptionPane.showMessageDialog( null, "O check box Itálico foi selecionado" ); } else if ((event.getSource() == rbotao1) && (event.getStateChange() == ItemEvent.SELECTED)) { JOptionPane.showMessageDialog( null, "O radio button Plain foi selecionado" ); } else if ((event.getSource() == rbotao2) && (event.getStateChange() == ItemEvent.SELECTED)) { JOptionPane.showMessageDialog( null, "O radio button bold foi selecionado" ); } else if ((event.getSource() == rbotao3) && (event.getStateChange() == ItemEvent.SELECTED)) { JOptionPane.showMessageDialog( null, "O radio button Itálico foi selecionado" ); } } } // fim da classe interna Gerenciador // Método principal public static void main(String args[]) { ExemploCheckBoxRadio application = new ExemploCheckBoxRadio(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); }} // fim da classe ExemploCheckBoxRadio

Page 41: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JComboBox - Exemplo Exemplo: aplicativo Java que permita ao usuário

escolher itens relacionados em dois componentes ComboBox distintos.

Solução: 1. Criar uma classe pública (ex: ExemploComboBox) que tenha

dois objetos JComboBox e um objeto do tipo Vector.2. No construtor de objetos da classe pública criar uma instância

da classe Container para configurar a GUI. 3. Ajustar o objeto de Container para o layout FlowLayout4. Adicionar alguns itens para o objeto ComboBox através do

método add() e definir o item selecionado por padrão5. Adicionar esse primeiro ComboBox objeto para o container.6. Adicionar uma lista de itens para o objeto do tipo Vector,

utilizar esse vetor na criação do segundo ComboBox e adicionar este objeto ao container

7. Criar o gerenciador de ComboBox para o tratamento de eventos, com sua classe interna de tratamento, onde deve ser apresentado o conteúdo do texto quanto o item for selecionado.

Page 42: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JComboBoximport java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;

public class ExemploComboBox extends JFrame {

private JComboBox cbb = new JComboBox(); private JComboBox cbb1; private Vector cor = new Vector();

// Configurando a GUI public ExemploComboBox() { super( "Testando JComboBox" );

// Cria um container e define o modelo de layout (FlowLayout) Container container = getContentPane(); container.setLayout( new FlowLayout() );

// Adiciona os elementos para o primeiro Combo cbb.addItem("Disciplina 1"); cbb.addItem("Disciplina 2"); cbb.addItem("Disciplina 3"); //Define o item que estará selecionado cbb.setSelectedItem("Disciplina 2"); //Adiciona para o container container.add( cbb );

//Preenche o vetor cor.add("Verde"); cor.add("Amarelo"); cor.add("Azul"); cor.add("Branco");

Page 43: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JComboBox //Cria um Combo utilizando o vetor cbb1 = new JComboBox(cor); //Adiciona para o container container.add( cbb1 );

// registra os tratadores de evento GerenciadorComboBox gerenteCB = new GerenciadorComboBox(); cbb.addItemListener(gerenteCB);

setSize( 300, 170 ); setVisible( true ); setDefaultCloseOperation(EXIT_ON_CLOSE); }

private class GerenciadorComboBox implements ItemListener { //processa eventos associados aos objetos ComboBox public void itemStateChanged(ItemEvent evento) { String texto = ""; if ((evento.getSource() == cbb) && (evento.getStateChange() == ItemEvent.SELECTED)){ JOptionPane.showMessageDialog(null, "O elemento selecionado foi "+cbb.getSelectedItem()); } } } // fim da classe interna

// Método principal da aplicação public static void main( String args[] ){ ExemploComboBox combobox = new ExemploComboBox(); }

} // final da classe

Page 44: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JList - Exemplo Exemplo: aplicativo Java que permita ao usuário

selecionar uma determinada cor de uma lista, que será aplicada ao frame, alterando a cor de acordo com a cor (item) selecionada.

Solução: 1. Criar uma classe pública (ex: ExemploList) que tenha um

objeto JList, um array de Strings e um array do tipo Color 2. No construtor da classe crie uma instância da classe

Container para configurar a GUI. 3. Ajustar o objeto de Container para o layout FlowLayout.4. Criar o objeto JList utilizando o array com os nomes das cores

e definir o modo de seleção como simples.5. Adicionar o objeto JList para o container6. Criar o gerenciador para o tratamento de eventos onde ao ser

escolhido determinado item da lista seja alterada a cor do frame. Utilize o método setBackground(Color) do objeto Container.

Page 45: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JList// Exemplo adaptado do Deitel & Deitelimport java.awt.*;import javax.swing.*;import javax.swing.event.*;

public class ExemploList extends JFrame { private JList listaCores; private Container container;

private String nomeCores[] = { "Preto", "Azul", "Cyan", "Cinza Escuro", "Cinza", "Verde", "Cinza Claro", "Magenta", "Laranja", "Vermelho", "Branco", "Amarelo" };

private Color cores[] = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.red, Color.white, Color.yellow };

// Configuração da GUI public ExemploList() { super("Testando JList");

// Obtém o painel e configura o layout container = getContentPane(); container.setLayout( new FlowLayout() );

// Cria uma lista com os nomes das cores // e define o tamanho máximo da lista para 5 elementos listaCores = new JList( nomeCores ); listaCores.setVisibleRowCount( 5 );

Page 46: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – JList // Permite somente a seleção de uma únida linha listaCores.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );

// Adiciona um JScrollPane para permitir a rolagem // horizontal e vertical container.add( new JScrollPane( listaCores ) );

GerenciadorList gerenteList = new GerenciadorList(); listaCores.addListSelectionListener(gerenteList);

setDefaultCloseOperation(EXIT_ON_CLOSE); setSize( 350, 150 ); setVisible( true ); }

//Classe que gerencia os eventos private class GerenciadorList implements ListSelectionListener { // Método de manipulação do evento public void valueChanged( ListSelectionEvent evento ) { container.setBackground(cores[listaCores.getSelectedIndex()] ); } } // fim da classe interna

public static void main( String args[] ) { ExemploList lista = new ExemploList(); }

} // final da classe

Page 47: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – Menus Os menus são parte integrante das GUIs; Permite que a interface fique mais organizada; Os menus podem ser anexados somente aos objetos das

classes que fornecem o método setJMenuBar(). Duas dessas classes são JFrame e JApplet;

As classes utilizadas para definir menus são JMenuBar, JMenuItem, JCheckBoxMenuItem e JRadioButtonMenuItem;

A classe JMenuBar contém os métodos necessários para gerenciar uma barra de menus;

A classe JMenu contém os métodos necessários para gerenciar menus;

Os menus contêm itens de menu e são adicionados à barra de menus ou a outros menus como submenus;

Page 48: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – Menus A classe JItemMenu contém os métodos necessários para

gerenciar os itens dos menus; O item de menu é um componente GUI pertencente ao

componente menu que quando selecionado realiza determinada ação;

A classe JCheckBoxMenuItem contém os métodos necessários para gerenciar itens de menu que podem ser ativados ou desativados;

A classe JRadioButtonMenuItem contém os métodos necessários para gerenciar itens de menu que também podem ser ativados ou desativados.

Page 49: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – Menus - Exemplo Exemplo: desenvolver um aplicativo Java que apresente três menus:

Cadastro, Relatórios e Ajuda na barra superior da janela. O primeiro menu deve possibilitar o cadastro de Paciente e Médicos e permitir que o sistema seja finalizado. O terceiro menu deve ter um item que possibilite a visualização de um tela com informações do sistema (Sobre).

Solução: 1. Criar uma classe pública (ex: ExemploMenu) estendendo JFrame e contendo

um objeto JMenuBar (barra de menus), três objetos JMenu (para receber os menus) e quatro objetos JMenuItem (para receber os itens dos menus).

2. No construtor da classe atribua o título da janela (setTitle(String)) e crie a barra de menu.

3. No construtor crie os menus, determine a letra que será anexada a tecla “Alt” para possibilitar acesso rápido (setMnemonic(char)) e adicione para a barra de menu.

4. Ainda no construtor crie os itens de menu e adicione para os menus correspondentes.

5. Após criar os objetos crie um objeto da classe Gerenciador. Essa instância será capaz de tratar os eventos associados ao item de menu que finaliza o sistema e também ao item que apresentação a tela com as informações (Sobre). Adicione esse objeto aos listeners dos eventos (addActionListener())

6. Implemente a classe privada Gerenciador, que deve implementar a interface ActionListeners com o tratamento dos eventos associados aos itens de menu. Para isso, implemente o método actionPerformed() para cada item.

Page 50: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – Menusimport java.awt.*;import java.awt.event.*;import javax.swing.*;

public class ExemploMenu extends JFrame {

private JMenuBar barraMenu; private JMenu mCad, mRel, mAjuda; private JMenuItem iPac, iMed, iFim, iSobre; private String sistema = "Sistema de Gerenciamento de Clínicas"; private String versao = "Versao 1.0"; private String build = "(build 20030626)";

// Configura a GUI public ExemploMenu() { //Atribui o título para a janela setTitle(sistema);

//Cria a barra de menus barraMenu = new JMenuBar();

//Cria os menus e adiciona para a barra mCad = new JMenu("Cadastro"); mCad.setMnemonic('C'); mRel = new JMenu("Relatórios"); mRel.setMnemonic('R'); mAjuda = new JMenu("Ajuda"); mAjuda.setMnemonic('A'); barraMenu.add(mCad); barraMenu.add(mRel); barraMenu.add(mAjuda);...

O método setMnemonic(char) permite definir o caracter de atalho utilizado conjuntamente com a tecla Alt

Page 51: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – Menus //Cria os itens de menu iPac = new JMenuItem("Paciente"); iPac.setMnemonic('P'); iMed = new JMenuItem("Médico"); iMed.setMnemonic('M'); iFim = new JMenuItem("Finaliza"); iFim.setMnemonic('F'); iSobre = new JMenuItem("Sobre"); iSobre.setMnemonic('S'); //Adiciona os itens para o menu de Cadastro mCad.add(iPac); mCad.add(iMed); mCad.addSeparator(); mCad.add(iFim); //Adiciona o iten sobre para o menu Ajuda mAjuda.add(iSobre);

// registra os tratadores de evento Gerenciador gerente = new Gerenciador(); iPac.addActionListener(gerente); iFim.addActionListener(gerente); iSobre.addActionListener(gerente);

//Anexa a barra de menu a janela setJMenuBar(barraMenu); setSize(800,600); setVisible(true); //Configura para permitir o fechamento da aplicação //quando a janela for fechada setDefaultCloseOperation(EXIT_ON_CLOSE); }....

Page 52: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – Menus

private class Gerenciador implements ActionListener { //processa eventos de campos de texto public void actionPerformed(ActionEvent evento) { if (evento.getSource() == iPac) { //ExemploGridBagLayout cadastro = new ExemploGridBagLayout(); } else if (evento.getSource() == iFim) { System.exit(0); } else if (evento.getSource() == iSobre) { JOptionPane.showMessageDialog( null, sistema+"\n\n"+" "+versao+" "+build+"\n\n", "Sobre o sistema", JOptionPane.PLAIN_MESSAGE ); } } }

public static void main (String arg[]) { ExemploMenu menuGeral = new ExemploMenu(); }

} //Fim da classe ExemploMenu

Page 53: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Menus – Exercício

• Modifique o exemplo anterior inserindo os menus e itens de menus referente ao exercício sobre cadastro de estudantes, disciplinas e turmas (essa classe tem comportamento de Limite e já deve ser implementada para possibilitar sua utilização no exercício).

Page 54: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - Gerenciadores de Layouts Os gerenciadores de layout são fornecidos para organizar

componentes GUI em um container para que estes sejam apresentados;

FlowLayout Coloca os componentes seqüencialmente (da esquerda para a

direita) na ordem em que foram adicionados. BorderLayout

Organiza os componentes em cinco áreas: norte, sul, leste, oeste e centro.

GridLayout Organiza os componentes em linhas e colunas.

BoxLayout Permite que os componentes sejam organizados da esquerda

para a direita ou de cima para baixo em um container.

Page 55: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - Gerenciadores de Layouts CardLayout

Empilha componentes como uma pilha de cartas.

GridBagLayout Semelhante a GridLayout mas permite que o tamanho de cada

componente varie e que estes possam ser definidos em qualquer ordem.

Existe também a possibilidade de se indicar null para o tipo de layout. Isso significa que nenhum dos gerenciadores serão utilizados. Em função disso o posicionamento passa a ser absoluto, dependente de plataforma e resolução de vídeo. Deve então utilizar o método setBounds(x, y, width, height), onde, x (deslocamento a partir da esquerda – eixo x), y (deslocamento a partir do topo – eixo y), width (tamanho) e height (altura).

Page 56: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - GridBagLayout É o mais poderoso dos gerenciadores de layout; Os componentes adicionados para o layout podem

variar em tamanho, isto é, eles podem ocupar múltiplas linhas e colunas;

Podem ser adicionados em qualquer ordem; A tela é dividida em linhas e colunas representando

as células que serão ocupadas pelos componentes;

Page 57: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - GridBagLayoutColuna

0 1 2 3

0

1

2

3

4

Linha

Page 58: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - GridBagLayout Duas classes são importantes para definição do

layout. GridBagConstraints Insets

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)

Page 59: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - GridBagLayoutgridx 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 a 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

Page 60: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - GridBagLayout Insets

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

Page 61: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - GridBagLayout container.add(lblNome, new GridBagConstraints (0, 0, 1, 1, 0, 0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(30, 10, 0, 10), 0, 0)

Page 62: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing - GridBagLayout container.add(edtNome, new GridBagConstraints(1, 0, 3, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(30, 10, 0, 10), 0,0));

Page 63: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – GridBagLayout - Exemplo Exemplo: desenvolver um aplicativo Java que apresente uma interface GUI

possibilitando que o usuário informe os dados cadastrais de um paciente (Nome, Endereço, Idade, CPF). Essa interface deve ainda possuir três botões um que apresenta a relação de pacientes, um para confirmar as informações e outro para finalizar o janela.

Solução: 1. Criar uma classe pública (ex: ExemploGridBagLayout) estendendo JFrame

e contendo quatro objetos JLabel (rótulos para identificação dos campos de edição), quatro objetos JTextFiedl (campos de edição), três objetos JButton (para os controle da interface), um objeto Container e um objeto GridBagLayout (para definição do layout da interface).

2. No construtor da classe atribuir o painel getContentPane() para o container e configurar o layout.

3. Adicionar cada componente JLabel, JTextEdit, JButton para o container utilizando GridBagLayout().

4. No construtor da classe atribuir o título da janela (setTitle(String)).5. Após adicionar os objetos para o layout criar um objeto da classe

GerenciadorGeral. Essa instância será capaz de tratar os eventos associados ao botão que finaliza o sistema. Adicione esse objeto ao listener do evento (addActionListener()).

6. Definir as configurações básicas tais como: título da janela setTitle(String), setResizable(boolean), setSize(int, int) e setVisible(boolean).

7. Implementar a classe privada GerenciadorGeral, que deve implementar a interface ActionListeners com o tratamento dos eventos associados ao botão que finaliza o sistema. Para isso, implemente o método actionPerformed().

Page 64: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – GridBagLayoutimport java.awt.*;import java.awt.event.*;import javax.swing.*;

public class ExemploGridBagLayout extends JFrame { private final String strTitulo = "Cadastro de Pacientes";

//Cria os rótulos private JLabel lblNome = new JLabel("Nome:"); private JLabel lblEndereco = new JLabel("Endereço:"); private JLabel lblIdade = new JLabel("Idade:"); private JLabel lblDocumento = new JLabel("CPF:");

//Cria os campos de edição public JTextField edtNome = new JTextField(); public JTextField edtEndereco = new JTextField(); public JTextField edtIdade = new JTextField(); public JTextField edtCPF = new JTextField();

//Cria os botões private JButton btnConfirmar = new JButton("Confirmar"); private JButton btnCancelar = new JButton("Cancelar"); private JButton btnRelacaoPacientes = new JButton("Relação de Pacientes");

//Cria o container e o layout private Container container = new Container(); private GridBagLayout layout = new GridBagLayout();....

Page 65: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – GridBagLayout public ExemploGridBagLayout() {

//Configura o layout container = getContentPane(); container.setLayout(layout);

//Adiciona os componentes ao container //Rótulos e campos de edição container.add(lblNome, new GridBagConstraints(0, 0, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(30, 10, 0, 10), 0, 0)); container.add(edtNome, new GridBagConstraints(1, 0, 3, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(30, 10, 0, 10), 0, 0)); container.add(lblEndereco, new GridBagConstraints(0, 1, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0)); container.add(edtEndereco, new GridBagConstraints(1, 1, 3, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10, 10, 0, 10), 0, 0)); container.add(lblIdade, new GridBagConstraints(0, 2, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0)); container.add(edtIdade, new GridBagConstraints(1, 2, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10, 10, 0, 10), 0, 0)); container.add(lblDocumento, new GridBagConstraints(0, 3, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0)); container.add(edtCPF, new GridBagConstraints(1, 3, 2, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10, 10, 0,

150), 0, 0));....

Page 66: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – GridBagLayout //Botões container.add(btnRelacaoPacientes, new GridBagConstraints(0, 4, 2, 1, 0, 0 ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(100, 10, 17, 0), 0, 0)); container.add(btnConfirmar, new GridBagConstraints(2, 4, 1, 1, 0, 0 ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(100, 127, 17, 0), 0, 0)); container.add(btnCancelar, new GridBagConstraints(3, 4, 1, 1, 0, 0 ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(100, 0, 17, 10), 0, 0));

//Registra o tratador de eventos GerenciadorGeral gerGeral = new GerenciadorGeral(); btnCancelar.addActionListener(gerGeral);

//Define as configurações gerais setTitle(strTitulo); setResizable(false); setSize(500, 300); setVisible(true); }

private class GerenciadorGeral implements ActionListener { public void actionPerformed(ActionEvent evento) { if (evento.getSource() == btnCancelar) System.exit(0); } }

public static void main (String par[]) { ExemploGridBagLayout exemplo = new ExemploGridBagLayout(); }}

Page 67: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Swing – Exemplo usando posição absolutaimport java.awt.*;import javax.swing.*;

public class PosicaoAbsoluta extends JFrame { private JLabel lblLNome = new JLabel("Nome:"); private JTextField txtLNome = new JTextField(); private JLabel lblLEndereco = new JLabel("Endereço:");

private JTextField txtLEndereco = new JTextField();

public PosicaoAbsoluta() {super.setTitle("Exercício");Container container = getContentPane(); container.setLayout(null);

lblLNome.setBounds(new Rectangle(35, 35, 100, 19));txtLNome.setBounds(new Rectangle(101, 36, 300, 20)); container.add(lblLNome); container.add(txtLNome); lblLEndereco.setBounds(new Rectangle(35, 75, 100, 19));txtLEndereco.setBounds(new Rectangle(101, 76, 300, 20));container.add(lblLEndereco);container.add(txtLEndereco); setResizable(true);setSize(520, 180);setVisible(true);}

public static void main (String args[]){PosicaoAbsoluta posicao = new PosicaoAbsoluta();posicao.setDefaultCloseOperation(EXIT_ON_CLOSE);}

}

O construtor do objeto Rectangle é composto pelos seguintes parâmetros:

Rectangle(x, y, width, height);

x: posição horizontal na telay: posição vertical na telawidth: comprimentoheight: altura

Page 68: Roberto C. S. Pacheco pacheco@egc.ufsc.br Professor Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Ricardo N. Rieke rieke@egc.ufsc.br Monitor

Exercício

Alterar o sistema de cadastro de estudantes, disciplinas e turmas para utilizar os componentes de interface gráfica, tanto para entrada como para apresentação de informações.

Obs.: Como o exercício foi implementado utilizando o modelo MVC, é necessário somente fazer alterações nas classes limites, pois as regras de negócio estão implementadas nos controladores.