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<Produto>(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.