JComboBox Model Renderer Problema

4 respostas
A

Estou tentando fazer um combobox que receba um valor e retorne outro como o id do BD, entao sequi um exemplo que encontrei aqui no fórum e deu certo. Primeiro criei um renderer para receber um objeto do tipo Estado e depois um modelo onde eu pudesse enviar um objeto Estado através do método setSelectedItem e este encontraria esse objeto através do id. O problema é que quando eu seleciono atraves do modelo ele funciona mas quando eu tendo retornar ao objeto selecionado anteriormente través do mouse no combobox, ele simplesmente não seleciona. Não entendi qual é o problema se alguem poder me ajudar.

import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.JList;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Component;

public class ComboRenderer extends JLabel implements ListCellRenderer {
     public ComboRenderer() {
         setOpaque(true);
     }
     public Component getListCellRendererComponent(JList list,Object value,
     int index,boolean isSelected,boolean cellHasFocus){
     	
     	if(value.getClass()==Estado.class)
	    	setText(((Estado)value).getSigla());
     		
	    setBackground(isSelected ? Color.red : Color.white);
	    setForeground(isSelected ? Color.white : Color.black);
	    
	    return this;
     }
 }
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.util.Iterator;

public class ComboModel extends AbstractListModel implements ComboBoxModel{
	private Vector<Object> lista;
	public int indexSelected;
	
	public ComboModel(Vector<Object> lista){
		this.lista = lista;
	}
	
	public void addElement(Object anObject){
		lista.add(anObject);
	}
	
	public Object getElementAt(int index) {
		return lista.get(index);
	}
	
	public int getIndexOf(Object anObject){
		int index = 0;
		for(int i=0;i<=lista.size()-1;i++){
			if(((Estado)lista.get(i)).getId() == ((Estado)anObject).getId()){
				index = i;
				break;
			}
		}
		return index;
	}
	
	public void setSelectedItem(Object anObject){
		for(int i=0;i<=lista.size()-1;i++){
			if(((Estado)lista.get(i)).getId() == ((Estado)anObject).getId()){
				indexSelected = i;
				break;
			}
		}
	}
	
	public Object getSelectedItem() {
		return lista.get(indexSelected);
	}
	
	public int getSize() {
		return lista.size();
	}
	
	public void insertElementAt(Object anObject, int index){
		lista.add(index,anObject);
	}
	
	public void removeAllElements(){
		lista.removeAllElements();
	}
	
	public void removeElement(Object anObject){
		for(int i=0;i<=lista.size()-1;i++){
			if(((Estado)lista.get(i)).getId() == ((Estado)anObject).getId()){
				lista.remove(i);
				break;
			}
		}
	}
	
	public void removeElementAt(int index){
		lista.remove(index);
	}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;

public class Teste extends JFrame implements ActionListener{
	private JComboBox combo;
	private JTextField campo;
	private ComboModel model;
	
	public Teste(){
		setTitle("Teste de combo");
		setSize(300,300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		Vector<Object> v = new Vector<Object>();
		v.add(new Estado(1,"AP","Amapa"));
		v.add(new Estado(2,"AC","Acre"));
		v.add(new Estado(3,"PA","Para"));
		model = new ComboModel(v);
		
		combo = new JComboBox();
		combo.setRenderer(new ComboRenderer());
		combo.setModel(model);
		combo.addActionListener(this);
		
		campo = new JTextField(5);
		campo.addActionListener(this);
		
		c.add(combo);
		c.add(campo);
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==combo){
			System.out.println(((Estado)model.getSelectedItem()).getId());
		}
		if(e.getSource()==campo){
			Estado est1 = new Estado();
			est1.setId(Integer.parseInt(e.getActionCommand()));
			
			model.setSelectedItem(est1);
			combo.repaint();
		}
	}
	
	public static void main(String args[]){
		new Teste().setVisible(true);
	}
}

4 Respostas

brlima

A primeira coisa melhor a corrigir eh: para comparar se uma classe é do tipo da outra, o meio mais correto seria usando a palavra instanceof. Dai, teu Renderer ficaria assim:

if(value instanceof Estado)

Talvez por isso não esteja funcionando.

flw!

brlima

Cara,
Teste esse codigo ai em cima aqui e funcionou tudo certinho. Pelo menor aqui não encontrei nenhum problema nele.

A

A questão é que quando eu digito na classe de teste dentro do textField o id do objeto que eu quero selecionar ele funciona, mas quando eu tento voltar ao anterior selecinado ele simplesmente não volta. Um exemplo é logo quando o frame aparece o objeto selecionado é o AP então quando eu gigito no textfield o id 2 do AC ele vai sem nenhum problema, mas quando eu tento voltar com o mouse ao AP o combo não obedece e continua setado no AC.

A

Consegui dar um jeito nele, o problema era o meu comboboxmodel que tinha alguma coisa de errada, e sinceramente ainda não sei o que é.

Assim ele funcionou corretamente e bem mais simples que o anterior

import javax.swing.DefaultComboBoxModel;
import java.util.Vector;

public class ComboModel extends DefaultComboBoxModel {
	public ComboModel(Vector<Object> lista){
		super(lista);
	}
	
	public void setSelectedItem(Object anObject){
		for(int i=0;i<=getSize()-1;i++){
			if(((Estado)getElementAt(i)).getId() == ((Estado)anObject).getId()){
				super.setSelectedItem(getElementAt(i));
				break;
			}
		}
	}
	
	public void setSelectedIndex(int index){
		super.setSelectedItem(getElementAt(index));
	}
	
	public int getSelectedIndex(){
		return getIndexOf(getSelectedItem());
	}
}
Criado 2 de fevereiro de 2005
Ultima resposta 4 de fev. de 2005
Respostas 4
Participantes 2