Recuperar ID de Jtable

47 respostas
L

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

47 Respostas

R

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.

A

E ai cara . blz.

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

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

falow um abraço.

L

Estou passando um vetor para a tabela…

R

Você está usando DefaultTableModel?

L

Estou passando assim:

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

[]'s

A

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…

R

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.

L

Você diz assim:

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

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

[]'s

E

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…

T

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

M

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…

Apoiado.

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

L

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

[]'s

E

Mark_Ameba:
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…

Apoiado.

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


Se tem alguma coisa que me arrependo é não ter visto teu ObjectTableModel antes…

A

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.

V

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.
M

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.

:shock: Nossa! O último argumento eu não conhecia ainda… :smiley:
S

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

E

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

C

Bom saber. Nunca vou usar DefaultTableModel.

Quem usa DefaultTableModel não arranja namorada :lol:

E

Páscoa… época de ressurreição… :smiley:

A

cara nao concordo… uso defeautTableModel e nunca tive problemas… ela ja contém os métodos nescessários, getSelectedRow, getValueAT, e etc.

realmente nunca tive problema, faço consultas no BD e tenho uma resposta rápida, sem tilts…

e detalhe, uso ela em uma JInternalFrame, integrada… nunca tive problema.

fiz uma aplicação de quase 50 classes, todas abrindo em uma só janela… e tem umas 15 a 25 tabelas, todas como DefeautTableModel…

so q detalhe, nao sei como criar a minha própria TableModel… nao tenho nem idéia, nunca tive nem o interesse em pesquisar como se faz, por isso penso assim, mais

quem sabe… pode ser que essas opções que o VINY GODOY abordou ai pode ser verdade, mais so se me provarem ao contrário…

se eu ver uma tabela que nao seja DefeautTableModel rodando, e eu ver as diferenças…ai sim…

mais se alguem ai souber como faz uma TableModel… posta ai… pode ate esclarecer a dúvida de outros… q por sinal é a minha agora… irei pesquisar por ai como se faz…

valew galera…

V

Bom, isso explica muita coisa.

Você já consegue criar suas próprias classes de negócio e separa a aplicação em camadas, como rezam as boas práticas de programação?

Ou está rodando selects direto no banco e jogando na tabela, como se fazia lá pelo final dos anos 80?

Se for a primeira opção, acho muitíssimo difícil que você realmente prefira o DefaultTableModel. Também gostaria de saber como você resolveu o problema de, por exemplo, atualizar um registro de um campo, sem exibir seu ID na tabela.

M

É, eu também gostaria de saber como voce criou essas 15~25 DefaultTableModels para modificar o conteudo da tabela.

Voce criou tudo isso de DAOs só para preencher a tabela?

E a duvida do ViniGodoy ainda é valida

D

Boa tarde a todos.

Também gostaria de saber como voce recupera uma linha de registros sem fazer o casting :?: Isto é presumindo que voce tenha criado entidade de dados, com um bean por exemplo, passando os dados para o DAO.

Com AbstractTableModel, voce já cria um TableModel, onde o armazenamento do JTable pode ser um dessas entidades de dados, onde ao se clicar na linha de um JTable, ele já retorna essa entidade devidamente populada, é muito melhor do que voce ficar fazendo diversos castings desnecessários.

Além disso, se voce tem uma aplicação que acessa 100 tabelas de um banco, voce vai criar 100 classes DefaultTableModels, como o Marky.Vasconcelos citou.

Aqui na Secretaria, nós temos um Mega Banco de dados que acessa simplesmente 325 tabelas, e consegui criar lista de dados configurando uma classe extendida de AbstractTableModel genérica para todas as 325 tabelas, onde elas são acessadas em único JTable.

A

correto, eu crio um pacote DAO so para métodos de acessos ao banco, um pacote GETs para armazenar as minhas classes ENTIDADES de GETs and SETTERRS…Encapsulamento e outro pacote, APRESENDAÇÃO, só com as classes de layouts… as que irá aparecer para o usuário…

REEEESUMINDO !!! USO O PADRÃO MVC!!!

e estava programando em SDI, ião se abrindo JANELAS E JANELAS…era janela pra todo lado…

agora estou programando em MDI… fica muuuito mais prático…

e atualizo registro, excluo, altero, tudo passando para outra classe, capturando a linha selecionada… e tambem, nas minhas classes de cadastros de funcionario concursados, terceirizados e etc., os cargos ou salários são listados dentro de uma comboBox apartir de uma consulta em uma tabela específica do BD de acordo para cada cargo.

exemplo…

para eu listar meu funcionário na minha defeautTableModel uso:

public void listarTodos(){
		FuncionarioDAO operac = new FuncionarioDAO();
		ArrayList&lt;FuncionarioGET&gt; lista = operac.consultarTodos();
		
		Object []vec=null; 
		vec = new Object[14];

		for (int i=0; i&lt;lista.size(); i++){ 
			  vec[0]  = ((lista.get(i).getId()));
			  vec[1]  = ((lista.get(i).getNome()));
			  vec[2]  = ((lista.get(i).getCpf()));
			  vec[3]  = ((lista.get(i).getRg()));
			  vec[4]  = ((lista.get(i).getEmail()));
			  vec[5]  = ((lista.get(i).getSexo()));
			  vec[6]  = ((lista.get(i).getEmpresa()));
			  vec[7]  = ((lista.get(i).getSetor()));
			  vec[8]  = ((lista.get(i).getCargo()));
			  vec[9]  = ((lista.get(i).getEstadoCivil()));
			  vec[10] = ((lista.get(i).getSalario()));
			  vec[11] = ((lista.get(i).getLocalizacao()));
			  vec[12] = ((lista.get(i).getEndereco()));
			  vec[13] = ((lista.get(i).getIdade()));	
			  modelo.addRow(vec);
		}
	}

pode nao ser a melhor maneira, mais é so assim que eu sei fazer…

outro exemplo, pra eu alterar uma linha selecionada uso:

btnAlterar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					try {
						jk.setNome((String)tabela1.getValueAt(tabela1.getSelectedRow(),1));
						jk.setCpf((String)tabela1.getValueAt(tabela1.getSelectedRow(),2));
						jk.setRg((String)tabela1.getValueAt(tabela1.getSelectedRow(),3));
						jk.setEmpresa((String)tabela1.getValueAt(tabela1.getSelectedRow(),6));
						jk.setCargo((String)tabela1.getValueAt(tabela1.getSelectedRow(),8));
						jk.setSetor((String)tabela1.getValueAt(tabela1.getSelectedRow(),7));
						jk.setEstadoCivil((String)tabela1.getValueAt(tabela1.getSelectedRow(),9));
						jk.setSalario((String)tabela1.getValueAt(tabela1.getSelectedRow(),10));
						jk.setEmail((String)tabela1.getValueAt(tabela1.getSelectedRow(),4));
						jk.setEndereco((String)tabela1.getValueAt(tabela1.getSelectedRow(),12));
						jk.setIdade((String)tabela1.getValueAt(tabela1.getSelectedRow(),13));
						jk.setLocalizacao((String)tabela1.getValueAt(tabela1.getSelectedRow(),11));
						jk.setSexo((String)tabela1.getValueAt(tabela1.getSelectedRow(),5));
						jk.setId((String)tabela1.getValueAt(tabela1.getSelectedRow(),0));
						new Alterarfuncionarios(jk);
					} catch (ArrayIndexOutOfBoundsException e1) {
						JOptionPane.showMessageDialog(null, "Selecione um funcionario para ALTERAÇÃO");
					}	
				}
			});

para excluir a mesma coisa:

btnExcluir.addActionListener(new ActionListener() {
				
				public void actionPerformed(ActionEvent arg0) {
					try {
						jk.setNome((String)tabela1.getValueAt(tabela1.getSelectedRow(),1));
						FuncionarioDAO op = new FuncionarioDAO();
						op.excluir(jk);
						setVisible(false);
					} catch (ArrayIndexOutOfBoundsException e1) {
						JOptionPane.showMessageDialog(null, "Selecione um funcionario para EXCLUSÃO");	
					}
				}
			});

e dentro dos meus métodos de alteração, exclusão ou insersão, os próprios métodos ja fazem REFRESH na minha tabela automaticamente.

na execução…

public static void main(String[] args) throws SQLException, ClassNotFoundException {
		
EventQueue.invokeLater(new Runnable() {			
			public void run() {
			TabelaFuncionarios tblFunc = new TabelaFuncionarios();
	                tblFunc.setVisible(true);
                        tblFunc.listarTodos();
			}
		});
	}

