setSelectedItem ComboBoxModel

Já li vários tópicos aqui no fórum sobre este assunto, e em alguns outros fóruns também, mas não consegui resolver meu problema. Tenho uma aplicação, e em uma determinada tela, quando eu dou duplo clique em minha JTable(table model), preciso que um item seja selecionado em meu JCombox(ComboBoxModel). Segue alguns trechos do meu código.

Aqui, o método setSelectedItem do meu comboboxmodel:

private CContasContabeis selectedContas;

public void setSelectedItem(Object anItem){
   selectedContas = (CContasContabeis) anItem;
} 

E aqui o método quando dou duplo clique na tabela:

private void PreencheCamposEditar() {
int row = tabelacontascontabeis.getSelectedRow();
String idclicado = (tabelacontascontabeis.getModel().getValueAt(row, 1).toString());
        CContasContabeis ct = new CContasContabeis();
        ct.setConta(Integer.parseInt(idclicado));
        DaoContasContabeis dt = new DaoContasContabeis();
        dt.ConsultaContaContabil(ct);
        String cod = String.valueOf(ct.getConta());
        txtconta.setText(cod);
       txtdescricao.setText(ct.getDescricao());
       //aqui, verifico se a conta é maior que 0(zero), se for, seleciona na combo
        if (ct.getTotalizadora() > 0) {
         //aqui que a minha dúvida acontece.
       } else {
       //se for menor que 0(zero), não seleciono nada
       cbtotalizadora.setSelectedIndex(-1);
        }
    }

É so você passar o objeto que representa o registro que quer selecionar na ComboBox e dar um jComboBox.setSelectedItem(objeto); se não me engano.

Então edinhocoelho, já tentei desta maneira, mas ele não traz o objeto referente a linha que estou clicando, traz o último registro inserido. Mas agradeço pela sua resposta.

Como você preencheu sua ComboBox inicialmente porque era pra da certo assim?

Segue o método que carrega a minha Combo:

private void CarregaComboTotalizadora() {
DaoContasContabeis dao = new DaoContasContabeis();
listatotalizadora = dao.getContasTotalizadoras();
modelototalizadora = new ContasContabeisComboModel(listatotalizadora);
cbtotalizadora.setModel(modelototalizadora);
cbtotalizadora.setRenderer(new ContasContabeisCellRenderer());
}

Entendi, você ta fazendo de uma forma meio diferente usando uma Classe model customizada, desse jeito eu nunca fiz os exemplos que eu tenho por exemplo em um sistema antigo que eu fiz eu passava direto, por exemplo abaixo.

    while (resultSet.next()) {
        int cdPais = resultSet.getInt("CDPAIS");
        String noPais = resultSet.getString("NOPAIS");
        
        jComboBoxCadastroCidadeCdPais.addItem(new Pais(cdPais, noPais));
    }

Sim, isso mesmo. Quando minha Combo não carrega informações do banco de dados, eu utilizo também o addItem. Mas quando ela é populada por registros do BD, eu uso um Model.

Mas novamente, agradeço pela sua ajuda.

Mas uma coisa nesse caso que você não pode deixar acontecer é perder a referência do objeto, verifica seus model que fez.

Se os valores que estão na jtable estiverem com os mesmos no jcombobox nomes isso funciona:

//isso pega o que foi clicado na sua jtable
        String valorjtable = jtable.getModel().getValueAt(jtable.getSelectedRow(), jtable.getSelectedColumn()).toString();
        int cont = 0;
        int itemcorresp = 0;
        //esse laço é responsavel por verificar qual valor na jcombobox é = ao clicado na jtable
        while (cont < jcombobox.getItemCount()) {
            if (jcombobox.getItemAt(cont).equals(valorjtable)) {
                itemcorresp = cont;
                break;
            }
            cont++;
        }
        //isso seleciona no jcombobox o que foi clicado na jtable
        jcombobox.setSelectedIndex(itemcorresp);

Obrigado Eslley, vou tentar. Caso consiga (ou não, rsrsrsrrsrs) eu posto aqui novamente.

