[RESOLVIDO]Pegar dados da Jtable e Jogar num JcomboBox do tipo Object

27 respostas
jtable
M

Tenho uma tela para cadastrar Pedidos, nessa tela uma JcomboBox com Objetos clientes vindo do banco(só estou mostrando o nome dos clientes nessa JcomboBox). Quando cadastro um novo pedido, os dados vão para uma Jtable, porem quero selecionar a linha da Jtable e trazer o nome do cliente para minha JcomboBox, já tentei utilizar o cmb.SetSelectedItem(); porem não aceita dados do tipo Objeto ;/

(Veja na foto, a linha selecionada esta com todos os dados no seus respectivos lugares, menos a ComboBox Cliente)

27 Respostas

rodriguesabner

Como vc não postou código, tenta isso:

String result = "" + tabela.getValueAt(tabela.getSelectedRow(), 1);
        combo.removeAllItems(); //Remove os itens antigos e deixa o combo sempre com um item, se você quiser um histórico de nomes, pode remover essa linha
        combo.addItem(result); //adiciona o item da tabela, nesse caso pega a linha selecionada (getSelectedRow), e a coluna 1. Lembrando que a coluna começa do 0;
        combo.setSelectedItem(result); //Deixa o item que veio da tabela já selecionado no combo

image

M
//função para popular combobox pegando info do banco de dados
public void popularCmb(){
    ClienteDAO cdao = new ClienteDAO();
    DefaultComboBoxModel comboMobel = (DefaultComboBoxModel) cmb_cliente.getModel();
    for (Cliente c : cdao.find()) {
        comboMobel.addElement(c);
    }
}
M
txt_ID.setText(jTable6.getValueAt(jTable6.getSelectedRow(), 0).toString());
    txt_vale.setText(jTable6.getValueAt(jTable6.getSelectedRow(), 1).toString());
    txt_nfe.setText(jTable6.getValueAt(jTable6.getSelectedRow(), 2).toString());
    cmb_situacao.setSelectedItem(jTable6.getValueAt(jTable6.getSelectedRow(), 3).toString()); 
    cmb_cliente.setSelectedItem(jTable6.getValueAt(jTable6.getSelectedRow(), 4)); // ESSA LINHA NAO FUNCIONA
    txt_peso.setText(jTable6.getValueAt(jTable6.getSelectedRow(), 5).toString());
    txt_valor.setText(jTable6.getValueAt(jTable6.getSelectedRow(), 6).toString());

Aqui é o codigo de quando eu seleciono a linha na Jtable e os dados vão para os JtextField(FUNCIONAM!) e a ComboBox cliente(NAO FUNCIONA)

rodriguesabner

Não precisa usar esse popularCmb, faz assim:

String result = "" + jTable6.getSelectedRow(), 4)
        cmb_cliente.removeAllItems(); //Remove os itens antigos e deixa o combo sempre com um item, se você quiser um histórico de nomes, pode remover essa linha
        cmb_cliente.addItem(result); //adiciona o item da tabela, nesse caso pega a linha selecionada (getSelectedRow), e a coluna 1. Lembrando que a coluna começa do 0;
        cmb_cliente.setSelectedItem(result); //Deixa o item que veio da tabela já selecionado no combo
M

Preciso sim, pois essa é a tela de cadastrar/editar/excluir clientes, se eu fizer desse jeito que vc me passou, todos os outros nomes de clientes vao sumir e só vai sobrar o qual eu cliquei

rodriguesabner

combo.removeAllItems(); //Remove os itens antigos e deixa o combo sempre com um item, se você quiser um histórico de nomes, pode remover essa linha

Os cliente já estão no combo?

M

sim, pois ao iniciar o programa eu invoco o metodo de popularCmb (popula o comboBox com os objetos clientes)

M


Ao clicar na linha, todos os meu dados vão para os determinados lugares, menos o cmb_cliente que é do tipo objeto, ele nao aceita SetSelectedItem(jTable6.getValueAt(jTable6.getSelectedRow(), 4)

rodriguesabner
String result = "" + jTable6.getSelectedRow(), 4) //Pega a linha selecionada da coluna 4
        cmb_cliente.setSelectedItem(result); //Deixa o item que veio da tabela já selecionado no combo
M

nao funcionou pq a cmb_cliente é do Tipo Object

rodriguesabner

Mas mano, eu acabei de fazer isso aqui e deu certo. A ComboBox aceita String dentro dela tranquilo…

M

eu sei, no caso a outra combobox que tenho (cmb_situação) pega os valores da tabela, pq é tipo String mas essa cmb_cliente é tipo Object enão pega valores da jtable

