11.04.2013 Views

Componentes gráficos GUI – Parte 2

Componentes gráficos GUI – Parte 2

Componentes gráficos GUI – Parte 2

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Criando interfaces<br />

com o usuário<br />

Continuação


A diferença básica entre um objeto Window e um objeto<br />

JFrame é que o JFrame representa a janela principal de<br />

uma aplicação e o Window apenas uma janela a mais.<br />

Antes de criar um objeto Window ou JDialog é preciso<br />

criar um objeto JFrame.<br />

JFrame => Um objeto desta classe possui uma barra de<br />

título e características para receber menus e outros<br />

componentes.<br />

JDialog => Usada para definir janelas de diálogos para<br />

entrada de dados. Normalmente usada em resposta a<br />

uma opção de menu selecionada. Definida em função<br />

de um objeto JFrame.<br />

JApplet => Classe base para applets Java. É possível<br />

desenhar e adicionar menus e outros componentes em<br />

um JApplet.<br />

JComponent => As subclasses de JComponent definem<br />

um conjunto de componentes standard (menus, botões,<br />

checkboxes, etc)


Vejamos alguns atributos comuns de<br />

componentes:<br />

posição(x,y): posição do objeto em relação ao seu<br />

container;<br />

Nome do componente<br />

(myWindow.setName(“Nome”););<br />

Tamanho: altura e largura<br />

Cor do objeto e cor de fundo<br />

Fonte<br />

Aparência do cursor<br />

Objeto habilitado ou não: (isEnabled(),<br />

myWindow.setEnabled())<br />

Objeto visível ou não: (isVisible(),<br />

myWindow.setVisible())<br />

Objeto válido ou não<br />

Obs: Todos estes atributos são private.


Vejamos um exemplo<br />

usando o componente<br />

gráfico JPanel exibido<br />

dentro de um JFrame.<br />

Este componente será<br />

extendido para exibir o<br />

desenho de algumas<br />

linhas.<br />

Implemente a seguinte<br />

classe:


Implemente esta<br />

classe para testar a<br />

anterior


A posição de um componente é definida por um par de<br />

inteiros x,y ou por um objeto do tipo Point. Um objeto<br />

Point possui dois argumentos public int (x e y).<br />

Dimensões são definidas pelos inteiros width e height ou<br />

por um objeto do tipo Dimension que possui dois<br />

argumentos public inteiros (width e height).<br />

Tamanho e posição também podem ser definidos juntos<br />

por um objeto Rectangle (4 argumentos public int <strong>–</strong> x,y,<br />

representando o topo a esquerda e width e height<br />

representando o tamanho).<br />

Outros componentes que podemos usar em nossas<br />

aplicações são: Botão (JButton), Menu (JMenu), Caixa<br />

de texto(JTextComponent), Lista (JList), Tabela(JTable),<br />

Container, etc.


Entendendo Layouts:<br />

Já foi visto que interfaces em Java são formadas<br />

quando adicionamos componentes a containers. Os<br />

containers são responsáveis por manter os<br />

componentes visíveis, repassar os eventos, etc.<br />

Como a filosofia da linguagem Java é que os<br />

programas sejam extremamente portáveis, a filosofia<br />

da interface também visa ser extremamente<br />

adaptável. Por esta razão a disposição dos<br />

componentes sobre o container não é indicada por<br />

um par ordenado (x,y) como na maioria das outras<br />

bibliotecas de construção de interface com o usuário.<br />

A linguagem oferece um conjunto de Layouts básicos<br />

que especificam como estes componentes devem ser<br />

organizados(é claro que você também pode<br />

especificar seu próprio layout, mas isto dará mais<br />

trabalho).


Entendendo Layouts (continuação)<br />

O arranjo dos componentes dentro do<br />

container é gerenciado por um Layout<br />

Manager.<br />

A vantagem de se ter um Layout Manager é<br />

que a apresentação dos componentes se<br />

adapta quando redimensionamos a janela. A<br />

desvantagem é o pouco domínio que o<br />

programador tem da posição dos<br />

componentes com alguns Layout Managers.


FlowLayout<br />

<strong>Componentes</strong> distribuídos da esquerda para a<br />

direita de cima pra baixo.<br />

Panel c = new Panel();<br />

c.add(new Button(“1”));<br />

c.add(new TextField(“9”));<br />

