Recuperar ID de Jtable

Olá pessoal, estou com problemas com Jtable.

Estou preenchendo a tabela com campos do banco de dados, só que preciso resgatar a linha selecionada para carregar o registro em outra tela para modificações. Eu queria pegar o id do registro mais não deixar ele aparecendo na tabela, como eu faço isso?

Obrigado!

[]'s

Como você está fornecendo os dados à tabela? Uma boa alternativa seria usar um TableModel contendo um ArrayList com os registros a exibir. Para saber o ID de qualquer deles, bastaria determinar a linha selecionada na JTable e em seguida usar esse valor para ler o elemento adequado no ArrayList do TableModel.

E ai cara . blz.

esse exemplo aqui retorna o valor do campo que esta selecionado…

nomeDaTabela.getValueAt(nomeDaTabela.getSelectedRow(), NumeroDaColunaQueVcQuer);

falow um abraço.

Estou passando um vetor para a tabela…

Você está usando DefaultTableModel?

Estou passando assim:

 DefaultTableModel defaultTableModel = (DefaultTableModel) masterTable.getModel();
 defaultTableModel.addRow(dados);

[]'s

Acho que agora entendi o que vc quer.

vc quer preencher uma tabela…mais não quer que um determinado atributo não apareça né mesmo?
se for isso…tenta assim…

quando vc criar o vetor…cria ele com um campo a mais…ou seja…

se a tabela. tem 2 colunas criar o vetor com tamanho 4 ai vc coloca o valor que vc quer na posição 3
quando vc for pegar o valor ai vc pega o Model da tabela…indicando a posição 3 do model…não da tabela
mais sim do Model…tenta isso…

Você tem que ter alguma maneira de associar a linha da JTable a um determinado ID do Banco de Dados. Você poderia criar um ArrayList para guardar os ID’s, e, a cada linha que adicionasse à JTable, adicionar também um ID ao ArrayList. Aí, para saber o ID selecionado, basta ler a linha selecionada com JTable.getSelectedRow() e em seguida usar essa linha com ArrayList.get() para obter o ID.

Você diz assim:

masterTable.getModel().getValueAt(masterTable.getSelectedRow(), 6))

Tentei mais ele da erro de java.lang.ArrayIndexOutOfBoundsException: 6 >= 6

[]'s

cara… dá uma olhada no ObjectTableModel feito pelo Mark_Ameba…
nele você dá getValue(numeroDaLinha) e ele te retorna o teu objeto inteiro… sem precisar pegar o código para fazer uma pesquisa no banco e sem a necessidade de listar todos os campos…

Provavelmente esta dando erro porque esta fora do indice da tabela, verifique se é esta coluna mesmo.

[quote=erico_kl]cara… dá uma olhada no ObjectTableModel feito pelo Mark_Ameba…
nele você dá getValue(numeroDaLinha) e ele te retorna o teu objeto inteiro… sem precisar pegar o código para fazer uma pesquisa no banco e sem a necessidade de listar todos os campos…[/quote]

Apoiado.

Fora isso, estude como os dados vão para a tabela através do TableModel.

A coluna está certa, mais quando eu recupero usando valueAt o vetor está chegando sem a posição que eu quero.

[]'s

[quote=Mark_Ameba][quote=erico_kl]cara… dá uma olhada no ObjectTableModel feito pelo Mark_Ameba…
nele você dá getValue(numeroDaLinha) e ele te retorna o teu objeto inteiro… sem precisar pegar o código para fazer uma pesquisa no banco e sem a necessidade de listar todos os campos…[/quote]

Apoiado.

Fora isso, estude como os dados vão para a tabela através do TableModel.[/quote]
Se tem alguma coisa que me arrependo é não ter visto teu ObjectTableModel antes…

moço faz assim então…coloca o tamanho da colunas da tabelas 6 mesmo…
só que a ultimo onde vc esta o dados. o que vc faz…seta o tamanho maximo e minimo dela para 0

falow.

Não use DefaultTableModel!!!

Motivos:

  1. É mais difícil que escrever seu próprio TableModel;
  2. É mais lento (usa classes sincronizadas);
  3. Ocupa mais espaço em memória (duplica seus dados);
  4. Deixa o código mais confuso e difícil de manter;
  5. Usa casts inseguros;
  6. Força que você tenha que exibir informações desnecessárias (como o ID) na tabela, ou controlar o ID numa lista separada;
  7. Faz a sua mulher te deixar, o leite da sua geladeira azedar, e pessoas apontarem o dedo para você na rua.
2 curtidas

[quote=ViniGodoy]Não use DefaultTableModel!!!

Motivos:

  1. É mais difícil que escrever seu próprio TableModel;
  2. É mais lento (usa classes sincronizadas);
  3. Ocupa mais espaço em memória (duplica seus dados);
  4. Deixa o código mais confuso e difícil de manter;
  5. Faz a sua mulher te deixar, o leite da sua geladeira azedar, e pessoas apontarem o dedo para você na rua.[/quote]
    :shock: Nossa! O último argumento eu não conhecia ainda… :smiley:

Olá amigo

uma rotina que desenvolvi:

chamda da consulta:

private void jButtonPesquisaClienteActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
  Consultacliente.setNome(tfNomeCliente.getText());
  Consultacliente consultaCliente = new Consultacliente(null);
  consultaCliente.setModal(true);
  consultaCliente.setVisible(true);

  id_cliente  = consultaCliente.getCodigo();
  try {
       if (!id_cliente.equals(null)) {
          selecionaCliente();
       }
       else {
         tfIdCliente.requestFocus();
      }
  } catch (Exception ex) {
      Logger.getLogger(FrameOrdemServicoOld.class.getName()).log(Level.SEVERE, null, ex);
  }
}

agora na tela de consulta:

/*
 * Consultacliente.java
 *
 * Created on 24 de Agosto de 2008, 19:48
 */

package assistenciadesktop;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.sql.*;
import java.util.*;
import java.awt.GridLayout;
import assistenciadesktop.FrameClientes_old;
import bd.ConexaoBancoDados;
import javax.swing.event.AncestorListener;
import javax.swing.table.DefaultTableModel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.Object;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;


/**
 *
 * @author  Silvio Guedes
 */
