[resolvido] - jTable - pegar valor

Gente…

Coloquei um evento na Jtable (mouseClicked)… queria que quando ele clicasse em uma linha
eu pegasse o objeto da linha (Lembrando que eu tenho o meu proprio TableModel) para que
o programa ‘setasse’ alguns textFields de acordo com o objeto retornado da linha selecionada…

Como “pego” o objeto contido na linha que ele digitou?

Pois é… tentei achar sobre isso no forum … Posso até ter digitado mal… Desculpem de qualquer maneira

cara, isso é relativamente simples!

//no seu table model deve ter algo +/- assim:
public nomeDaSuaClasse getSelectedObject( int row )
{
     return seuArrayDaClasse[row];
}

pra pegar o numero do row eh relativamente simples

SuaClasse objeto = ((SeuTableModel)tabela.getModel()).getSelectedObject( tabela.getSelectedRow() );
//seta os dados do objeto nos textsfields!

ja quanto se utiliza o RowFilter nao sei como fazer esse retorno do objeto!

é simples mesmo…
eu ja tinha implementa o ‘getMEUOBJETO’ no table model…

na verdade eu esqueci era o

‘getSelectedRow();’

passei mta vergonha agora
kkkkkkkk
vlwww mnainho

hehehe
blz!
qualquer duvida tamos ai!

oi pessoal, me desculpem a intromissão e tardia.
não consigo resposta apra algo q possa se encaixar aqui. Pensei q a sua solução poderia substituir a minha e solucionar outro problema mas não foi o q aconteceu.
eu dou 2 clicks numa row de uma jtable para abrir um formulário com os dados da linha selecionada, mas quando eu reordeno a tabela e dou o click, não é exibido o que eu vejo, mas sim o registro q estava antes de reordenar(a posição original de quando fou carregada a tabela).
como fazer para a tabela me passar os dados referentes a linha q eu dou o click?

[quote=daquinho]oi pessoal, me desculpem a intromissão e tardia.
não consigo resposta apra algo q possa se encaixar aqui. Pensei q a sua solução poderia substituir a minha e solucionar outro problema mas não foi o q aconteceu.
eu dou 2 clicks numa row de uma jtable para abrir um formulário com os dados da linha selecionada, mas quando eu reordeno a tabela e dou o click, não é exibido o que eu vejo, mas sim o registro q estava antes de reordenar(a posição original de quando fou carregada a tabela).
como fazer para a tabela me passar os dados referentes a linha q eu dou o click?[/quote]

isso é por que o seu BD estta pegando os dados “anteriores”, quando você ordenar a tabela, vc nao pode pegar os dados DA POSIÇÃO da tabela, e simn pesquisar no banco QUAL elemento que você está vendo… é simples assim…
também passei por isso :slight_smile:
abraços

acho q entendi… quando eu dou o double-click, estava buscando na memória, a posição daquela linha numa List, mas ai eu reordeno a tabela, no visual ele muda e por traz(nos códigos) ele não muda, é purametne visual a mudança.
então tenho q ir no banco buscar o que eu quero? sempre q ouver qualquer mudança tenho ir no banco buscar novametne os dados seguinte esse nava mudança?

[quote=daquinho]acho q entendi… quando eu dou o double-click, estava buscando na memória, a posição daquela linha numa List, mas ai eu reordeno a tabela, no visual ele muda e por traz(nos códigos) ele não muda, é purametne visual a mudança.
então tenho q ir no banco buscar o que eu quero? sempre q ouver qualquer mudança tenho ir no banco buscar novametne os dados seguinte esse nava mudança?[/quote]

parabens, aprendeu rápido…

É exatamente isso!
Abraços

opa… acabei de penser em outra coisa.
justamente, é em meméria q está a minha lista q foi carregada na jtable, selecionando a linha pego os dados q estão na lista e baseado nesses dados eu vou no banco.
mas como fazer isso se eu não consigo pegar o registro certo nessa lista com a tabela reordenada?
ou tem outra forma de ir direto no banco? sacou o q eu quero?
ir no banco tudo bem, mas na verdade eu quero abrir um formulário para ai sim editar os campos e salvar no banco, mas quando eu clico na tabela, vem dados de outra linha, a linha q estava naquela posição antes de reordenar.

estou começando a pensar em impedir a reordenação da tabela!!!

