jCombobox x jtextField

4 respostas
rodrigo.rrch

Apenas para nivel de estudo
Gostaria de quando eu selecionar algum item (produto) no meu combobox mostrasse o preco correspondente em um jTextField

ArrayList<Produto> listaProduto = RepositorioProduto.obterInstancia().listarTodos(); 

private void carregarCombos(){        
        
        DefaultComboBoxModel modeloProd = new DefaultComboBoxModel();
        this.listaProduto = RepositorioProduto.obterInstancia().listarTodos();
        for(int i = 0; i < this.listaProduto.size(); i++){
            modeloProd.addElement(this.listaProduto.get(i).getDescricao());                      
        }
        jComboBoxProduto.setModel(modeloProd);
        jComboBoxProduto.setSelectedIndex(-1);                 
    }

Creio que teria que tratar para ele fazer isso no ItemStateChanged
para que cada vez que eu selecionar um item no combobox ele retornasse
o listaProduto.get(i).getPreco() no jTextField… mais nao to conseguindo

private void jComboBoxProdutoItemStateChanged(java.awt.event.ItemEvent evt) {
       
       // Sem ideia de como codificar aqui =/
    }

Aceito qualquer ideia de como fazer isso… Tenho certeza que é algo bobo que eu nao vi ainda

Grato desde ja

4 Respostas

al.barbosa

Rodrigo,

Este exemplo deve te ajudar:

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

public class TelaCombo extends JFrame implements ItemListener{
    private JComboBox<String> comboProdutos;
    private JTextField texto;

    ArrayList<Produto> lista = new ArrayList();

    public TelaCombo(){
        lista.add(new Produto("Computador",500));
        lista.add(new Produto("Impressora",200));
        lista.add(new Produto("Memoria",100));

        setLayout(new FlowLayout());

        comboProdutos = new JComboBox(lista.toArray());
        texto = new JTextField(10);

        comboProdutos.addItemListener(this);
        comboProdutos.setSelectedIndex(-1);
        add(comboProdutos);
        add(texto);
        
        setSize(300, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void itemStateChanged(ItemEvent e) {  
        int indice = comboProdutos.getSelectedIndex();
        if(indice == -1){
           texto.setText("");
        }else{
           int preco = lista.get(indice).getPreco();
           texto.setText(Integer.toString(preco));
        }
    } 

    public static void main(String[] args){
        TelaCombo tela = new TelaCombo();
        tela.setVisible(true);
    }

    class Produto{
       private String descricao;
       private int preco;
       public Produto(String descricao, int preco){
          this.descricao = descricao;
          this.preco = preco;
       }
       public String getDescricao(){
          return descricao;
       }
       public int getPreco(){
          return preco;
       }
       public String toString(){
          return descricao;
       }
    }

}
ViniGodoy

Ou então, repare que o JComboBox recebe um objeto, e não apenas Strings:

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

public class TelaCombo extends JFrame implements ItemListener{
    private JComboBox&lt;Produto&gt; comboProdutos;
    private JTextField texto;

    public TelaCombo(){
        setLayout(new FlowLayout());

        comboProdutos = new JComboBox&lt;Produto&gt;(new Produto[] {
            new Produto("Computador",500),
            new Produto("Impressora",200),
            new Produto("Memoria",100)});
        texto = new JTextField(10);

        comboProdutos.addItemListener(this);
        comboProdutos.setSelectedIndex(-1);
        add(comboProdutos);
        add(texto);
        
        setSize(300, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void itemStateChanged(ItemEvent e) {  
        Produto produto = comboProdutos.getSelectedItem();
        if(produto == null){
           texto.setText("");
        }else{
           texto.setText(Integer.toString(produto.getPreco()));
        }
    } 

    public static void main(String[] args){
        TelaCombo tela = new TelaCombo();
        tela.setVisible(true);
    }

    class Produto{
       private String descricao;
       private int preco;
       public Produto(String descricao, int preco){
          this.descricao = descricao;
          this.preco = preco;
       }
       public String getDescricao(){
          return descricao;
       }
       public int getPreco(){
          return preco;
       }

       @Override
       public String toString(){
          return descricao;
       }
    }
}

Assim vc evita controlar um ArrayList em paralelo.

al.barbosa

Vinny,

Valeu, realmente ficou melhor obtendo o produto como objeto na combo.
Testei o código, só precisei colocar um cast para Produto ao selecionar o item na combo:

Produto produto = (Produto) comboProdutos.getSelectedItem();

Para carregar a combo, eu queria obter os elementos de um ArrayList para aproveitar o ArrayList que o Rodrigo já tem.
Pesquisei um variante do método toArray() de ArrayList, o T[] toArray(T[] a).

Assim consegui criar o JComboBox usando o ArrayList:

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

public class TelaCombo extends JFrame implements ItemListener{
    private JComboBox<Produto> comboProdutos;
    private JTextField texto;

    ArrayList<Produto> lista = new ArrayList<Produto>();

    public TelaCombo(){
        lista.add(new Produto("Computador",500));
        lista.add(new Produto("Impressora",200));
        lista.add(new Produto("Memoria",100));

        setLayout(new FlowLayout());

        comboProdutos = new JComboBox<Produto>(lista.toArray(new Produto[]{}));
        texto = new JTextField(10);

        comboProdutos.addItemListener(this);
        comboProdutos.setSelectedIndex(-1);
        add(comboProdutos);
        add(texto);
        
        setSize(300, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void itemStateChanged(ItemEvent e) {   
        Produto produto = (Produto) comboProdutos.getSelectedItem();   
        if(produto == null){   
           texto.setText("");   
        }else{   
           texto.setText(Integer.toString(produto.getPreco()));   
        }   

    } 

    public static void main(String[] args){
        TelaCombo tela = new TelaCombo();
        tela.setVisible(true);
    }

    class Produto{
       private String descricao;
       private int preco;
       public Produto(String descricao, int preco){
          this.descricao = descricao;
          this.preco = preco;
       }
       public String getDescricao(){
          return descricao;
       }
       public int getPreco(){
          return preco;
       }
       public String toString(){
          return descricao;
       }
    }

}
ViniGodoy

Legal, não testei o código aqui pq estou sem java no momento.

Outra possibilidade seria implementar um ComboBoxModel que trabalhe com lists ao invés de Vector.

Aliás, até hoje não sei pq a Oracle não troca o Vector<E> por um List<E>. Além de permitir o uso de ArrayList e LinkedList, não quebraria a compatibilidade com códigos que já usam vector.
Da mesma forma, o segundo construtor poderia ser alterador de E[] para E… sem problemas.

Mas postei mais pq muita gente não se liga que é possível incluir qualquer tipo de objeto em JComboBoxes, JLists, JTables e JTrees.

Criado 12 de julho de 2012
Ultima resposta 14 de jul. de 2012
Respostas 4
Participantes 3