Problemas com DefaultComboBoxModel[RESOLVIDO]

14 respostas
marcoslogan

Oi, pessoal tudo bem com vcs?

Estou tendo problemas com o DefaultComboBoxModel.

O meu professor de POO. Passou o seguinte exercício:

Inserir alguns dados no combobox via textfield.

Até aí tudo bem.

depois ele pediu que colocássemos algumas restrições do tipo. Somente inserir registros que não foram cadastrados e aí que está o problema. Toda vez que tento inserir um registro ele me retorna nulo e gera uma exceção do tipo NullPointerException.

Eu vou colocar o código que eu escrevi.

for (int i = 0; i <= modeloCombo.getSize(); i++) {

                if(!modeloCombo.getElementAt(i).equals(jTextField1.getText())){
                    modeloCombo.addElement(jTextField1.getText());
                }




                jComboBox1.setModel(modeloCombo);
            }

O programa não pode deixar que Usuário com o mesmo nome seja inserido duas vezes. Se ele estiver cadastrado o sistema tem que avisar o usuário.

Será que alguém poderia me ajudar?

14 Respostas

lele_vader

Não precisa de um casting modeloCombo.getElementAt(i)
para String ?

gustavocoolt

tente isto

if(!jTextField1.getText().equals(modeloCombo.getElementAt(i))){  
                    modeloCombo.addElement(jTextField1.getText());  
                }
marcoslogan

Ainda está dando errado.

marcoslogan

Coloquei assim:

if(!modeloCombo.getElementAt(i).toString().equals(jTextField1.getText())){
                    modeloCombo.addElement(jTextField1.getText());
}

E mesmo assim está dando errado.

lele_vader

Qual erro dá ?
Você falou que dá nullPointerException não é ?
Isola os 2 elementos do if e veja qual está vindo null.

modeloCombo.getElementAt(i).toString()

ou

jTextField1.getText()

marcoslogan

como assim isolar?

lele_vader

Debuga e vê qual parte está dando null pointer exception.
Deve ser em 1 desses 2 caras do if imagino eu.

G

Cara, acho que só tem um pequeno erro de lógica:

for (int i = 0; i <= modeloCombo.getSize(); i++) {  

	if(!modeloCombo.getElementAt(i).equals(jTextField1.getText())){  // Aqui se testa se o elemento atual do modelo é diferente ao texto.
		modeloCombo.addElement(jTextField1.getText()); // Sob esta lógica, o que estiver na caixa de texto SEMPRE será inserido no modelo.
	}  

	jComboBox1.setModel(modeloCombo);  // Aqui há uma tentativa pra mudar o modelo. Isso não é necessário.
}

A ideia é a seguinte: o q está no campo foi encontrado no modelo? Então pára de executar o código. Se depois de percorrer o modelo todo o texto não for encontrado, aí sim você insere o nome:

public void actionPerformed(ActionEvent e){
	for(int i = 0; i < modeloCombo.getSize(); ++i){
		if(modeloCombo.getElementAt(i).equals(campo.getText())){
			return; // Se o que estiver no campo for igual ao elemento no modelo, sai do cohdigo sem inserir o valor no modelo.
		}
	}
	modeloCombo.addElement(campo.getText());
	campo.setText("");
}

Segue um código de teste que eu fiz, talvez ajude:

import javax.swing.*;
import java.awt.event.*;

public class TesteComboBox extends JFrame implements ActionListener{

	JLabel rotulo = new JLabel("Escreva um nome: ");
	JTextField campo = new JTextField();
	JButton botao = new JButton("Inserir");
	DefaultComboBoxModel modeloCombo = new DefaultComboBoxModel(new String[]{"Joao", "Maria", "Joseh"});
	JComboBox combo = new JComboBox(modeloCombo);
		
		
	public TesteComboBox(){
		super("Teste Combo Box");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(null);
		setLocationRelativeTo(null);
		setSize(300,300);
		setVisible(true);
		
		rotulo.setBounds(10, 10, 200, 20);
		campo.setBounds(10, 35, 200, 20);
		combo.setBounds(10, 60, 200, 20);
		botao.addActionListener(this); // O proprio formulario "ouve" os cliques do botão.
		botao.setBounds(10, 85, 100, 20);
		
		add(rotulo);
		add(campo);
		add(combo);
		add(botao);
		
		validate();
		repaint();
	}
	
	public void actionPerformed(ActionEvent e){
		for(int i = 0; i < modeloCombo.getSize(); ++i){
			if(modeloCombo.getElementAt(i).equals(campo.getText())){
				return; // Se o que estiver no campo for igual ao elemento no modelo, sai do cohdigo sem inserir o valor no modelo.
			}
		}
		modeloCombo.addElement(campo.getText());
		campo.setText("");
	}

