JComboBox e Cardlayout

Bom dia pessoal, uma dúvida de iniciante, mas não consegui resolver.

Estou criando uma pequena janela em java pelo netbeans, que contém um JComboBox e um JPanel usando Cardlayout.

O que preciso fazer é simples: selecionar o item no combobox e aparecer o painel respectivo.
Cheguei a encontrar um exemplo na net, mas não consegui entender direito e adaptar a minha necessidade.

Vamos ao código:

package relatorios;

import java.awt.CardLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class Cardlayout extends javax.swing.JFrame implements ItemListener {
    CardLayout card;

    public Cardlayout() {
        initComponents();
        
        cbOpcoes.setEditable(false);
        cbOpcoes.addItemListener(this);
        
        
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        cbOpcoes = new javax.swing.JComboBox();
        pMain = new javax.swing.JPanel();
        p1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        p2 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        p3 = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        p4 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("CARDLAYOUT");

        cbOpcoes.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Painel 1", "Painel 2", "Painel 3", "Painel 4" }));

        pMain.setLayout(new java.awt.CardLayout());

        jLabel1.setText("PAINEL 1");

        javax.swing.GroupLayout p1Layout = new javax.swing.GroupLayout(p1);
        p1.setLayout(p1Layout);
        p1Layout.setHorizontalGroup(
            p1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addContainerGap(326, Short.MAX_VALUE))
        );
        p1Layout.setVerticalGroup(
            p1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addContainerGap(227, Short.MAX_VALUE))
        );

        pMain.add(p1, "card2");

        jLabel2.setText("PAINEL 2");

        javax.swing.GroupLayout p2Layout = new javax.swing.GroupLayout(p2);
        p2.setLayout(p2Layout);
        p2Layout.setHorizontalGroup(
            p2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel2)
                .addContainerGap(326, Short.MAX_VALUE))
        );
        p2Layout.setVerticalGroup(
            p2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel2)
                .addContainerGap(227, Short.MAX_VALUE))
        );

        pMain.add(p2, "card3");

        jLabel3.setText("PAINEL 3");

        javax.swing.GroupLayout p3Layout = new javax.swing.GroupLayout(p3);
        p3.setLayout(p3Layout);
        p3Layout.setHorizontalGroup(
            p3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel3)
                .addContainerGap(326, Short.MAX_VALUE))
        );
        p3Layout.setVerticalGroup(
            p3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel3)
                .addContainerGap(227, Short.MAX_VALUE))
        );

        pMain.add(p3, "card4");

        jLabel4.setText("PAINEL 4");

        javax.swing.GroupLayout p4Layout = new javax.swing.GroupLayout(p4);
        p4.setLayout(p4Layout);
        p4Layout.setHorizontalGroup(
            p4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p4Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel4)
                .addContainerGap(326, Short.MAX_VALUE))
        );
        p4Layout.setVerticalGroup(
            p4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(p4Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel4)
                .addContainerGap(227, Short.MAX_VALUE))
        );

        pMain.add(p4, "card5");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(pMain, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addComponent(cbOpcoes, javax.swing.GroupLayout.Alignment.LEADING, 0, 380, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(cbOpcoes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(pMain, javax.swing.GroupLayout.DEFAULT_SIZE, 252, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>
    

    public static void main(String args[]) {
         new Cardlayout().setVisible(true);
    }
    
    // Variables declaration - do not modify
    private javax.swing.JComboBox cbOpcoes;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel p1;
    private javax.swing.JPanel p2;
    private javax.swing.JPanel p3;
    private javax.swing.JPanel p4;
    private javax.swing.JPanel pMain;
    // End of variables declaration

    public void itemStateChanged(ItemEvent evt) {
        CardLayout cl = (CardLayout)(pMain.getLayout());
        cl.show(pMain, (String)evt.getItem());
        System.out.println("Selecionou o item "+evt.getItem());
    }
    
}

Tentei modificar esse código, principalmente o método itemStateChanged, coloquei um System.out.println(""); para ver a saída, está com dois problemas:

  • O System.out.println sempre mostra dois itens, ex: se eu clico na opção nº 2 ele mostra “Selecionou o 2 e o anterior”, se eu clico na opção nº 3 ele mostra “Selecionou o 3, Selecionou o 2”;
  • O segundo problema é que não mostra os painéis.

Pensei em encher de ifs ai, mas ficaria mais vergonhoso do que já está.
Se alguém puder ajudar a entender o que está acontecendo - agradeço!

O itemEvent lança mais de um evento ao trocar de seleção (Não tenho certeza: DESELECTED e ITEM_STATE_CHANGED).
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/ItemEvent.html

Você terá que fazer um if para pegar o evento de item selecionado.