Buscar

Aula 11

Prévia do material em texto

Programação Orientada a Eventos 
 
 
 
Alexandre Marcos C. Gitirana 
amcgitirana@yahoo.com.br 
 
2013.1 
Abstract Window Toolkit(AWT) 
l 
Swing vs. AWT 
Swing Características 
A vantagem de se usar dois buffers ao invés de um só é muito simples: enquanto o computador 
armazena dados em um dos buffers, ele pode ler no outro. É como se fosse um revezamento, o 
PC grava dados no Buffer A e lê no Buffer B; 
Arquitetura MVC 
Top Level Containers 
Criando uma interface 
• Primeiro passo: criar uma classe que representa a interface gráfica 
com o usuário (Jwindow ou JFrame); 
 
• Criação: 
public class Janela extends JFrame 
{ 
.... 
} 
O construtor da classe deve tratar das seguintes tarefas: 
• Chamar o construtor de uma superclasse para dar um título ao frame e tratar de 
outros procedimentos de configuração; 
• Definir o tamanho da janela de um frame; 
• Decidir o que fazer se um usuário fechar a janela; 
• Exibir o frame; 
 
JFrame 
Jframe Exemplo 
Conteiners 
Hierarquia de Composição 
Hierarquia de Classes 
• JButton (String) 
• JButton (Icon) 
• JButton (String, Icon) 
• Exemplo: 
JButton btok = new JButton(" OK "); 
JButton btcal = new JButton(" Calcular "); 
JButton 
JImageIcon 
• JImageIcon 
Usado em botões e outros componentes para 
adicionar ícones; 
 
