Prévia da Interface Gráfica: Stringless Guitar - Parte 3
Autor: Thiago Vidal | Publicado: 2013-01-02T20:31:00-02:00



Nessa parte iremos abordar sobre os tratadores de evento de selecionar um item do JComboBox. Ao consultar a documentação (API), descobrimos como prosseguir diante desta situação. Há dois métodos de duas interfaces distintas, respectivamente, ActionListener e ItemListener, que podem ser associados a um JComboBox. Devemos, portanto, criar uma classe que implemente uma dessas interfaces, e instanciar um objeto que será registrado como o handler de evento.



Ambos funcionam, mas é preciso ressaltar a diferença de comportamento entre ambos. Para cada item selecionado, a seleção de outro item é primeiro removida - então ocorrem dois ItemEvents quando um item é selecionado. Ou seja, quando você selecionar um item, este método (itemStateChanged) será disparado duas vezes, ficando propensa a ocorrência de futuros bugs.



Então, optamos por utilizar um action listener. As duas condições dentro do método actionPerformed determinam a origem do evento (se ele é oriundo da primeira ou segunda combo box).&nbsp;





void addActionListener(ActionListener)&nbsp;: Adiciona um action listener ao combo box. O método actionPerformed do listener é chamado quando o usuário seleciona um item do combo box ou, quando num combo box editável, quando o usuário pressiona Enter.



void addItemListener(ItemListener) : Adiciona um item listener ao combo box. O método itemStateChanged do listener é chamado quando o estado de seleção de qualquer um dos combo box's muda.




import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class TesteEventoJComboBox extends JFrame implements ActionListener {

 JComboBox comboBoxTomMenor;
 JComboBox comboBoxTomMaior;
 
 public TesteEventoJComboBox(){
  super("Teste Evento JComboBox");
  Container container = this.getContentPane();
  container.setLayout(new FlowLayout());
  
  String[] listaAfinacaoMaior = {"Selecione um tom maior","C", "Db", "D", "Eb", "E", "F", "F#", "G", "Ab", "A", "Bb", "B"};
  String[] listaAfinacaoMenor = {"Selecione um tom menor","C", "C#", "D", "Eb", "E", "F", "F#", "G", "G#", "A", "Bb", "B"};
  
  comboBoxTomMaior = new JComboBox(listaAfinacaoMaior);
  container.add(comboBoxTomMaior);
  
  comboBoxTomMenor = new JComboBox(listaAfinacaoMenor);
  container.add(comboBoxTomMenor);
  
  comboBoxTomMaior.setEditable(false);
  comboBoxTomMenor.setEditable(false);
  
  comboBoxTomMaior.addActionListener(this);
  comboBoxTomMenor.addActionListener(this);
 }
 
 
 public static void main(String[] args) {
  TesteEventoJComboBox t = new TesteEventoJComboBox();
  t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  t.setSize(250, 150);
  t.setVisible(true);
 }


 @Override
 public void actionPerformed(ActionEvent event) {
  if(event.getSource() == comboBoxTomMaior){
   JOptionPane.showMessageDialog(null, String.format("Você clicou %s", comboBoxTomMaior.getSelectedItem()));
  }
  
  if(event.getSource() == comboBoxTomMenor) {
   JOptionPane.showMessageDialog(null, String.format("Você clicou %s", comboBoxTomMenor.getSelectedItem()));
  }
 }

}





















Fontes de Referência


DEITEL, H.M; DEITEL, P.J,&nbsp;Java, Como Programar -8ªed. – São Paulo: Prentice Hall, 2010.

http://geekycoder.wordpress.com/2008/07/28/tipjava-difference-between-actionlistener-and-itemlistener/

http://javafree.uol.com.br/topic-864599-JComboBox-eventos-duplicados.html

http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#listeners