Fill JComboBox with an object

7

Would you like help filling out a JComboBox with one class. In this class, return two parameters: Id and Desc.

Category class I need to show in combo:

private int Id_categoria;
private String Desc_Categoria;

How do I show only Desc_categoria ? And at the time of selecting some value, how do I get only Id_Categoria ?

I've tried, pass as parameter in JComboBox one array type and also add a model.

    
asked by anonymous 28.12.2015 / 02:21

2 answers

6

Another solution would be to use the comboModel . Simple example:

public class AulaComboModel extends AbstractListModel<Aula> implements ComboBoxModel<Aula> {

    private List<Aula> lista;

    /* Seleciona um objeto na caixa de seleção */
    private Aula selecionado;

    /* Método construtor */
    public AulaComboModel() {
        /* Popula a lista */
        popular();

        /* Define o objeto selecionado */
        setSelectedItem(lista.get(0));
    }

    /* Captura o tamanho da listagem */
    public int getSize() {
        int totalElementos = lista.size();
        return totalElementos;
    }

    /* Captura um elemento da lista em uma posição informada */
    public Aula getElementAt(int indice) {
        Aula t = lista.get(indice);
        return t;
    }

    /* Marca um objeto na lista como selecionado */
    public void setSelectedItem(Object item) {
        selecionado = (Aula) item;
    }

    /* Captura o objeto selecionado da lista */
    public Object getSelectedItem() {
        return selecionado;
    }

    private void popular() {
        try {
            /* Cria o DAO */
            AulaDAO tdao = new AulaDAO();

            /* Cria um modelo vazio */
            Aula t = new Aula();
            t.setNomeUsuario("");

            /* Recupera os registros da tabela */
            lista = tdao.buscar(t);

            /* Cria o primeiro registro da lista */
            Aula primeiro = new Aula();
            primeiro.setIdUsuario(0);
            primeiro.setNomeUsuario("--SELECIONE UM USUARIO--");

            /* Adiciona o primeiro registro a lista */
            lista.add(0, primeiro);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}

In this comboModel I retrieve the records from the database as follows: lista = tdao.buscar(t);

To implement this comboModel it is necessary to override the method equals and toString

Do this in the model, example:

 @Override
 public String toString() {
        String texto = idUsuario+" - "+ nomeUsuario;
        return texto;
    }

  @Override
   public boolean equals(Object obj) {
       Aula f = (Aula) obj;
       return Objects.equals(this.idUsuario, f.idUsuario);
   }

Note that no toString is concatenating the id and name.

If you are using netBeans, go to the comboModel component, right-click and go to properties > model > custom code and then instantiate the created template: new AulaComboModel()

Thiswouldbeaslightly"bigger" solution to your problem, but using comboModel can make your code more organized.

    
28.12.2015 / 14:25
5

Solution 1

In your custom class, add the method toString() to return the Desc_Categoria parameter:

@Override
public String toString()
    return this.Desc_Categoria;
}
Solution 2

You can customize the display of Jcombobox through the getListCellRendererComponent method of the DefaultListCellRenderer :

DefaultListCellRenderer renderer = new DefaultListCellRenderer() {

            @Override
            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                  if (value instanceof SuaCustomClasse) {
                    SuaCustomClasse minhaclasse = (SuaCustomClasse) value;
                    setText(minhaclasse.getDesc_Categoria);//supondo que seu parametro seja encapsulado
                }
                return this;
            }

...

   combo.setRenderer(renderer);

In this way, you are changing how JCombobox displays the elements added to it. You can create a custom%% as well, but it depends on the need and complexity of the objects that will be added in your combobox.

    
28.12.2015 / 13:43