Set selected ComboBox item as clicked on jTable

0

I'm trying to fill in the fields of a form as the item clicked on jTable. Text fields are filled in normally, but the comboBox remains with the default value selected.

//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 the ComboBox as the selected item in JTable?

    
asked by anonymous 19.05.2017 / 01:28

1 answer

0

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

Only 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 objects created with the same parameters within System.out.println() , the result will be in the format ClasseDoObjeto@hascode and will be different. See a test on ideone .

A simpler solution would be to override this method with% of classes equals , Marca and Genero , so as to "teach" the compiler under what circumstances objects of these types are equals. To illustrate this better, see the Fornecedor method 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();
    }
}

Only return equals if both objects are of the same type and have the true field equal.

However, I recommend reading this answer in your final paragraphs, which talks about what the correct form would look like to override this method and what consequences of not following the recommendations.

Reference:

19.05.2017 / 04:04