rodriguesabner

M

Até muda os nomes, porem quando clico em lançar/atualizar da este erro:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to model.bean.Cliente
Pois cliente é uma FK na tabela pedido

Jonathan_Medeiros

Recupera os dados da JTable da forma que você já fazia, após recuperar cria um novo objeto do tipo que sua combo possuí, feito isso basta setar o objeto na combo que deve funcionar.

Exemplo: (Imagino que sua combo já esteja preenchida)

String id = suaJTable.getValueAt(suaJTable.getSelectedRow(), 0).toString();
String nome = suaJTable.getValueAt(suaJTable.getSelectedRow(), 1).toString();

SeuObjeto obj = new SeuObjeto(id, nome);

suaCombo.setSelectedItem(obj);
M
cliente = (Cliente)jTable6.getValueAt(jTable6.getSelectedRow(), 4);
cmb_cliente.setSelectedItem(cliente);

fiz desta maneira, porem não esta mudando o nome na JComboBox que já estava preenchida.

rodriguesabner

Como vc tá pegando o item na hora de lançar/atualizar?

M
Faturamento f = new Faturamento();

f.setCliente((Cliente)cmb_cliente.getSelectedItem());

rodriguesabner

Tenta só com: combo.getSelectedItem();, até pq fazendo: Object result.... Vc não tá referenciando nada do model Cliente

Jonathan_Medeiros

Cara, é bem simples!

Pensa comigo, assim como na JTable a JComboBox também trabalha com Model certo?

Então para manipular os objetos precisamos informar ao model utilizado qual objeto dele queremos.

Ficaria assim:

String id = suaJTable.getValueAt(suaJTable.getSelectedRow(), 0).toString();
String nome = suaJTable.getValueAt(suaJTable.getSelectedRow(), 1).toString();

SeuObjeto obj = new SeuObjeto(id, nome);

suaCombo.getModel().setSelectedItem(obj); //Recupera o model e depois passa o objeto
rodriguesabner

Então mano, é praticamente a mesma coisa, a única coisa diferente é que na hora de puxar os dados ele não chamou o Model, só na hora de referenciar, por isso o erro…

Jonathan_Medeiros

Justamente, muito bem destacado @rodriguesabner, o preenchimento dos objetos na comboBox devem referenciar o model da mesma também.

M

Para puxar o nome funciona perfeitamente, obrigado, porem quando Clico em Atualizar/Lançar tenho este erro:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`metalflex`.`faturamento`, CONSTRAINT `fk_cliente_faturamento` FOREIGN KEY (`cliente`) REFERENCES `cliente` (`ID_cliente`))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
at model.dao.FaturamentoDAO.update(FaturamentoDAO.java:257)
at view.TelasFaturamento.TelaFaturamentoMetalFlex.btn_atualizarActionPerformed(TelaFaturamentoMetalFlex.java:587)
at view.TelasFaturamento.TelaFaturamentoMetalFlex.access$200(TelaFaturamentoMetalFlex.java:29)
at view.TelasFaturamento.TelaFaturamentoMetalFlex$4.actionPerformed(TelaFaturamentoMetalFlex.java:256)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6539)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6304)
at java.awt.Container.processEvent(Container.java:2239)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2297)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.awt.Container.dispatchEventImpl(Container.java:2283)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
at java.awt.EventQueue$4.run(EventQueue.java:733)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Jonathan_Medeiros

O próprio erro descreve o problema, você está quebrando a integridade de uma FK da sua tabela no banco de dados!
Veja bem, o erro descreve até qual é a FK e qual é a coluna que está ocorrendo a quebra.

Verifique se os dados que você está enviando para atualizar/lançar estão corretos ou se sua FK deveria ser exatamente assim, pois algum dos dois devem estar incorretos.

M

Consegui mano, só tive que mostrar uma coluna ID_cliente na minha Jtable

M
Cliente c = new Cliente();
        c = (Cliente)jTable6.getValueAt(jTable6.getSelectedRow(), 4);
        cmb_cliente.getModel().setSelectedItem(c);

POREM TIVE QUE ADICIONAR UMA COLUNA ID_cliente na Jtable pq por algum motivo sem ela, não funciona o ATUALIZAR/LANÇAR

rodriguesabner

Vc fez assim? Se fez, é por isso. Mas tem um jeito de esconder a coluna ID

tabela.getColumnModel().getColumn(0).setMaxWidth(0);
        tabela.getColumnModel().getColumn(0).setMinWidth(0);
        tabela.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);
        tabela.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0);
Criado 29 de janeiro de 2019
Ultima resposta 29 de jan. de 2019
Respostas 27
Participantes 3