public class Consultacliente extends javax.swing.JDialog {
    //private JTable jTable = null;
    private java.sql.Statement stmt;
    public int linhastabela;     
    public Object Codigo;
    private boolean okSelecionado;
    static String nomeConsulta;
  

  
    /** Creates new form Consultacliente */
    public Consultacliente(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

    Consultacliente(Object object) {
        try {
            initialize();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Consultacliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

   public Object getCodigo() {
        return Codigo;
        //throw new UnsupportedOperationException("Not yet implemented");
    }
 
   public static void setNome(String Nome) {
       nomeConsulta = Nome;
   }
   
   public String getNome() {
     return nomeConsulta;
   }
   
   
public boolean SelecionaDados()    
    {        
        okSelecionado = false;  //Marcamos que o ok não foi selecionado
        setModal(true);         //A dialog tem que ser modal. Só pode retornar do setVisible após ficar invisível.
        setVisible(true);       //Mostramos a dialog e esperamos o usuário escolher alguma coisa.
        return okSelecionado;   //Retornamos true, se ele pressionou ok.
    }   

  private void mostrarResultados(ResultSet rs) throws SQLException, ClassNotFoundException {
       Statement statement;
 
        String[] tableColumnsName = {"", "Código", "Nome", "Fone"};        
        final DefaultTableModel aModel = new DefaultTableModel(tableColumnsName, 0) {

            @Override
            public Class getColumnClass(int column) {
                Class returnValue;
                if ((column >= 0) && (column < getColumnCount())) {
                    if (getValueAt(0, column) != null) {
                        returnValue = getValueAt(0, column).getClass();
                    } else {
                        returnValue = Object.class;
                    }
                } else {
                    returnValue = Object.class;
                }
                return returnValue;
            }

            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }
          
    };
        
        if (linhastabela == 0) {
            JOptionPane.showMessageDialog(this, "Nehum registro encontrado");
            return; 
        }
        else {
           final JTable jTable = new JTable();
           JScrollPane jScrollPane = new JScrollPane(jTable); 
           getContentPane().add(jScrollPane,java.awt.BorderLayout.CENTER);
           aModel.setColumnIdentifiers(tableColumnsName);        
           java.sql.ResultSetMetaData rsmd = rs.getMetaData();
           int colNo = rsmd.getColumnCount();
        
           while(rs.next()){
              Object[] objects = new Object[colNo];
              objects[0] = rs.getObject(1);
              objects[1] = rs.getObject(2);
              objects[2] = rs.getObject(3);
              objects[3] = rs.getObject(4);
              aModel.addRow(objects);
           }

           jTable.setModel(aModel);             
           jTable.setFillsViewportHeight(true);
           jTable.getTableHeader().setReorderingAllowed(false);
           jTable.getColumnModel().getColumn(0).setWidth(0);
           jTable.getColumnModel().getColumn(0).setPreferredWidth(0);
        
           jTable.getColumnModel().getColumn(1).setPreferredWidth(50);
           jTable.getColumnModel().getColumn(2).setPreferredWidth(300);      
           jTable.getColumnModel().getColumn(3).setPreferredWidth(100);
           jTable.setAutoCreateRowSorter(true);
           TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(jTable.getModel());
           jTable.setRowSorter(sorter);
           jTable.getColumnModel().removeColumn( jTable.getColumnModel().getColumn(0));
           jTable.getSelectionModel().setSelectionInterval(0, 0);
           jTable.requestFocusInWindow();      
           
           jTable.addMouseListener(new MouseAdapter(){  
                @Override
           public void mouseClicked(MouseEvent e){  
              if (e.getClickCount() == 2){  
                 // Listaclientes.id  = jTable.getModel().getValueAt(jTable.getSelectedRow(),0);
                    Codigo = jTable.getModel().getValueAt(jTable.getSelectedRow(),0);
                    dispose();
              }  
           }
           });
        }    

} 
        
    private void getJTable() throws ClassNotFoundException, ClassNotFoundException{
       Statement statement;
       ResultSet result;
       
       try {
           stmt = bd.ConexaoBancoDados.conexao().createStatement(); 
           String query = "select id,id,nome,telefone from clientes where upper(nome) ilike "+"upper('%"+
                         nomeConsulta+"%') order by nome";
           ResultSet rs = stmt.executeQuery(query);
           mostrarResultados(rs);
           stmt.close();
       }
       catch (SQLException sqlex) {sqlex.printStackTrace();}
           
}    
    
    private void initialize() throws ClassNotFoundException {
        ResultSet rst;
        this.setSize(600,400);
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();  
        this.setLocation((tela.width-this.getSize().width)/2,   
            (tela.height-this.getSize().height)/2); 
        nomeConsulta = this.getNome();
        try {
            
            stmt = bd.ConexaoBancoDados.conexao().createStatement();
            String query = "select count(*) from clientes where upper(nome) ilike "+"upper('%"+
                     nomeConsulta+"%')";
 
            rst = stmt.executeQuery(query);
            while(rst.next()){
              Object[] objects = new Object[1];
              objects[0] = rst.getObject(1);
            linhastabela = rst.getInt(rst.getRow()); 
            }
            
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(Consultacliente.class.getName()).log(Level.SEVERE, null, ex);
        }
        getJTable();
        this.setTitle("Clientes");
        this.setDefaultCloseOperation(Consultacliente.DISPOSE_ON_CLOSE);
}    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setName("Form"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Consultacliente dialog = new Consultacliente(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables

}

Boa Sorte!

Silvio Guedes

ah… então foi por isso… :smiley:

1 curtida

Bom saber. Nunca vou usar DefaultTableModel.

Quem usa DefaultTableModel não arranja namorada :lol: