Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
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(MouseEvent ev) {
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: