Componentes gráficos GUI – Parte 2
Componentes gráficos GUI – Parte 2
Componentes gráficos GUI – Parte 2
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 />
}