• Nenhum resultado encontrado

gui

N/A
N/A
Protected

Academic year: 2021

Share "gui"

Copied!
59
0
0

Texto

(1)

INTERFACE GRÁFICA EM

JAVA

(2)

MOTIVAÇÃO

• Como fazer programas com interface gráfica em Java?

• Algumas possibilidades:

• AWT – Abstract Window Toolkit (java.awt.*): API básica para o desenvolvimento de GUIs e applets em Java

• Swing (javax.swing.*): Extensão da API básica com inclusão de componentes visuais de mais alto nível (por ex., tree

view, list box e tabbed panes)

• SWT - Standard Widget Toolkit (org.eclipse.swt.*): Biblioteca desenvolvida pela IBM como parte da plataforma Eclipse; entretanto, seu uso não está amarrado ao uso da IDE

• Java 2D (java.awt e java.awt.image): Adição de classes ao pacote básico para desenho avançado de imagens em 2D

(3)

SWING

Algumas características importantes:

Look and Feel plugável: configuração da aparência

de uma aplicação

Transferência de Dados: copy-paste, drag and dropInternacionalização e localização: permite a

configuração separada de aspectos dependentes de uma região: língua, moeda, ..

Acessibilidade: permite projetar GUIs capazes de

serem utilizadas por portadores de deficiências

Integração com o desktop: possibilita a integração

da aplicação com o desktop hospedeiro,

permitindo a execução de aplicações default com preenchimento prévio de dados, etc.

(4)

SWING

À seguir, apresentamos figuras com os

componentes mais comuns desta biblioteca

Estas figuras foram tiradas do tutorial da Sun (

http://java.sun.com/docs/books/tutorial/ui/featur es/components.html

(5)
(6)

CONTROLES INTERATIVOS COM

INFORMAÇÃO MAIS FORMATADA

(7)

CONTROLES INTERATIVOS COM

INFORMAÇÃO MAIS FORMATADA

(8)

CONTROLES COM INFORMAÇÃO

NÃO-EDITÁVEL

(9)
(10)
(11)

CONTÊINERES COM PROPÓSITO

ESPECIAL

(12)

ROTEIRO DE CRIAÇÃO DE INTERFACES

GRÁFICAS

1) instanciar os componentes de interface

janelas, botões, campos de textos, etc

2) adicionar os componentes em containers

como os componentes podem ser agrupados

(13)

ROTEIRO DE CRIAÇÃO DE INTERFACES

GRÁFICAS

3) estabelecer o tratamento de eventos de interface

o que deve ocorrer quando o usuário clicar um botão?

como alterar o conteúdo de um componente quando

(14)
(15)

public class JanelaSimples {

public JanelaSimples() {

final JButton botaoLimpa = new JButton("Limpa"); //botão

final JTextField campoTexto = new JTextField(10); //texto

campoTexto.setText("Java");

final JFrame janela = new JFrame ("Janela Simples"); //janela

janela.setSize(300,100);

JPanel painel = new JPanel(); // adiciona componentes

painel.add (botaoLimpa); painel.add (campoTexto);

janela.getContentPane().add(painel);

//Quando o usuário clicar no botao, limpa o campo de texto

botaoLimpa.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) { campoTexto.setText("");

}

});

janela.setVisible(true); }

public static void main(String[] args) {

new JanelaSimples(); }

}

(16)

EXEMPLO

Container content pane JPanel painel contém JButton botaoLimpa JTextField campoTexto contém contém JFrame janela contém

(17)

HIERARQUIA DE COMPOSIÇÃO

Componente

qualquer elemento de interfaceContaineré um Componenteagrega Componentes Componente Container é um contém

(18)

ELEMENTOS DE INTERFACE SWING

janela:

é um top-level container

é onde os outros componentes são desenhados painel:

é um container intermediário

serve para facilitar o agrupamento de outros componentes

(19)

ELEMENTOS DE INTERFACE SWING

componentes atômicos

elementos de interface que não agrupam outros componentes

botões

campos de texto

API do Swing

À seguir serão apresentados exemplos de uso de

(20)

JAVAX.SWING.JLABEL

Modela um texto e/ou imagem não editável, isto é,

(21)

EXEMPLO DE JLABEL

/* Cria um label com texto */

JLabel label1 = new JLabel("Label1: Apenas Texto");

/* Cria um label com texto e imagem */

JLabel label2 = new JLabel("Label2: Imagem e texto", new ImageIcon("javalogo.gif"), JLabel.CENTER);

label2.setVerticalTextPosition(JLabel.BOTTOM); label2.setHorizontalTextPosition(JLabel.CENTER);

(22)

JAVAX.SWING.JBUTTON

(23)

EXEMPLO DE JBUTTON

/* Cria um botao com texto */

JButton botao1 = new JButton ("Botão Desabilitado"); botao1.setEnabled(false);

botao1.setToolTipText("Exemplo de um botão de texto"); botao1.setMnemonic(KeyEvent.VK_D); // Alt-D

/* Cria um botao com texto e imagem */

JButton botao2 = new JButton("Botão Habilitado", new

ImageIcon("javalogo.gif"));

botao2.setToolTipText("Botão de texto e imagem"); botao2.setMnemonic(KeyEvent.VK_H); // Alt-H

(24)

ALGUNS CONTAINERS

JanelaDiálogoAppletPainel

Scroll Pane

}

Containers Intermediários

(25)

JAVAX.SWING.JFRAME

representa uma janela do sistema nativo

possui título e borda

(26)

EXEMPLO DE JFRAME

JFrame j = new JFrame("Exemplo de Janela");

j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel msg = new JLabel("Olá Mundo!"); j.getContentPane().add(msg);

j.setLocationRelativeTo(null); // centraliza j.setIconImage(new

ImageIcon("javalogo2.gif").getImage());

JMenuBar menuBar = new JMenuBar(); menuBar.add(new JMenu("Menu"));

j.setJMenuBar(menuBar); j.pack();

(27)

JAVAX.SWING.JPANEL

modela um container sem decoraçãorepresenta um grupo de elementos

normalmente usado para estruturar a interfaceassociado a um diagramador

(28)

DIAGRAMADORES

arrumam um grupo de elementosestão associados aos containersdiferentes estilos de arrumação

como fluxo de textoorientada pelas bordasem forma de grade

• e outros ...

http://java.sun.com/docs/books/tutorial/uiswing/layout/vis

(29)

JAVA.AWT.FLOWLAYOUT

coloca os componentes lado a lado, uma linha

após a outra

alinhamento: centralizado (default), à esquerda

ou à direita

(30)

EXEMPLO DE FLOWLAYOUT

Container contentPane = janela.getContentPane(); contentPane.setLayout(new FlowLayout());

contentPane.add(new JButton("Button 1")); contentPane.add(new JButton("2"));

contentPane.add(new JButton("Button 3"));

contentPane.add(new JButton("Long-Named Button 4")); contentPane.add(new JButton("Button 5"));

(31)

JAVA.AWT.BORDERLAYOUT

Divide o container em 5 áreas: norte, sul, leste,

oeste e centro

(32)

EXEMPLO DE BORDERLAYOUT

Container contentPane = janela.getContentPane(); contentPane.add(new JButton("Button 1 (NORTH)"),

BorderLayout.NORTH);

contentPane.add(new JButton("2 (CENTER)"),

BorderLayout.CENTER);

contentPane.add(new JButton("Button 3 (WEST)"),

BorderLayout.WEST);

contentPane.add(new JButton("Long-Named Button 4 (SOUTH)"), BorderLayout.SOUTH);

contentPane.add(new JButton("Button 5 (EAST)"),

(33)

JAVA.AWT.GRIDLAYOUT

Células do mesmo tamanho especificadas pelo

(34)

EXEMPLO DE GRIDLAYOUT

Container contentPane = janela.getContentPane(); contentPane.setLayout(new GridLayout(3,2));

contentPane.add(new JButton("Button 1"));

contentPane.add(new JButton("2"));

contentPane.add(new JButton("Button 3"));

contentPane.add(new JButton("Long-Named Button 4"));

(35)

EXERCÍCIO: ENUNCIADO

Usando apenas as classes JFrame, JPanel, JButton,

JLabel, BorderLayout,

GridLayout e FlowLayout, escreva um programa que, ao ser executado, exiba a tela ao lado.

Não se preocupe com a funcionalidade do

programa. Ou seja, o programa não deve

responder aos cliques do usuário.

(36)

EVENTOS

o que deve ocorrer quando o usuário clicar um

botão?

como alterar o conteúdo de um componente

quando um outro sofre alguma alteração?

solução: estabelecer o tratamento de eventos de

(37)

ANALOGIA

Antes de irmos aos detalhes, imaginem o

funcionamento de uma lista de discussão:

O indivíduo deseja receber postagens de uma lista

Este indivíduo entra no site da lista e cadastra seu e-mailÀ partir daí, toda a postagem na lista será encaminhada

(38)

ANALOGIA

Na situação citada, a lista de discussão

funciona como um recurso gráfico, como um

botão

O endereço de e-mail indica quem são os

assinantes, quem está “escutando” (listener)

uma dada lista

O evento de envio de uma mensagem de um

usuário representa acionar o recurso gráfico,

como pressionar o botão

O sistema responsável por manter a lista

(39)

ORIENTAÇÃO POR EVENTOS

modelo de programação que tornou-se bastante

difundido com o uso de interfaces gráficas

o programa deixa de ter o controle do fluxo de

execução, passando a um sistema encarregado de gerenciar a interface

o programa passa a ser chamado pelo sistema

(40)

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

essas funções são chamadas de callbacks por

(41)

CALLBACKS EM OO

modelo é ortogonal ao modelo de orientação por

objetos

é possível projetar um sistema OO que use o

modelo de orientação por eventos para tratar eventos de interface, comunicações, etc

problema: não possui o conceito de função. Como

(42)

CALLBACKS EM OO

solução: usar um objeto que faça o papel de

callback

ou seja, onde registraríamos uma função,

passamos a registrar um objeto

quando o sistema precisar executar a callback,

ele deverá executar um determinado método do objeto

(43)

LISTENERS E EVENTOS

os listeners (Java) 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 (objeto)

que descreve o evento ocorrido

existem classes para modelar diferentes

(44)

EXERCÍCIO

Para o navegador apresentado anteriormente,

modifique-o de forma que, ao passarmos o mouse sobre o label url, apareça uma caixa de diálogo solicitando um novo endereço www.

(45)

LISTENERS

definem interfaces que representam um grupo de

callbacks

são registrados junto aos componentesjava.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)

(46)

REGISTRO DE LISTENERS

mecanismo de callbacksimplementação da interfaceuso de classes aninhadas

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Botão pressionado");

} });

(47)

EVENTOS

trazem informações sobre o evento ocorridosão passados aos listeners (callbacks)

java.awt.event.MouseEvent

public int getX() public int getY()

(48)

WINDOWEVENT

modela os eventos que podem ocorrer em uma

janela

essa classe declara constantes que identificam os

diversos eventos

public static final int WINDOW_OPENED public static final int WINDOW_CLOSING public static final int WINDOW_CLOSED

public static final int WINDOW_ICONIFIED public static final int WINDOW_DEICONIFIED public static final int WINDOW_ACTIVATED public static final int WINDOW_DEACTIVATED public Window getWindow()

(49)

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

(50)

IMPLEMENTANDO UM LISTENER

para criarmos um listener para um evento de

janela, por exemplo, devemos criar uma classe que implemente a interface WindowListener

nessa classe, codificaremos o método

(51)

IMPLEMENTANDO UM LISTENER

problema: não podemos implementar uma

interface e deixar de codificar algum método

solução: precisaremos implementar todos os sete

(52)

ADAPTADORES

neste caso, seis implementações são vazias pois

só desejamos responder a um único evento

esta é uma situação comum

o pacote java.awt.event define adaptadores

para todas as interfaces de listeners que têm mais de um método

(53)

ADAPTADORES

são classes que implementam o listener e

fornecem implementações vazias para todos os métodos

(54)

EXEMPLO

import java.awt.event.*; import javax.swing.*; public class Janela {

JButton botaoLimpa; JTextField campoTexto; JFrame janela; public Janela() {

botaoLimpa = new JButton("Limpa"); campoTexto = new JTextField(10);

janela = new JFrame ("Exemplo de Listener"); janela.setSize(300,100);

JPanel painel = new JPanel();

janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); painel.add (botaoLimpa);

painel.add (campoTexto);

janela.getContentPane().add(painel);

botaoLimpa.addActionListener (new ActionListener() { public void actionPerformed(ActionEvent e) {

campoTexto.setText(""); } }); janela.setVisible(true); }

public static void main(String[] args) { new Janela();

} }

(55)

EXERCÍCIO: ENUNCIADO

Usando apenas as classes

JFrame, JPanel, JButton, JLabel, BorderLayout,

GridLayout e FlowLayout, escreva um programa que, ao ser executado, exiba a tela ao lado.

Faça com que o número que aparece no visor seja o

número digitado no teclado numérico da aplicação.

O botão send deve imprimir no console o conteúdo do visor e o botão end deve apagar o visor.

Permita que a aplicação seja termina fechando-se a

(56)

EXERCÍCIO CALCULADORA: SOLUÇÃO 1

import javax.swing.*; public class Celular {

public static void main(String[] args) {

JFrame janela = new JFrame("Celular"); // janela JLabel visor = new JLabel("5122299"); // visor visor.setAlignment(JLabel.RIGHT);

JPanel num = new JPanel(new GridLayout(4,3)); // teclado String[] n =

{"1","2","3","4","5","6","7","8","9","*","0","#"};

for (int i=0; i<n.length; i++) num.add(new Button(n[i])); JPanel botoes = new JPanel(); // send & end

((FlowLayout)botoes.getLayout()).setVgap(0); botoes.add(new Button("send"));

botoes.add(new Button("end"));

janela.add(visor, BorderLayout.NORTH); // monta tudo janela.add(num, BorderLayout.CENTER); janela.add(botoes, BorderLayout.SOUTH); janela.pack(); // mostra janela.show(); } }

(57)

EXERCÍCIO: SOLUÇÃO 2

import javax.swing.*; import java.awt.*;

import java.awt.event.*;

public class JCelular {

public static void main(String[] args) {

JFrame janela = new JFrame("Celular"); // janela

final JLabel visor = new JLabel("5122299"); // visor visor.setHorizontalAlignment(JLabel.RIGHT);

JPanel numeros = new JPanel(new GridLayout(4,3));//Tecla String[] nomes =

{"1","2","3","4","5","6","7","8","9","*","0","#"}; // Cria o listener para as teclas do celular

ActionListener trataTecla = new ActionListener() { public void actionPerformed(ActionEvent e) {

JButton botaoClicado = (JButton)e.getSource();

visor.setText(visor.getText()+botaoClicado.getText()); }};

(58)

EXERCÍCIO: SOLUÇÃO

for(int i=0; i<nomes.length; i++) ((JButton)numeros.add(new

JButton(nomes[i]))).addActionListener(trataTecla); JPanel botoes = new JPanel(); // Botoes send e end

((JButton)botoes.add(newJButton("send"))).addActionListen er (new ActionListener() {

public void actionPerformed(ActionEvent e) { System.out.println(visor.getText()); }});

((JButton)botoes.add(new

JButton("end"))).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {

visor.setText(" "); }});

(59)

EXERCÍCIO: SOLUÇÃO

// monta tudo janela.getContentPane().add(visor, BorderLayout.NORTH); janela.getContentPane().add(numeros, BorderLayout.CENTER); janela.getContentPane().add(botoes, BorderLayout.SOUTH); // mostra janela.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); janela.pack(); janela.show(); } }

Referências

Documentos relacionados

A jurisprudência do Supremo Tribunal Federal entende que, quando há deliberação de PEC que seja contrária a uma das chamadas “cláusulas pétreas” da Constituição Federal

Pós-graduação na área de Tecnologia da Informação na função escolhida (carga horária mínima de 360 horas), acrescido de experiência profissional superior a cinco anos

Resultados: Os subtipos mais comuns de TBEB, classificados pelas características na broncoscopia, foram tumoral e granular (em 22,2% para ambas) A baciloscopia de escarro

Para reduzir o consumo de energia eléctrica, água ou gás, não use o aparelho em vazio ou em condições que comprometam o rendimento máximo (por ex. portas ou tampas abertas, etc.);

public static Delegate Combine(Delegate d1, Delegate d2); public static Delegate Remove(Delegate source, Delegate d); public virtual Delegate[] GetInvocationList();. public

Documentação necessária: processo de sindicância contendo o Boletim de Ocorrência Policial (lavratura imediata pelo “Usuário Local”), parecer conclusivo da

78 Figura 3.27 Padrão de difração de pós obtido para o complexo ácido nalidíxico:Zn através (a) de síntese por solução, em comparação com os difractogramas

A Heller Energy International é uma empresa espanhola, com um capital humano com uma ampla experiência no setor energético e meio ambiente, que deseja contribuir para melhorar o