Problema ao selecionar item dentro do JComboBox

8 respostas
G

Bom dia, pessoal

Criei um combobox e adicionei dados de uma tabela. O problema é que nao nao consigo selecionar um item dentro do combobox, é como se estivesse estatico, ou sem evento no teclado para manipular os itens dentro do combobox. Estou usando a IDE netbeans e criei um JFrame. está aqui o codigo Classe DAO
public List<Cadastro> getListaCombo() throws SQLException{   
  
        String sql = "select * from cadastro order by nome";   
        PreparedStatement stmt = this.conexao.prepareStatement(sql);   
        ResultSet rs = stmt.executeQuery();   
  
        List<Cadastro> minhalista = new ArrayList<Cadastro>();   
  
        while (rs.next()){   
  
            Cadastro cad = new Cadastro();   
            cad.setNome(rs.getString("nome"));   
            minhalista.add(cad);   
        }   
        rs.close();   
        stmt.close();   
        return minhalista;   
    }
classe JFrame
private void listaCombo() throws SQLException{   
        CadastroDao dao;   
        try {   
            dao = new CadastroDao();   
            List<Cadastro> minhalista = dao.getListaCombo();   
  
            CbxCadastro.removeAllItems();   
            CbxCadastro.setMaximumRowCount(5);   
            CbxCadastro.addItem("<Selecione>");   
            for (int i = 0; i < minhalista.size(); i++) {   
                CbxCadastro.addItem(minhalista.get(i).getNome());   
            }   
        } catch (SQLException ex) {   
            JOptionPane.showMessageDialog(null,"Erro no CbxCadastro ! " + ex);   
        }   
    }
private void CbxCadastroActionPerformed(java.awt.event.ActionEvent evt) {                                               
        try {   
            listaCombo();   
        } catch (SQLException ex) {   
            Logger.getLogger(JFCadastro.class.getName()).log(Level.SEVERE, null, ex);   
        }   
    }
Eu acho estranho é que se eu tirar o
CbxCadastro.removeAllItems();
eu consigo selecionar um item, mas fica duplicando os itens dentro do combobox. Se alguem puder mim ajudar, agradeço

8 Respostas

J

Você precisa usar um Modelo e usar o Objeto diretamente no modelo.

Segue exemplo:
JComboBox cb = new JComboBox();

//Pegar uma lista de objetos (aqui Cliente, esse objeto deve estar com o metodos: equals, compareTo e hashCode)
ArrayList<Cliente> lista = new ClienteDAO().lista();

// Criar o modelo que vai usar no componente
ArrayListComboBoxModel modeloLista = new ArrayListComboBoxModel(lista);

// Associar o modelo ao JComboBox
cb.setModel(modeloLista);

// Criar um item qualquer o qual queira selecionar no modelo (e JComboBox)
Cliente item = new Cliente();
item.setNome("Nome do cliente");
item.setCodigo(123);

// Selecionar diretametne no modelo
modeloLista.setSelectedItem(item);
Classe para criar o modelo:
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.MutableComboBoxModel;

public class ArrayListComboBoxModel extends AbstractListModel implements MutableComboBoxModel {

    private Object selectedItem;
    private List list;

    public ArrayListComboBoxModel() {
        this.list = new ArrayList();
    }

    public ArrayListComboBoxModel(List list) {
        this.list = new ArrayList(list);
    }

    public void setList(List list) {
        this.list = list;
        fireContentsChanged(this, 0, list.size());
    }

    @Override
    public int getSize() {
        return list.size();
    }

    @Override
    public Object getElementAt(int i) {
        try {
            return list.get(i);
        } catch (java.lang.IndexOutOfBoundsException ex) {
            return null;
        }
    }

    @Override
    public Object getSelectedItem() {
        return selectedItem;
    }

    public Integer getSelectedIndex() {
        int index = list.indexOf(this.getSelectedItem());
        return index;
    }

    @Override
    public void setSelectedItem(Object newValue) {
        selectedItem = newValue;
        fireContentsChanged(this, -1, list.size());
    }

    // MutableComboBoxModel
    public void setElementAt(Object element, int index) {
        list.set(index, element);
        // Added at end, notify ListDataListener objects
        int length = getSize();
        fireIntervalAdded(this, length - 1, length - 1);
    }

    // MutableComboBoxModel
    @Override
    public void addElement(Object element) {
        list.add(element);
        // Added at end, notify ListDataListener objects
        int length = getSize();
        fireIntervalAdded(this, length - 1, length - 1);
    }

    @Override
    public void insertElementAt(Object element, int index) {
        // Insert the element at the specified position
        list.add(index, element);
        // Added in middle, notify ListDataListener objects
        fireIntervalAdded(this, index, index);
    }

    @Override
    public void removeElement(Object element) {
        // Find out position
        int index = list.indexOf(element);
        if (index != -1) {
            // Remove an element
            list.remove(element);
            // Removed from middle, notify ListDataListener objects
            fireIntervalRemoved(this, index, index);
        }
    }

    public void removeAllItens() {
        if (list != null && list.size() > 0) {
            list.clear();
            fireContentsChanged(this, -1, list.size());
        }
    }

    @Override
    public void removeElementAt(int index) {
        if (getSize() >= index) {
            // Remove an element at the specified position
            list.remove(index);
            // Removed from index, notify ListDataListener objects
            fireIntervalRemoved(this, index, index);
        }
    }
}
G
Eu modifiquei o metodo listaCombo(), para
private void listaCombo() throws SQLException{
        CadastroDao dao = new CadastroDao();
        ArrayList<Cadastro> minhalista = (ArrayList<Cadastro>) dao.getListaCombo();
        
        DefaultComboBoxModel defaultComboBox = new
                DefaultComboBoxModel(minhalista.toArray());

        CbxCadastro.setMaximumRowCount(5);
        CbxCadastro.setModel(defaultComboBox);
        CbxCadastro.setSelectedIndex(-1);

        EdtNome.setText(CbxCadastro.getSelectedItem().toString());
        EdtCodigo.setText(String.valueOf(CbxCadastro.getSelectedIndex()));
 }
Mas está dando o sequinte erro.

[list]run:
Conectando ao banco ...
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Forms.JFCadastro.listaCombo(JFCadastro.java:212)
at Forms.JFCadastro.CbxCadastroActionPerformed(JFCadastro.java:196)
at Forms.JFCadastro.access$200(JFCadastro.java:17)
at Forms.JFCadastro$3.actionPerformed(JFCadastro.java:76)
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1240)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1311)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:100)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:88)
at javax.swing.JComboBox.actionPerformed(JComboBox.java:1294)
at Forms.JFCadastro.BtnNovoActionPerformed(JFCadastro.java:186)
at Forms.JFCadastro.access$300(JFCadastro.java:17)
at Forms.JFCadastro$4.actionPerformed(JFCadastro.java:142)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 17 segundos)[/list]

O que será que aconteceu...

D

A excessão ja diz tudo…

mas me diz, para que:

CbxCadastro.setSelectedIndex(-1);

nao teria que ser “0” ?

G

Colocando “-1” eu consigo selecionar qualquer item dentro da combo, mas dá esse erro postado acima.
Se eu colocar “0”, fica setado so no primeiro item e nao consigo selecionar outro item dentro da combo e nao dá esse erro postado acima.
Se vc puder mi ajudar eu agradeço.

D
java.lang.NullPointerException

diz respeito a um objeto que nao foi inicializado ou nao existe.

G

Vc poderia me orientar melhor pelo os codigo que postei ai acima, pois eu nao consegui encontrar o erro.
Fico grato pela compeensao.

T

Cara já tive um problema desse uma vez, e por mais estranho que possa parecer, e é, tenta manter o código de listar seu antigo, mas troca a chamada pro método CbxCadastro.removeAllItems(), remove item por item da JComboBox.

G

Coloquei o metodo com o for e tentei remover item por item nao resolveu, valeu pela tentativa,

Se alguem puder me ajudar eu agradeço.

Criado 25 de fevereiro de 2011
Ultima resposta 28 de fev. de 2011
Respostas 8
Participantes 4