+++ mais eu repito, essas nao devem ser as melhores maneiras de se fazer… por isso que entrei no fórum, PARA APRENDER… e APRENDER A ENSINAR…

pq a minha dúvida que tirei aqui no FÓRUM, posso muito bem ensinar a alguém que esta tbm afim de aprender… mais so agora eu me deparei com um problema usando defeautTableModel, problema para imprimir a tabela, ou gerar um relatório…

so consigo imprimir criando uma JTable e adicionando colunas e linhas, através de vectores, sem consultas no BD.

mais eu vou dar mais uma pesquisada… vou tentar implementar consultar a esses vectores de inserção.

e eu estou muuuuito curioso agora em criar uma TableModel, ou tentar usar uma dessas ai AbstractTableModel ou ObjectTableModel…

mais é isso ai…

e galera, confesso, sou leigo em JAVA… so q eu sei bastante coisa… e me preoculpa nao saber se é padrão o não.

e avaliem esses meus blocos de códigos ai e digam o q vcs acham…

valew pessoal… e me desculpe ai qualquer coisa… sou meio retardado as vezes… tenho até medo de pensar que estou virando NERD… kkkkk

valew… lfwssss…

pedro.setVisible(false);>

M

Sobre as implementações, AbstractTableModel é só a classe abstrata que deve ser implementada para um TableModel eficiente, o ObjectTableModel já é um TableModel generico que implementei.

E os seus códigos usando um TableModel OO (como o ObjectTableModel por exemplo) seriam o seguinte.

public void listarTodos(){
		FuncionarioDAO operac = new FuncionarioDAO();
		ArrayList&lt;FuncionarioGET&gt; lista = operac.consultarTodos();
		
                modelo.addAll(lista); //addAll para adicionar todos ao modelo ou setData para ser exatamente esta lista
	}

Para alterar

btnAlterar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
                                                new Alterarfuncionarios(modelo.get(tabela1.getSelectedRow()));
				}
			});

Para excluir

btnExcluir.addActionListener(new ActionListener() {				
				public void actionPerformed(ActionEvent arg0) {
						FuncionarioDAO op = new FuncionarioDAO();
						op.excluir(modelo.get(tabela1.getSelectedRow()));
						setVisible(false);
				}
			});

Muito mais simples não?

Fora o fato que voce nem precisa exibir esse campo id na tabela e deixar apenas para uso interno.

A

carara bicho… sério mesmo q funciona…???

vou testar aqui e depois eu respondo…

vlws…

A

não funcionou…

da erro nos GET.

todos as 3 linhas de código q vc passou… listarTodos(), alterar e excluir.

tentei de tudo… mudei o construtor e tudo, e nada…

vlw…

mais deicha essa duvida pra lah… vou procurar as objectTableModel…

flws…

valew ai a tentativa…

E

O exemplo do Mark mostra como ficaria para adicionar e recuperar funcionários de uma tabela com um table model próprio (FuncionarioTableModel, por exemplo). Com DefaultTableModel, só fazendo esses laços gigantes para carregar o Vector com Strings.

Aqui no GUJ mesmo tem vários exemplos de TableModel espalhados pelos tópicos. Pelos links da assinatura do ViniGodoy e do Mark você encontra ótimos exemplos

http://www.guj.com.br/java/149034-duvidas-ao-fazer-uma-consulta#808003

http://www.guj.com.br/java/147521-inserir-dados-da-jtable-no-banco/3#799170

http://www.guj.com.br/java/132698-jtable-removendo-colunas-em-tempo-de-execucao#714736

http://www.guj.com.br/java/225793-exemplo-de-tablemodel#1156821

D

aproveitando o tópico… minha dúvida se encaixa aqui tb.
eu tenho 4 listas que juntas formam um registro maior(num cadstro essas 4 formam um grande formulário) e quero pegar algumas propriedades de cada uma dessas listas e colocar num jtable, já vi que vou criar uma tabela que vai extender AbstractTableModel para evitar um certo engessamento do código. Quando eu selecionar uma linha da tabela, quero abrir em outra janela aquele formulário de cadastro, mas dessa vez seria para editar os dados.
Eu fiz um pequeno teste e vi que posso criar a minha tabela com 4 colunas visíveis e criaria uma quinta coluna nos dados para a tabela para guardar a ID de uma dessas listas para poder recuperar, se eu deixa-se esse ID na primeira posição ele é exibido e não quero isso, deixando ele na ultima posição ele não é exibido e posso buscar esse ID para identificar essa linha na tabela e buscar os registros certos para edita-los.
Alguém tem idéia melhor para recuperar esse Id que vai me levar para os registros certos? ou é isso mesmo?
vlw.

V

O TableModel só exibe o que você pedir para ele mostrar. Como está escrito esse seu TableModel?

D

eu ainda não o escrevi, estou estudando a uns dias, achava alguns exemplo que lia ruins com o JTable padrão ou passando DefaultTableModel, via que era muito trabalho para popular a tabela.
Eu só preciso que me apontem o caminho para seguir essas descrições, registros formados por campos de objetos diferentes e uma forma de quando selecionado, eu posso buscar todos esse objetos de volta, acho esse forma de deixar o id omitido de um dos objetos, meio estranho e feio.

V

Tente escrever seu TableModel. Essa dúvida irá desaparecer assim que vc entender como ele funciona.

D

devo extender AbstractTableModel, é a melhor solução para reescreber meu TableModel e simplificar minha tabela? certo?

V

Certo.

D

Certo.
acabei de atualizar um post várias alterações sugeridas, tb com a ajuda do amigo do outro post(do link abaixo), realmente fica bem melhor, dividido, legível e flexivel, com o tempo pode-se dizer que realmente é mais fácil ter trabalho hj e menos amanhã.

na tela principal onde tem a tabela que é populada com um beans específico(ele coleta os dados de outros beans para n exibir dezenas de dados), peço para cadstrar, abre-se um formulário, após esse ser preenchido, quero q a tabela atualize. Quando eu conseguir isso, acho q vou fácil no update e delete.
http://www.guj.com.br/java/232068-varios-objetos-em-uma-tabela-no-netbeans/1

V

Esse post é pra você: http://www.guj.com.br/java/55710-comunicacao-de-dados-entre-duas-janelas#292687

D

Esse post é pra você: http://www.guj.com.br/java/55710-comunicacao-de-dados-entre-duas-janelas#292687
vc se refere a passar sempre os objetos e a divisão das tarefas em cada classe? isso?
o meu problema é quando eu cadastro ou atualizo os dados no formulário, em seguida na tela principal a tabela se atualizar sozinha, eu chamo dentro do formulário o modelo e executo fireTableModelUpdate() e nada de atualizar a tabela.

A

Vini,
estou ralando sobre a construção de tabelas, e encontrei no google um link que aponta para o site da Oracle que explica o funcionamento do JTable e fornece alguns exemplos.
http://download.oracle.com/javase/tutorial/uiswing/components/table.html
Você poderia me dizer por gentileza, se esse é exatamente o que eu não devo utilizar para construir as tabelas, ou esses exemplos podem ser úteis para mim?

Muito obrigado,

Airton

R

Estou jogando o objeto inteiro no vetor, aí eu nao preciso do id

int id=0;
        for(Conta item : contas){
            data[id][0]=item;
            id+=1;
        }

data[]

L

Boa noite ViniGodoy,
Será que é por isso que minha aplicação trava (estouro de memória da JVM).
Ela atualiza uma tabela a cada 30 segundos (Timer), cuja a mesma e demais do sistema utiliza DefaultTableModel.
De duas em duas horas preciso fechar a aplicação matando o processo.
Se puder me responder agradeço.
Abraço!

V

O ideal seria usar um profiler, como o VisualVM, e ver exatamente onde está seu gargalo de memória. Se estiver usando o Netbeans, ele tem um profiler ainda melhor.

PS: Evite ressuscitar tópicos muito antigos. Levei um tempão para descobrir o que era o “isso” que você falava na sua frase.

L

Me desculpe pelo tópico antigo, é que realmente me chamou a atenção sendo talvez uma solução para mim.
Minha aplicação roda a mais de 2 anos e não consegui resolver esse problema.
Utilizo sim o NetBeans. Você se refere a utilizar o ‘Perfil Projeto’ do NetBeans?
Tempos atrás eu fiz este teste e obtive o resultado conforme a figura.
Thread causando exceção OutOfMemoryError: [color=blue]AWT-EventQueue-0[/color]

V

Isso mesmo. Vai ali em instâncias e você vai ver que provavelmente existem centenas de instâncias da mesma classe. Pega algumas amostras e vasculha a quem essas instâncias estão ligadas. Depois, procura no seu código o porque essas instâncias não estariam morrendo.

