GUI e componentes

Neste módulo veremos:

JCheckBox

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

JList

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

Eventos de mouse

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.

Classes adaptadoras

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.

Gerenciadores de Leioute

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:

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.

Última modificação feita em: 27 de setembro de 2006
Evandro Eduardo Seron Ruiz, PhD (evandro at usp ponto br)
www.imagcom.org/evandro/ibm1030