[quote=daquinho]opa… acabei de penser em outra coisa.
justamente, é em meméria q está a minha lista q foi carregada na jtable, selecionando a linha pego os dados q estão na lista e baseado nesses dados eu vou no banco.
mas como fazer isso se eu não consigo pegar o registro certo nessa lista com a tabela reordenada?
ou tem outra forma de ir direto no banco? sacou o q eu quero?
ir no banco tudo bem, mas na verdade eu quero abrir um formulário para ai sim editar os campos e salvar no banco, mas quando eu clico na tabela, bem dados de outra linha, a linha q estava naquela posição antes de reordenar.[/quote]

A solução é a mesma que a gente conversou meu amigo… Você tem que criar um método como:

“EncontrarNoBanco” ou algo assim,
que antes de você abrir o forumulario ele vai pesquisar em qual registro que você está e vai enviar esses dados para o forumulario carregar essas informações (construtor)…

Isso não seria necessário, caso você tenha o seu próprio tableModel…

Por exemplo, eu tenho uma tabela com os meus Fornecedores, quando eu seleciono uma linha, veja o que o meu “modelo” faz:

        Fornecedor f12;
        f12 = modelo.getFornecedor(jTable1.getSelectedRow());

        campo_Cidade.setText(f12.getCidade());
        campo_End.setText(f12.getEndereco());
        campo_Nome.setText(f12.getNome());
        campo_Tel.setText(f12.getTelefone());
        proc = f12.getNome();

viu ? Eu pego o modelo e carrego no objeto f12 para setar as informações do campo, e isso só é possível por que eu criei o meu proprio tableModel…

Abraços

bom dia,
eu entendi o que sugeriu mas continuo afirmando que não adinta, estou fazendo isso mas não dá resultado esperado.

A solução é a mesma que a gente conversou meu amigo… Você tem que criar um método como:

[quote]“EncontrarNoBanco” ou algo assim,
que antes de você abrir o forumulario ele vai pesquisar em qual registro que você está e vai enviar esses dados para o forumulario carregar essas informações (construtor)…[/quote]
eu abro o formulário passando um bean, esse bean é o tipo de dado que preenche o jtable, com esse bean tiro as infromações que preciso para buscar o restante das infromações no banco e preencher o formulário.

eu estou extendendo AbstractTableModel para o meu modelo.

veja:
Modelo

class TabelaModelo extends AbstractTableModel{

        private String[] colunas = {"EMPRESA","NOME","TELEFONE1","RÁDIO", "ESTADO","MUNICÍPIO"};
        private List<BeanTabelaModelo> dados;

        private DaoTabelaModelo daoTabelaModelo = new DaoTabelaModelo();

        public TabelaModelo(){
                try {
                        setDados(daoTabelaModelo.listarParaTabela());
                } catch (SQLException ex) {
                        ErroAgenda.exibirMensagemErro("não é possível listar na tabela:\n"+ex);
                }
        }

        public List<BeanTabelaModelo> getDados() {
                return dados;
        }

        private void setDados(List<BeanTabelaModelo> dados) {
                this.dados = dados;
        }

        public int getRowCount() {
                return dados.size();
        }

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

        public Object getValueAt(int rowIndex, int columnIndex) {
                // SQL usado para popular a lista
                //select empresa.id, empresa.nomefantasia, contato.nome, telefone.telefonefixo1, telefone.radio, endereco.estado, endereco.municipio from empresa, contato, telefone, endereco where empresa.id_contato=contato.id and empresa.id_telefone=telefone.id and empresa.id_endereco=endereco.id
                BeanTabelaModelo linha = dados.get(rowIndex);

                        if(columnIndex == 0) return linha.getNomeFantasia();
                        if(columnIndex == 1) return linha.getNomeContato();
                        if(columnIndex == 2) return linha.getTelefone1();
                        if(columnIndex == 3) return linha.getRadio();
                        if(columnIndex == 4) return linha.getEstado();
                        if(columnIndex == 5) return linha.getMunicipio();
                        if(columnIndex == 6) return linha.getId_empresa();
                return "";
        }

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

        BeanTabelaModelo getLinhaTabelaModelo(int row){
                return (BeanTabelaModelo)dados.get(row);
        }
}


na tela principal onde tem o Jtable, eu chamo a tela de formulário assim:

private void tabelaMouseClicked(java.awt.event.MouseEvent evt) {                                    
        if(evt.getClickCount() == 2){
                BeanTabelaModelo btm = (BeanTabelaModelo) tabelaModelo.getDados().get(tabela.getSelectedRow()); // esse bean é a classe q criei p facilitar preencher a tabela, nela tem as PKs para buscar o restate dos dados no banco 

                TelaCadastro telaCadastro = new TelaCadastro(btm);
                telaCadastro.setTitle("Alterar Contato");
                telaCadastro.setVisible(rootPaneCheckingEnabled);
        }
    }