Eslley, testei este código que vc postou, porém ainda não deu certo.
Os valores são preenchidos sim a partir dos dados da jtable.

Acontece que, quando clico na jtable para selecionar na combox, ele seleciona, porem, se eu clico em outra linha na jtable, ele permanece selecionado o que eu cliquei primeiro. Sabe me dizer o porque?

Obrigado mais uma vez.

Aqui no meu está dando tudo certo, mas me envia seu código.

Olá Esller,
Ok, segue meus códigos.

Meu DAO(que popula a JComboBox):

public List getContasTotalizadoras() {
conn = null;
ArrayList cp = new ArrayList<>();
String sql = “SELECT * FROM contascontabeis WHERE lancavel = ‘N’ ORDER BY conta ASC”;
try {
conn = ConexaoPostGreSql.getConexao();
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while (rs.next()) {
CContasContabeis cp2 = new CContasContabeis();
cp2.setConta(rs.getInt(“conta”));
cp2.setDescricao(rs.getString(“descricao”));
cp2.setTotalizadora(rs.getInt(“totalizadora”));
cp2.setLancavel(rs.getString(“lancavel”));
cp.add(cp2);
}
ConexaoPostGreSql.fechaConexao(conn, pst, rs);
} catch (SQLException | ClassNotFoundException | IOException e) {
JOptionPane.showMessageDialog(null, “Erro ao listar as contas!\n”+e.getMessage());
}
return cp;
}

Meu Combo Model:

import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import controle.CContasContabeis;

public final class ContasContabeisComboModel extends AbstractListModel implements ComboBoxModel{
private List listContas;
private CContasContabeis selectedContas;
private final static int FIRSTINDEX = 0;
public ContasContabeisComboModel() {
this.listContas = new ArrayList<>();
}
public ContasContabeisComboModel(List listContaContabeis){
this();
this.listContas.addAll(listContaContabeis);
if (getSize() > 0) {
setSelectedItem(this.listContas.get(FIRSTINDEX));
}
}
@Override
public Object getElementAt(int index){
return listContas.get(index);
}
@Override
public int getSize() {
return listContas.size();
}
@Override
public Object getSelectedItem(){
return selectedContas;
}
@Override
public void setSelectedItem(Object anItem){
selectedContas = (CContasContabeis) anItem;
}
public void addConta(CContasContabeis cs){
listContas.add(cs);
fireIntervalAdded(this, getSize() - 1, getSize() - 1);
setSelectedItem(listContas.get(getSize() - 1));
}
public void addListConta(List cs2){
int primeiraLinha = getSize();
listContas.addAll(cs2);
fireIntervalAdded(this, primeiraLinha, primeiraLinha + cs2.size());
setSelectedItem(listContas.get(getSize() - 1));
}
public void removeConta(){
listContas.remove(getSelectedItem());
fireIntervalRemoved(this, FIRSTINDEX, getSize() - 1);
setSelectedItem(listContas.get(FIRSTINDEX));
}
public void clear(){
listContas.clear();
fireContentsChanged(this, FIRSTINDEX, getSize() - 1);
}
}

Meu Combo Renderer:

import java.awt.Component;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import controle.CContasContabeis;

public class ContasContabeisCellRenderer extends DefaultListCellRenderer {

@Override
public Component getListCellRendererComponent(JList<? extends Object> list,
        Object value, int index, boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
     
    if (value instanceof CContasContabeis) {
        CContasContabeis cs = (CContasContabeis) value;
        setText(String.valueOf(cs.getConta()));
    }
    return this;
}

}

E o método que eu uso, para quando clicar na tabela, enviar os dados para edição no Form:

