Programacao GUI

Embed Size (px)

Citation preview

  • 8/9/2019 Programacao GUI

    1/88

    Interfaces Grficas (GUIs) em Javausando Swing

    Profa. Flvia Cristina Bernardini

    * Baseado em slides de Ricardo Linden, JooBosco Sobral e Samuel Cristhian Schwebel

  • 8/9/2019 Programacao GUI

    2/88

    GUI (Graphical User Interface)

    A interface grfica com o usurio (GUI - Graphical UserInterface) do, de forma intuitiva, ao usurio um nvelbsico de familiaridade, sem que jamais tenha usado oprograma. Dessa forma, reduzido o tempo deaprendizado do programa pelo usurio.

    As GUIs so construdas a partir de componentes GUI.O componente GUI um objeto com o qual o usuriointerage atravs de, por exemplo:

    Mouse; Teclado; Alguma forma de entrada; Reconhecimento de voz.

  • 8/9/2019 Programacao GUI

    3/88

    Interfaces Mais Simples

    Ns usamos javax.swing.JOptionPane

    No muito OO! Nem muito poderoso...

  • 8/9/2019 Programacao GUI

    4/88

    Elementos de uma GUI

    componentes: Elementos desenhados na tela.Exemplos: boto, textbox, label, etc.

    containers: elementos que servem como agrupadoreslgicos para componentes. Exemplo: Panel.

    Containers de alto nvel: cidados de primeira classe,

    que efetivamente ocupam um espao no desktop.Exemplos: Frame, DialogBox.

  • 8/9/2019 Programacao GUI

    5/88

    GUI em Java: AWT e Swing

    Idia inicial da Sun: Abstract Windowing Toolkit AWT

    Criar um conjunto de classes e mtodos que possam ser usadospara escrever uma GUI multi-plataforma No era poderosa o suficiente, sendo extremamente limitada.

    Segunda edio (JDK v1.2): Swing Nova biblioteca, construda do zero que permite grficos e GUIsmuito mais poderosos e flexveis.

    Por compatibilidade retroativa, ambos existem no Java e, svezes, ns usamos os dois...

  • 8/9/2019 Programacao GUI

    6/88

    Swing

    Porque o nome swing?

    Apelido usado pelos desenvolvedores das JavaFoundations Classes (JFC) usadas para odesenvolvimento do GUI

    Vem do cone que era usado em uma release inicial.

    Porque swing e no awt?

    awt a verso mais velha e mais primitiva. Swing mais poderosa Swing pode ser enviado com as aplicaes, sendo

    no dependente de mquina

  • 8/9/2019 Programacao GUI

    7/88

    Look and Feel

    Cada figuta abaixo mostra o mesmo programa com um lookand feel diferente.

    Conforme mudamos de SO ou de ambiente, o look and feelse adapta para aquele que padro na mquina onderodamos.

    Isto uma obrigao da JVM, no do programador.

  • 8/9/2019 Programacao GUI

    8/88

    Componentes Swing

    O Swing fornece vrios componentes padro

    de GUI que podem ser combinados de formaa criar sua interface. Alguns exemplos:

    Botes, Listas, Menus, reas de texto, etc. Swing tambm fornece containers tais comojanelas e barras de ferramentas.

    Pode ser de vrios nveis: Nvel mais alto: frames, dilogos Nvel Intermedirio: panel, scroll pane, tabbed

    pane, ...

  • 8/9/2019 Programacao GUI

    9/88

    Hierarquia de Componentes Swing

    java.lang.Object

    +--java.awt.Component

    +--java.awt.Container+--javax.swing.JComponent

    | +--javax.swing.JButton| +--javax.swing.JLabel| +--javax.swing.JMenuBar

    | +--javax.swing.JOptionPane| +--javax.swing.JPanel| +--javax.swing.JTextField|

    +--java.awt.Window+--java.awt.Frame

    +--javax.swing.JFrame

  • 8/9/2019 Programacao GUI

    10/88

    Mtodos comuns em todos os

    componentes Swing

    get/setPreferredSize

    get/setSize

    get/setLocation

    getLength/Width repaint

    setBackground(Color)

    setFont(Font)

    isEnabled / setEnabled(boolean)

    isVisible / setVisible(boolean)

  • 8/9/2019 Programacao GUI

    11/88

    Containers

    Descendentes da classe java.awt.Container

    Componentes que podem conter outros componentes.

    Usamos um layout manager para posicionar e definir otamanho dos componentes contidos neles.

    Componentes so adicionados a um container usandoas vrias formas do mtodo add

  • 8/9/2019 Programacao GUI

    12/88

    Containers Top-Level

    Todo programa que usa uma GUI Swing tem pelo

    menos um container de alto nvel (top-level). Um container top-level prov o suporte que oscomponenetes siwng necessitam para realizar o

    desenho da tela e o tratamento de eventos. O Swing fornece trs containers top-level : JFrame (Janela principal)

    JDialog (Janela secundria) JApplet (Um applet mostra uma rea desenhada

    dentro de um navegador internet)

  • 8/9/2019 Programacao GUI

    13/88

    Containers Top-Level

    Para aparecer na tela, todo componente GUI deve ser

    parte de uma hierarquia de conteno, cuja raiz umcontainer top-level. Todo container top-level tem um content pane que

    contm todos os componentes visveis dentro da

    interface daquele container top-level.

    No adicione o

    componentediretamente aocontainer top-level

  • 8/9/2019 Programacao GUI

    14/88

    Content Pane

    Todo container top-level contm indiretamente um

    container intermedirio denominado content pane Este content pane contm todos os componentesvisveis n GUI da janela.

    Os containers so adicionados ao content paneusando um dos vrios tipos de mtodos add Exemplo:

    frame = new JFrame(...);

    label = new JLabel(...);frame.getContentPane().add(label, BorderLayout.CENTER);

  • 8/9/2019 Programacao GUI

    15/88

    JFrame

    Um frame, implementado como uma instncia da

    classe JFrame, uma janela que tem acessriostais como borda, ttulo e botes para fechar eminimiz-la.

    Estes acessrios so totalmente dependentes deplataforma.

    As aplicaes com uma GUI tipicamente usam aomenos um frame.

  • 8/9/2019 Programacao GUI

    16/88

    JFrame

    Mtodos principais public void setTitle(String title): Coloca um

    ttulo na barra de ttulo da janela. public void show(): Faz o frame aparecer na tela. public void setVisible(boolean v): Faz com que o

    frame se torne visvel (v=true) ou no (v=false). public void setDefaultCloseOperation(int op) :

    Faz a janela realizar uma determinada operao quandofecha. Mais comum: JFrame.EXIT_ON_CLOSE

  • 8/9/2019 Programacao GUI

    17/88

    JFrame

    A programao grfica est muito ligada ocorrncia

    de eventos, que devem ser tratados Ao contrrio de outras linguagens de programao, oscontainers Java no vm 100% para lidar com oseventos bsicos que ocorrem em uma janela.

    Um exemplo o evento de fechamento. Qualquer aplicativo Delphi ou VB sabe fechar sua janela

    sem problema, mas Java no.

    Mais frente ns vamos aprender mais sobre eventos,ento vamos nos contentar com o setDefaultCloseOperationpor enquanto

  • 8/9/2019 Programacao GUI

    18/88

    Primeiro programa GUI em Java

    pack() faz com que a janela seja ajustada para

    o tamanho preferido de todos os seus sub-

    componentes.

    import javax.swing.*;

    public class HelloWorldSwing {

    public static void main(String[] args) {

    JFrame frame = new JFrame("HelloWorldSwing");

    final JLabel label = new JLabel("Hello World");

    frame.getContentPane().add(label);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.pack();

    frame.setVisible(true);}

    }

  • 8/9/2019 Programacao GUI

    19/88

    Exemplo 2

    import javax.swing.*;

    public class HelloWorldFrame extends JFrame {

    public HelloWorldFrame() {

    super(HelloWorldSwing);

    final JLabel label = new JLabel("Hello World");

    getContentPane().add(label);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    pack();

    setVisible(true);}

    public static void main(String[] args) {

    HelloWorldFrame frame = new HelloWorldFrame();

    }}

    Faz a mesma coisa, s que criando uma

    classe nova, definida por ns .

  • 8/9/2019 Programacao GUI

    20/88

    Relacionamentos conceituais

    Diagrama UML

  • 8/9/2019 Programacao GUI

    21/88

    Superclasses comuns da maioria dos

    componentes Swing

    java.lang.Object

    java.awt.Component

    java.awt.Container

    javax.swing.JCom ponent

  • 8/9/2019 Programacao GUI

    22/88

    JDialog

    Um dilogo uma maneira de conseguir com que o usuriorealize uma entrada de dados.

    Existem vrios tipos de dilogos - ns j usamos um hmuito tempo...

    Todo dilogo dependente de um frame.

    Destruir um frame destri todos os dilogos que so seusdependentes Quando um frame minimizado, somem da tela todos os seus

    dilogos

    Eles voltam quando o frame volta ao seu tamanho normal Um dilogo pode ser modal. Quando um dilogo modal estvisvel, todas as entradas para outros componentes estarobloqueadas.

  • 8/9/2019 Programacao GUI

    23/88

    JDialog

    Para criar dilogos customizados, use a

    classe JDialog diretamente. O Swing prov vrios dilogos padres:

    JProgressBar, JFileChooser, JColorChooser,...

    A classe JOptionPane pode ser usada

    para criar dilogos modais simples, quepermitem a costumizao de cones,ttulos, textos e botes

  • 8/9/2019 Programacao GUI

    24/88

    Usando JOptionPane

    JOptionPane faz com que seja fcil exibirum dilogo padro que leia um valor dousurio ou informe-o de algo.

    A classe JOptionPane parecer complexadado o seu grande nmero de mtodos.

    Entretanto, a maioria dos uso desta classeso simplesmente chamadas de uma nicalinha para um dos mtodos estticosshowXxxDialog

  • 8/9/2019 Programacao GUI

    25/88

    showXxxDialog

    showConfirmDialog Faz uma pergunta confirmatria eespera uma resposta tal como yes/no/cancel.

    showInputDialog L entrada do teclado (velhoconhecido)

    showMessageDialog Informa ao usurio que algoaconteceu.

    showOptionDialog Os trs anteriores em um s

    Todos os dilogos acima so modais.

  • 8/9/2019 Programacao GUI

    26/88

    Usando JOptionPane: Exemplo

    Object[] options = {Sim!", "No",Quem sabe?"};

    int n = JOptionPane.showOptionDialog(frame, Tem certeza?

    Confirmao",

    JOptionPane.YES_NO_CANCEL_OPTION,

    JOptionPane.QUESTION_MESSAGE,null,

    options,

    options[2]);

  • 8/9/2019 Programacao GUI

    27/88

    Container

    Um container um objeto que armazena componentes,governando suas posies, tamanhos e comportamentos

    quando o usurio altera seu tamanho. Principais mtodos:

    public void add(Component comp)

    public void add(Component comp, Object O): adiciona umcomponente usando informaes adicionais (veremos maisadiante).

    public void remove(Component comp) public void setLayout(LayoutManager mgr): Usa o layout

    manager especificado para posicionar os componentes nocontainer.

    public void validate(): Manda o layout manager reposicionartodos os objetos no container.

  • 8/9/2019 Programacao GUI

    28/88

    JComponent

    Classe base para todos os componentes Swing, comexceo dos containers top-level

    Para usar um componente que herde de JComponent,ele deve ser colocado na hierarquia de conteno cujaraiz seja um container top-level

    A classe JComponent prov, entre outros, tratamentode eventos de teclado, look and feel, infra-estruturapara desenho, suporte a bordas, etc

    Todos os descendentes de JComponent tambm soContainers. Exemplo: um JButton pode conter textos,cones, etc

  • 8/9/2019 Programacao GUI

    29/88

    JComponent

    Componentes tpicos

    JLabel

    JButton

    JTextField

    JPanel

    JTableEtc.

  • 8/9/2019 Programacao GUI

    30/88

    JButton

    Um boto uma regio clicvel com a qual o usurio interagede forma a realizar um comando.

    Principais mtodos: public JButton(String text): Cria um novo boto com o

    texto dado como parmetro definido como texto de face. public String getText():Retorna o texto mostrado no boto. public void setText(String text): Muda o texto de face do

    boto.

  • 8/9/2019 Programacao GUI

    31/88

    JButton

    Apesar de termos criado um boto, ele

    ainda no faz nada.

    Mesmo clicando nele, nada ocorre

    Isto ocorre porque ns no associamos

    nenhum tratador de evento a esteboto Tratamento de eventos: veremos adiante

  • 8/9/2019 Programacao GUI

    32/88

    JLabel

    Um label um texto a ser mostrado na tela quenormalmente oferece informao para o usurio deforma a tornar a interface mais compreensvel.

    Principais mtodos:

    public JLabel(String text): Cria um novo label com o textodado como parmetro definido como texto de face.

    public String getText():Retorna o texto mostrado no label.

    public void setText(String text): Muda o texto de face dolabel.

  • 8/9/2019 Programacao GUI

    33/88

    JTextField

    Um textfield como um label, s que pode ser editadoe modificado pelo usurio.

    Textfields so usados geralmente para entrada dedados pelo usurio.

    Mtodos interessantes: public JTextField(int columns): Cria um novo textfield com uma largura, emcaracteres, dada pelo parmetro.

    public String getText(): Retorna o texto atualmente armazenado no campo.

    public void setText(String text): Modifica o texto do campo para ser igual stringdada como parmetro.

  • 8/9/2019 Programacao GUI

    34/88

    JCheckBox

    Objeto de tela que permite que escolhamos entre duasopes (marcado e no marcado)

    Mtodos interessantes: public JCheckBox(String text): Cria uma checkbox cujo texto

    dado pelo parmetro e cujo valor default no marcada

    public JCheckBox(String text, boolean isChecked)Cria uma checkbox cujo texto dado pelo primeiro parmetro ecujo valor default dado pelo segundo parmetro.

    public boolean isSelected():Retorna true se a check box foiselecionada.public void setSelected(boolean selected): Muda o estado dacheckbox de acordo com o parmetro passado.

  • 8/9/2019 Programacao GUI

    35/88

    JRadioButton

    Um boto que pode ser selecionado.

    Normalmente parte de um grupo debotes mutuamente exclusivos (isto ,apenas um pode ser selecionado de cada

    vez) Mtodos interessantes

    public JRadioButton(String text)

    public JRadioButton(String text, Icon icon)

    public boolean isSelected()

    public void setSelected(boolean b)

  • 8/9/2019 Programacao GUI

    36/88

    ButtonGroup

    Um grupo lgico de radiobuttons que garante

    que apenas um deles pode ser selecionadode cada vez. Mtodos interessantes:

    public ButtonGroup() public void add(AbstractButton b)

    O objeto da classe ButtonGroup no um

    objeto grfico, apenas um grupo lgico. Os objetos da classe RadioButton que soadicionados ao container

  • 8/9/2019 Programacao GUI

    37/88

    Usando Icon

    Nas classes JButton, JRadioButton,

    JCheckBox, JLabel, etc, temos oseguinte.O construtor pode receber um cone public void setIcon(Icon)

    public void setSelectedIcon(Icon)

    public void setRolloverIcon(Icon)

  • 8/9/2019 Programacao GUI

    38/88

  • 8/9/2019 Programacao GUI

    39/88

    Problema: Posicionando componentes

    Como o programador pode especificar onde fica cadacomponente na janela, quo grande ele deve ser e oque ele deve fazer quando a janela muda de tamanho? Em C++, Delphi e outros: usar posicionamento absoluto.

    O programador especifica as coordenadas de cada componente.

    Em Java : usamos os gerenciadores de formato (LayoutManagers).

    So objetos especiais que decidem onde posicionar cada

    componente baseados em critrios especficos.

  • 8/9/2019 Programacao GUI

    40/88

  • 8/9/2019 Programacao GUI

    41/88

    Classe BorderFactory

    Hierarquiajava.lang.Object

    javax.swing.BorderFactory Servem para implementar bordas padronizadas. Use mtodos estticos que retornam elementos

    da classe Border: createBevelBorder

    createEtchedBorder

    createTitledBorder

    createEmptyBorder createLineBorder

    etc.

  • 8/9/2019 Programacao GUI

    42/88

    Tipos de bordas

  • 8/9/2019 Programacao GUI

    43/88

    Containers de nvel intermedirio

    Tambm conhecidos como panels ou panes Simplificam o posicionamento de outros

    componentes, como no caso do JPanel Tm um papel visvel e interativo na GUI do

    programa, como no caso do JScrollPane e do

    JTabbedPane. Possuem um gerenciador de layout padro,que o FlowLayout.

    Este gerenciador pode ser modificado com ocomando: panel.setLayout(new BorderLayout());

  • 8/9/2019 Programacao GUI

    44/88

    Containers de nvel intermedirio

    Por default, os panels no pintam

    nada, exceto o seu fundo(background). Por default, eles so opacos.

    Um panel opaco pode ser definidocomo o content pane de um container

    de top-level. Panels opacos no desenham umbackground.

  • 8/9/2019 Programacao GUI

    45/88

    JPanel

    Um panel um container que podemos usar(alm do JFrame)

    Principais mtodos: public JPanel(): Cria um JPanel com o layour

    manager padro public JPanel(LayoutManager mgr): Cria um Jpanel

    com o layour manager especificado.

    Um JPanel pode depois ser acrescentado em umJframe para melhorar o layout de nossas telas.

  • 8/9/2019 Programacao GUI

    46/88

    Resumo

    JFrame = um continer (formulrio) para outros

    componentes GUI. JLabel = rea em que podem ser exibidos textos no-editveis ou cones.

    JTextField = rea em que o usurio insere dados peloteclado.

    JButton = rea que aciona um evento quando o usurio clica. JCheckBox = Possui dois estados: selecionado ou no-

    selecionado. JComboBox = Lista de itens que o usurio pode fazer uma

    seleo clicando em um item na lista ou digitando na caixa. JList = rea em que uma lista exibida, possibilitando aseleo clicando em qualquer item da lista.

    JPanel = Continer em que os componentes podem sercolocados.

  • 8/9/2019 Programacao GUI

    47/88

    Alguns Componentes GUI Bsicos

    JLabel JTextField JButton JCheckBox

    JComboBox

    JList

    JFrame

    G i d L

  • 8/9/2019 Programacao GUI

    48/88

    Gerenciamento de Layout

    Gerenciamento de layout consiste no processo dedeterminar o tamanho e a posio dos componentes.

    Ele pode ser feito usando-se posicionamento absoluto,como fazamos no VC++, Delphi e VB. Neste caso o tamanho e a posio de cada componente

    deve ser especificado. No ajusta bem quando o container top-level muda detamanho.

    Tem um ajuste complexo quando mudamos de sistema e

    enfrentamos outras resolues, tamanhos de fonte, etc.

    G i t d L t

  • 8/9/2019 Programacao GUI

    49/88

    Gerenciamento de Layout

    O gerencimaneto de layout geralmente realizado peloslayout managers

    Os componentes oferecem dicas de tamanho eposicionamento para os layout managers, mas so estes quedecidem onde e como estes componentes sero posicionados.

    Estas dicas consistem em tamanho mnimo, preferido emximo, alinhamento vertical e horizontal.

    Podemos customizar estas preferncias de duas maneiras: Chamando os mtodos de definio:: setMinimumSize,

    setAlignmentX, ... Subclasseando componentes e modificando os mtodos de

    acesso:getMinimumSize, getAlignmentX, ...

    G i t d L t

  • 8/9/2019 Programacao GUI

    50/88

    Gerenciamento de Layout

    A deciso tomada usando-se designs padronizados. Vrios tipos de designs diferentes podem ser combinados para

    realizar qualquer tela que desejamos A plataforma Java fornece quatro layout managers mais usados:

    BorderLayout, BoxLayout, FlowLayout, GridLayout

    Quando usarmos o mtodo add para acrescentar um componente

    em um container, o layout manager em uso deve ser levado emconsiderao Chamadas possveis do add:

    Usando posio relativa (BorderLayout)

    panel.add(component, BorderLayout.CENTER); Ordem de adio: (BoxLayout, GridLayout, ...)

    panel.add(component);

  • 8/9/2019 Programacao GUI

    51/88

    Um exemplo grfico usando Layout

  • 8/9/2019 Programacao GUI

    52/88

    Um exemplo grfico usando Layout

    import java.awt.*;

    import javax.swing.*;

    public class DemoGUI1 {

    public static void main(String[] args) {JFrame frame = new JFrame("HelloSwing");

    JPanel panel = new JPanel();

    JButton button1 = new JButton("button1");

    JLabel label1 = new JLabel("label1");

    JButton button2 = new JButton("button2");

    JLabel label2 = new JLabel("label2");

    panel.setLayout(new BorderLayout());

    panel.add(button1, BorderLayout.NORTH);

    panel.add(button2, BorderLayout.SOUTH);

    panel.add(label1, BorderLayout.WEST);

    panel.add(label2, BorderLayout.EAST);frame.getContentPane().add(panel);

    frame.pack(); frame.setVisible(true);

    }

    }

    Resultado

  • 8/9/2019 Programacao GUI

    53/88

    Resultado...

    A sada do programa algo assim:

    Repare que sempre que modificamos o tamanho dajanela, os componentes automaticamente sereposicionam.

    Problema: quando fechamos o frame, gostaramos queo programa terminasse, mas isto no acontece (veja a

    janela de processos em execuo dentro do NetBeans)

    Resolvendo o problema

  • 8/9/2019 Programacao GUI

    54/88

    Resolvendo o problema

    O problema que no temos nenhum tratador para o evento defechar a janela.

    Fechar a janela Fechar o programa... Antes usvamos o setDefaultCloseOperation Podemos resolver isto tambm acrescentando um tratador de

    eventos:addWindowListener(new WindowAdapter() {

    public void windowClosing(WindowEvent e) {

    System.exit(0); }

    }

    );

    Obs: a classe WindowAdapter fica dentro da bibliotecajava.awt.event, que deve ser importada para que o programafuncione.

    FlowLayout

  • 8/9/2019 Programacao GUI

    55/88

    FlowLayout

    Trata o container como se fosse uma pgina ou umpargrafo da esquerda para a direita e de cima para

    baixo. Os componentes recebem o seu tamanho preferido

    tanto verticalmente quanto horizontalmente.

    Os componentes so posicionados na ordem em queforam adicionados Se a linha for muito longa, os componentes passam

    para a linha de baixo.

    GridLayout

  • 8/9/2019 Programacao GUI

    56/88

    GridLayout

    Trata o container como um grid de

    linhas e colunas de tamanhos iguais. Os componenets recebem tamanhos

    iguais no importando qual seutamanho favorito.

    BoxLayout

  • 8/9/2019 Programacao GUI

    57/88

    BoxLayout

    Alinha os componentes no container em uma nicalinha ou coluna

    Os componentes usam seu tamanho e alinhamentosfavoritos

    A melhor maneira de criar um container com o layout

    box: Box.createHorizontalBox();

    Box.createVerticalBox();

    Problema dos Layout Managers

  • 8/9/2019 Programacao GUI

    58/88

    Problema dos Layout Managers

    Como desenharamos uma janela complicada como a janelaabaixo usando os layout managers que vimos at agora?

    Soluo : Layout composto

  • 8/9/2019 Programacao GUI

    59/88

    Soluo : Layout composto

    Crie panels dentro de Panels Cada Panel tem um layout diferente

    Combinando os layouts, podemos conseguir desenhos maiscomplexos e poderosos e que atinjam nossos objetivos.

    Exemplo

    Quantos panels temos? Qual o layout de cada um deles?

    Resposta

  • 8/9/2019 Programacao GUI

    60/88

    Resposta

    Container north = new JPanel(new FlowLayout());

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

    north.add(new JButton("Button 2"));

    Container south = new JPanel(new BorderLayout());

    south.add(new JLabel("Southwest"), BorderLayout.WEST);

    south.add(new JLabel("Southeast"), BorderLayout.EAST);

    Container cp = getContentPane();

    cp.add(north, BorderLayout.NORTH);

    cp.add(new JButton("Center Button"), BorderLayout.CENTER);

    cp.add(south,BorderLayout.SOUTH);

    Exemplo de Layouts

  • 8/9/2019 Programacao GUI

    61/88

    Exemplo de Layouts

    Faam programas em Java que desenhem as seguintestelas:

    (a)

    (c)

    (d) (e)

    (b)

    JScrollPane

  • 8/9/2019 Programacao GUI

    62/88

    JScrollPane

    Uma container especial que permite queusemos barras de rolagem para vercomponentes.

    Na verdade, envolvemos um componentecom scrollbars. public JScrollPane(Component comp)

    Colocamos o JScrollpane no container, no ocomponente original. contentPane.add(new JScrollPane(textarea), BorderLayout.CENTER);

    JFileChooser

  • 8/9/2019 Programacao GUI

    63/88

    JFileChooser

    Uma caixa de dilogo que permite que

    ns selecionemos um ou maisarquivos e/ou diretrios.

    Mtodos interessantes: public JFileChooser() public JFileChooser(String

    currentDir)

    public int showOpenDialog(Componentparent)

    public int showSaveDialog(Componentparent)

    public File getSelectedFile()

    public static int APPROVE_OPTION,CANCEL_OPTION

    JColorChooser

  • 8/9/2019 Programacao GUI

    64/88

    JColorChooser

    Outro palete especial que permite que

    o usurio escolha uma dentre umpalete de cores. Mtodos interessantes:

    public JColorChooser()

    public JColorChooser(Color

    initial)

    public Color

    showDialog(Component parent,

    String title, Color

    initialColor) : permiteescolher uma cor do palete,retornando a cor escolhida.

    JMenuItem

  • 8/9/2019 Programacao GUI

    65/88

    JMenuItem

    Uma entrada em um menu, que pode

    ser clicado para disparar aes. Mtodos interessantes: public JMenuItem(String text)

    public JMenuItem(String text, Icon icon)

    public JMenuItem(String text, int mnemonic)

    public void addActionListener(ActionListener al)

    public void setAccelerator(KeyStroke ks)

    public void setEnabled(boolean b)

    public void setMnemonic(int mnemonic)

  • 8/9/2019 Programacao GUI

    66/88

    JMenu

  • 8/9/2019 Programacao GUI

    67/88

    Um menu que criado para mostrar os itens de menu. Menus podem conter outros menus.

    Mtodos interessantes: public JMenu(String s)

    public void add(JMenuItem item)

    public void addSeparator()

    public void setMnemonic(int mnemonic)

    JMenuBar

  • 8/9/2019 Programacao GUI

    68/88

    O container de nvel mais alto que

    pode armazenar menus. Podem ser ligados a um frame atravsdo mtodo setJMenuBar. Existente naclasse JFrame

    Mtodos Interessantes: public JMenuBar()

    public void add(JMenu menu)

    Menus - Exemplo Completo

  • 8/9/2019 Programacao GUI

    69/88

    p pimport java.awt.*;

    import javax.swing.*;

    public class MinhaTela {

    public static void main(String args[]) {

    JFrame f=new JFrame("Tela Complexa");JMenu menuArquivo=new

    JMenu("Arquivo");

    JMenu menuSobre=new JMenu("Sobre");

    JMenu subMenuSalvar=new

    JMenu("Salvar");

    JMenuItem a1=new JMenuItem("Abrir");

    JMenuItem e1=new JMenuItem("Sair");

    JMenuItem s1=new JMenuItem("Salvar");

    JMenuItem s2=new JMenuItem("Salvarcomo");

    subMenuSalvar.add(s1);

    subMenuSalvar.add(s2);

    menuArquivo.add(a1);

    menuArquivo.add(subMenuSalvar);

    menuArquivo.addSeparator();

    menuArquivo.add(e1);

    JMenuBar menuCompleto=

    new JMenuBar();

    menuCompleto.add(menuArquivo);

    menuCompleto.add(menuSobre);

    f.setJMenuBar(menuCompleto);

    f.setDefaultCloseOperation(

    JFrame.EXIT_ON_CLOSE)

    f.setSize( new Dimension(400,400) );

    f.setVisible(true);

    }

    }

  • 8/9/2019 Programacao GUI

    70/88

    Aceleradores

  • 8/9/2019 Programacao GUI

    71/88

    Tecla global que realiza aes. Ex: Alt-X termina programas da Microsoft.

    Funciona mesmo em componentes que so estejam com focode entrada ou mesmo invisveis. Podem ser executado em qualquer momento na aplicao. Podem incluir opcionalmente modificadores como Shift e Alt.

    Exemplo de uso:mItem.setAccelerator(

    KeyStroke.getKeyStroke('T',KeyEvent.ALT_MASK)

    );

    Mnemonics e Acelerators

  • 8/9/2019 Programacao GUI

    72/88

    Mnemonics so locais. Acelerators so globais.

    Ex. : Acrescentado no nosso cdigo anterior as linhase1.setAccelerator(KeyStroke.getKeyStroke('X',KeyEvent.ALT_MASK))

    ;

    menuArquivo.setMnemonic('A');

    a1.setMnemonic('A');

    Pintando a tela

  • 8/9/2019 Programacao GUI

    73/88

    O processo atravs do qual um componentese redesenha na tela chamado de pintura

    (painting)

    Painting ocorre nas seguintes ocasies:

    Quando o componente mostrado pela primeiravez. Quando o componente que estava coberto

    mostrado.

    Quando o componente muda de tamanho. Quando o programador o pede, atravs docomando repaint()

    Pintando a tela

  • 8/9/2019 Programacao GUI

    74/88

    A maior parte do processo feita automaticamente. Quando voc quer fazer alguma coisa diferente, voc

    deve sobreescrever o mtodo paintComponent Logo, voc deve derivar uma nova classe a partir da

    classe tradicional da GUI.

    Para garantir uma boa pintura, sempre invoque primeiro omtodo super.paintComponent

    Este mtodo recebe um objeto da classe Graphics comoparmetro.

    Ele passado automaticamente e representa a sua reade desenho.

    Use este objeto para realizar seus desenhos especiais.

    Primeiro Exemplo

  • 8/9/2019 Programacao GUI

    75/88

    import java.awt.*;

    import javax.swing.*;

    class MyPanel extends JPanel {

    public void paintComponent (Graphics g) {super.paintComponent(g);

    g.drawString("Not Hello World",5,25);

    }

    }

    public class MeuExemplo {public static void main(String args[]) {

    JFrame f=new JFrame("Estranho Hello World");

    f.getContentPane().add(new MyPanel());

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    f.setSize( new Dimension(200,200) );

    f.setVisible(true);

    }

    }

    Sempre chame o paintComponent

    da superclasse primeiro

    Segundo Exemplo

  • 8/9/2019 Programacao GUI

    76/88

    import java.awt.*;

    import javax.swing.*;

    class MyPanel extends JPanel {public void paintComponent(Graphics g) {

    super.paintComponent(g);

    setBackground(Color.white);g.setColor(Color.orange);

    g.fillRect(20,50,100,100);

    }

    }

    Sempre chame o mtodo

    paintComponent da

    superclasse primeiro

    Por qu???

    Segundo Exemplo (cont)

  • 8/9/2019 Programacao GUI

    77/88

    public class TestePanel {

    public static void main(String args[]) {

    JFrame f=new JFrame("Testando");MyPanel p=new MyPanel();

    f.getContentPane().add(p);

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

    ;

    f.setSize( new Dimension(200,200) );

    f.setVisible(true);}

    }

    Resultado do segundo exemplo

  • 8/9/2019 Programacao GUI

    78/88

  • 8/9/2019 Programacao GUI

    79/88

    Usando Graphics

  • 8/9/2019 Programacao GUI

    80/88

    Usando Graphics (e a classe mais poderosa,Graphics2D), podemos fazer desenhos taiscomo:

    e at produzir efeitos tais como:

    Usando Graphics

  • 8/9/2019 Programacao GUI

    81/88

    Voc recebe sempre um objeto da classeGraphics, mas para poder usar todo o

    poder associado API grfica, deve fazerum typecast para transform-lo emGraphics2D

    O cdigo public void Paint (Graphics g) {

    Graphics2D g2 = (Graphics2D) g;...}

    Graphics2D

  • 8/9/2019 Programacao GUI

    82/88

    Para mudar um atributo no contextode renderizao de um Graphics2D,usamos um dos mtodos a seguir:

    setStroke

    setPaint

    setComposite

    setTransform

    setClip

    setFont

    setRenderingHints

    Tratamento de Eventos

  • 8/9/2019 Programacao GUI

    83/88

    Algumas interfaces mais utilizadas: ActionListener FocusListener KeyListener

    MouseListener WindowListener

    Cada interface listener de eventos especifica um oumais mtodos de tratamento de evento que devem serdefinidos na classe que implementa a interface.

    Tratamento de Eventos

  • 8/9/2019 Programacao GUI

    84/88

    Quando um boto for pressionado,este evento ser tratado pelaimplementao do(s) mtodo(s) dainterface ActionListener

  • 8/9/2019 Programacao GUI

    85/88

    Windows Notas Adicionais

  • 8/9/2019 Programacao GUI

    86/88

    Interface WindowConstants implementadapor Jframe

    DISPOSE_ON_CLOSE, DO_NOTHING_ON,HIDE_ON_CLOSE (padro)

    Window superclasse indireta de JFrame Mtodo dispose para liberar o recurso de janela Quando janela no mais necessria, deve ser

    descartada explicitamente (Garbage Collector

    no funciona)Deitel & Deitel, pg. 753

    Eventos de Janela

  • 8/9/2019 Programacao GUI

    87/88

    Mtodo da classe Window: addWindowListener Mtodos da interface WindowListener:

    windowActivated chamado quando usurio torna janelaativa windowClosed chamado depois do fechamento da janela WindowClosing chamado quando inicia o fechamento da

    janela

    windowDeactivated chamado quando usurio torna outrajanela a janela ativa windowDeiconified chamado quando usurio restaura

    janela minimizada

    windowIconified chamado quando usurio minimizajanela windowOpened chamado quando programa exibe uma

    janela na tela pela primeira vez

    Referncias

  • 8/9/2019 Programacao GUI

    88/88

    Site da Sun, http://java.sun.com/j2se/

    Deitel, Harvey M. / Deitel, Paul J. Java,Como Programar. Editora Bookman.