Tratamento de Eventos Profa. Isabel Harb Manssour e Márcia Cristina Moraes (Material adaptado das aulas dos Profs: Luciana Nedel, Bernardo Copstein e Júlio P. Machado) Introdução Interfaces (revisão) Delegação de eventos Tratamento de eventos Classes Adaptadoras Capturando Eventos nos Componentes Swing Introdução Eventos são a forma utilizada por Java para adicionar interatividade em interfaces gráficas. Cada vez que o usuário pressionar um botão, digitar um caractere ou movimentar o mouse, por exemplo, ocorre um evento. 1
Introdução Neste modelo de programação, uma vez criados os componentes da interface (ex: janela), o sistema operacional se encarrega de monitorar as ações do usuário. Não existe a necessidade de prever, na aplicação, um laço aguardando uma entrada via mouse ou teclado. Essa responsabilidade passa a ser do sistema operacional. Introdução Programas baseados em janelas X Programas baseados na console: Programa com saída para a console: o usuário dispara a execução e o próprio código determina a seqüência dos eventos, onde geralmente tudo é pré-determinado. Aplicação baseada em janelas (ou uma applet): a operação do programa é conduzida pela GUI; a seleção de botões ou ícones usando o mouse ou o teclado causa ações particulares. 2
Introdução Programação dirigida por eventos: teclado, mouse Sistema Operacional Biblioteca de classes Java Eventos método método método método Tratamento de Eventos Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel, Bernardo Copstein e Júlio P. Machado) Introdução Interfaces (revisão) Delegação de eventos Tratamento de eventos Classes Adaptadoras Capturando Eventos nos Componentes Swing 3
Interfaces (revisão) Uma interface é, essencialmente, uma coleção de constantes e métodos abstratos Para fazer uso de uma interface Implementa-se a mesma em uma classe, isto é, declara-se que a classe implementa a interface e escreve-se o código para cada um dos métodos declarados na interface Interfaces (revisão) Métodos em uma interface são sempre públicos e abstratos public abstract Constantes em uma interface são sempre públicas, estáticas e final public static final 4
Interfaces (revisão) Em suma, uma interface lista um conjunto de métodos que outras classes podem implementar Uma classe que implementa uma interface deve implementar TODOS os métodos listados Interface não é uma classe abstrata!! Não confundir com interface gráfica, ou interface de usuário! Interfaces (revisão) Exemplo public interface Dirigível { int MAXTURN = 45; //é public static final por default //é public abstract por default void viraesquerda(int graus); //é public abstract por default void viradireita(int graus); public class Carro implements Dirigível { //Carro deve obrigatoriamente implementar os //métodos viraesquerda e viradireita public void viradireita(int graus){... public void viraesquerda(int graus){... 5
Tratamento de Eventos Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel, Bernardo Copstein e Júlio P. Machado) Introdução Interfaces (revisão) Delegação de eventos Tratamento de eventos Classes Adaptadoras Capturando Eventos nos Componentes Swing Delegação de Eventos Sempre que o usuário utiliza o mouse, o teclado ou outro dispositivo de entrada qualquer, o sistema operacional se encarrega de converter essas ações em eventos. Para cada evento que o sistema operacional é capaz de gerar, a aplicação deve prever um tratamento correspondente ( o que deve acontecer em resposta ). Em Java a ação resposta padrão para qualquer evento é não fazer nada. 6
Delegação de Eventos Para se ter uma ação em resposta, é necessário definir qual ou quais os componentes que serão encarregados de monitorar determinado evento, reagindo ao mesmo quando este ocorrer. Dizemos que um componente capaz de perceber um evento é um componente capaz de escutá-lo. Em Java, dizemos que para um componente ser capaz de perceber um evento (e tratá-lo) é necessário associar um listener (algo como um ouvinte ) ao componente. Delegação de Eventos Existem 4 componentes envolvidos no processo de tratamento de eventos: Origem do evento: é um componente onde o evento é gerado. Ex.: um evento de clique do mouse pode ser originado de um botão Evento: é um objeto que representa o evento gerado. Listener ou Receptor de evento: é um objeto responsável por ouvir ou captar a ocorrência do evento. Handler: é um método do listener responsável por executar as ações decorrentes do evento. 7
Delegação de Eventos OK Origem do Evento Notificação do Evento Listener Handler Delegação de Eventos Como isso acontece? Primeiro O listener tem que se registrar no objeto origem do evento, informando que tipo de evento ele está interessado em receber. Quando um evento ocorre O listener é notificado que o evento ocorreu O objeto origem notifica o listener através da execução de um método específico, o qual recebe como parâmetro o objeto evento. Quando o listener recebe a notificação Executa o método handler apropriado 8
Tratamento de Eventos Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel, Bernardo Copstein e Júlio P. Machado) Introdução Interfaces (revisão) Delegação de eventos Tratamento de eventos Classes Adaptadoras Capturando Eventos nos Componentes Swing Tratamento de Eventos Vimos que o objeto origem de um evento notifica o listener através da execução de um método específico. Cada tipo de evento possui métodos específicos para o seu tratamento. Para saber que métodos são esses e como a classe listener deve implementá-los utilizamos o conceito de interface. 9
Tratamento de Eventos Como implementar um listener? Um listener deve implementar um interface que define os métodos que serão chamados quando os eventos ocorrerem. Ex.: O evento que ocorre quando um botão é clicado é o evento (objeto) ActionEvent. Todos os listeners que estão registrados para um botão e esperam receber a notificação de um clique do botão devem implementar o método actionperformed(), que será chamado pelo botão quando for clicado. Este método está definido na interface ActionListener, logo o listener deverá implementar esta interface. Tratamento de Eventos Exemplo: usuário clica em um botão de uma interface gráfica. Origem do evento: botão (evento gerado a partir do clique do mouse é associado com o objeto JButton) Notificação do evento: criação de uma instância de ActionEvent Objeto que representa e identifica este evento Contém informações sobre o evento e sua fonte Objeto ActionEvent será passado para um objeto listener ( destino de um evento) previamente registrado Pode escutar eventos de um objeto particular (um botão, por exemplo) ou de um grupo de diferentes objetos (itens de um menu) 10
Tratamento de Eventos Exemplo public interface ActionListener { void actionperformed( ActionEvent e); public class MeuListener implements ActionListener { public void actionperfomed(actionevent e) { //Aqui vem o código que é executado //quando o botão for pressionado. Tratamento de Eventos Resumindo: É possível fazer objetos de qualquer classe escutar objetos, simplesmente fazendo a classe em questão implementar uma interface listener Existe uma variedade de interfaces listener (java.awt.event.* e javax.swing.event.*): ActionListener, WindowListener, MouseListener, MouseMotionListener, KeyListener, ListSelectionListener, 11
Tratamento de Eventos (java.awt.event) ActionListener - eventos de ação, que são gerados por um usuário agindo sobre um componente, como um clique em um botão. FocusListener - eventos de foco de teclado, que são gerados quando um componente, como um campo de texto, ganha ou perde o foco. ItemListener - eventos de item, que são gerados quando um item, como uma caixa de seleção, foi alterado. KeyListener - eventos de teclado, que ocorrem quando uma tecla é pressionada. MouseListener - eventos de mouse, que são gerados por cliques do mouse, um mouse entrando ou deixando uma área de um componente. MouseMotionListener - eventos de movimento de mouse, usados para controlar a movimentação do mouse sobre um componente. WindowListener - eventos de janela, que são gerados por uma janela ao ser maximizada, minimizada, movida ou fechada. Tratamento de Eventos WindowListener: windowopened(windowevent e) - Chamado a primeira vez que a janela é aberta. windowclosing(windowevent e) - Chamado quando o ícone de fecha janela é selecionado. windowclosed(windowevent e) - Chamado quando do fechamento de uma janela. windowactivated(windowevent e) - Chamado quando uma janela é ativada (clicando sobre a mesma, por exemplo). windowdeactivated(windowevent e) - Chamado quando uma janela é desativada (clicando sobre uma outra janela, por exemplo). windowiconified(windowevent e) - Chamado quando uma janela é minimizada. windowdeiconified(windowevent e) - Chamado quando uma janela é restaurada a partir de um ícone. 12
Tratamento de Eventos ActionListener: actionperformed - Chamado quando uma ação ocorre MouseListener: mouseclicked(mouseevent e) - Chamado quando o botão do mouse é clicado (e solto) sobre um componente mousepressed(mouseevent e) - Chamado quando o botão do mouse é clicado sobre um componente mousereleased(mouseevent e) - Chamado quando o botão do mouse é solto sobre um componente mouseentered(mouseevent e) - Chamado quando o mouse entra na área de um componente mouseexited(mouseevent e) - Chamado quando o mouse deixa a área de um componente Tratamento de Eventos MouseMotionListener: mousemoved(mouseevent e) - Chamado quando o mouse se movimenta com um componente (drag) mousedragged(mouseevent e) - Chamado quando o mouse se movimenta com um componente (drag) enquanto o botão do mouse está pressionado KeyListener: keytyped(keyevent e) - Chamado quando uma tecla do teclado é pressionada e solta keypressed(keyevent e) - Chamado quando uma tecla do teclado é pressionada keyreleased(keyevent e) - Chamado quando uma tecla do teclado é solta 13
Tratamento de Eventos Como registrar um listener? Os listeners devem ser registrados com o objeto que gera o evento. Cada tipo de evento tem um método correspondente para adicionar um listener. Exemplo: para ActionEvent, o método é addactionlistener() JButton zap = new JButton ( Zap ); MeuListener objlistener = new MeuListener(); zap.addactionlistener(objlistener); Tratamento de Eventos Exemplo: import javax.swing.*; import java.awt.event.*; //Para utilizar eventos //Esta classe é um listener de eventos public class TestaEventos extends JFrame implements { private JButton but; private JLabel texto; private JPanel painel; private int cont; implements ActionListener 14
Tratamento de Eventos Exemplo: // Construtor public TestaEventos() { //Cria um frame com os componentes super("testaeventos"); setdefaultcloseoperation(windowconstants.dispose_on_close); cont = 0; //Contador do número de cliques no botão but = new JButton("Clique aqui"); texto = new JLabel("Total de cliques: 0"); painel = new JPanel(); painel.setlayout(new BoxLayout(painel,BoxLayout.Y_AXIS)); painel.add(but); painel.add(texto); //Registra o listener para ações no botão but.addactionlistener addactionlistener(this); getcontentpane().add(painel); pack(); Tratamento de Eventos Exemplo: //Método exigido pela interface ActionListener public void actionperformed (ActionEvent e) { cont++; texto.settext("total de cliques: "+cont); public static void main(string[] args){ JFrame janela = new TestaEventos(); janela.setvisible(true); 15
Tratamento de Eventos Classe ActionEvent Método getsource() Retorna uma referência ao objeto que gerou o evento. Método getactioncommand() Retorna informações sobre o objeto origem do evento, por exemplo, se chamado em um botão, por default retornará o string do texto do botão. Podemos usar esses métodos para gerenciar eventos de mais do que um componente, com o mesmo listener. Tratamento de Eventos Exemplo: import javax.swing.*; import java.awt.event.*; public class TestaEventos2 extends JFrame implements ActionListener { private JButton but1,but2; private JPanel painel; public TestaEventos2() {... but1.addactionlistener(this); but2.addactionlistener(this);... public void actionperformed(actionevent e) { if (e.getsource() == but1) settitle("botão 1"); else if (e.getsource() == but2) settitle("botão 2"); repaint(); //Redesenha a janela após mudanças... 16
Tratamento de Eventos Eventos relacionados a AWT são subclasses de java.awt.awtevent Objetos AWTEvents tem métodos para getsource() - devolver o objeto originador do evento getid() - devolver o tipo do evento getx(),gety() - devolver a posição de clique do mouse Tratamento de Eventos Exemplos de eventos, listeners e métodos ActionEvent ActionListener actionperformed() FocusEvent FocusListener focusgained() focuslost() ItemEvent ItemListener itemstatechanged() KeyEvent KeyListener keypressed() keyreleased() keytyped() MouseEvent MouseListener mouseclicked() mouseentered() mouseexited() mousepressed() mousereleased() TextEvent TextListener textvaluechanged() 17
Tratamento de Eventos Eventos gerados por componentes (resumo) JButton ActionEvent botão clicado JCheckbox ItemEvent item selecionado/desmarcado JCheckboxMenuItem ItemEvent selecionado/desmarcado item JList ListDataEvent seleção é alterada JMenuItem ActionEvent item selecionado/desmarcado JScrollbar AdjustmentEvent scrollbar Tratamento de Eventos Categoria JButton, JLabel, JList, JMenu, JTexField Interface ActionListener Métodos actionperformed (ActionEvent) Método do Componente addactionlistener (ActionListener) JCheckBox, JCheckboxMenuItem Choice, JLabel ItemListener itemstatechanged (ItemEvent) additemlistener (ItemListener) Capturar teclas digitadas KeyListener keypressed keyreleased keytyped (KeyEvent) addkeylistener (KeyListener) 18
Tratamento de Eventos Categoria Interface Métodos Método do Componente Tratar eventos de pressionar o mouse Tratar eventos de movimentação do mouse MouseListener MouseMotion Listener mousepressed mousereleased mouseentered mouseexited mouseclicked (MouseEvent) mousedragged mousemoved (MouseEvent) addmouselistener (MouseListener) addmousemotion Listener (MouseMotionListener) Tratamento de Eventos Categoria Interface Métodos Método do Componente JTextArea JTextField TextListener textvaluechanged (TextEvent) addtextlistener (TextListener) JFrames WindowListener windowclosing windowopened windowiconified windowdeiconified windowclosed windowactivated windowdeactivated (WindowEvent) addwindowlistener (WindowListener) 19
Tratamento de Eventos Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel, Bernardo Copstein e Júlio P. Machado) Introdução Interfaces (revisão) Delegação de eventos Tratamento de eventos Classes Adaptadoras Capturando Eventos nos Componentes Swing Classes Adaptadoras Algumas das interfaces para a construção dos listeners possuem mais de um método. Ao implementar o listener, precisamos definir todos os métodos, mesmo que só estejamos interessados só em um tipo de evento. Ex.: MouseListener contém 5 métodos, e devemos implementar todos eles, mesmo que só utilizemos o método mousepressed() 20
Classes Adaptadoras Para facilitar a implementação de classes tratadoras de eventos, Java define classes adaptadoras (adapters) Classes adaptadoras Implementam as interfaces definindo métodos vazios (sem código) para cada um dos seus métodos Assim, o programador não precisa implementar toda a interface, mas crias uma subclasse de adapter redefinindo apenas os métodos que irá utilizar Classes Adaptadoras Algumas classes adaptadoras: ComponentAdapter - ComponentListener ContainerAdapter - ContainerListener FocusAdapter - FocusListener KeyAdapter - KeyListener MouseAdapter - MouseListener MouseMotionAdapter - MouseMotionListener WindowAdapter - WindowListener ActionListener não possui classe adaptadora pois só possui um método. 21
Classes Adaptadoras import java.awt.event.*; public class TesteAdaptadorMouse extends MouseAdapter { public void mousepressed(mouseevent e) { System.out.println("Botao pressionado"); Exemplo: public void mousereleased(mouseevent e) { System.out.println("Botao liberado"); Classes Adaptadoras Uma vez criada a classe que implementa a interface ou define uma subclasse de adapter, esta precisa ser instanciada e o objeto registrado como listener Entretanto, é possível implementar e registrar o listener em um passo só Basta implementar o listener como uma classe anônima (sem nome) interna (uma classe definida dentro de outra classe. 22
Classes Adaptadoras Classe anônima interna Facilidade de Java (a partir do JDK 1.1) São classes definidas dentro de outras classes e que podem ser criadas para tratamento de eventos Neste caso, a classe interna se chama inner class e a classe hospedeira se chama top-level class Classes Adaptadoras Exemplos: but.addactionlistener( new ActionListener() { public void actionperformed(actionevent e) { cont++; texto.settext("total de cliques: "+cont); ); janela.addwindowlistener( //código para executar quando a janela é fechada new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); // fecha e sai do programa ); 23
Classes Adaptadoras Exemplos: JMenu mfile = new JMenu("File"); JMenuItem miopen = new JMenuItem("Open"); miopen.addactionlistener( new ActionListener() { public void actionperformed(actionevent e) { campo.settext(e.getactioncommand()); ); mfile.add(miopen); Classes Adaptadoras Observe que se forem utilizadas classes internas anônimas, não será possível tratar múltiplos componentes. Deveremos implementar uma classe anônima para cada componente. Não aconselhável para código de tratamento que seja muito longo. 24
Tratamento de Eventos Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel, Bernardo Copstein e Júlio P. Machado) Introdução Interfaces (revisão) Delegação de eventos Tratamento de eventos Classes Adaptadoras Capturando Eventos nos Componentes Swing Capturando Eventos nos Componentes Swing JButton JTextField e JTextArea JCheckBox JRadioButton JList 25
JButton Construtores: JButton () JButton (String) - um botão com texto JButton (Icon) - um botão com imagem JButton (String, Icon) - um botão com texto e imagem JButton import javax.swing.*; import java.awt.event.*; import java.awt.*; public class TesteJButton extends JFrame implements ActionListener { private Container c; private JButton b1, b2; private JPanel p; public TesteJButton() { super("teste de Eventos de Botões"); b1 = new JButton("Botão 1"); b2 = new JButton("Botão 2"); b1.addactionlistener(this); b2.addactionlistener(this); p = new JPanel(new FlowLayout(FlowLayout.LEFT)); p.add(b1); p.add(b2); c = this.getcontentpane(); c.add(p); public void actionperformed(actionevent e){ String str = e.getactioncommand(); if(str.equals("botão 1")) settitle("botão 1"); else if(str.equals("botão 2")) settitle("botão 2"); 26
JTextField JTextField: entrada de uma única linha Construtores JTextField() JTextField(int tamanho) - um campo de texto com a largura especificada JTextField(String frase) - um campo de texto com preenchimento padrão JTextField(String frase, int tamanho) - campo de texto com texto padrão e largura especificados JTextArea JTextArea: texto de múltiplas linhas Construtores: JTextArea() JTextArea(int linhas, int colunas) - uma área de texto com o número especificado de linhas e colunas JTextArea(String texto) - uma área de texto já preenchida com valor padrão JTextArea(String texto, int linhas, int colunas) - uma área de texto com texto padrão, linhas e colunas especificados 27
JTextField e JTextArea import javax.swing.*; import java.awt.event.*; import java.awt.*; public class TesteJText extends JFrame { private Container c; private JTextArea ta; private JTextField tf; private JPanel p; private JScrollPane sp; private JButton bt; JTextField e JTextArea public TesteJText() { super("teste JTextArea e JTextField"); bt = new JButton("Insere linha:"); tf = new JTextField(10); p = new JPanel(); p.add(bt); bt.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) {String f = tf.gettext(); ta.append(f); ); p.add(tf); ta = new JTextArea(8, 40); sp = new JScrollPane(ta); c = getcontentpane(); c.add(p, "South"); c.add(sp, "Center"); public static void main(string[] args){ TesteJText janela = new TesteJText(); janela.setdefaultcloseoperation(windowconstants.dispose_on_close); janela.pack(); janela.setvisible(true); 28
JCheckBox Construtores: JCheckBox() JCheckBox(String) - um botão de seleção com texto especificado JCheckBox(String, boolean) - um botão de seleção com o texto especificado, selecionado por padrão se argumento for true JCheckBox(Icon) JCheckBox(Icon, boolean) JCheckBox(String, Icon) JCheckBox(String, Icon, boolean) Para indicar uma opção como escolhida: botaoselecao.setselected(true); Para verificar o estado de um botão de seleção: status = botaoselecao.isselected(); JRadioButton Construtores: JRadioButton() JRadioButton(String) - um botão de rádio com o texto especificado JRadioButton(String, boolean) - um botão de rádio com o texto especificado, selecionado por padrão se argumento for true JRadioButton(Icon) JRadioButton(Icon, boolean) JRadioButton(String, Icon) JRadioButton(String, Icon, boolean) 29
ButtonGroup Agrupa os botões de seleção de forma que somente um pode estar selecionado por vez. Mais utilizado com os botões de seleção de rádio. Uso: ButtonGroup() - construtor add(abstractbutton) - adiciona botão de seleção ao grupo getselection() - retorna o botão atualmente selecionado do grupo JCheckBox, JRadioButton import javax.swing.*; import java.awt.event.*; import java.awt.*; public class TesteCheckRadio extends JFrame { private JCheckBox j1, j2; private JRadioButton r1, r2; private JPanel p; private Container c; private ButtonGroup bg; public TesteCheckRadio() { super("teste Check e Radio"); j1 = new JCheckBox("Valor1", true); j2 = new JCheckBox("Valor2"); r1 = new JRadioButton("Radio1"); r2 = new JRadioButton("Radio2", true); p = new JPanel(); 30
JCheckBox, JRadioButton p.add(j1); p.add(j2); j1.additemlistener(new ItemListener() { public void itemstatechanged(itemevent e){ boolean v = j1.isselected(); if(v) System.out.println("Caixa 1 selecionada!"); else System.out.println("Caixa 1 não selecionada!"); ); j2.additemlistener(new ItemListener() { public void itemstatechanged(itemevent e){ boolean v = j2.isselected(); if(v) System.out.println("Caixa 2 selecionada!"); else System.out.println("Caixa 2 não selecionada!"); ); bg = new ButtonGroup(); bg.add(r1); bg.add(r2); p.add(r1); p.add(r2); c = getcontentpane(); c.add(p); JList import javax.swing.*; import javax.swing.event.*; import java.awt.*; public class TesteJList extends JFrame { private String label[] = {"Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"; private JList list; private JTextField textf; private JScrollPane pane; private Container c; public TesteJList() { super("teste JList"); textf = new JTextField(20); list = new JList(label); pane = new JScrollPane(list); getcontentpane().setlayout(new FlowLayout()); getcontentpane().add(pane); getcontentpane().add(textf);... 31
JList... list.addlistselectionlistener(new ListSelectionListener(){ public void valuechanged(listselectionevent e) { int i = list.getselectedindex(); textf.settext(label[i]); ); public static void main(string[] args){ TesteJList janela = new TesteJList(); janela.setdefaultcloseoperation( WindowConstants.DISPOSE_ON_CLOSE); janela.pack(); janela.setvisible(true); Exercício 1) Escreva um programa em Java que implemente uma calculadora simples (com operações de adição, subtração e multiplicação) para números inteiros. 32