Set selected Combobox item as clicked on jTable

Asked

Viewed 1,097 times

0

I am trying to fill in the form fields as per the item clicked on jTable. Text fields are normally filled in, but the combobox remains at the selected default value.

//método que preenche a comboBox
public void fillCBFornecedor(){
    fornCtrl = new FornecedorControle();
    cbFornecedor.removeAllItems();

    for(Object fornecedor: fornCtrl.listar()){
        cbFornecedor.addItem(fornecedor);
    }
}//aqui eu preencho a ComboBox com os itens trazidos da camada de controle(abaixo) que usa a camada DAO para fazer a busca no banco

//método que preenche a jTable
private void fillJTProdutos(){
    prodCtrl = new ProdutoControle();

    jtProdutos.removeAll();
    jtProdutos.setModel(prodCtrl);
}//aqui eu uso a camada de controle que implementa uma AbstractTableModel para preencher minha JTable

//preenche os campos conforme o item clicado
private void fillCampos(){
    txtProduto.setText((String) jtProdutos.getValueAt(jtProdutos.getSelectedRow(), 0));
    cbFornecedor.setSelectedItem(jtProdutos.getValueAt(jtProdutos.getSelectedRow(), 1));
    cbMarca.setSelectedItem(jtProdutos.getValueAt(jtProdutos.getSelectedRow(), 2));
    cbGenero.setSelectedItem(jtProdutos.getValueAt(jtProdutos.getSelectedRow(), 3));
    txtValor.setText(String.valueOf((Float) jtProdutos.getValueAt(jtProdutos.getSelectedRow(), 4)));
    txtMin.setText(String.valueOf((Integer) jtProdutos.getValueAt(jtProdutos.getSelectedRow(), 5)));
    txtMax.setText(String.valueOf((Integer) jtProdutos.getValueAt(jtProdutos.getSelectedRow(), 6)));
}
//atributos e métodos da camada de controle
public class ProdutoControle extends AbstractTableModel{

private final ProdutoDAO pDAO = new ProdutoDAO();
private Produto produto;
private Marca marca;
private Genero genero;
private Fornecedor fornecedor;

@Override
public String getColumnName(int coluna) {
    return colunas[coluna];
}

@Override
public int getRowCount() {
    return pDAO.buscar().size();
}

@Override
public int getColumnCount() {
    return colunas.length;
}

@Override
public Object getValueAt(int linha, int coluna) {
    switch(coluna){
        case 0:
            return pDAO.buscar().get(linha).getDescricao();
        case 1:
            return pDAO.buscar().get(linha).getMarca();
        case 2:
            return pDAO.buscar().get(linha).getGenero();
        case 3:
            return pDAO.buscar().get(linha).getFornecedor();
        case 4:
            return pDAO.buscar().get(linha).getValor_unitario();
        case 5:
            return pDAO.buscar().get(linha).getEstoque_min();
        case 6:
            return pDAO.buscar().get(linha).getEstoque_max();
        default:
            return null;
    }
}

//atributos e métodos da camada DAO
public class ProdutoDAO {

private Connection con = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
String sql = null;

private Produto produto;
private Fornecedor fornecedor;
private Marca marca;
private Genero genero;

public List<Produto> buscar(){
    con = ConexaoBanco.getConexao();
    List<Produto> produtos = new ArrayList<>();

    sql = "SELECT * FROM view_produtos";

    try{
        stmt = con.prepareStatement(sql);

        rs = stmt.executeQuery();

        while(rs.next()){
            fornecedor = new Fornecedor();
            marca = new Marca();
            genero = new Genero();
            produto = new Produto(marca, genero, fornecedor);

            produto.setId(rs.getInt(1));
            produto.setDescricao(rs.getString(2));
            produto.getMarca().setDescricao(rs.getString(3));
            produto.getGenero().setDescricao(rs.getString(4));
            produto.getFornecedor().setRazao_social(rs.getString(5));
            produto.setValor_unitario(rs.getFloat(6));
            produto.setEstoque_min(rs.getInt(7));
            produto.setEstoque_max(rs.getInt(8));
            produto.setAtivo(rs.getInt(9));

            produtos.add(produto);
        }
    }
    catch(SQLException ex){
        JOptionPane.showMessageDialog(null, ex, "Erro", 0);
    }
    finally{
        ConexaoBanco.fechar(con, stmt, rs);
    }
    return produtos;
}//na camada DAO faço um select na view de produtos e preencho um objeto com os dados trazidos.

//Inicialização da ComboBox

cbFornecedor = new javax.swing.JComboBox();
cbFornecedor.setToolTipText("");

//evento click do mouse na tabela
private void jtProdutosMouseClicked(java.awt.event.MouseEvent evt) {                                        
    fillCampos();
}

Is there any way to define the selected item in Combobox according to the selected item in Jtable?

  • What if no line is selected? Disabled multiline selection?

  • I didn’t get any treatment from the guy. The way the code is now the fields update whenever I change the line selection (I’m using the fillCampos() method in Jtable’s Mouseclicked event). When there is nothing selected in the table (on screen loading for example) the fields simply become empty

  • Brand, Gender and Supply have some unique identification field, like id? The reason for not selecting is that the combo object is not the same as in your table, at least in java. You need to "teach" java how to know when they are equal.

  • Yes, they all have an id. How to do this check?

1 answer

0


The method setSelectedItem() compares the object passed as a parameter with those already in the combo using the method equals()(source code of this method can be seen in grepcode) which is inherited by all classes of Object.

Only that each created object is not equal to another, even if they have the same parameters and are of the same type, you can do the test by printing the created objects with the same parameters within one System.out.println(), the result will be in the format ClasseDoObjeto@hascode and it will be different. See a test on ideone.

A simpler solution would overwrite this method equals of the classes Marca, Genero and Fornecedor, so as to "teach" to the compiler under what circumstances objects of these types are equal. To illustrate this better, see the method equals of this example:

class MyClass {

    private int id;
    private String desc;

    public MyClass(int id, String desc) {
        this.id = id;
        this.desc = desc;
    }

    public int getId() {
        return this.id;
    }

    public String getDesc() {
        return this.desc;
    }

    @Override
    public boolean equals(Object obj) {
            return  obj instanceof MyClass && this.id == ((MyClass)obj).getId();
    }
}

Will only return true if the two objects are of the same type and have the field id equal.

However, I recommend reading of this answer in its final paragraphs, which talks about what would be the correct way to overwrite this method and what consequences of not following the recommendations.


Reference:

  • It worked, thank you! In addition to your code, I also realized that I was passing the wrong column number in the parameters, now it is working perfectly.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.