...

o método que aciona o cadastro ou a edição dos dados no formulário
obs: os beans já estão preenchidos lá no construtor.

    private void btnGravarActionPerformed(java.awt.event.ActionEvent evt) {     // quando aciono o botão q vai cadastrar ou editar os campos                                       
        long id_contato , id_empresa, id_endereco, id_telefone;  // guarda apra mim as PKs de cada entidade do banco

                DaoContato daoContato = new DaoContato();
                DaoEndereco daoEndereco = new DaoEndereco();
                DaoTelefone daoTelefone = new DaoTelefone();
                DaoEmpresa daoEmpresa = new DaoEmpresa();

                TabelaModelo tabelaModelo = new TabelaModelo();
                String msg = "";

                if(validarCampos() == true){  // se os capos estiverem com o conteúdo além do permitido não entra na condição(if)
                        salvarCampos();             // pega o conteúdo de cada campo e salva nos beans

                        if(empresa.getId() == -1){       // se id fro igual a -1 é um cadastro.
                                id_contato = daoContato.cadastrar(contato);
                                id_endereco = daoEndereco.cadastrar(endereco);
                                id_telefone = daoTelefone.cadastrar(telefone);

                                empresa.setIdContato(id_contato);
                                empresa.setIdEndereco(id_endereco);
                                empresa.setIdTelefone(id_telefone);
                                daoEmpresa.cadastrar(empresa);

                               tabelaModelo.fireTableRowsInserted(tabelaModelo.getRowCount()-1,tabelaModelo.getRowCount()-1); // isso é uma tentativa, ainda n consegui atualizar automaticamente a jtable

                                msg = "Cadastrado!";
                        } else {
                                        daoContato.alterar(contato);
                                        daoEndereco.alterar(endereco);
                                        daoTelefone.alterar(telefone);
                                        daoEmpresa.alterar(empresa);

                                        tabelaModelo.fireTableRowsUpdated(0,tabelaModelo.getRowCount()-1);

                                       msg = "Alterado!";
                        }
                        JOptionPane.showMessageDialog(null, msg);
                }
                else {
                        JOptionPane.showMessageDialog(null, "Não é possível cadastrar ou atualizar com todos os campos vazios");
                }
                this.dispose();
    }

consigo cadastrar sem atualizar automaticamente a JTable e sempre que tento atualizar os dados trava a aplicação sem ao menos mostrar algum erro no console do Netbeans ou qualquer outro lugar, tenho q cancelar no runtime da IDE.
será que consegue me ajudar?
até “tentei” usar o debug, consego indetificar algumas coisas mas n consegui mesmo identificar.
não uso frameWork por ser uma aplicação pequena… sim está dando trabalho eu sei, muito mais do que eu esperava mas é para aprendizado, logo depois dessa, o uso do framework vai ser obrigatório, até pq estarei masi confiante e a aplicaçaõ seguinte será maior.
obrigado.

Não estou entendendo muito bem o esquema de TableModel… Estou utilizando um table model que eu modifiquei pra se adequar a minha necessidade, mas queria saber como faço pra pegar os dados…

Pelo que li da API o getSelectedRow retorna um int. Esse int é o numero da linha no array que tem meus dados. Preciso pegar os valores dessa linha do array.

(acho que até aqui está certo, né?)

O que estou tentando fazer é um botão que abra um form de edição com os dados referentes aquela linha… (pouca diferença do que foi perguntado no começo do tópico).

Estou usando um @Action mas quando tento chamar o getSelectedRow do meu TableModel diz que o “metodo não estático não pode ser referenciado por um metodo estático”

A mensagem é clara… mas o que faço pra resolver isso??

Estou fazendo errado?? (provavelmente)

//logo mais coloco o codigo

EDIT:

Desculpe… consegui acertar agora… só precisava pensar um pouco mais na lógica dos métodos e o que eu precisava fazer… :thumbup:
:lol:

private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {

           int linha_seleciconada = jTable1.getSelectedRow();  // 
   
       tx_id.setText(jTable1.getValueAt(linha_seleciconada, 0).toString());           //vc coloca o nome da variavel, adiciona a linha no caso seria essa que criei "linha_selecionada" e coloca o valor da coluna "0".........................

      tx_nome.setText(jTable1.getValueAt(linha_seleciconada, 1).toString());      //vc coloca o nome da variavel, adiciona a linha no caso seria essa que criei "linha_selecionada" e coloca o valor da coluna "1" ......ASSIM POR DIANTE................... SIMPLES E FACIL!!
  
   
}