jCombobox x jtextField

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

Rodrigo,

Este exemplo deve te ajudar:

[code]import javax.swing.;
import java.awt.
;
import java.awt.event.;
import java.util.
;

public class TelaCombo extends JFrame implements ItemListener{
private JComboBox 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;
   }
}

}[/code]

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

[code]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;

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;
   }
}

}[/code]

Assim vc evita controlar um ArrayList em paralelo.

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:

[code]import javax.swing.;
import java.awt.
;
import java.awt.event.;
import java.util.
;

public class TelaCombo extends JFrame implements ItemListener{
private JComboBox 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;
   }
}

}[/code]

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.