Вы находитесь на странице: 1из 87

GUI (Graphical User Interface)

A interface grfica com o usurio (GUI - Graphical User Interface) do, de forma intuitiva, ao usurio um nvel bsico de familiaridade, sem que jamais tenha usado o programa. Dessa forma, reduzido o tempo de aprendizado do programa pelo usurio. As GUIs so construdas a partir de componentes GUI. O componente GUI um objeto com o qual o usurio interage atravs de, por exemplo:
Mouse; Teclado; Alguma forma de entrada; Reconhecimento de voz.

Interfaces Mais Simples


Ns usamos javax.swing.JOptionPane
No muito OO! Nem muito poderoso...

Elementos de uma GUI


componentes: Elementos desenhados na tela. Exemplos: boto, textbox, label, etc. containers: elementos que servem como agrupadores lgicos para componentes. Exemplo: Panel. Containers de alto nvel: cidados de primeira classe, que efetivamente ocupam um espao no desktop. Exemplos: Frame, DialogBox.

GUI em Java: AWT e Swing


Idia inicial da Sun: Abstract Windowing Toolkit AWT
Criar um conjunto de classes e mtodos que possam ser usados para 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 GUIs muito mais poderosos e flexveis.

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

Swing
Porque o nome swing?
Apelido usado pelos desenvolvedores das Java Foundations Classes (JFC) usadas para o desenvolvimento 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

Look and Feel


Cada figuta abaixo mostra o mesmo programa com um look and feel diferente. Conforme mudamos de SO ou de ambiente, o look and feel se adapta para aquele que padro na mquina onde rodamos. Isto uma obrigao da JVM, no do programador.

Componentes Swing
O Swing fornece vrios componentes padro de GUI que podem ser combinados de forma a criar sua interface. Alguns exemplos:
Botes, Listas, Menus, reas de texto, etc.

Swing tambm fornece containers tais como janelas e barras de ferramentas. Pode ser de vrios nveis:
Nvel mais alto: frames, dilogos Nvel Intermedirio: panel, scroll pane, tabbed pane, ...

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

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)

Containers
Descendentes da classe java.awt.Container Componentes que podem conter outros componentes. Usamos um layout manager para posicionar e definir o tamanho dos componentes contidos neles. Componentes so adicionados a um container usando as vrias formas do mtodo add

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 os componenetes 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)

Containers Top-Level
Para aparecer na tela, todo componente GUI deve ser parte de uma hierarquia de conteno, cuja raiz um container 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 componente diretamente ao container top-level

Content Pane
Todo container top-level contm indiretamente um container intermedirio denominado content pane Este content pane contm todos os componentes visveis n GUI da janela. Os containers so adicionados ao content pane usando um dos vrios tipos de mtodos add Exemplo:
frame = new JFrame(...); label = new JLabel(...); frame.getContentPane().add(label, BorderLayout.CENTER);

JFrame
Um frame, implementado como uma instncia da classe JFrame, uma janela que tem acessrios tais como borda, ttulo e botes para fechar e minimiz-la. Estes acessrios so totalmente dependentes de plataforma. As aplicaes com uma GUI tipicamente usam ao menos um frame.

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 quando fecha. Mais comum: JFrame.EXIT_ON_CLOSE

JFrame
A programao grfica est muito ligada ocorrncia de eventos, que devem ser tratados Ao contrrio de outras linguagens de programao, os containers Java no vm 100% para lidar com os eventos 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 setDefaultCloseOperation por enquanto

Primeiro programa GUI em Java


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); } } pack() faz com que a janela seja ajustada para

o tamanho preferido de todos os seus subcomponentes.

Exemplo 2
Faz a mesma coisa, s que criando uma classe nova, definida por ns . 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(); } }

Relacionamentos conceituais
Diagrama UML

Superclasses comuns da maioria dos componentes Swing


java.lang.Object

java.awt.Component

java. awt.Cont ainer

javax.swi ng.JCom ponent

JDialog
Um dilogo uma maneira de conseguir com que o usurio realize uma entrada de dados. Existem vrios tipos de dilogos - ns j usamos um h muito tempo... Todo dilogo dependente de um frame.
Destruir um frame destri todos os dilogos que so seus dependentes 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 est visvel, todas as entradas para outros componentes estaro bloqueadas.

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, que permitem a costumizao de cones, ttulos, textos e botes