c.add(new Button(“2”));<br />

c.add(new Button(“3”));<br />

Respeita o tamanho preferido dos componentes mesmo quando não<br />

houver espaço suficiente no container.


GridLayout<br />

Similar ao FlowLayout só que cada componente é<br />

alocado em uma célula de igual tamanho. Permite definir<br />

um vetor ou uma matriz de células nas quais os<br />

componentes são alocados.<br />

Panel c = new Panel();<br />

c.setLayout(new GridLayout(2,2));<br />

c.add(new Button(“um”));<br />

c.add(new TextField(“9”));<br />

c.add(new Button(“dois”));<br />

c.add(new Button(“três”));<br />

Divide a área em uma grade<br />

Dispõe os elementos da esquerda para a direita de cima<br />

para baixo<br />

Todos tem o mesmo tamanho


GridBagLayout<br />

Semelhante ao GridLayout porém as<br />

divisões podem ser de tamanhos<br />

diferentes<br />

É um layout flexível e complicado e só<br />

deve ser usado quando nenhum dos<br />

outros se aplica.<br />

A classe GridBagConstraints é usada para<br />

dimensionar e posicionar os<br />

componentes.


CardLayout<br />

Usado para exibir um componente de cada vez como<br />

em uma pilha de cartas<br />

Somente o objeto que estiver no topo será visível<br />

Métodos:<br />

first(container), last(container), next(container),<br />

previous(container), show(container, string)


BorderLayout<br />

É o layout default para a maioria das aplicações<br />

gráficas. Um container é dividido em 5 regiões e<br />

quando se adiciona um componentes é preciso<br />

especificar em que área se quer adicioná-lo. Ex:<br />

add(botao_ok, BorderLayout.WEST);<br />

Cada região de BorderLayout só suporta a<br />

inclusão de um único componente. Caso um<br />

segundo componente seja incluído em uma das<br />

regiões o componente anterior será apagado.


As regiões de BorderLayout são:<br />

BorderLayout.CENTER<br />

BorderLayout.NORTH<br />

BorderLayout.EAST<br />

BorderLayout.SOUTH<br />

BorderLayout.WEST<br />

Vejamos no próximo slide um exemplo da utilização<br />

de BorderLayout:


import java.awt.BorderLayout;<br />

import javax.swing.ImageIcon;<br />

import javax.swing.JLabel;<br />

import javax.swing.JFrame;<br />

public class LabelDemo<br />

{<br />

public static void main(String args[])<br />

{<br />

ImageIcon labelIcon = new ImageIcon("<strong>GUI</strong>tip.gif");<br />

JLabel norteLabel = new JLabel(labelIcon);<br />

norteLabel.setText("Norte");<br />

JLabel centroLabel = new JLabel(labelIcon);<br />

centroLabel.setText("Centro");<br />

centroLabel.setToolTipText(“Sou o elemento do centro");<br />

JLabel sulLabel = new JLabel(labelIcon);<br />

sulLabel.setText("Sul");<br />

JLabel lesteLabel = new JLabel("Leste");<br />

JLabel oesteLabel = new JLabel("Oeste");<br />

}<br />

JFrame aplicacao = new JFrame("Teste de labels");<br />

aplicacao.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />

aplicacao.add(norteLabel,BorderLayout.NORTH);<br />

aplicacao.add(centroLabel,BorderLayout.CENTER);<br />

aplicacao.add(sulLabel,BorderLayout.SOUTH);<br />

aplicacao.add(lesteLabel,BorderLayout.EAST);<br />

aplicacao.add(oesteLabel,BorderLayout.WEST);<br />

aplicacao.setSize(300, 300);<br />

aplicacao.setVisible(true);<br />

}


Exercitando:<br />

1)Redimensione a janela para 400 pontos de<br />

largura e 200 pontos de altura.<br />

2)Na parte norte da janela acrescente um<br />

outro label de forma que os dois labels sejam<br />

exibidos na parte norte simultaneamente. Se<br />

o novo label for simplesmente acrescentado à<br />

construção atual ambos (ele e o anterior)<br />

serão exibidos ao mesmo tempo? Como<br />

resolver esta questão?


BoxLayout<br />

Respeita o tamanho preferido dos componentes<br />

Coloca os componentes organizados em uma linha ou<br />

coluna<br />