private void PreencheCamposEditar() { int row = tabelacontascontabeis.getSelectedRow(); txtconta.setText(tabelacontascontabeis.getModel().getValueAt(row, 1).toString()); txtdescricao.setText(tabelacontascontabeis.getModel().getValueAt(row, 2).toString()); int tot = (int) tabelacontascontabeis.getModel().getValueAt(row, 3); System.out.println("Conta Totalizadora Selecionada: " + tot); if (tot == 0) { cbtotalizadora.setSelectedIndex(-1); } else { //Aqui que não dá certo } String lancavel = tabelacontascontabeis.getModel().getValueAt(row, 4).toString(); if (lancavel.equals("S")) { rbsim.setSelected(true); rbnao.setSelected(false); } else { rbsim.setSelected(false); rbnao.setSelected(true); } btgravar.setEnabled(false); btcancelar.setEnabled(true); bteditar.setEnabled(true); btatualizar.setEnabled(false); btinserir.setEnabled(false); jtpcontascontabeis.setSelectedIndex(1); }

Deixa eu ver se entendi direiro:

private void PreencheCamposEditar() {
int row = tabelacontascontabeis.getSelectedRow();
txtconta.setText(tabelacontascontabeis.getModel().getValueAt(row, 1).toString());
txtdescricao.setText(tabelacontascontabeis.getModel().getValueAt(row, 2).toString());
int tot = (int) tabelacontascontabeis.getModel().getValueAt(row, 3);
System.out.println("Conta Totalizadora Selecionada: " + tot);
if (tot == 0) {
cbtotalizadora.setSelectedIndex(-1);
} else {
//Aqui que não dá certo
}
String lancavel = tabelacontascontabeis.getModel().getValueAt(row, 4).toString();
if (lancavel.equals("S")) {
rbsim.setSelected(true);
rbnao.setSelected(false);
} else {
rbsim.setSelected(false);
rbnao.setSelected(true);
}
btgravar.setEnabled(false);
btcancelar.setEnabled(true);
bteditar.setEnabled(true);
btatualizar.setEnabled(false);
btinserir.setEnabled(false);
jtpcontascontabeis.setSelectedIndex(1);
}

neste trecho o seu combobox vai ser selecionado a partir do valor da variável tot, certo?

Sim, isto mesmo. Quando eu gravo uma conta, se a conta contábil for lancavel, uma conta totalizadora deve ser informada. Se não for lancavel, o sistema grava 0(zero). E quando der dois cliques na tabela para editar os dados, o sistema verifica: se a totalizadora for 0(zero), não seleciona nada na combo. Senão, pega a conta totalizadora na coluna 3 da tabela(variável tot), e deixa selecionada na combo.

Só pra conferir:
Então o conteúdo do seu combobox são números?
Ai você quer deixar o valor da variável tot selecionado no valor correspondente que já existe na combobox ?

Isso mesmo Eslley

Então tenta isso:

private void PreencheCamposEditar() {
int row = tabelacontascontabeis.getSelectedRow();
txtconta.setText(tabelacontascontabeis.getModel().getValueAt(row, 1).toString());
txtdescricao.setText(tabelacontascontabeis.getModel().getValueAt(row, 2).toString());
String tot =  tabelacontascontabeis.getModel().getValueAt(row, 3).toString();
System.out.println("Conta Totalizadora Selecionada: " + tot);
if (tot == "0") {
cbtotalizadora.setSelectedIndex(-1);
} else {
int cont = 0;
    int itemcorresp = 0;
    while (cont < cbtotalizadora.getItemCount()) {
        if (cbtotalizadora.getItemAt(cont).equals(tot)) {
            itemcorresp = cont;
            break;
        }
        cont++;
    }
    cbtotalizadora.setSelectedIndex(itemcorresp);
}
String lancavel = tabelacontascontabeis.getModel().getValueAt(row, 4).toString();
if (lancavel.equals("S")) {
rbsim.setSelected(true);
rbnao.setSelected(false);
} else {
rbsim.setSelected(false);
rbnao.setSelected(true);
}
btgravar.setEnabled(false);
btcancelar.setEnabled(true);
bteditar.setEnabled(true);
btatualizar.setEnabled(false);
btinserir.setEnabled(false);
jtpcontascontabeis.setSelectedIndex(1);
}