Principais Classes Swing AWT

Transcrição

Principais Classes Swing AWT
Principais Classes Swing AWT
As classes e interfaces localizadas nos pacotes
java.awt e javax.swing são recursos para o desenvolvimento
de GUIs (Graphic User Interface – Interface Gráfica do
Usuário).
Uma GUI é desenvolvida utilizando-se componentes, que
são objetos visuais que possibilitam ao usuário realizar a
interação com o programa por meio do mouse e do teclado. Os
componentes mais comuns são: rótulos (Label), botões
(button), campo de texto (text field), áreas de texto (text
area), caixas de checagem (check box), botões de rádio
(radio button), listas (list) e menus.
Na versão 1.0 de Java, encontramos um pacote chamado
AWT (Abstract Window Toolkit – kit de ferramentas de
janelas abstratas) contendo todas as classes necessárias
para a construção de GUIs. A estratégia adotada, naquele
momento, para tratar dos elementos da interface do usuário
fora delegar a sua criação e seu comportamento ao kit de
ferramentas nativo do sistema operacional específico onde
fossem criados.
Algum tempo depois se verificou que os componentes
apresentavam diferenças entre as diversas plataformas e
isto dificultava a construção de GUIs. Além disto, ocorriam
erros diferentes com os componentes em cada plataforma,
obrigando os desenvolvedores a testar seus aplicativos em
cada uma delas.
Devido a este problema, a Sun começou a desenvolver
uma nova biblioteca de componentes que aperfeiçoasse o
método adotado. Essa biblioteca foi chamada de Swing e
passou a ser o nome oficial do kit de componentes para a
construção de GUIs.
O pacote Swing não é sobrecarregado com as complexas
capacidades da plataforma em que são utilizados e, por
isto, são freqüentemente chamados de peso leve. Ao
contrário, os componentes AWT precisam contar com o sistema
de janelas da plataforma local para determinar sua
funcionalidade,
sua
aparência
e
seu
comportamento.
Entretanto,
alguns
componentes
Swing
ainda
requerem
interação direta com o sistema local de janelas, como é o
caso de todas as classes derivadas de Window (como JFrame).
Os componentes AWT continuam disponíveis nas últimas
versões do J2SDK e encontra-se no pacote java.awt. Os
componentes Swing foram dispostos no pacote javax.swing.
1
Component
A classe Component representa as características
comuns de todos os componentes, ou seja, de todos aqueles
objetos que possuem uma representação gráfica, que podem
interagir com o usuário e que possuem uma aparência e um
comportamento.
Container
A classe Container representa um contêiner,ou seja, um
componente
que
pode
abrigar
dentro
de
si
outros
componentes.
Os
contêineres
criados
com
a
classe
Container
funcionam como painéis e janelas, que abrigam outros
contêineres e/ou componentes que aparecem na tela.
A classe javax.swing.JFrame
JFrame
estendida da
arquitetura
incompatível
é um container de janela e é uma versão
classe java.awt.Frame que adiciona suporte à
dos componentes Swing. Entretanto, ela é
com a classe Frame.
Para adicionar um componente a um JFrame é preciso
invocar o método add() do objeto que representa seu painel
de conteúdo. Como esse objeto não pode ser acessado
diretamente, deve-se recuperá-lo utilizando o método
getContentPane() da janela. A instrução para adição de um
componente a um JFrame deve, então obedecer ao seguinte
padrão.
JFrame f = new JFrame ();
f.getContentPane().add(<nome do Componente>);
2
Veja abaixo um exemplo da utilização do container JFrame.
import java.awt.*;
import javax.swing.*;
class TesteJFrame extends JFrame{
public TesteJFrame(){
//Titulo da janela
setTitle("Primeira Janela Swing");
//tamanho da janela
setSize(275,100);
// anula o layout padrao
getContentPane().setLayout(null);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String [] args){
TesteJFrame janela = new TesteJFrame();
janela.setVisible(true);
1
2
3
4
5
6
7
}
}
A classe TesteJFrame é filha de JFrame, logo herda os
atributos e métodos da super classe.
Na linha 1 está sendo definido o título da janela.
Na linha 2 está sendo definido o tamanho da janela.
Na linha 3 está sendo anulado o layout padrão para que
seja possível definir manualmente o tamanho e a posição dos
componentes que ele abrigará.
Na linha 4 está sendo definida a cor de fundo da
janela. As cores seguem o padrão RGB (Red Green Blue) e
podem ser representadas por números inteiros de 0 a 255 ou
por números em ponto flutuante entre 0,0 e 1,0.
Na linha 5 estamos definindo o comportamento que será
executado quando clicarmos no botão "X" no canto superior
direito da janela, ou seja, encerrar a execução do
programa. Caso não seja definido este comportamento, a
janela irá assumir o comportamento default (HIDE_ON_CLOSE)
ou seja, a janela será "escondida", mas o processo
continuará executando.
Na linha 6 está sendo criado um objeto da classe. Veja
que todas as definições da janela estão sendo executadas
dentro do método construtor.
Na linha 7 a janela torna-se visível para o usuário.
3
Veja a janela gerada pela execução do programa anterior.
Esta janela não irá aparecer centralizada na tela e
caso este seja o objetivo, devemos alterar o código da
classe anterior.
Veja o exemplo abaixo:
import java.awt.*;
import javax.swing.*;
class TesteJFrame extends JFrame{
public TesteJFrame(){
//Titulo da janela
setTitle("Primeira Janela Swing");
//tamanho da janela
setSize(275,100);
// anula o layout padrao
getContentPane().setLayout(null);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteJFrame janela = new TesteJFrame();
janela.setVisible(true);
}
}
4
Inserindo Textos, Campos de Edição e Botões na
Tela
A Classe javax.swing.JLabel
Um rótulo (JLabel) é uma área para a exibição de um
texto, uma imagem ou ambos. Ele não reage a eventos de
entrada e, por isto, não pode receber o foco do teclado.
Entretanto, pode incluir teclas de atalho para passar o
foco para outro componente.
Veja o exemplo abaixo:
import java.awt.*;
import javax.swing.*;
class TesteJLabel extends JFrame{
public TesteJLabel(){
//Titulo da janela
setTitle("Primeira Janela Swing");
//tamanho da janela
setSize(275,100);
//anula o layout padrao
getContentPane().setLayout(null);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
//Cria um JLabel
JLabel jl= criarJLabel();
//insere o JLabel no ContentPane da Janela
getContentPane().add(jl);
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
}
public JLabel criarJLabel(){
JLabel jl = new JLabel();
jl.setText("JLabel inserido");
jl.setLocation(10, 10);
jl.setSize(370, 50);
//Torna opaco o fundo do rótulo
jl.setOpaque(true);
jl.setBackground(new Color(255,255,255));
jl.setForeground(new Color(0,0,0));
jl.setFont(new Font("Courier new", Font.BOLD, 12));
jl.setToolTipText("JLabel Exemplo");
jl.setHorizontalAlignment(SwingConstants.LEFT);
jl.setVerticalAlignment(SwingConstants.TOP);
return jl;
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
5
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteJLabel janela = new TesteJLabel();
janela.setVisible(true);
}
}
Veja a janela gerada pela execução do programa anterior
A Classe javax.swing.JButton
Um botão (button) é um componente que pode ser
pressionado pelo usuário, utilizando o mouse ou teclado,
para acionar uma ação específica.
Veja o exemplo abaixo:
import java.awt.*;
import javax.swing.*;
class TesteJButton extends JFrame{
public TesteJButton(){
//Titulo da janela
setTitle("Primeira Janela Swing");
//tamanho da janela
setSize(new Dimension(300,100));
//anula o layout padrao
getContentPane().setLayout(null);
//cor de fundo da janela no padrao RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
JButton b1, b2;
//Cria um JButton "gravar"
b1 = new JButton();
b1.setText("Gravar");
//50 posição x, 30 posição y, 100 largura, 30 altura
b1.setBounds(50, 30, 100, 30);
b1.setBackground(new Color(0,0,170));
b1.setForeground(Color.YELLOW);
b1.setFont(new Font("Helvetica", Font.BOLD, 12));
b1.setToolTipText("Botao b1");
b1.setHorizontalAlignment(SwingConstants.CENTER);
b1.setVerticalAlignment(SwingConstants.CENTER);
b1.setEnabled(false);
6
b1.setMnemonic('G');
b2 = new JButton();
b2.setText("Sair");
b2.setBounds(150, 30, 100, 30);
b2.setBackground(new Color(0,0,170));
b2.setForeground(Color.YELLOW);
b2.setFont(new Font("Helvetica", Font.BOLD, 12));
b2.setToolTipText("Botao b2");
b2.setHorizontalAlignment(SwingConstants.CENTER);
b2.setVerticalAlignment(SwingConstants.CENTER);
b2.setEnabled(true);
b2.setMnemonic('S');
//insere os botões no ContentPane da Janela
getContentPane().add(b1);
getContentPane().add(b2);
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtem a altura e largua da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteJButton janela = new TesteJButton();
janela.setVisible(true);
}
}
Veja abaixo a saída gerada pela execução do programa acima.
Vários métodos da classe JButton realizam as mesmas
tarefas realizadas por métodos com nomes idênticos da
classe JLabel e já foram analisados. Veja abaixo um resumo
desses métodos:
7
setText(): define o texto do botão
setBounds():
contêiner
define
o
tamanho
e
a
posição
em
seu
setBackground(): define a cor de fundo
setForeground(): define a cor do texto
setFont(): define o tipo, o estilo e o tamanho da
fonte
setToolTipText(): define uma dica
setHorizontalAlignment():
horizontal do conteúdo.
define
o
alinhamento
setVerticalAlignment(): define o alinhamento vertical
do conteúdo.
Apenas dois métodos utilizados nesse exemplo não
haviam sido introduzidos durante o estudo dos Labels
(JLabel). São eles: setEnabled() e setMnemonic().
setEnabled(): exige um argumento booleano e serve para
habilitar ou desabilitar o botão.
setMnemonic(): define um atalho de teclado para o
botão. Deve-se informar para esse método um caracter que
exista no seu texto. Posteriormente, o botão poderá ser
acessado,
a
partir
de
qualquer
ponto
da
janela,
pressionando-se a tecla ALT em conjunto com esse caracter.
A Classe javax.swing.JTextField
Esta classe representa um campo de texto para
digitação pelo usuário, usualmente empregado para campos de
cadastro de uma única linha.
Veja o exemplo abaixo:
import java.awt.*;
import javax.swing.*;
class TesteJTextField extends JFrame{
public TesteJTextField(){
//Titulo da janela
setTitle("Primeira Janela Swing");
//tamanho da janela
setSize(new Dimension(300,100));
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(200,230,200));
//Cria JTextField
JTextField jt = new JTextField();
jt.setText("Insira texto aqui");
jt.setHorizontalAlignment(JTextField.CENTER);
8
//insere o JTextField no ContentPane da Janela
getContentPane().add(jt);
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteJTextField janela = new TesteJTextField();
janela.setVisible(true);
}
}
Layouts de Tela
Gerenciamento de Layout
Nos exemplos anteriores, o tamanho e o posicionamento
dos componentes nas janelas foram definidos através dos
métodos setSize(), setBounds() e setLocation(). Utilizou-se
o sistema de coordenadas x e y para posicionar os
componentes e a definição de valores absolutos para sua
altura e largura. Entretanto, essa forma de organização
esbarra em vários inconvenientes.
Deve-se evitar o uso de valores absolutos para
definição do tamanho e posição de componentes porque eles
comprometem duas importantes características da qualidade
do
software:
sua
portabilidade
e
manutenção.
Eles
comprometem
a
portabilidade
porque
os
componentes
dimensionados e posicionados com valores absolutos se
apresentam de forma distinta em diferentes plataformas.
Eles também comprometem a manutenibilidade porque o
trabalho necessário para realizar ajustes em uma GUI se
torna mais complexo, gastando muito mais tempo.
9
Em função do exposto acima, é aconselhável evitar o
uso de valores absolutos para o dimensionamento e
posicionamento
de
componentes.
Para
isso,
deve-se
substituir esse procedimento pelo uso dos gerenciadores de
leiaute (layout) disponíveis na API Java.
Os gerenciadores de leiaute (layout) nada mais são que
classes que aplicam um conjunto de regras predefinidas para
determinar o tamanho e a posição de cada componente em um
contêiner. Para que os componentes de uma janela ou de um
painel sejam organizados, automaticamente, você precisará
vincular um gerenciador de leiaute (layout) a esse
contêiner e adicionar os componentes a ele.
O objetivo de um gerenciador de leiaute (layout) é
organizar os componentes em seu contêiner para uma
apresentação adequada. Além de serem mais eficientes, eles
fornecem capacidades que são muito mais fáceis de utilizar
do que a definição de tamanho e posição por valores
absolutos.
Além disso, utilizando-se gerenciadores de leiaute
(layout), os componentes são reorganizados automaticamente,
quando a janela em que estão dispostos é redimensionada e
se ajustam a mudanças feitas em seu conteúdo.
Layout de Fluxo (FlowLayout)
O leiaute (layout) de fluxo (flowLayout) alinha os
componentes em um fluxo, da esquerda para a direita e de
cima para baixo, muito parecido com o texto de um
parágrafo. Esse tipo de leiaute (layout) é representado
pela classe java.awt.FlowLayout.
Em um painel cujo gerenciamento de leiaute (layout) é
delegado a um objeto da classe FlowLayout, os componentes
são dispostos em colunas e linhas, da esquerda para a
direita e de cima para baixo, à medida que são adicionados.
Quando um componente é adicionado, ele é disposto do lado
direito do último componente presente no painel e, se ele
não é comportado na mesma linha, ele é posicionado na linha
seguinte.
10
Veja o exemplo abaixo.
import java.awt.*;
import javax.swing.*;
class TesteFlowLayout extends JFrame{
public TesteFlowLayout(){
//Titulo da janela
setTitle("Teste FlowLayout");
//Define um tamanho inicial para a janela
setSize(300,120);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
//Cria um flowlayout alinhando seus componentes ah esquerda
//e definindo o espaçamento horizontal e vertical entre eles
FlowLayout fl = new FlowLayout(FlowLayout.LEFT, 10, 10);
getContentPane().setLayout(fl);
JButton
JButton
JButton
JButton
JButton
b1
b2
b3
b4
b5
=
=
=
=
=
new
new
new
new
new
JButton("Botao
JButton("Botao
JButton("Botao
JButton("Botao
JButton("Botao
1");
2");
3");
4");
5");
getContentPane().add(b1);
getContentPane().add(b2);
getContentPane().add(b3);
getContentPane().add(b4);
getContentPane().add(b5);
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteFlowLayout janela = new TesteFlowLayout();
janela.setVisible(true);
}
}
11
Neste exemplo foi criado um objeto da classe
FlowLayout com um de seus construtores que modifica o
alinhamento padrão dos componentes (centralizado) para que
sejam
alinhados
à
esquerda
e
definiu-se
também
o
espaçamento horizontal e vertical entre estes componentes.
Para definir esse objeto como gerenciador de leiaute
(layout) do painel de conteúdo da janela, invocou-se o
método setLayout() desse painel e utilizou-se o objeto "fl"
como argumento.
Neste
exemplo,
à
medida
que
a
janela
for
redimensionada, os botões serão reorganizados como se
fossem palavras em um parágrafo alinhado à esquerda. Se a
largura da janela for incrementada, alguns botões podem
passar para as linhas precedentes àquelas em que se
encontram.
Veja abaixo a tela gerada pela execução deste programa.
Layout de Bordas (BorderLayout)
O leiaute (layout) de bordas é representado pela
classe java.awt.BorderLayout. Ela posiciona e redimensiona
os componentes para ajustarem-se a cinco regiões de seu
contêiner: norte, sul, leste, oeste e centro. Cada uma
dessas regiões pode conter somente um componente e sua
localização é definida por uma constante, como segue:
BorderLayout.NORTH: representa a região norte (superior)
BorderLayout.SOUTH: representa a região sul (inferior)
BorderLayout.EAST: representa a região leste (direita)
BorderLayout.WEST: representa a região oeste (esquerda)
BorderLayout.CENTER: representa a região central.
12
Veja abaixo um exemplo.
import java.awt.*;
import javax.swing.*;
class TesteBorderLayout extends JFrame{
public TesteBorderLayout(){
//Titulo da janela
setTitle("Teste BorderLayout");
//Define um tamanho inicial para a janela
setSize(350,150);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
//Cria um borderlayout definindo o espaçamento horizontal e
//vertical entre cada uma das regiões
BorderLayout bl = new BorderLayout(5,5);
getContentPane().setLayout(bl);
JButton
JButton
JButton
JButton
JButton
b1
b2
b3
b4
b5
=
=
=
=
=
new
new
new
new
new
JButton("Botao
JButton("Botao
JButton("Botao
JButton("Botao
JButton("Botao
Norte");
Sul");
Leste");
Oeste");
Centro");
getContentPane().add(b1,BorderLayout.NORTH);
getContentPane().add(b2,BorderLayout.SOUTH);
getContentPane().add(b3,BorderLayout.EAST);
getContentPane().add(b4,BorderLayout.WEST);
getContentPane().add(b5,BorderLayout.CENTER);
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteBorderLayout janela = new TesteBorderLayout();
janela.setVisible(true);
}
}
13
Um
objeto
da
classe
BorderLayout
foi
criado
utilizando-se uma versão alternativa do construtor, de modo
a ser possível definir um espaçamento horizontal e vertical
entre cada uma de suas regiões. Na linha seguinte esse
objeto é configurado como gerenciador de leiaute (layout)
do painel de conteúdo da janela.
Foi
utilizado
o
método
add()
para
adicionar
componentes ao contêiner. Como o gerenciador de leiaute
(layout) é o borderLayout, foi preciso informar, além do
nome do componente, uma das constantes que representa a
região onde o botão será inserido.
Ao redimensionar a janela, aumentando ou diminuindo
tanto a largura quando a altura, os botões adicionados ao
seu painel de conteúdo têm largura e/ou altura modificadas,
mas matem sempre as mesmas posições.
Veja abaixo a tela gerada pela execução deste programa.
Layout de Grade (GridLayout)
Um gerenciador de leiaute (layout) de grade é aquele
que dispõe os componentes em um contêiner em forma de uma
grade retangular. O contêiner é dividido em células
retangulares de tamanhos iguais e cada componente é
disposto em uma célula diferente.
O
leiaute
(layout)
de
grade
(GridLayout)
é
representado pela classe java.awt.GridLayout e, do mesmo
modo que no leiaute (layout) de fluxo, os componentes são
dispostos da esquerda para a direita, mas ocupam uma célula
da grade e ajustam seu tamanho a ela.
14
Veja abaixo um exemplo.
import java.awt.*;
import javax.swing.*;
class TesteGridLayout extends JFrame{
public TesteGridLayout(){
//Titulo da janela
setTitle("Teste GridLayout");
//Define um tamanho inicial para a janela
setSize(300,150);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
/* Número de linhas(3), o número de colunas(2), o
espaçamento horizontal(0) e o espaçamento vertical(0)
entre os componentes (em pixels) */
GridLayout gl = new GridLayout(3,2,0,0);
getContentPane().setLayout(gl);
JButton
JButton
JButton
JButton
JButton
JButton
b1
b2
b3
b4
b5
b6
=
=
=
=
=
=
new
new
new
new
new
new
JButton("Linha
JButton("Linha
JButton("Linha
JButton("Linha
JButton("Linha
JButton("Linha
1
1
2
2
3
3
-
Coluna
Coluna
Coluna
Coluna
Coluna
Coluna
1");
2");
1");
2");
1");
2");
getContentPane().add(b1);
getContentPane().add(b2);
getContentPane().add(b3);
getContentPane().add(b4);
getContentPane().add(b5);
getContentPane().add(b6);
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteGridLayout janela = new TesteGridLayout();
janela.setVisible(true);
}
}
15
No exemplo acima foi instanciado um novo objeto da
classe GridLayout, chamado "gl", utilizando-se uma versão
do construtor que exige quatro números inteiros como
argumentos. Eles representam, respectivamente: o número de
linhas, o número de colunas, o espaçamento horizontal e o
espaçamento vertical entre os componentes (em pixels).
Na instrução seguinte o objeto "gl" é definido como o
gerenciador de leiaute (layout) do painel de conteúdo da
janela. A partir deste momento, todos os componentes
adicionados a esse painel serão posicionados na grade de
três linhas e duas colunas que ele representa.
Se a janela for redimensionada, todos os componentes
também serão redimensionados na mesma proporção para
ocuparem todo o seu espaço.
Veja abaixo a tela gerada pela execução deste programa.
Painéis - Inserindo novos containeres a tela a
partir do JPanel
Os painéis agem como contêineres que servem para
dividir a janela. Eles são utilizados para possibilitar
maior controle da organização de interfaces gráficas mais
complexas e, em conjunto com os gerenciadores de leiaute
(layout), permitem mais exatidão no posicionamento dos
componentes.
A classe javax.swing.Jpanel representa um contêiner
genérico. Ela deriva da classe Jcomponent, que é uma classe
derivada de Java.awt.Container. Pode-se dizer que todo
painel, representado como um objeto da classe Jpanel, é um
contêiner e pode abrigar componentes, inclusive outros
painéis.
16
Veja o exemplo abaixo.
import java.awt.*;
import javax.swing.*;
class TesteJPanel extends JFrame{
JButton b1, b2;
JPanel p1, p2;
public TesteJPanel(){
//Titulo da janela
setTitle("Teste JPanel");
//tamanho da janela
setSize(200,200);
// anula o layout padrao
getContentPane().setLayout(null);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
p1 = new JPanel();
p1.setLayout(null);
p1.setBounds(10, 10, 170, 70);
p1.setBackground(Color.BLUE);
p2 = new JPanel();
p2.setLayout(null);
p2.setBounds(10,90,170,70);
p2.setBackground(Color.YELLOW);
b1 = new JButton("Gravar");
b1.setBounds(35, 30, 100, 30);
b2 = new JButton("Sair");
b2.setBounds(35, 30, 100, 30);
p1.add(b1);
p2.add(b2);
getContentPane().add(p1);
getContentPane().add(p2);
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public static void main(String [] args){
TesteJPanel janela = new TesteJPanel();
janela.setVisible(true);
}
}
17
O objetivo deste exemplo é criar dois painéis e
adiciona-los ao painel de conteúdo da janela e, em seguida,
adicionar um botão em cada um dos painéis criados.
Para facilitar o exemplo, os gerenciadores de leiaute
(layout) não foram utilizados, logo o leiaute (layout)
padrão desses painéis foi anulado pela chamada as
instruções setLayout(null). Com isto foi possível adicionar
componentes e posicioná-los utilizando posições absolutas
(coordenadas x e y).
Veja abaixo
anterior.
a
saída
gerada
pela
execução
do
programa
Interface
Interface é um recurso da programação orientada a
objetos que define ações (comportamentos) que devem ser
obrigatoriamente
executadas,
porém
cada
classe
que
implementa esta interface pode executar de forma diferente.
Interfaces possuem
de métodos que devem
classe. Uma interface é
é a implementação de um
um tipo.
valores constantes ou assinaturas
ser implementados dentro de uma
a definição de um tipo, uma classe
tipo e um objeto é uma instância de
A interface define um tipo porque muitos objetos
(instâncias de classes) podem possuir a mesma ação (método
ou comportamento), porém podem executar esta ação de forma
diferente.
Para exemplificar o conceito de interface, vamos
definir uma interface chamada País que possui a assinatura
do método criarConstituicao(). Ou seja, toda classe que
implementar País deve definir como criar uma constituição
por meio do método criarConstituicao(). Devido a isto, se
eu tenho uma classe chamada Brasil e outra chamada México,
18
ambas implementando a interface País, cada uma deverá
obrigatoriamente codificar a forma como a constituição será
criada. (Existe uma opção para não codificar utilizando a
palavra abstract que não será abordada no curso).
Uma interface pode ser criada da mesma forma que uma
classe, basta utilizar a palavra chave "interface" no lugar
de class. Veja o exemplo abaixo:
interface InterfaceName
{
método(args);
}
Uma classe pode estender suas funcionalidades obtendo
as características de outra classe num processo chamado de
herança. Uma interface não é herdada, mas sim implementada.
Todo o código dos métodos da interface deve ser escrito
dentro da classe que implementa a interface. Com isto,
obtemos as assinaturas dos métodos da interface em uma
classe utilizando a palavra chave implements.
A vantagem das interfaces está no fato de que não há
limites para a quantidade de interfaces que uma classe pode
implementar. Isto ajuda no caso de herança múltipla que não
é suportada pela linguagem Java, pois uma classe apenas
pode herdar as características e comportamentos de uma
única classe.
Vamos analisar o exemplo abaixo:
public interface Temperatura {
void converterTemperatura(double temperatura, String origem);
}
import javax.swing.JOptionPane;
public class Celsius implements Temperatura {
public void converterTemperatura(double temperatura, String origem)
{
double tempCelsius=0;
if( origem.equals("Fahrenheit")){
tempCelsius = (temperatura - 32) / 1.8;
}
else if (origem.equals("Kelvin")){
tempCelsius = temperatura - 273.15;
}
JOptionPane.showMessageDialog(null,"Temperatura em Celsius:
" + tempCelsius);
}
}
19
import javax.swing.JOptionPane;
public class Fahrenheit implements Temperatura {
public void converterTemperatura(double temperatura, String origem){
double tempFahrenheit =0;
if( origem.equals("Celsius")){
tempFahrenheit = temperatura * 1.8 + 32;
}
else if (origem.equals("Kelvin")){
tempFahrenheit = temperatura * 1.8 - 459.67;
}
JOptionPane.showMessageDialog(null, "Temperatura em
Fahrenheit: " + tempFahrenheit);
}
}
A
interface
Temperatura
define
o
método
converterTemperatura(), já as classes Celsius e Fahrenheit
implementam o método converterTemperatura() de formas
diferentes, ou seja, cada implementação do método utiliza
fórmulas diferentes para converter a temperatura, pois o
objetivo do método converterTemperatura() da classe Celsius
é converter a temperatura para Celsius, já na classe
Fahrenheit o objetivo é converter a temperatura para
Fahrenheit.
Curiosidade: Em interfaces, os métodos são públicos
abstratos(public abstract) e os atributos são constantes
estáticas (final static), mesmo que o desenvolvedor não
defina essas palavras na assinatura do método.
A classe Java abaixo foi criada apenas para testar o
exemplo acima descrito. Veja que são solicitadas ao usuário
três informações:
1) Um valor de temperatura (origem);
2) Qual unidade está a temperatura (origem) informada;
3) Para qual temperatura deve-se converter a temperatura;
Em seguida é criado o
temperatura será convertida.
objeto
correspondente
e
a
import javax.swing.JOptionPane;
public class TestaConversao {
public static void main(String[] args) {
String temperatura = JOptionPane.showInputDialog("Digite o
valor da temperatura (origem)");
String origem = JOptionPane.showInputDialog("Digite a
unidade da temperatura");
String destino = JOptionPane.showInputDialog("Informe a
unidade da temperatura destino");
if(destino.equals("Celsius")){
Celsius c = new Celsius();
double temp = Double.parseDouble(temperatura);
c.converterTemperatura(temp, origem);
}
else if(destino.equals("Fahrenheit")){
20
Fahrenheit f = new Fahrenheit();
double temp = Double.parseDouble(temperatura);
f.converterTemperatura(temp, origem);
}
}
}
Como exercício, crie a classe Kelvin, implemente o
método converterTemperatura() e faça as modificações
necessárias na classe TestaConversao.java para a mesma
também calcular a temperatura em graus Kelvin.
Fórmulas para conversão:
De
Celsius
Fahrenheit
Para
Kelvin
Kelvin
Fórmula
K = °C + 273.15
K = (°F + 459.67) / 1.8
Eventos de Clique (Ação)
Eventos de clique (ação) são eventos de alto nível
gerados por um componente (como um botão) quando a ação
especificada por ele ocorrer (como ser pressionado). Quando
um evento desse tipo ocorre, o componente gerador envia um
objeto da classe ActionEvent para cada ouvinte, registrado
através do método addActionListener().
Cada vez que um botão é pressionado, o ouvinte será
notificado através de um objeto do tipo ActionEvent, que
contém informações acerca do evento ocorrido. Se ele é
ouvinte de dois ou mais botões, é preciso determinar qual
deles foi pressionado para tomar a decisão correta. Isso
pode ser feito invocando-se o método getSource(), que
retornará uma referência ao objeto que gerou o evento.
Veja o exemplo abaixo
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
class TesteEventoAcao extends JFrame implements ActionListener{
JLabel l1;
JButton b1, b2;
int i1, i2;
public TesteEventoAcao(){
setTitle("Teste Evento Acao");
//tamanho da janela
setSize(240,100);
// anula o layout padrao
getContentPane().setLayout(null);
//cor de fundo da janela no padrão RGB (Red Green Blue)
getContentPane().setBackground(new Color(255,255,255));
21
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
centralizar();
i1 = i2 = 0;
b1 = new JButton("Gravar");
b1.setBounds(10, 10, 100, 30);
b1.addActionListener(this);
b2 = new JButton("Sair");
b2.setBounds(120, 10, 100, 30);
b2.addActionListener(this);
l1 = new JLabel("Pressione os botões");
l1.setBounds(5, 50, 220, 20);
getContentPane().add(b1);
getContentPane().add(b2);
getContentPane().add(l1);
}
public void centralizar(){
//obtém a altura e largura da resolução vídeo
Dimension screen =
Toolkit.getDefaultToolkit().getScreenSize();
//obtém a altura e largura da minha janela
Dimension janela = getSize();
if (janela.height > screen.height)
setSize(janela.width, screen.height);
if (janela.width > screen.width)
setSize(screen.width, janela.height);
setLocation((screen.width - janela.width)/2,
(screen.height - janela.height)/2);
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == b1)
l1.setText("Botão gravar pressionado " + ++i1 + " vez(es)");
if (e.getSource() == b2)
l1.setText("Botão sair pressionado " + ++i2 + " vez(es)");
}
public static void main(String [] args){
TesteEventoAcao janela = new TesteEventoAcao();
janela.setVisible(true);
}
}
Exercícios Sobre Interface Gráfica
1)
Implemente uma classe Java que faça uso de
interface gráfica. Faça uma tela de login de
usuário com os seguintes componentes:
• Um
rótulo
(label)
com
a
descrição
"Usuário"
• Um rótulo (label) com a descrição "Senha"
• Uma caixa de texto (TextField) para o
usuário digitar o seu nome
• Uma caixa de senha (PasswordField) para o
usuário digitar a sua senha
• Dois botões: Um "Ok" e outro "Cancelar"
22
Quando o usuário clicar no botão "Cancelar" o
programa deve ser encerrado (Utilize o comando
System.exit(0) para isto).
Quando o usuário clicar no botão "Ok" valide o
usuário e senha e caso sejam informações corretas,
utilize um JOptionPane para informar ao usuário que
ele foi logado ao sistema e em seguida encerre o
programa (Utilize o comando System.exit(0) para
isto).
Caso as informações não estejam corretas, utilize
um JoptionPane para informar ao usuário que as
informações de login não estão corretas, e diga
para o usuário digitar as informações novamente.
Resposta
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class TesteLogonUsuario extends JFrame implements
ActionListener{
JButton btnOk, btnCancelar;
JTextField campoUsuario;
JPasswordField campoSenha;
public TesteLogonUsuario(){
setTitle("Login Usuario");
setSize(300,110);
GridLayout gl = new GridLayout(3,2,1,1);
getContentPane().setLayout(gl);
//provoca o termino da execução (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel labelUsuario = new JLabel();
labelUsuario.setText("Usuario: ");
getContentPane().add(labelUsuario);
campoUsuario = new JTextField();
getContentPane().add(campoUsuario);
JLabel labelSenha = new JLabel();
labelSenha.setText("Senha: ");
getContentPane().add(labelSenha);
campoSenha = new JPasswordField();
getContentPane().add(campoSenha);
btnOk = new JButton("Ok");
getContentPane().add(btnOk);
btnOk.addActionListener(this);
btnCancelar = new JButton("Cancelar");
getContentPane().add(btnCancelar);
btnCancelar.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == btnOk){
23
String usu = campoUsuario.getText();
String senha = String.valueOf(campoSenha.getPassword());
if (usu.equals("Glauco") && senha.equals("752")){
JOptionPane.showMessageDialog(null, usu + ",
você foi logado ao sismtema.");
System.exit(0);
}
else{
JOptionPane.showMessageDialog(null, "Usuario ou
senha invalidos. Tente novamente");
}
}
if (e.getSource() == btnCancelar){
System.exit(0);
}
}
public static void main(String[] args) {
TesteLogonUsuario tlu = new TesteLogonUsuario();
tlu.setVisible(true);
}
}
2)
Implemente uma classe Java com a seguinte GUI:
Resposta
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Formulario extends JFrame {
JButton btnOk, btnCancelar;
public Formulario(){
setTitle("Formulario");
setSize(300,160);
GridLayout gl = new GridLayout(6,2,1,1);
getContentPane().setLayout(gl);
//provoca o termino da execucao (encerra o programa)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel labelNome = new JLabel();
labelNome.setText("Nome: ");
getContentPane().add(labelNome);
JTextField campoNome = new JTextField();
getContentPane().add(campoNome);
24
JLabel labelEndereco = new JLabel();
labelEndereco.setText("Endereco: ");
getContentPane().add(labelEndereco);
JTextField campoEndereco = new JTextField();
getContentPane().add(campoEndereco);
JLabel labelTelefone = new JLabel();
labelTelefone.setText("Telefone: ");
getContentPane().add(labelTelefone);
JTextField campoTelefone = new JTextField();
getContentPane().add(campoTelefone);
JLabel labelCPF = new JLabel();
labelCPF.setText("CPF: ");
getContentPane().add(labelCPF);
JTextField campoCPF = new JTextField();
getContentPane().add(campoCPF);
JLabel labelRG = new JLabel();
labelRG.setText("RG: ");
getContentPane().add(labelRG);
JTextField campoRG = new JTextField();
getContentPane().add(campoRG);
btnOk = new JButton("Ok");
getContentPane().add(btnOk);
btnCancelar = new JButton("Cancelar");
getContentPane().add(btnCancelar);
}
public static void main(String[] args) {
Formulario form = new Formulario();
form.setVisible(true);
}
}
3)
Fdfdf
25

Documentos relacionados