Capítulo 12 Eventos de interacção Eventos em Java Referência aos pacotes awt e swing Programação com botões e campos de texto Eventos, fontes de eventos e atendimento de eventos • Qualquer programa deve reagir/processar eventos. Por exemplo, eventos de interacção com o utilizador: pressão em teclas, movimento do rato, clicks nos botões do rato, etc. • Ao surgir um evento, desencadeia-se a notificação do atendedor de eventos. Este pertence a uma classe definida pelo programador da aplicação e os seus métodos descrevem as acções a realizar após o evento • Um programa indica os eventos que pretende receber criando objectos de atendimento de eventos. Note-se que, em geral, um programa evita ser sistematicamente interrompido por eventos que não considera relevantes Introdução à Programação 2007/08 A. Lopes Pacotes awt e swing • O pacote java.awt (Abstract Windowing Toolkit) do Java é apropriado para a manipulação de janelas gráficas e eventos associados • O pacote javax.swing incorpora uma melhoria do awt, sendo escrito no topo deste último. As componentes de ambos podem ser utilizadas indistintamente, aumentando assim a versatilidade dos programas com janelas gráficas Introdução à Programação 2007/08 A. Lopes Algumas classes do pacote awt Object Component AWT Container Button MenuComponent Menubar Label Window MenuItem Menu TextComponent Panel Frame Introdução à Programação TextArea 2007/08 TextField A. Lopes Algumas classes do pacote swing Object Component Container JComponent JLabel JMenuBar JPanel JCheckBox Introdução à Programação JButton JToogleButton Objectos visuais JScrollBar JTextField JRadioButton 2007/08 ... JFileChooser A. Lopes Exemplo: botão e respectivo atendedor de eventos • Criação do botão com uma componente JButton, ao qual se associa um ActionListener. A interface de ActionListener é: public interface ActionListener { public void actionPerformed(ActionEvent evento); } • Definição de uma classe com o método actionPerformed, contendo as instruções a executar quando o botão é pressionado. O parâmetro evento contém os detalhes do evento, tais como o momento em que este ocorreu • Criação de um objecto de atendedor de eventos e respectiva associação ao botão ActionListener listener = new ClickListener(); button.addActionListener(listener); Introdução à Programação 2007/08 A. Lopes Ficheiro ClickListener.java import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** Um atendedor de eventos que escreve uma mensagem no ecrã. */ public class ClickListener implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("I was clicked."); } } Introdução à Programação 2007/08 A. Lopes Ficheiro ButtonTester.java import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; /** Instalação de um atendedor de eventos (action listener). */ public class ButtonTester { private static final int FRAME_WIDTH = 100; private static final int FRAME_HEIGHT = 60; ! public static void main(String[] args) { JFrame frame = new JFrame(); // a janela com barra de título JButton button = new JButton("Click me!!"); // cria e adiciona um botão frame.add(button); // define um atendedor de eventos e associa-o ao botão ActionListener listener = new ClickListener(); button.addActionListener(listener); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); // define a dimensão da janela // quando a janela fechar, o programa deve terminar // (programa e janela gráfica são conceitos distintos) frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } Introdução à Programação 2007/08 A. Lopes Aplicação com botões sempre que o botão é pressionado, acrescenta os respectivos juros ao saldo Introdução à Programação 2007/08 A. Lopes Modelo-Interacção-Controlo Gestão de eventos/acções 1011 1100,0 Introdução à Programação 2007/08 A. Lopes Aplicação com botões • Criação de um objecto da classe JButton JButton button = new JButton("Add Interest"); • Utilização de um objecto da classe JLabel para mostrar a mensagem JLabel label = new JLabel("balance="+account.getBalance()); • Utilização de um objecto da classe JPanel para conter/agrupar as várias componentes utilizadas na interface JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); // adiciona o painel à janela Introdução à Programação 2007/08 A. Lopes Aplicação com botões • A classe Listener calcula o juro e mostra o novo saldo • Incluir a classe AddInterestListener como “inner class” - classe declarada dentro de outra classe - de modo a que possa aceder às variáveis próximas account (da conta bancária) e label class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) { double interest = account.getBalance() * INTEREST_RATE / 100; account.deposit(interest); label.setText("balance=" + account.getBalance()); } } Introdução à Programação 2007/08 A. Lopes Ficheiro InvestmentViewer1.java Introdução à Programação 2007/08 A. Lopes Processamento de texto de entrada Para além de acrescentar os respectivos juros ao saldo sempre que o botão é pressionado, inclui um campo de texto para indicar a taxa de juro • Utilização de componente JTextField para disponibilizar espaço para entrada de informação final int FIELD_WIDTH = 10; // em caracteres final JTextField rateField = new JTextField(FIELD_WIDTH); Introdução à Programação 2007/08 A. Lopes Processamento de texto de entrada • Colocação de uma componente JLabel junto de cada campo de texto JLabel rateLabel = new JLabel("Interest Rate: "); • Disponibilização de um botão para o utilizador sinalizar que a informação de texto fornecida deve ser processada • O método actionPerformed associado ao botão lê a informação escrita pelo utilizador nos campos de texto através do método getText() class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) { double rate = Double.parseDouble(rateField.getText()); ... } } Introdução à Programação 2007/08 A. Lopes Ficheiro InvestmentViewer2.java Introdução à Programação 2007/08 A. Lopes Algumas componentes do pacote swing api/javax/swing JButton An implementation of a "push" button. JCheckBox An implementation of a check box - an item that can be selected or deselected, and which displays its state to the user. JCheckBoxMenuItem A menu item that can be selected or deselected. JComboBox A component that combines a button or editable field and a drop-down list. JComponent The base class for all Swing components except top-level containers. JFileChooser JFileChooser provides a simple mechanism for the user to choose a file. JFrame An extended version of java.awt.Frame that adds support for the JFC/Swing component architecture. JLabel A display area for a short text string or an image, or both. JMenu An implementation of a menu - a popup window containing JMenuItems that is displayed when the user selects an item on the JMenuBar. JMenuBar An implementation of a menu bar. JMenuItem An implementation of an item in a menu. JOptionPane makes it easy to pop up a standard dialog box that prompts users for a value or informs them of something. JPanel is a generic lightweight container. JPopupMenu An implementation of a popup menu - a small window that pops up and displays a series of choices. Introdução à Programação 2007/08 A. Lopes Algumas componentes do pacote swing api/javax/swing JRadioButton An implementation of a radio button - an item that can be selected or deselected, and which displays its state to the user. JRadioButtonMenuItem An implementation of a radio button menu item. JScrollBar An implementation of a scrollbar. JScrollPane Provides a scrollable view of a lightweight component. JSeparator JSeparator provides a general purpose component for implementing divider lines most commonly used as a divider between menu items that breaks them up into logical groupings. JSlider A component that lets the user graphically select a value by sliding a knob within a bounded interval. JSpinner A single line input field that lets the user select a number or an object value from an ordered sequence. JTextArea A JTextArea is a multi-line area that displays plain text. JTextField JTextField is a lightweight component that allows the editing of a single line of text. JTextPane A text component that can be marked up with attributes that are represented graphically. JToggleButton An implementation of a two-state button. Introdução à Programação 2007/08 A. Lopes