• Exemplo: 
JImageIcon ico = new 
JImageIcon(“DOOROPEN.GIF”); 
JButton btsair = new JButton(" Sair “,ico); 
ou 
JButton btsair = new JButton(ico); 
JLabel 
• JLabel (String) 
• JLabel (String, int) - com alinhamento 
• JLabel (String, Icon, int) – com ícone e alinhamento 
• Exemplo: 
JLabel lbnome = new JLabel (“Nome do usuário"); 
JLabel lbtel = new JLabel (" Telefone "); 
 
• JTextField () 
• JTextField (int) - com tamanho 
• JTextField (String, int) – texto default e tamanho 
 
• Exemplo: 
JTextField tfNome = new JTextField (30); 
JTextField tfTel = new JTextField (" digite aqui “, 40); 
JTextField 
 
• setEditable(boolean): tornar ou não o campo editável 
• isEditable( ): retorna true ou false, se o campo é ou não editável 
• getText( ): captura o texto do campo 
• setText(String): coloca um texto no campo 
• getSelectedText( ):captura o texto do campo que foi selecionado. 
JTextField 
• Estende de JTextField 
• Mesmos métodos de sua classe “pai”; 
• Exemplo: 
JPasswordField login = new PasswordField(20); 
login.setEchoChar(‘#’); 
JPasswordField “campos de senha” 
JTextArea 
• JTextArea(int,int) - linhas e colunas 
• JTextArea (String, int, int) – texto default,linhas e 
colunas 
• getText( ), setText( ), getSelectedText( ); 
• append(String) – acrescenta linha no final 
• insert(String,int) – insere linha numa posição; 
• setLineWrap(boolean) – determina se o texto quebrará 
automatico quando chegar a margem final. 
 
JScrollPane 
 
• JScrollPane(Component) - especificar o componente que terá a rolagem; 
• JScrollPane(Component, int, int) – além do componente, se haverá rolagem vertical e 
horizontal; 
 
• VERTICAL_SCROLLBAR_ALWAYS 
• VERTICAL_SCROLLBAR_AS_NEEDED 
• VERTICAL_SCROLLBAR_NEVER 
 
EXEMPLO: 
JTextArea obs = new JTextArea(10,40); 
JScrollPane scroll = new 
JScrollPane(obs,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, 
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
add(scroll); 
JCheckBox e JRadioButton 
• Vários métodos em comum: 
• setSelected(boolean): seleciona o componente se o argumento for true. 
• isSelected( ): retorna um booleano se o componente está selecionado. 
 
• Construtores: 
• JCheckBox (String): com o texto da opção; 
• JCheckBox (String,boolean): rotulo + seleção; 
• JCheckBox (Icon): com icone; 
• JCheckBox (Icon,boolean): icone + seleção 
• JCheckBox (String,Icon): texto + icone; 
• JCheckBox (String,Icon,boolean): texto + icone +seleção. 
Exemplo: 
ButtonGroup grup = new ButtonGroup(); 
JRadioButton b1 = new JRadioButton (“Delphi”, true); 
grup.add(b1); 
JRadioButton b2 = new JRadioButton (“Java”, false); 
grup.add(b2); 
 
 
 
JComboBox 
• Lista drop-down; 
• JComboBox( ) – sem argumentos; 
• addItem(Object): acrescenta itens; 
• getItemAt(int): retorna o texto do item na posição de indice especificada pelo 
argumento inteiro; 
• getItemCount( ): retorna o nº de itens; 
• getSelectedIndex( ): retorna a posição do indice do item selecionado; 
• getSelectedItem( ): retorna o texto do item selecionado; 
• setSelectedIndex(int): retorna o item na posição de indice indicada; 
• Exemplo: 
public class Teste extends JFrame { 
String itens[ ] = { “Windows", “Unix", “Linux", “MacOS" }; 
JComboBox cBox = new JComboBox(); 
public Teste() { 
.... 
JPanel pane = new JPanel(); 
for (int i = 0; i < itens.length; i++) 
cBox.addItem(itens[i]); 
pane.add(cBox); 
add(pane); 
.... 
} 
JList 
• Lista drop-down; 
• JList( ) – sem argumentos; 
• JList(Object[ ]) – com array da classe especificada (como String); 
• setVisibleRowCount(int): define quantas linhas serão exibidas; 
• getSelectedValues( ): retorna um array de objetos que contém todos os 
itens selecionados; 
• Exemplo: 
public class Teste extends JFrame { 
String opcoes[ ] = { “Esporte", “Musica", “Videos", “Info“, “Tv” }; 
JList lista = new JList(opcoes); 
public Teste() { 
.... 
JPanel pane2 = new JPanel(); 
lista.setVisibleRowCount(3); 
JScrollPane br = new JScrollPane(lista); 
pane2.add(br); 
add(pane2); 
.... 
} 
Menus 
 
• A biblioteca Swing disponibiliza menus comuns (pull-down) e menus pop-up 
• Um menu pode conter itens de menu e separadores, sendo que os itens podem ter 
texto e imagem, além de poderem ser marcados (como um checkbox) 
 
Classe JMenuBar 
 
• Modela uma barra de menu, fixa em uma janela da aplicação 
• Na barra de menu pode-se colocar os menus da aplicação, sendo que o menu de 
ajuda (help) possui um tratamento diferenciado 
 
Classe JMenu 
• Modela um menu que pode ser colocado na barra de menus ou dentro de um outro 
menu 
• Pode conter: 
• itens de menu 
• separadores 
 
 
Métodos de JMenu 
• JMenu(String s) 
• JMenuItem add(String name): adiciona um item de menu 
• JMenuItem add(JMenuItem menuItem): adiciona um objeto item de menu 
• JMenuItem insert(JMenuItemi, int p): insere um item de menu numa determinada 
posição 
• void addSeparator( ): adiciona um separador; 
• void insertSeparator(int pos): idem para uma posição especifica; 
 
Classe JMenuItem 
 
• Modela um item de menu 
• É superclasse de JMenu, uma vez que um menu também pode ser um item de menu 
• É sub-classe de JAbstractButton, logo, um item de menu é um botão 
Métodos de JMenuItem 
• JMenuItem(String text) 
• JMenuItem(String text, Icon icon): adiciona um item de menu, com ícone; 
• void setAccelerator(KeyStroke keyStroke) 
• void setEnabled(boolean b): habilita um item de menu; 
• void addActionListener(ActionListener l): adiciona um Listener; 
Menus 
Exemplo de Menu 
 
JMenuItemj1 = new JMenuItem(“Abrir"); 
JMenuItemj2 = new JMenuItem(“Salvar"); 
JMenuItemj3 = new JMenuItem(“Executar"); 
JMenuItemj4 = new JMenuItem(“Desfazer"); 
JMenuBar menubar = new JMenuBar(); 
JMenu menu = new JMenu(“Arquivos"); 
 
menu.add(j1); 
menu.add(j2); 
menu.addSeparator(); 
menu.add(j3); 
menu.add(j4); 
 
menubar.add(menu); 
setJMenuBar(menubar); 
Menus 
Classe JPopupMenu 
• Modela um menu pop-up, isto é, um menu que pode ser aberto sobre um 
elemento qualquer de interface, fora da barra de menu 
• Assim como um menu comum, um menu pop-up pode conter itens de menu e 
separadores 
Métodos de JPopupMenu 
• JPopupMenu() 
• JPopupMenu(String label) 
• JMenuItem add(String name) 
• JMenuItem add(JMenuItem menuItem) 
• void addSeparator() 
• void pack() 
• void show(Component c, int x, int y) 
 
Menus 
JPopupMenu 
Exemplo de JPopupMenu 
JFrame f = new JFrame("Teste"); 
final JPopupMenu p = new JPopupMenu(); 
JMenu m = new JMenu("Arquivo"); 
m.add("Sair"); 
p.add(m); 
f.addMouseListener(new MouseAdapter() { 
public void mousePressed(MouseEvent ev) { 
if (ev.isPopupTrigger()) 
p.show((Component)ev.getSource(), ev.getX(), ev.getY()); 
} 
public void mouseReleased(MouseEventev) { 
if (ev.isPopupTrigger()) 
p.show((Component)ev.getSource(), ev.getX(), ev.getY()); 
}}; 
f.pack(); 
f.show(); 
Diagramadores 
 
• Arrumam um grupo de elementos 
• Estão associados aos containers 
• Diferentes estilos de arrumação 
 
• como fluxo de texto 
• orientada pelas bordas 
• em forma de grade 
• e outros... 
 
java.awt.FlowLayout 
• Coloca os componentes lado a lado, uma linha após a outra 
• Alinhamento: centralizado (default), à esquerda ou à direita 
• Default para o JPanel 
 
java.awt.BorderLayout 
• Divide o container em 5 áreas: norte, sul, leste, oeste e centro 
• Default para content pane do JFrame 
Diagramadores 
java.awt.GridLayout 
• Células do mesmo tamanho especificadas pelo número de linhas e colunas 
Orientação por Eventos 
Um modelo de programação que tornou-se bastante difundido com o uso de interfaces 
gráficas foi a programação orientada por eventos. Segundo esse modelo, o programa 
deixa de ter o controle do fluxo de execução, que passa a um sistema encarregado de 
gerenciar a interface. Assim, o programa passa a ser chamado pelo sistema quando 
algum evento é gerado na interface. 
 
Mecanismos de Callback 
• Para que o programa possa ser chamado pelo sistema, ele deve registrar uma função 
para cada evento de interface que ele desejar tratar. 
• Tais funções são chamadas de callbacks por serem ‘chamadas de volta’ pelo sistema. 
 
Callbacks OO?? 
 
• Esse modelo é ortogonal ao modelo de orientação por objetos. É perfeitamente 
possível projetar um sistema OO que use o modelo de orientação por eventos para 
tratar eventos de interface, comunicações, etc. 
• Porém, temos um problema: uma linguagem puramente OO não possui o conceito de 
função. Como resolver então? 
 
 
Objeto Callback 
 
A solução é utilizar um objeto que faça o papel de callback. Ou seja, onde 
registraríamos uma função, passamos a registrar um objeto. Assim, quando o sistema 
precisar executar a callback, ele deverá executar um determinado método do objeto. 
Esse método, então, fará o tratamento do evento. 
 
Callbacks em Java 
• Como Java é uma linguagem OO na qual não existe o conceito de função, 
callbacks devem ser implementadas através de objetos 
• Um objeto que implementa uma callback em Java é chamado de listener 
 
Orientação por Eventos 
Listeners & Eventos 
• Os listeners fazem o papel das callbacks. 
• Listeners são definidos por interfaces e podem estar aptos a tratar mais de um tipo de 
evento. 
• Quando um listener tem um de seus métodos chamados, ele recebe um parâmetro que 
• descreve o evento ocorrido. Esse parâmetro é um objeto: existem classes para modelar 
diferentes grupos de eventos. 
 
Listeners 
• Definem interfaces que representam um grupo de callbacks 
• São registrados junto aos componentes 
 
Exemplo: java.awt.event.MouseListener 
public abstract void mouseClicked(MouseEvent e) 
public abstract void mousePressed(MouseEvent e) 
public abstract void mouseReleased(MouseEvent e) 
public abstract void mouseEntered(MouseEvent e) 
public abstract void mouseExited(MouseEvent e) 
ActionListener 
• Modela a callback de um evento do tipo ActionEvent. 
public abstract void actionPerformed(ActionEvent e) 
 
WindowListener 
 
• Modela a callback de um evento do tipo WindowEvent. Essa interface declara um 
método para cada evento do grupo 
public abstract void windowOpened(WindowEvent e) 
public abstract void windowClosing(WindowEvent e) 
public abstract void windowClosed(WindowEvent e) 
public abstract void windowIconified(WindowEvent e) 
public abstract void windowDeiconified(WindowEvent e) 
public abstract void windowActivated(WindowEvent e) 
public abstract void windowDeactivated(WindowEvent e) 
Eventos 
• Trazem informações sobre o evento ocorrido 
• São passados aos listeners (callbacks) 
ActionEvent 
• Modela o evento que representa uma ação executada sobre 
um componente. 
• O significado depende do componente. 
 
Exemplos: 
• “botão pressionado“ 
• “entrada de texto finalizada” 
• … 
Modela os eventos que podem ocorrer em uma janela. Essa classe declara constantes que 
identificam os diversos eventos 
public static final intWINDOW_OPENED 
public static final intWINDOW_CLOSING 
public static final intWINDOW_CLOSED 
public static final intWINDOW_ICONIFIED 
public static final intWINDOW_DEICONIFIED 
public static final intWINDOW_ACTIVATED 
public static final intWINDOW_DEACTIVATED 
public Window getWindow() 
Listener 
Implementando um Listener 
• Define a classe que implementa a interface do Listener 
class MeuListener implements ActionListener { 
public void actionPerformed(ActionEvent e) { 
System.out.println("Botão pressionado"); 
} 
} 
 
Registrando um Listener 
• Cria o objeto de callback e o registra no componente 
 button.addActionListener(new MeuListener()); 
 
Listener 
class MeuListener implements WindowListener { 
 
public void windowOpened(WindowEvent e) { } 
public void windowClosing(WindowEvent e) { 
System.out.println("Janela sendo fechada"); 
} 
public void windowClosed(WindowEvent e) { } 
public void windowIconified(WindowEvent e) { } 
public void windowDeiconified(WindowEvent e){ } 
public void windowActivated(WindowEvent e){ } 
public void windowDeactivated(WindowEvent e) { } 
} 
Implementando um Listener de janela 
 
Para criarmos um listener para um evento de janela devemos criar uma classe que 
implemente a interface WindowListener. Nessa classe, codificaremos, então, o 
método correspondente ao evento que desejamos tratar. Porém, não podemos 
implementar uma interface e deixar de codificar algum método. Assim, precisaremos 
implementar todos os sete métodos definidos. 
Exercícios 
 
1) Escreva um programa que jogue “adivinhe o número”: o programa escolhe um número a ser 
adivinhado, selecionando-o randomicamente no intervalo de 1-1000. O programa mostra uma 
mensagem (JLabel) – Eu tenho um número entre 1 e 1000, você pode adivinhá-lo? Entre com 
seu chute. 
 
• Um JTextField deve ser usado na captura do valor. Para cada tentativa de adivinhação a cor de 
fundo deve mudar ou para vermelho ou azul. Vermelho indica que o usuário está chegando mais 
perto e azul indica que o usuário está se afastando do número. Um JLabel deve mostrar ou 
“Mais Perto” ou “Mais Longe” como auxílio ao usuário. 
 
• Quando a resposta estiver correta, você deve mostrar a frase “Correto!” e não permitir mais a 
edição no JTextField. 
 
• Um JButton deve permitir um novo jogo. Quando o JButton é clicado, um novo número 
randômico deve ser gerado e o JTextField ser editável. 
Exercícios 
 
2) Vamos fazer uma calculadora:

Continue navegando