Usando JOptionPane
JOptionPane faz com que seja fcil exibir um dilogo padro que leia um valor do usurio ou informe-o de algo. A classe JOptionPane parecer complexa dado o seu grande nmero de mtodos. Entretanto, a maioria dos uso desta classe so simplesmente chamadas de uma nica linha para um dos mtodos estticos showXxxDialog

showXxxDialog
showConfirmDialog Faz uma pergunta confirmatria e espera uma resposta tal como yes/no/cancel. showInputDialog L entrada do teclado (velho conhecido) showMessageDialog Informa ao usurio que algo aconteceu. showOptionDialog Os trs anteriores em um s

Todos os dilogos acima so modais.

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]);

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 um componente usando informaes adicionais (veremos mais adiante). public void remove(Component comp) public void setLayout(LayoutManager mgr): Usa o layout manager especificado para posicionar os componentes no container. public void validate(): Manda o layout manager reposicionar todos os objetos no container.

JComponent
Classe base para todos os componentes Swing, com exceo dos containers top-level Para usar um componente que herde de JComponent, ele deve ser colocado na hierarquia de conteno cuja raiz seja um container top-level A classe JComponent prov, entre outros, tratamento de eventos de teclado, look and feel, infra-estrutura para desenho, suporte a bordas, etc Todos os descendentes de JComponent tambm so Containers. Exemplo: um JButton pode conter textos, cones, etc

JComponent
Componentes tpicos
JLabel JButton JTextField JPanel JTable Etc.

JButton
Um boto uma regio clicvel com a qual o usurio interage de 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.

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 este boto
Tratamento de eventos: veremos adiante

JLabel
Um label um texto a ser mostrado na tela que normalmente oferece informao para o usurio de forma a tornar a interface mais compreensvel. Principais mtodos:
public JLabel(String text): Cria um novo label com o texto dado 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 do label.

JTextField
Um textfield como um label, s que pode ser editado e modificado pelo usurio. Textfields so usados geralmente para entrada de dados pelo usurio. Mtodos interessantes:
public JTextField(int columns): Cria um novo textfield com uma largura, em caracteres, 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 string dada como parmetro.

JCheckBox
Objeto de tela que permite que escolhamos entre duas opes (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 e cujo valor default dado pelo segundo parmetro. public boolean isSelected():Retorna true se a check box foi selecionada. public void setSelected(boolean selected): Muda o estado da checkbox de acordo com o parmetro passado.

JRadioButton
Um boto que pode ser selecionado. Normalmente parte de um grupo de botes 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)

ButtonGroup
Um grupo lgico de radiobuttons que garante que apenas um deles pode ser selecionado de 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 so adicionados ao container

Usando Icon
Nas classes JButton, JRadioButton, JCheckBox, JLabel, etc, temos o seguinte.
O construtor pode receber um cone public void setIcon(Icon) public void setSelectedIcon(Icon) public void setRolloverIcon(Icon)

JTextArea
Uma rea de texto multi-linha til para escrever textos longos que no necessitam formatao. Mtodos interessantes:
public JTextArea(int rows, int columns): Cria um novo campo de texto com um tamanho determinado em termos de nmero de linhas e colunas public String getText():Retorna o texto armazenado no momento na rea. public void setText(String text):Define o texto a ser armazenado na rea como sendo o parmetro passado.

Problema: Posicionando componentes


Como o programador pode especificar onde fica cada componente na janela, quo grande ele deve ser e o que 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 (Layout Managers).


So objetos especiais que decidem onde posicionar cada componente baseados em critrios especficos.

Bordas
Todo JComponent pode ter uma ou mais bordas A classe usada para criar bordas padronizadas a BorderFactory Exemplo de uso:
p.setBorder(BorderFactory.createLineBorder(Color.black));

Podemos criar uma borda composta, combinando uma ou mais bordas, da seguinte maneira:
BorderFactory.createCompoundBorder(border1, border2);

Classe BorderFactory
Hierarquia
java.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.

Tipos de bordas

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 o comando: panel.setLayout(new BorderLayout());

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 definido como o content pane de um container de top-level. Panels opacos no desenham um background.

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 um Jframe para melhorar o layout de nossas telas.

Resumo
JFrame = um continer (formulrio) para outros componentes GUI. JLabel = rea em que podem ser exibidos textos noeditveis ou cones. JTextField = rea em que o usurio insere dados pelo teclado. JButton = rea que aciona um evento quando o usurio clica. JCheckBox = Possui dois estados: selecionado ou noselecionado. 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 a seleo clicando em qualquer item da lista. JPanel = Continer em que os componentes podem ser colocados.

