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: