33
Aplicações Visuais em Java Aplicações Visuais em Java com Swing com Swing Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java A Plataforma Java Programação Orientada a Objetos em Java Programação Orientada a Objetos em Java Abstract Window Toolkit (AWT) n Peer based Delega ao toolkit nativo a criação de elementos gráficos Look & feel da plataforma de execução n Limitações Falta de consistência entre plataformas “Denominador comum” para atender a todas as plataformas “Bugs” diferentes em plataformas diferentes “Write once, test everywhere”

MaterialAula Java Swing - Giuliano Prado Page · Aplicações Visuais em Java com Swing Prof. Giuliano Prado de Morais Giglio, M.Sc. A Plataforma Java Programação Orientada a Objetos

Embed Size (px)

Citation preview

Aplicações Visuais em JavaAplicações Visuais em Javacom Swingcom Swing

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma JavaA Plataforma JavaProgramação Orientada a Objetos em JavaProgramação Orientada a Objetos em Java

Abstract Window Toolkit(AWT)

n Peer based• Delega ao toolkit nativo a criação de elementos

gráficos• Look & feel da plataforma de execução

n Limitações• Falta de consistência entre plataformas• “Denominador comum” para atender a todas as

plataformas• “Bugs” diferentes em plataformas diferentes• “Write once, test everywhere”

Swing vs. AWT

n Non-peer-based GUI toolkitn Conjunto maior de elementos

• Mais funcionalidaden Maior consistência de uso entre plataformas

• Mais “robusto”, maior portabilidaden Pacote javax.swing

• Pacote de extensão no Java 1.1• Incorporado como pacote básico no Java 2

Swing: Características

n Componentes levesn Não substitui integralmente o AWT

• Estende o AWT• Diagramadores & Listeners

n Look& Feel configurável• Windows, Motif, Metal

n Double-buffering automáticon Arquitetura MVC

Arquitetura MVCn O Swing adota uma arquitetura conhecida

como Model-View-Controller (MVC)n Modelo = dados/conteúdo

• estado de um botão, texton Visão = aparência

• cor, tamanhon Controle = comportamento

• reação a eventos

TOP LEVEL CONTAINERS

n Todo programa que utiliza componentes Swing tem pelo menos um TLC• raiz de uma “containment hierarchy”

n Todo TLC possui um “content pane” que contém os elementos visíveis• opcionalmente, uma “menu bar”

n JFrame, JDialog, JApplet• aplicações tipicamente possuem pelo menos uma

hierarquia com um JFrame como raiz (janela principal)

• applets Swing contém uma hierarquia com JApplet como raiz

Criando uma interface

n Primeiro passo: criar uma classe que representa a interface gráfica com o usuário (Jwindow ou JFrame);

n Criação:public class Janela extends JFrame{

....}

Criando uma interface

n 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

n Título• JFrame(String) – construtor• setTitle(String)

n Tamanho• setSize(int,int) – largura,altura• pack( )• setBounds(int,int,int,int) – x,y,largura,altura

JFrame

n Exibição• setVisible(boolean)• show( )• hide( )

n Comportamento• setDefaultCloseOperation( argumento )

üEXIT_ON_CLOSE = sai da aplicação;üDISPOSE_ON_CLOSE = fecha o frame, descarta o

objeto e segue a aplicação;üDO_NOTHING_ON_CLOSE = mantém o frame abertoüHIDE_ON_CLOSE = fecha o frame e continua

executando;

JFrame - Exemplo

n import javax.swing.*;

public class Janela extends JFrame{

public Janela(){ super("Primeira Aplicação Swing - Java");

setSize(300,100);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);

}

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

}

Contêiners

n Qualquer componente, antes de ser exibido em uma interface, precisa ser adicionado em um contêiner.

n Para acrescentar : método add(componente);n O contêiner mais simples do Swing é o

painel: JPanel.n Exemplo:

üJButton load = new JButton(“Carregar”);üJPanel p = new JPanel();üp.add(load);üadd(p);

Hierarquia de Composição

Hierarquia de Classes

JButton

n JButton (String)n JButton (Icon)n JButton (String, Icon)

n Exemplo:JButton btok = new JButton(" OK "); JButton btcal = new JButton(" Calcular ");

JImageIcon

n Usado em botões e outros componentes para adicionar ícones;

n Exemplo:

JImageIcon ico = new JImageIcon(“DOOROPEN.GIF”);

JButton btsair = new JButton(" Sair “,ico);ou

JButton btsair = new JButton(ico);

JLabel

n JLabel (String)n JLabel (String, int) - com alinhamenton JLabel (String, Icon, int) – com ícone e

alinhamento

n Exemplo:JLabel lbnome = new JLabel (“Nome do usuário"); JLabel lbtel = new JLabel (" Telefone ");

JTextField

n JTextField ()n JTextField (int) - com tamanhon JTextField (String, int) – texto default e

tamanho

n Exemplo:

JTextField tfNome = new JTextField (30); JTextField tfTel = new JTextField (" digite aqui “, 40);

JTextField

n setEditable(boolean): tornar ou não o campo editável

n isEditable( ): retorna true ou false, se o campo é ou não editável

n getText( ): captura o texto do campon setText(String): coloca um texto no campon getSelectedText( ):captura o texto do campo

que foi selecionado.

JPasswordField“campos de senha”

n Extende de JTextFieldnMesmos métodos de sua classe “pai”;

n Exemplo:

JPasswordField login = new JPasswordField(20);login.setEchoChar(‘#’);

JTextArea

n JTextArea(int,int) - linhas e colunasn JTextArea (String, int, int) – texto default,

linhas e colunas

n getText( ), setText( ), getSelectedText( );n append(String) – acrescenta linha no finaln insert(String,int) – insere linha numa

posição;n setLineWrap(boolean) – determina se o

texto quebrará automatico quando chegar a margem final.

JScrollPane

n JScrollPane(Component) - especificar o componente que terá a rolagem;

n JScrollPane(Component, int, int) – além do componente, se haverá rolagem vertical e horizontal;

• VERTICAL_SCROLLBAR_ALWAYS• VERTICAL_SCROLLBAR_AS_NEEDED• VERTICAL_SCROLLBAR_NEVER

JScrollPane

n 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

n 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.

JCheckBox e JRadioButton

n 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.

JCheckBox e JRadioButton

n Exemplo:

ButtonGroup grup = new ButtonGroup();JRadioButton b1 = new JRadioButton (“Delphi”, true);

grup.add(b1);JRadioButton b2 = new JRadioButton (“Java”, false);

grup.add(b2);

JComboBox

n Lista drop-down;n JComboBox( ) – sem argumentos;n addItem(Object): acrescenta itens;n getItemAt(int): retorna o texto do item na posição de

indice especificada pelo argumento inteiro;n getItemCount( ): retorna o nº de itens;n getSelectedIndex( ): retorna a posição do indice do

item selecionado;n getSelectedItem( ): retorna o texto do item

selecionado;n setSelectedIndex(int): retorna o item na posição de

indice indicada;

JComboBox

n 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

n Lista drop-down;n JList( ) – sem argumentos;n JList(Object[ ]) – com array da classe

especificada (como String);n setVisibleRowCount(int): define quantas

linhas serão exibidas;n getSelectedValues( ): retorna um array de

objetos que contém todos os itens selecionados;

JList

n 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

n A biblioteca Swing disponibiliza menus comuns (pull-down) e menus pop-up

n 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

nModela uma barra de menu, fixa em uma janela da aplicação

n 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

nModela um menu que pode ser colocado na barra de menus ou dentro de um outro menu

n Pode conter:• itens de menu• separadores

Métodos de JMenu

n JMenu(String s)n JMenuItem add(String name): adiciona um

item de menun JMenuItem add(JMenuItem menuItem):

adiciona um objeto item de menun JMenuItem insert(JMenuItemi, int p): insere

um item de menu numa determinada posiçãon void addSeparator( ): adiciona um separador;n void insertSeparator(int pos): idem para uma

posição especifica;

Classe JMenuItem

n Classe JMenuItemnModela um item de menun É superclasse de JMenu, uma vez que

um menu também pode ser um item de menu

n É sub-classe de JAbstractButton, logo, um item de menu é um botão

Métodos de JMenuItem

n JMenuItem(String text)n JMenuItem(String text, Icon icon): adiciona

um item de menu, com ícone;n void setAccelerator(KeyStroke keyStroke)n void setEnabled(boolean b): habilita um item

de menu;n void addActionListener(ActionListener l):

adiciona um Listener;

Exemplo de MenuJMenuItem j1 = new JMenuItem(“Abrir");JMenuItem j2 = new JMenuItem(“Salvar");JMenuItem j3 = new JMenuItem(“Executar");JMenuItem j4 = 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);

Classe JPopupMenu

nModela um menu pop-up, isto é, um menu que pode ser aberto sobre um elemento qualquer de interface, fora da barra de menu

n Assim como um menu comum, um menu pop-up pode conter itens de menu e separadores

Métodos de JPopupMenu

n JPopupMenu()n JPopupMenu(String label)n JMenuItem add(String name)n JMenuItem add(JMenuItem menuItem)n void addSeparator()n void pack()n void show(Component c, int x, int y)

Exemplo de JPopupMenuJFrame 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

n Arrumam um grupo de elementosn Estão associados aos containersn Diferentes estilos de arrumação

• como fluxo de texto• orientada pelas bordas• em forma de grade• e outros...

java.awt.FlowLayout

n Coloca os componentes lado a lado, uma linha após a outra

n Alinhamento: centralizado (default), à esquerda ou à direita

n Default para o JPanel

java.awt.BorderLayoutn Divide o container em 5 áreas: norte, sul,

leste, oeste e centron Default para content pane do JFrame

java.awt.GridLayoutn 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

n Para que o programa possa ser chamado pelo sistema, ele deve registrar uma função para cada evento de interface que ele desejar tratar.

n Tais funções são chamadas de callbacks por serem ‘chamadas de volta’ pelo sistema.

Callbacks OO??

n 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.

n 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

n Como Java é uma linguagem OO na qual não existe o conceito de função, callbacks devem ser implementadas através de objetos

n Um objeto que implementa uma callback em Java é chamado de listener

Listeners & Eventos

n Os listeners fazem o papel das callbacks.n Listeners são definidos por interfaces e

podem estar aptos a tratar mais de um tipo de evento.

n 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

n Definem interfaces que representam um grupo de callbacks

n São registrados junto aos componentesn 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

nModela a callback de um evento do tipo ActionEvent.

public abstract void actionPerformed(ActionEvent e)

WindowListener

n 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

n Trazem informações sobre o evento ocorrido

n São passados aos listeners (callbacks)

ActionEvent

nModela o evento que representa uma ação executada sobre um componente.

n O significado depende do componente.n Exemplos:

• “botão pressionado“• “entrada de texto finalizada”• …

ActionEvent

n Modela os eventos que podem ocorrer em uma janela. Essa classe declara constantes que identificam os diversos eventos

public static final int WINDOW_OPENEDpublic static final int WINDOW_CLOSINGpublic static final int WINDOW_CLOSEDpublic static final int WINDOW_ICONIFIEDpublic static final int WINDOW_DEICONIFIEDpublic static final int WINDOW_ACTIVATEDpublic static final int WINDOW_DEACTIVATEDpublic Window getWindow()

Implementando um Listener

n 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

n Cria o objeto de callback e o registra no componente

button.addActionListener(new MeuListener());

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.

Implementando um Listener de janela

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) { }

}

Geração de documentaçãoGeração de documentaçãocom com JavaDocsJavaDocs

Prof. Giuliano Prado de Morais Giglio, M.Sc.

A Plataforma JavaA Plataforma JavaProgramação Orientada a Objetos em JavaProgramação Orientada a Objetos em Java

JavaDoc

n Especificação de documentação para classes, interfaces e métodos que podem ser processadas por uma ferramenta (javadoc) capaz de gerar páginas HTML com as descrições.

n Um exemplo clássico é a documentação da própria Sun sobre as APIs Java

n O NetBeans pode ser configurado para gerar comentários usando esta especificação

JavaDoc – exemplo/** * Returns an Image object that can then be painted on the screen. * The url argument must specify an absolute {@link URL}. The name * argument is a specifier that is relative to the url argument. * <p> * This method always returns immediately, whether or not the * image exists. When this applet attempts to draw the image on * the screen, the data will be loaded. The graphics primitives * that draw the image will incrementally paint on the screen. * * @param url an absolute URL giving the base location of the image * @param name the location of the image, relative to the url argument * @return the image at the specified URL * @see Image */ public Image getImage(URL url, String name) {

try { return getImage(new URL(url, name));

} catch (MalformedURLException e) { return null;

} }

JavaDoc – resultadogetImagepublic Image getImage(URL url, String name)

Returns an Image object that can then be painted on the screen. The urlargument must specify an absolute URL. The name argument is a specifier that is relative to the url argument. This method always returns immediately, whether or not the image exists. When this applet attempts to draw the image on the screen, the data will be loaded. The graphics primitives that draw the image will incrementally paint on the screen. Parameters:

url - an absolute URL giving the base location of the image name - the location of the image, relative to the url argument

Returns:the image at the specified URL

See Also:Image

JavaDoc – ordem dos itens

n Existem várias tags para JavaDocs, as principais são mostradas a seguir.

n Outras tags podem ser utilizadas para referências mais complexas, mas este tipo de situação é mais comum para o desenvolvimento de APIs.

n http://java.sun.com/j2se/javadoc/index.jsp* @param (classes, interfaces, methods and constructors only) * @return (methods only) * @throws* @author (classes and interfaces only, required) * @version (classes and interfaces only, required).