BoxLayout.X_AXIS para componentes em linha<br />

BoxLyout.Y_AXIS para componentes em coluna<br />

Ex:<br />

JPanel c = new JPanel();<br />

c.setLayout(new BoxLayout(c,BoxLayout.X_AXIS));<br />

c.add(new JButton(“um”));<br />

c.add(new JButton(“dois”));<br />

c.add(new JButton(“três”));<br />

c.add(new JButton(“quatro”));


Compondo Layouts usando Panels<br />

A classe Panel é um container pois é derivada<br />

da classe Container. Assim sendo podemos<br />

agrupar vários componentes dentro de um<br />

Panel e passar a considerá-lo um único<br />

componente para efeito de layout.<br />

Por ser um container um Panel pode ter seu<br />

layout próprio.<br />

Esta é uma maneira muito usada para criar<br />

layouts compostos.<br />

Vejamos um exemplo de layout composto<br />

usando swing:


Vejamos uma implementação para este código com 2 botões<br />

import javax.swing.*;<br />

import java.awt.event.*;<br />

//import java.awt.*;<br />

public class TestaEventos3 extends JFrame<br />

{<br />

JButton botao, botao2;<br />

JLabel texto;<br />

JPanel painel;<br />

int cont;<br />

<br />

public TestaEventos3()<br />

{<br />

super("Aplicacao de testar eventos");<br />

cont = 0;<br />

painel = new JPanel();<br />

botao = new JButton("Botao");<br />

botao2 = new JButton("Botao2");<br />

painel.setLayout(new BoxLayout(painel, BoxLayout.Y_AXIS));<br />

painel.add(botao);<br />

painel.add(botao2);<br />

MouseAdapter mouseGer =new MouseAdapter(){public void mouseClicked(MouseEvent e)<br />

{if(e.getSource() == botao) System.out.println("Clicou b1");<br />

else System.out.println("Clicou b2");<br />

}<br />

public void mouseReleased(MouseEvent e)<br />

{if(e.getSource() == botao) System.out.println("Soltou b1");<br />

else System.out.println("Soltou b2");<br />

}<br />

};<br />

botao.addMouseListener(mouseGer);<br />

botao2.addMouseListener(mouseGer);<br />

getContentPane().add(painel);<br />

}


continuação<br />

public static void main(String args[])<br />

{<br />

TestaEventos3 aplicacao = new TestaEventos3();<br />

<br />

aplicacao.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />

aplicacao.setSize(200,100);<br />

aplicacao.setVisible(true);<br />

}<br />

}


Um mesmo gerenciador pode receber os<br />

eventos de mais de um componente como<br />

veremos no próximo exemplo:


import javax.swing.*;<br />

import java.awt.event.*;<br />

//import java.awt.*;<br />

public class TestaEventos2B extends JFrame implements ActionListener<br />

{<br />

JButton botao, botao2;<br />

JLabel texto, texto2;<br />

JPanel painel;<br />

int cont;<br />

<br />

public TestaEventos2B()<br />

{<br />

super("Janela de teste com dois botões");<br />

cont = 0;<br />

painel = new JPanel();<br />

botao = new JButton("Botao");<br />

botao2 = new JButton("Botão 2");<br />

texto = new JLabel("Quantidade de clicks:");<br />

texto2 = new JLabel("Último botão pressionado:");<br />

painel.setLayout(new BoxLayout(painel, BoxLayout.Y_AXIS));<br />

painel.add(botao);<br />

painel.add(botao2);<br />

painel.add(texto);<br />

painel.add(texto2);<br />

<br />

botao.addActionListener(this);<br />

botao2.addActionListener(this);<br />

<br />

getContentPane().add(painel);<br />

}


public void actionPerformed(ActionEvent e)<br />

{<br />

cont++;<br />

texto.setText("Quantidade de clicks = "+cont);<br />

if (e.getSource() == botao) texto2.setText("Último botão pressionado:<br />

Botão 1");<br />

else if (e.getSource() == botao2) texto2.setText("Último botão<br />

pressionado: Botão 2");<br />

}<br />

public static void main(String args[])<br />

{<br />

TestaEventos2B aplicacao = new TestaEventos2B();<br />

<br />

aplicacao.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />

aplicacao.setSize(300,200);<br />

aplicacao.setVisible(true);<br />

}<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!