Há altíssimas chances de haver alguma variável estática segurando esse pessoal todo.

L

Opa, Vini. Já é uma luz rsrs.
Vou fazer outra análise e te retorno com uma resposta positiva.
Por enquanto agradeço.
Boa Semana!

L

ViniGodoy:
Isso mesmo. Vai ali em instâncias e você vai ver que provavelmente existem centenas de instâncias da mesma classe. Pega algumas amostras e vasculha a quem essas instâncias estão ligadas. Depois, procura no seu código o porque essas instâncias não estariam morrendo.

Há altíssimas chances de haver alguma variável estática segurando esse pessoal todo.

Bom dia Vini. Cara eu passei a madrugada analisando o ‘Perfil do Projeto’. Vi muitas instâncias de classes repetidas (ex.: bytes = 255.299 instâncias), porém não sei se é relativo ao meu código escrito ou são das classes JAVA (String, Double…), percebi a memória tentando acompanhar o constante crescimento do consumo da aplicação até se esgotar, e analisei a quantidade de Threads sendo executadas, porém ainda não cheguei a nenhuma solução.
Acredito que minha necessidade fugiu do contexto deste tópico (Recuperar ID de Jtable), gostaria de criar uma nova discussão sobre o assunto (ex: Aplicação travando, estouro de Memória da JVM).
Posso prosseguir com essa ideia e contar com sua ajuda?
Ficaria muito grato.

M
Não  os dados do BD (linha 60), Sempre entra no cath e da mensagem javalangnull

package Connection.Data.Base;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class ModeloTabela extends AbstractTableModel
{
    private ArrayList linhas = null; //array para guardar linhas
    private String[] colunas = null;//vetor para guardar colunas
    
    public ModeloTabela(ArrayList line, String[] column)
    {
        setLinhas(line);
        setColunas(column);
    }    
    public ArrayList getLinhas()
    {
        return linhas;
    }
    public void setLinhas(ArrayList dados)
    {
        linhas = dados;
    }
    public String[] getColunas()
    {
        return colunas;
    }
    public void setColunas(String[] nomes)
    {
        colunas = nomes; 
    }
    public int getColumnCount()
    {
        return colunas.length;//retorna a quantidade de colunas
    }
    public int getRowCount()
    {
        return linhas.size();//conta a quantidade de linhas
    }
    public String getColumnName(int numCol)
    {
        return colunas[numCol];
    }
    public Object getValueAt(int numLin, int numCol)
    {
        Object[] linha = (Object[])getLinhas().get(numLin);
        return linha[numCol];
    }
}

 public void preencherTabela(String SQL)
    {
        ArrayList dados = new ArrayList();
        String[] Colunas = new String[]{"Nome", "Cidade", "Estado"};
        
        conecta.executaSQL(SQL);
               
        try
        {
            conecta.rs.first(); 
            do
            {          
                dados.add(new Object[]{conecta.rs.getString("nome"), conecta.rs.getString("estado"),
                conecta.rs.getString("cidade")});
            } while (conecta.rs.next());// Enquanto houver dados no banco o loop continua          
        } catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Erro ao preencher o ArrayList! \n Erro " + e);
        }
        
        ModeloTabela modelo = new ModeloTabela(dados, Colunas);
        jTableTabela.setModel(modelo);
        jTableTabela.getColumnModel().getColumn(0).setPreferredWidth(300);//Tamanho da coluna
        jTableTabela.getColumnModel().getColumn(0).setResizable(false);// Nao pode alterar a largura da coluna, ou seja, não pode aumentar o tamanho com o mouse
        jTableTabela.getColumnModel().getColumn(1).setPreferredWidth(300);
        jTableTabela.getColumnModel().getColumn(1).setResizable(false);
        jTableTabela.getColumnModel().getColumn(2).setPreferredWidth(80);
        jTableTabela.getColumnModel().getColumn(2).setResizable(false);
        jTableTabela.getTableHeader().setReorderingAllowed(false);// Nao pode reorganizar os campos da tabela
        jTableTabela.setAutoResizeMode(jTableTabela.AUTO_RESIZE_OFF);// A tabela nao poderá ser redimensionada
        jTableTabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// Poderá selecionar apenas um campo da tabela
        
    }
Criado 20 de janeiro de 2010
Ultima resposta 26 de set. de 2014
Respostas 47
Participantes 18