Neste módulo veremos:
JCheckBox
e JList
; além de Enre os botões com alteração de estado, como o JCehckBox
, o
JToggleButton
e o JRadioBox
,
que têm seus valores de estado desativados ou não, escolhemos
o primeiro como demosntração de funcionamento deste tipo de
componente gráfico do Swing.
Estudem e implementem o código a seguir para compreender o funcinamento deste recurso gráfico.
/** CheckBox1.java * @author EESR based on Deitel e Deitel */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CheckBox1 extends JFrame { private JTextField texto; private JCheckBox negrito, italico; // configura a GUI public CheckBox1() { super("Teste de CheckBox"); //obtem painel de conteudo Container cont = getContentPane(); cont.setLayout( new FlowLayout()); texto = new JTextField("Alterem o estilo desta fonte", 40); texto.setFont( new Font("Serif", Font.PLAIN, 14)); //cria os checkboxes negrito = new JCheckBox("Negrito"); italico = new JCheckBox("Itálico"); cont.add(texto); cont.add(negrito); cont.add(italico); TrataEvento tratador = new TrataEvento(); negrito.addItemListener(tratador); italico.addItemListener(tratador); setSize(500,100); setVisible(true); }//construtor //classe interna private class TrataEvento implements ItemListener { private int cNegrito = Font.PLAIN; private int cItalico = Font.PLAIN; public void itemStateChanged (ItemEvent evento) { if (evento.getSource() == negrito) if (evento.getStateChange() == ItemEvent.SELECTED) cNegrito = Font.BOLD; else cNegrito = Font.PLAIN; if (evento.getSource() == italico) if (evento.getStateChange() == ItemEvent.SELECTED) cItalico = Font.ITALIC; else cItalico = Font.PLAIN; texto.setFont( new Font("Serif", cNegrito+cItalico, 14)); } } //TrataEvento }
Primeiramente, procurem analisar do ponto de vista de POO o
significado e a funcionalidade de uma classe interna.
Notem no resultado da compilação destas classes de um mesmo arquivo.
Procurem destacar também os seguintes elementos: os componentes
gráficos, o futuro objeto evento e os listeners
para
estes eventos. Como eles estão representados no código acima.
Outro ponto importante é destacar o evento em sí. Procurem acompanhar na API as classes envolvidas.
Veja agora uma classe que executa a classe acima.
/** * TCheckBox1 */ import javax.swing.JFrame; public class TCheckBox1 { public static void main (String[] entrada) { CheckBox1 aplicacao; aplicacao = new CheckBox1(); aplicacao.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
Vejamos agora como processar elementos de uma lista. Implementem e estudem o código abaixo.
/** GLista.java * @author EESR based on Deitel e Deitel */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class GLista extends JFrame{ private JList listaCor; public Container cont; private String nomes[]={"Preto", "Azul", "Laranja", "Magenta", "Branco", "Vermelho", "Amareloooo"}; private Color cores[]={Color.black, Color.blue, Color.orange, Color.magenta, Color.white, Color.red, Color.yellow}; // configura a GUI public GLista() { super("Teste de JList"); //obtem painel de conteudo cont = getContentPane(); cont.setLayout( new FlowLayout()); listaCor = new JList(nomes); listaCor.setVisibleRowCount(3); //nao permite selecao multipla listaCor.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); TrataLista tratador = new TrataLista(); listaCor.addListSelectionListener(tratador); cont.add( new JScrollPane(listaCor)); setSize(400,150); setVisible(true); }//construtor //classe interna private class TrataLista implements ListSelectionListener{ public void valueChanged(ListSelectionEvent evento) { Container cont2; cont2 = getContentPane(); int qual = listaCor.getSelectedIndex(); cont2.setBackground(cores[qual]); } }//interna }//Glista
Notem que adicionamos agora as classes de evento do pacote Swing e não somente do pacote AWT. otem também que para cada evento existem os métodos específicos para tratamento destes eventos e, como são interfaces, devem ser implementados.
Testem o código acima com o seguinte código fonte:
/** * TGlista */ import javax.swing.JFrame; public class TGLista { public static void main (String[] entrada) { GLista aplicacao; aplicacao = new GLista(); aplicacao.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
Os eventos de mouse são tantos que são divididos em três classes distintas, que são:
Vamos implementar e analisar o código abaixo que implementa a primeira interface.
/** MouseLeitor */ import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; public class MouseLeitor extends JFrame { private JLabel status; public MouseLeitor() { super("Mouse Demo"); status = new JLabel(); getContentPane().add(status, BorderLayout.SOUTH); Posicao ml = new Posicao(); this.addMouseListener(ml); setSize(300,100); setVisible(true); }//construtor //classe interna private class Posicao implements MouseListener { public void mouseClicked(MouseEvent e) { status.setText("clicou em "+ e.getX()+ "; "+// e.getY()); } public void mousePressed(MouseEvent e) { status.setText("pressionou em "+ e.getX()+ "; "+// e.getY()); } public void mouseReleased(MouseEvent e) { status.setText("soltou em "+ e.getX()+ "; "+// e.getY()); } public void mouseEntered(MouseEvent e) { JOptionPane.showMessageDialog(null,"Mouse na janela"); } public void mouseExited(MouseEvent e) { status.setText("Mouse fora da janela"); } }//interna }
Veja a API e note que, como é uma interface, tivemos que implementar todos os seus métodos.
Escreva uma classe para testar a classe acima.
Se o seu programa precisar apenas de um um método
de uma interface como fazer para não ter que implementar a interface toda?
Resposta: Usar as classes adaptadoras.
Estas classes adaptadoras fornecem uma implementação default
de cada método da interface. Esta implementação são os métodos
com seu corpo vazio.
O programador pode herdar a classe adaptadora e sobrescrever apenas os métodos que interessam para seus eventos. Veja o exemplo abaixo:
/** MouseLeitor2 */ import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; public class MouseLeitor2 extends JFrame { private JLabel status; public MouseLeitor2() { super("Mouse Demo"); status = new JLabel(); getContentPane().add(status, BorderLayout.SOUTH); Posicao ml = new Posicao(); this.addMouseListener(ml); setSize(300,100); setVisible(true); }//construtor //classe interna private class Posicao extends MouseAdapter { public void mouseClicked(MouseEvent e) { status.setText("clicou em "+ e.getX()+ "; "+// e.getY()); } }//interna }
Veja como foram suprimidos os métodos da classe MouseListener
agora que herdamos uma classe adaptadora.
Os gerenciadores de leiaute existem para organizar os componentes gráficos sobre um container, ou seja, especificam como dispor os vários componentes gráficos para obedecer uma programação visual destas entidades.
Existem três gerenciadores de leiaute a saber:
FlowLayout
,
é o gerenciador padrão para applet, Panel e JPanel.
Ele coloca os componentes gráficos seqüencialmente da esquerda para
a direita, na ordem em que foram adicionados, respeitando os limites
de tamanho do container; BorderLayout
, padrão para JFrame e JApplet. Organiza os
componetes em cinco áreas: norte, sul, leste, oeste e centro; GridLayout
, organiza os componenets em linha e colunas.
Implemente o código abaixo que trata do FlowLayout
para analisar como este gerenciador funciona.
/**Leiaute */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Leiaute extends JFrame { private JButton botaoEsq, botaoDir, botaoCen; private FlowLayout modo; private Container cont; public Leiaute () { super("Demo leiaute"); modo = new FlowLayout(); cont = getContentPane(); cont.setLayout(modo); TrataBotao trata = new TrataBotao(); botaoEsq = new JButton("Esquerdo"); botaoEsq.addActionListener(trata); cont.add(botaoEsq); botaoDir = new JButton("Direito"); botaoDir.addActionListener(trata); cont.add(botaoDir); botaoCen = new JButton("Central"); botaoCen.addActionListener(trata); cont.add(botaoCen); setSize(300,60); setVisible(true); } //classe interna public class TrataBotao implements ActionListener { public void actionPerformed (ActionEvent e) { Container cont2; FlowLayout modo2; cont2 = getContentPane(); modo2 = new FlowLayout(); if(e.getSource() == botaoEsq) { modo2.setAlignment(FlowLayout.LEFT); } else if(e.getSource() == botaoDir) { modo2.setAlignment(FlowLayout.RIGHT); } else modo2.setAlignment(FlowLayout.CENTER); //realinha componentes modo2.layoutContainer(cont2); } } }//Leiaute
Elabore um código Java para testar o código acima.
(evandro at usp ponto br)