	public static void main(String[] args){
		new TesteComboBox();
	}
}

o/

marcoslogan

Deu o mesmo erro.
Sinceramente eu não sei mais o que fazer.

G

Posta o seu código todo aí.

marcoslogan

Eis o código todo.

public class ExerciciosjCombo extends javax.swing.JFrame {

    /**
     * Creates new form ExerciciosjCombo
     */
    DefaultComboBoxModel modeloCombo = new DefaultComboBoxModel();

    public ExerciciosjCombo() {
        initComponents();
        this.setVisible(true);
        this.setLocationRelativeTo(null);
        modeloCombo.addElement("");
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jComboBox1 = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("Adicionar Elementos");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 132, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(71, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(13, 13, 13)
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(206, Short.MAX_VALUE))
        );

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:



        if (jTextField1.getText().trim().equals("") || jTextField1 == null) {
            JOptionPane.showMessageDialog(null, "Não pode adicionar elementos vazios ou nulos.");
            jTextField1.requestFocus();
        } else {






            for(int i = 0; i<=modeloCombo.getSize(); ++i){
                if(modeloCombo.getElementAt(i).equals(jTextField1.getText())){
                    return;
                }
            }
            
            
            modeloCombo.addElement(jTextField1.getText());
            jComboBox1.setModel(modeloCombo);
            jTextField1.setText("");
            
            

            jTextField1.requestFocus();








        }


    }
G
  1. Quando tu for criar o ComboBox, passe o DefaultComboBoxModel pra ele como parâmetro.
  2. O erro de ponteiro nulo é porque o java usa base 0 pra vetores/listas. Tira o sinal de igual no for que resolve.
  3. O comando jcomboBox.setModel(modeloCombo) tenta trocar o modelo do jcomboBox. Mas isso naum faz sentido, afinal você está usando o mesmo modelo pro combo. Ao alterar o modelo, o combo altera sozinho de acordo com o modelo.

Vê o código:

import javax.swing.*; // Use mais imports. Isso deixa o código mais limpo.

public class ExerciciosjCombo extends javax.swing.JFrame {  
	  
	/** 
	  * Creates new form ExerciciosjCombo 
	  */  
	DefaultComboBoxModel modeloCombo = new DefaultComboBoxModel();  
	JTextField jTextField1; // Isso naum tava declarado.
	JButton jButton1; // Isso naum tava declarado.
	JComboBox jComboBox1; // Isso naum tava declarado. 
	
	public ExerciciosjCombo() {  
		 initComponents();  
		 jComboBox1 = new JComboBox(modeloCombo); // Note que o construtor usa o modeloCombo como parâmetro.
		 this.setVisible(true);  
		 this.setLocationRelativeTo(null);  
		 modeloCombo.addElement("");  
	}  
	  
	/*
	* O resto do seu código fica aqui.
	*/
	
	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
		// TODO add your handling code here:  

		if (jTextField1.getText().trim().equals("") || jTextField1 == null) {  
			 JOptionPane.showMessageDialog(null, "Não pode adicionar elementos vazios ou nulos.");  
			 jTextField1.requestFocus();  
		} else {  
			 // for(int i = 0; i<= modeloCombo.getSize(); ++i){  //Cuidado com o sinal de igual aí. Esse eh o problema de lógica.
			 for(int i = 0; i< modeloCombo.getSize(); ++i){  
				 if(modeloCombo.getElementAt(i).equals(jTextField1.getText())){  
					 // Aqui você pode até usar um diálogo falando que o valor já está no combo.
					 JOptionPane.showMessageDialog(null, "Não é possível inserir o nome, pois já está cadastrado.");  
					 return;  
				 }  
			 }  
			 modeloCombo.addElement(jTextField1.getText());  
			 //jComboBox1.setModel(modeloCombo);  // Coloque este código no construtor. Este código não é necessário aqui, ele não muda o modelo do comboBox.
			 jTextField1.setText("");  

			 jTextField1.requestFocus();  
		}  

	}
	
	public static void main(String ... args){ // O código precisa do main pra rodar.
		new ExerciciosjCombo();
	}
}
marcoslogan

Mas o meu projeto estou fazendo no netbeans. O código é gerado automaticamente.
Como faço então?

marcoslogan

Deu certo. Obrigado a todos que postaram aqui.

Criado 27 de agosto de 2012
Ultima resposta 30 de ago. de 2012
Respostas 14
Participantes 4