Alguns Componentes GUI Bsicos


JLabel JTextField JButton JCheckBox JComboBox

JList

JFrame

Gerenciamento de Layout
Gerenciamento de layout consiste no processo de determinar 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 de tamanho. Tem um ajuste complexo quando mudamos de sistema e enfrentamos outras resolues, tamanhos de fonte, etc.

Gerenciamento de Layout
O gerencimaneto de layout geralmente realizado pelos layout managers Os componentes oferecem dicas de tamanho e posicionamento para os layout managers, mas so estes que decidem onde e como estes componentes sero posicionados. Estas dicas consistem em tamanho mnimo, preferido e mximo, 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, ...

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 em considerao Chamadas possveis do add: Usando posio relativa (BorderLayout) panel.add(component, BorderLayout.CENTER); Ordem de adio: (BoxLayout, GridLayout, ...) panel.add(component);

BorderLayout
Divide o container em cinco regies : NORTH, SOUTH, WEST, EAST, CENTER As regies NORTH e SOUTH se expandem de forma a tomar todas a regio horizontalmente e usam o tamanho default verticalmente As regies WEST e EAST se expandem para preencher a regio verticalmente e usam o tamanho default horizontalmente CENTER usa o espao que no foi ocupado pelos outros.

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...
A sada do programa algo assim:

Repare que sempre que modificamos o tamanho da janela, os componentes automaticamente se reposicionam. Problema: quando fechamos o frame, gostaramos que o programa terminasse, mas isto no acontece (veja a janela de processos em execuo dentro do NetBeans)

Resolvendo o problema
O problema que no temos nenhum tratador para o evento de fechar 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 biblioteca java.awt.event, que deve ser importada para que o programa funcione.

FlowLayout
Trata o container como se fosse uma pgina ou um pargrafo 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 que foram adicionados Se a linha for muito longa, os componentes passam para a linha de baixo.

GridLayout
Trata o container como um grid de linhas e colunas de tamanhos iguais. Os componenets recebem tamanhos iguais no importando qual seu tamanho favorito.

BoxLayout
Alinha os componentes no container em uma nica linha ou coluna Os componentes usam seu tamanho e alinhamentos favoritos A melhor maneira de criar um container com o layout box:
Box.createHorizontalBox(); Box.createVerticalBox();

Problema dos Layout Managers


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

Soluo : Layout composto


Crie panels dentro de Panels Cada Panel tem um layout diferente Combinando os layouts, podemos conseguir desenhos mais complexos e poderosos e que atinjam nossos objetivos. Exemplo

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

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
Faam programas em Java que desenhem as seguintes telas:

(a)

(b)

(c)

(d)

(e)

JScrollPane
Uma container especial que permite que usemos barras de rolagem para ver componentes. Na verdade, envolvemos um componente com scrollbars.
public JScrollPane(Component comp)

Colocamos o JScrollpane no container, no o componente original.


contentPane.add(new JScrollPane(textarea), BorderLayout.CENTER);

JFileChooser Uma caixa de dilogo que permite que ns selecionemos um ou mais arquivos e/ou diretrios.
Mtodos interessantes:
public JFileChooser() public JFileChooser(String currentDir) public int showOpenDialog(Component parent) public int showSaveDialog(Component parent) public File getSelectedFile() public static int APPROVE_OPTION, CANCEL_OPTION

JColorChooser Outro palete especial que permite que o usurio escolha uma dentre um palete de cores.
Mtodos interessantes:
public JColorChooser() public JColorChooser(Color initial) public Color showDialog(Component parent, String title, Color initialColor) : permite escolher uma cor do palete, retornando a cor escolhida.

JMenuItem
Uma entrada em um menu, que pode ser clicado para disparar aes. Mtodos interessantes:
public public public public public public public JMenuItem(String text) JMenuItem(String text, Icon icon) JMenuItem(String text, int mnemonic) void addActionListener(ActionListener al) void setAccelerator(KeyStroke ks) void setEnabled(boolean b) void setMnemonic(int mnemonic)

JCheckBoxMenuItem / JRadioButtonMenuItem
Itens de menu que se comportam como checkboxes ou radiobuttons. Mtodos interessantes:
public JXxxMenuItem(String text) public JXxxMenuItem(String text, boolean select) public JXxxMenuItem(String text, Icon icon) public JXxxMenuItem(String text,Icon icon, boolean selected) public void addActionListener(ActionListener al) public boolean isSelected() public void setSelected(boolean b)

