Colegas,
sou iniciante no java e agora começando a entender Orientação a objeto
Tenho um formulario simples de produtos e uma tabela feita no postgresql 8.4 com os campos Id do produto e nome do produto
coloquei um Jcombobox e gostaria de exibir o nome do produto e depois gravar o codigo do produto no banco, mas sempre mostrando o nome do produto.
Qual a maneira mais facil, usar arraylist ou select.
O que achar mais facil poderia me dar um passo a passo.
Obrigado!
Esta é minha classe produto. Onde eu coloquei double é porque irei trabalhar com valores, não sei se esta certo.
O metodo toString não sei trabalhar com ele, assisto muitas videos aulas, mas na hora de implementar vem a dificuldades.
package Classes;
/**
*
* @author Nilo
*/
public class Produto {
private int _codigo;
private String _noem;
private double _custo;
private double _percentual;
private String _ativo;
private double _precofinal;
/**
* @return the _codigo
*/
public int getCodigo() {
return _codigo;
}
/**
* @param codigo the _codigo to set
*/
public void setCodigo(int codigo) {
this._codigo = codigo;
}
public String getNoem() {
return _noem;
}
public void setNoem(String noem) {
this._noem = noem;
}
public double getCusto() {
return _custo;
}
public void setCusto(double custo) {
this._custo = custo;
}
public double getPercentual() {
return _percentual;
}
public void setPercentual(double percentual) {
this._percentual = percentual;
}
public String getAtivo() {
return _ativo;
}
public void setAtivo(String ativo) {
this._ativo = ativo;
}
public double getPrecofinal() {
return _precofinal;
}
void setPrecofinal(double precofinal) {
this._precofinal = precofinal;
}
}
Não tem segredo nenhum em implementar o toString(). Basta retornar nesse método o valor que você quer que seja exibido por padrão, sempre que o objeto do seu combo for impresso. Se no seu caso é o nome, o método fica assim:
@Override
public String toString() {
return getNome(); //Já corrigi seu erro de português
}
Agora, poste o código onde você faz o preenchimento do seu JComboBox.
Fique atento que pela convenção do Java, você não deve usar _ antes do nome dos atributos.
Por não saber fazer , eu estava tentando adaptar o codigo abaixo para preencher o jcombo,
mas não sei se esse cara usou a forma correta de implementação. Abaixo o que eu estava tentando fazer copiando a ideia dele, esse codigo foi usado para
preencher um jcombo de bairro. :
public void atualizaComboBoxBairro()
{
// procedimento para atualizar jcombobox de bairro
try
{
String sql = "select * from bairro Where codigo ="+tf_codBairro.getText();
con_bairro.executeSQL(sql);
con_bairro.resultset.first();
cb_bairro.setSelectedItem(con_bairro.resultset.getString("nome"));
}
catch (SQLException erro)
{
JOptionPane.showMessageDialog(null,"Nao foi possivel localizar bairro");
tf_codBairro.requestFocus();
}
}
Para preencher um combo, existem 2 passos distintos:
Carregar os objetos que você quer do banco, dentro de um List;
Carregar a lista no combo.
Comece fazendo o item 1. Será basicamente construir uma classe que manipule o banco de dados para a classe Produto.
Ela terá um método carregarProduto assim:
public class ProdutoDao {
public List<Produto> carregar() {
//Aqui faça a carga dos seus produtos
}
}
Note que você carrega os objetos da classe produto inteiros, não só a String com o nome.
Depois disso, seu método para preencher a combo ficará assim:
public void atualizaComboBoxBairro() {
for (Produto produto : new ProdutoDao().carregar()) {
cmbProdutos.addItem(produto);
}
}
Note que estou inserindo objetos da classe produto diretamente dentro da combo, não Strings. O método toString() diz para a combo que pra exibir esses objetos, ela deve usar o getNome().
Finalmente, na hora de ler os dados da combo, você terá acesso ao id do produto:
Produto p = (Produto) suaCombo.getSelectedItem(); //Retorna o produto selecionado
int id = p.getId();
ViniGodoy, me de licença por favor de responder a essa logica de gravar o codigo do combo que exibe o nome.
Para pegar um nome e gravar um codigo eu uso a seguinte logica…
pegar o nome que esta sendo exibido no index do jcombo,
criar um metodo que recebe esse nome vindo do getSelectedItem,
o metodo recebe o nome e da um select no banco pegando o codigo e guardando em uma variavel…
na hora de gravar o codigo, eu apenas guardo o valor da variavel.
[quote=fernandopaiva]ViniGodoy, me de licença por favor de responder a essa logica de gravar o codigo do combo que exibe o nome.
Para pegar um nome e gravar um codigo eu uso a seguinte logica…
pegar o nome que esta sendo exibido no index do jcombo,
criar um metodo que recebe esse nome vindo do getSelectedItem,
o metodo recebe o nome e da um select no banco pegando o codigo e guardando em uma variavel…
na hora de gravar o codigo, eu apenas guardo o valor da variavel.
pronto. ![/quote]
Extremamente trabalhoso e ineficiente. Você consulta uma vez a mais o banco (o que é desnecessário, se fizer do jeito certo) e também não cobre o caso de dois produtos terem nomes iguais.
O jeito ideal é preencher sua Combo com Produtos e não com Strings. Não é à toa que todos os componentes do Swing são feitos para trabalhar diretamente com objetos, não com tipos primitivos.
Vini, sim sim…
na verdade posso gravar esse codigo apenas num select, mas a pergunta dele foi ter um produto no combo e pegar seu codigo…para gravar o codigo !
eu faria como disse…foi apenas um exemplo de como chegar a uma logica para fazer, sobre nomes iguais e tals, claro que precisaria pegar um campo unico para isso.
o cenario dele e: o combo dele exibe o nome do produto e ele quer gravar o codigo, a maneira que respondi seria uma maneira de fazer…e o q eu faria, e o q eu faco.
uau…gostei disso ae.
entaum me explique uma coisa…se eu tenho na minha tabela chamada tipodeproduto no meu bd.
vou preencher o combo com um select q me retorna os tipos de produtos vindo dela.
select * from tipodeproduto
nesse select eu tenho o retorno do codigo e do tipodeproduto
preencho o combo com tipodeproduto, se eu usar da maneira q vc mostra ae eu consigo saber q o tipodeproduto “conveniencia” tem o codigo por exemplo “10” ???
Sim. Mas pra isso você tem que criar a classe TipoProduto (o que você teria que fazer mesmo, se estiver usando OO) e separar seu programa nos DAOs corretamente.
É o que eu estava explicando pro colega ali em cima.