Ambas as classes extendem a classe AbstractButton!

JMenu
Um menu que criado para mostrar os itens de menu. Menus podem conter outros menus. Mtodos interessantes:
public public public public JMenu(String s) void add(JMenuItem item) void addSeparator() void setMnemonic(int mnemonic)

JMenuBar
O container de nvel mais alto que pode armazenar menus. Podem ser ligados a um frame atravs do mtodo setJMenuBar. Existente na classe JFrame Mtodos Interessantes:
public JMenuBar() public void add(JMenu menu)

Menus - Exemplo Completo


import 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("Salvar como"); 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); } }

Resultado do exemplo
Todo frame tem apenas um JMenuBar Itens de menu podem ser menus

Aceleradores
Tecla global que realiza aes. Ex: Alt-X termina programas da Microsoft. Funciona mesmo em componentes que so estejam com foco de 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
Mnemonics so locais. Acelerators so globais. Ex. : Acrescentado no nosso cdigo anterior as linhas
e1.setAccelerator(KeyStroke.getKeyStroke('X',KeyEvent.ALT_MASK)) ; menuArquivo.setMnemonic('A'); a1.setMnemonic('A');

Pintando a tela
O processo atravs do qual um componente se redesenha na tela chamado de pintura (painting) Painting ocorre nas seguintes ocasies:
Quando o componente mostrado pela primeira vez. Quando o componente que estava coberto mostrado. Quando o componente muda de tamanho. Quando o programador o pede, atravs do comando repaint()

Pintando a tela
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 o mtodo super.paintComponent

Este mtodo recebe um objeto da classe Graphics como parmetro. Ele passado automaticamente e representa a sua rea de desenho. Use este objeto para realizar seus desenhos especiais.

Primeiro Exemplo
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
import java.awt.*; import javax.swing.*; class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); setBackground(Color.white); Sempre chame o mtodo g.setColor(Color.orange); paintComponent da g.fillRect(20,50,100,100); superclasse primeiro } }

Por qu???

Segundo Exemplo (cont)


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

Tratamento de Eventos
As GUIs so baseados em eventos gerados pela interao do usurio. Por exemplo, mover o mouse, clicar no mouse, digitar um campo de texto, fechar uma janela, etc. Tanto os componentes AWT como Swing utilizam os tipos de eventos do pacote java.awt.event. Mas o Swing tambm tem seus prprios eventos no pacote javax.swing.event. Mecanismo de tratamento de eventos possui trs partes: a origem do evento, o objeto evento e o ouvinte (listener) do ouvinte. O programador precisa: Registrar um ouvinte de evento no componente e implementar um mtodo de tratamento de eventos.

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

e at produzir efeitos tais como:

Usando Graphics
Voc recebe sempre um objeto da classe Graphics, mas para poder usar todo o poder associado API grfica, deve fazer um typecast para transform-lo em Graphics2D O cdigo
public void Paint (Graphics g) { Graphics2D g2 = (Graphics2D) g; ... }

Graphics2D
Para mudar um atributo no contexto de renderizao de um Graphics2D, usamos um dos mtodos a seguir:
setStroke setPaint setComposite setTransform setClip setFont setRenderingHints

Tratamento de Eventos

Algumas interfaces mais utilizadas:


ActionListener FocusListener KeyListener MouseListener WindowListener

Cada interface listener de eventos especifica um ou mais mtodos de tratamento de evento que devem ser definidos na classe que implementa a interface.

Tratamento de Eventos
Quando um boto for pressionado, este evento ser tratado pela implementao do(s) mtodo(s) da interface ActionListener

Exemplo com tratamento de eventos


Deitel & Deitel pg 421

Windows Notas Adicionais


Interface WindowConstants implementada por 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
Mtodo da classe Window: addWindowListener Mtodos da interface WindowListener:
windowActivated chamado quando usurio torna janela ativa windowClosed chamado depois do fechamento da janela WindowClosing chamado quando inicia o fechamento da janela windowDeactivated chamado quando usurio torna outra janela a janela ativa windowDeiconified chamado quando usurio restaura janela minimizada windowIconified chamado quando usurio minimiza janela windowOpened chamado quando programa exibe uma janela na tela pela primeira vez

Referncias

Site da Sun, http://java.sun.com/j2se/ Deitel, Harvey M. / Deitel, Paul J. Java, Como Programar. Editora Bookman.

Вам также может понравиться