vários objetos em uma tabela no Netbeans

Oi pessoal,
tenho 4 objetos diferentes, e algumas propriedades de cada objeto vai formar uma linha na tabela, mas quando eu clicar no registro da tabela, quero poder identificar e recuperar os objetos que formaram essa linha na tabela.
eu pensei em pegar os 4 objetos e pegar as informações que preciso e formar um ArrayList com elas, mas deixando um último campo que não vai ser exibido na tabela, esse campo vi ter a chave primária de uma dos objetos, quando selecionar um registro da tabela, pego esse valor e por ele recupero esses objetos na memória,
o que acham? é o melhor caminho?

os objetos não são aleatórios, eles estão associados.
estou usando Netbeans 6.9.1
meu SGDB é o Derby

Oi,

Posta o seu código e o que você está tentando fazer. Assim fica mais claro para nós e podemos ser mais eficientes na resposta! ^^

Abraço!

eu ainda não comecei a escrever esse código.
mas estou lendo sobre como montar uma tabela.

o netbeans tem algumas ferramentas, como associações de métodos ou listas para um componente swing, mas não achei como usar, pesquisei pouco.
e queria saber a melhor forma, se eu fizer na mão, de como proceder para passar esses dados para a tabela e como recuperar esses dados posteriormente.
não quero código, pelo menos ainda não estou precisando, o que quero são os procedimentos mais adequados ou rápidos para fazer essas tarefas.

[quote=daquinho]eu ainda não comecei a escrever esse código.
mas estou lendo sobre como montar uma tabela.

o netbeans tem algumas ferramentas, como associações de métodos ou listas para um componente swing, mas não achei como usar, pesquisei pouco.
e queria saber a melhor forma, se eu fizer na mão, de como proceder para passar esses dados para a tabela e como recuperar esses dados posteriormente.
não quero código, pelo menos ainda não estou precisando, o que quero são os procedimentos mais adequados ou rápidos para fazer essas tarefas.[/quote]

Opa,

Pesquise, então, sobre JTables, seu funcionamento e sobre TableModels. Aconselho aprender primeiramente como usar o AbstractTableModel, e creio que já vai resolver seu problema. Siga o link na minha assinatura, créditos ao ViniGodoy.

Abraços!

opa… já tenho código
o que eu fiz, foi…
pasta onde tem as telas, criei uma classe que extende AbstracttableModel e outra classe DaoPopulaJTable, que é os dados a serem exibidos na tabela, lembrando que os dados completos são compostos por 4 tabelas no banco, estou exibindo bem menos informações na tabela. Nela crio os nomes das colunas e populo um ArrayList que vai ser chamado para encher a classe TabelaModelo(extends AbstractTableModel).
estou usando NetBeans 6.9.1

essa classe vai ser usada em "tabela.setModel(tabelaModelo);

class TabelaModelo extends AbstractTableModel{

        private String[] colunas = {"EMPRESA","NOME","SOBRENOME","TELEFONE","ENDEREÇO"};
        private List<DaoPopulaJTable> dados;

        private DaoPopulaJTable daoPopulaJTable = new DaoPopulaJTable();
        
        public TabelaModelo() {
                setDados(daoPopulaJTable.listar());
        }

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

        private void setLinhas(List 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
                DaoPopulaJTable linha = dados.get(rowIndex);
                String valor = "";
                switch(columnIndex){
                        case 1: valor = linha.getNomeFantasia();
                                break;
                        case 2: valor = linha.getNomeContato();
                                break;
                        case 3: valor = linha.getTelefone1();
                                break;
                        case 4: valor = linha.getRadio();
                                break;
                        case 5: valor = linha.getEstado();
                                break;
                        case 6: valor = linha.getMunicipio();
                                break;
                }
                return valor;
        }

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

}

e essa classe vai no banco buscar os dados para preencher a tabela. Nela eu pego o id da tabela empresa e não jogo na tabela para ser exibida, isso é apra depois poder ffazer o caminho inverso e resgatar todas as informações daquele registro selecionando a linha na tabela, to no caminho certo?

public class DaoPopulaJTable {

        private long id_empresa;
        private String nomeFantasia;
        private String nomeContato;
        private String telefone1;
        private String radio;
        private String estado;
        private String municipio;


        private Dao dao = new Dao();
        private PreparedStatement preparedStatement;
        private ResultSet resultSet;
        
        public long getId_empresa() {
                return id_empresa;
        }

        public void setId_empresa(long id_empresa) {
                this.id_empresa = id_empresa;
        }

        public String getEstado() {
                return estado;
        }

        public void setEstado(String estado) {
                this.estado = estado;
        }

        public String getMunicipio() {
                return municipio;
        }

        public void setMunicipio(String municipio) {
                this.municipio = municipio;
        }

        public String getNomeContato() {
                return nomeContato;
        }

        public void setNomeContato(String nomeContato) {
                this.nomeContato = nomeContato;
        }

        public String getNomeFantasia() {
                return nomeFantasia;
        }

        public void setNomeFantasia(String nomeFantasia) {
                this.nomeFantasia = nomeFantasia;
        }

        public String getTelefone1() {
                return telefone1;
        }

        public void setTelefone1(String telefone) {
                this.telefone1 = telefone;
        }

        public String getRadio() {
                return radio;
        }

        public void setRadio(String radio) {
                this.radio = radio;
        }

        

        public List<DaoPopulaJTable> listar(){
                List<DaoPopulaJTable> lista = new ArrayList();
                DaoPopulaJTable dpjt;

                String sql =  "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";
                try {
                        preparedStatement = dao.getConexao().prepareStatement(sql);
                        resultSet = preparedStatement.executeQuery();
                        while(resultSet.next()){

                                dpjt = new DaoPopulaJTable();

                                dpjt.setId_empresa(resultSet.getLong(1));
                                dpjt.setNomeFantasia(resultSet.getString(2));
                                dpjt.setNomeContato(resultSet.getString(3));
                                dpjt.setTelefone1(resultSet.getString(4));
                                dpjt.setRadio(resultSet.getString(5));
                                dpjt.setEstado(resultSet.getString(6));
                                dpjt.setMunicipio(resultSet.getString(7));

                                lista.add(dpjt);
                        }
                } catch (SQLException ex) {
                        JOptionPane.showMessageDialog(null,ex.getStackTrace());
                }

                return lista;
        }

}

a minha aplicação inicia, preenche os nomes das colunas da tabela mas não preenche as celulas.

[quote=daquinho]opa… já tenho código
o que eu fiz, foi…
pasta onde tem as telas, criei uma classe que extende AbstracttableModel e outra classe DaoPopulaJTable, que é os dados a serem exibidos na tabela, lembrando que os dados completos são compostos por 4 tabelas no banco, estou exibindo bem menos informações na tabela. Nela crio os nomes das colunas e populo um ArrayList que vai ser chamado para encher a classe TabelaModelo(extends AbstractTableModel).
estou usando NetBeans 6.9.1

essa classe vai ser usada em "tabela.setModel(tabelaModelo);

class TabelaModelo extends AbstractTableModel{

        private String[] colunas = {"EMPRESA","NOME","SOBRENOME","TELEFONE","ENDEREÇO"};
        private List<DaoPopulaJTable> dados;

        private DaoPopulaJTable daoPopulaJTable = new DaoPopulaJTable();
        
        public TabelaModelo() {
                setDados(daoPopulaJTable.listar());
        }

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

        private void setLinhas(List 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
                DaoPopulaJTable linha = dados.get(rowIndex);
                String valor = "";
                switch(columnIndex){
                        case 1: valor = linha.getNomeFantasia();
                                break;
                        case 2: valor = linha.getNomeContato();
                                break;
                        case 3: valor = linha.getTelefone1();
                                break;
                        case 4: valor = linha.getRadio();
                                break;
                        case 5: valor = linha.getEstado();
                                break;
                        case 6: valor = linha.getMunicipio();
                                break;
                }
                return valor;
        }

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

}

e essa classe vai no banco buscar os dados para preencher a tabela. Nela eu pego o id da tabela empresa e não jogo na tabela para ser exibida, isso é apra depois poder ffazer o caminho inverso e resgatar todas as informações daquele registro selecionando a linha na tabela, to no caminho certo?

public class DaoPopulaJTable {

        private long id_empresa;
        private String nomeFantasia;
        private String nomeContato;
        private String telefone1;
        private String radio;
        private String estado;
        private String municipio;


        private Dao dao = new Dao();
        private PreparedStatement preparedStatement;
        private ResultSet resultSet;
        
        public long getId_empresa() {
                return id_empresa;
        }

        public void setId_empresa(long id_empresa) {
                this.id_empresa = id_empresa;
        }

        public String getEstado() {
                return estado;
        }

        public void setEstado(String estado) {
                this.estado = estado;
        }

        public String getMunicipio() {
                return municipio;
        }

        public void setMunicipio(String municipio) {
                this.municipio = municipio;
        }

        public String getNomeContato() {
                return nomeContato;
        }

        public void setNomeContato(String nomeContato) {
                this.nomeContato = nomeContato;
        }

        public String getNomeFantasia() {
                return nomeFantasia;
        }

        public void setNomeFantasia(String nomeFantasia) {
                this.nomeFantasia = nomeFantasia;
        }

        public String getTelefone1() {
                return telefone1;
        }

        public void setTelefone1(String telefone) {
                this.telefone1 = telefone;
        }

        public String getRadio() {
                return radio;
        }

        public void setRadio(String radio) {
                this.radio = radio;
        }

        

        public List<DaoPopulaJTable> listar(){
                List<DaoPopulaJTable> lista = new ArrayList();
                DaoPopulaJTable dpjt;

                String sql =  "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";
                try {
                        preparedStatement = dao.getConexao().prepareStatement(sql);
                        resultSet = preparedStatement.executeQuery();
                        while(resultSet.next()){

                                dpjt = new DaoPopulaJTable();

                                dpjt.setId_empresa(resultSet.getLong(1));
                                dpjt.setNomeFantasia(resultSet.getString(2));
                                dpjt.setNomeContato(resultSet.getString(3));
                                dpjt.setTelefone1(resultSet.getString(4));
                                dpjt.setRadio(resultSet.getString(5));
                                dpjt.setEstado(resultSet.getString(6));
                                dpjt.setMunicipio(resultSet.getString(7));

                                lista.add(dpjt);
                        }
                } catch (SQLException ex) {
                        JOptionPane.showMessageDialog(null,ex.getStackTrace());
                }

                return lista;
        }

}

a minha aplicação inicia, preenche os nomes das colunas da tabela mas não preenche as celulas.[/quote]

Daquinho,

Vamos ajeitar essa aplicação em camadas. Ela vai ficar mais inteligível.
Primeiro, crie o pacote Bean. As classes Bean serão aquelas que represetarão as entidades do banco de dados. Elas possuem Getters e Setters, bem como implementações mais detalhadas do toString(), equals(), dentre outros.

public class Empresa {
   
        // Os atributos que você colocou na classe acima, só que em uma classe separada.
        private long id_empresa;
        private String nomeFantasia;
        private String nomeContato;
        private String telefone1;
        private String radio;
        private String estado;
        private String municipio;

        // Getters, setters e demais...
}

Beleza, feito isso, temos um objeto independente da sua entidade do Banco de Dados. Da sua maneira, há um acoplamento gigante entre a classe Bean e a classe de Persistência.
Agora sim faremos uma classe de Persistência própria, que será responsável por buscar dados referentes à entidade acima construída.

public class EmpresaDAO { // ao invés de DaoPopulaJTable, pois fica um nome mais genérico.

public List<DaoPopulaJTable> listar() throws SQLException { // as exceções serão tratadas nas camadas superiores, não diretamente aqui.
                List<Empresa> lista = new ArrayList<Empresa>();
                Empresa empresa;

                String sql =  "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";

                        preparedStatement = dao.getConexao().prepareStatement(sql);
                        resultSet = preparedStatement.executeQuery();
                        while(resultSet.next()){

                                empresa = new Empresa();

                                empresa.setId_Empresa( resultSet.getLong("empresa.id") ); //busque pelo nome da coluna ao invés de índices, menos propício a erros.

                                lista.add(empresa);
                        }

                return lista;
        }
}

Agora, seu TableModel poderá ser tipado para uma entidade específica, e não para aquela classe que encapsulava tanto a entidade quanto métodos de acesso a dados.

public class EmpresaTableModel extends AbstractTableModel {

        private List<Empresa> empresas;
        public EmpresaTableModel(List<Empresa> empresas) {

                this.empresas = empresas != null ? empresas : new ArrayList<Empresas>();
        }

        public Object getValueAt(int row, int col) {
    
                Empresa empresa = empresas.get(row);
                if (col == 0) return empresa.getId_Empresa();
                if (col == 1) return empresa.getNome_Empresa();
                //...

                return "";
        }
}

Tenta com seus objetos bem separadinhos, bonitinhos, e nos dê um reply!
Abraço

eu tenho a minha pasta de beans, mas pensei q como ia ser uma classe bem restrita para encher a tabela, poderia ficar junto da tabela e outra, ela assim n fica pública não poluindo o meu auto-complete

essa classe n vai e nem pode ser usada por outras classes, ela é um apanhado de dados de outros beans só para encher a tabela

porque?

usei indice por questão de desempenho, apesar de não saber o quanto aumenta esse desempenho.
aproveitando… vc sabe se usando indice, essa numeração busca só no banco a ordem de criaçãos das propriedades ou ele tb serve para numerar a ordem de chamada na instrução select do SQL?

[quote]Tenta com seus objetos bem separadinhos, bonitinhos, e nos dê um reply!
Abraço[/quote]
jaja eu volto com alterações…

[quote=daquinho]
eu tenho a minha pasta de beans, mas pensei q como ia ser uma classe bem restrita para encher a tabela, poderia ficar junto da tabela e outra, ela assim n fica pública não poluindo o meu auto-complete[/quote]

Na verdade, o Bean não é tão restrito assim, sabe. É importante você ter um local para guardar os atributos de uma entidade do Banco de Dados, e nada melhor que uma classe Bean para fazer isso. Se você fizer seu Auto-Complete com GlazedLists, ele fica bem limpinho!

Eu disse para colocar um nome mais genérico pelo fato de você poder usar essa classe para todas as operações DAO da sua entidade! Fica mais fácil de outro desenvolvedor reconhecer a classe EmpresaDAO como a classe de Persistência do que a classe DAOPopulaJTable para persistir os mesmos dados. O que acha?

[quote]public List<DaoPopulaJTable> listar() throws SQLException { // as exceções serão tratadas nas camadas superiores, não diretamente aqui.
porque?[/quote]
As exceções são tratadas nas camadas superiores, né? Tanto que, no seu código, você colocou no bloco catch para exibir um JOptionPane. Assim, você coloca código de View em código de modelo de negócio. Não combina, concorda?

[quote]empresa.setId_Empresa( resultSet.getLong(“empresa.id”) ); //busque pelo nome da coluna ao invés de índices, menos propício a erros.
usei indice por questão de desempenho, apesar de não saber o quanto aumenta esse desempenho.
aproveitando… vc sabe se usando indice, essa numeração busca só no banco a ordem de criaçãos das propriedades ou ele tb serve para numerar a ordem de chamada na instrução select do SQL?[/quote]

Na verdade, que eu saiba não tem diferença de desempenho alguma. Na verdade, essa numeração que você usa é pra pegar de acordo com o Select seu. Se você faz…

Select Nome, Email From Cliente

Você sabe que seu índice 0 é o Nome e o índice 1 é o Email. O problema é quando você tem vários e vários campos. Como saber qual é qual? Vai ficar contando? Ou mesmo quando você usa…

Select * From Cliente

Sacou? Então é mais seguro você ir pelo nome do campo que você erra menos! :slight_smile:

[quote]
jaja eu volto com alterações…[/quote]
Boa sorte!

[quote=Nicolas Fernandes][quote=daquinho]
eu tenho a minha pasta de beans, mas pensei q como ia ser uma classe bem restrita para encher a tabela, poderia ficar junto da tabela e outra, ela assim n fica pública não poluindo o meu auto-complete[/quote]

Na verdade, o Bean não é tão restrito assim, sabe. É importante você ter um local para guardar os atributos de uma entidade do Banco de Dados, e nada melhor que uma classe Bean para fazer isso. Se você fizer seu Auto-Complete com GlazedLists, ele fica bem limpinho![/quote]
o que é GlazedList ?

Eu disse para colocar um nome mais genérico pelo fato de você poder usar essa classe para todas as operações DAO da sua entidade! Fica mais fácil de outro desenvolvedor reconhecer a classe EmpresaDAO como a classe de Persistência do que a classe DAOPopulaJTable para persistir os mesmos dados. O que acha?[/quote]ja tem uma classe Empresa e DaoEmpresa, mas realemte o nome pode melhorar

[quote][quote]public List<DaoPopulaJTable> listar() throws SQLException { // as exceções serão tratadas nas camadas superiores, não diretamente aqui.
porque?[/quote]
As exceções são tratadas nas camadas superiores, né? Tanto que, no seu código, você colocou no bloco catch para exibir um JOptionPane. Assim, você coloca código de View em código de modelo de negócio. Não combina, concorda?[/quote]tá certo, na verdade eu criei uma classe ErroAgenda de dois métodos, recebendo String e outra recebendo Exception,mas esse método é extensão da JOptionPane.
essa é muito boa ein, não pensei nem perto disso, em pacote DAO e outros , sempre empurrar as excessões? agora entendo melhor a diferença de throw e throws. Até para controlar excessões, fica tudo na camada de controle, isso?

[quote][quote]empresa.setId_Empresa( resultSet.getLong(“empresa.id”) ); //busque pelo nome da coluna ao invés de índices, menos propício a erros.
usei indice por questão de desempenho, apesar de não saber o quanto aumenta esse desempenho.
aproveitando… vc sabe se usando indice, essa numeração busca só no banco a ordem de criaçãos das propriedades ou ele tb serve para numerar a ordem de chamada na instrução select do SQL?[/quote]
Na verdade, que eu saiba não tem diferença de desempenho alguma. Na verdade, essa numeração que você usa é pra pegar de acordo com o Select seu. Se você faz…[/quote]quando vc escreve o nome do campo, a aplicação tem que procurar aquela descrição de coluna em coluna(ou de alguma outra forma, num index por exemplo, n lembro exatamente), mas se você numera, já indica de cara a posição que deve buscar.
numa aplicação pequena não deve fazer diferença, mas acredito pode e vai fazer diferença com muito acessos ao banco, assim como acontece com concatenação e StringBuffer

opa… cheguei com as alterações, quem sabe sabe, acho que ficou muito bom.

o bean

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agenda.bean;

/**
 * Exibe um apanhado de dados dos outros beans para preencher a tabela da tela principal
 *
 * @author ti-rj
 */
public class BeanTabelaModelo {

        private long id_empresa;
        private String nomeFantasia;
        private String nomeContato;
        private String telefone1;
        private String radio;
        private String estado;
        private String municipio;


       // gets e sets ... 
       
        @Override
        public String toString() {
                return super.toString();
        }

        @Override
        public boolean equals(Object obj) {
                if (obj == null) {
                        return false;
                }
                if (getClass() != obj.getClass()) {
                        return false;
                }
                final BeanTabelaModelo other = (BeanTabelaModelo) obj;
                if (this.id_empresa != other.id_empresa) {
                        return false;
                }
                return true;
        }

        @Override
        public int hashCode() {
                int hash = 5;
                hash = 53 * hash + (int) (this.id_empresa ^ (this.id_empresa &gt;&gt;&gt; 32));
                return hash;
        }

}

aqui o DAO
vc acha se vai fazer diferença mover as propriedades da classe para dentro do método? sem contar que no futuro possa precisar deles em outros métodos.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agenda.dao;

import agenda.bean.BeanTabelaModelo;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author ti-rj
 */
public class DaoTabelaModelo {
        
        private PreparedStatement preparedStatement;
        private ResultSet resultSet;
        private Dao dao = new Dao();


        public List&lt;BeanTabelaModelo&gt; listarParaTabela() throws SQLException{
                List&lt;BeanTabelaModelo&gt; lista = new ArrayList();
                BeanTabelaModelo beanTabelaModelo;

                String sql =  "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";

                        preparedStatement = dao.getConexao().prepareStatement(sql);
                        resultSet = preparedStatement.executeQuery();
                        while(resultSet.next()){
                                beanTabelaModelo = new BeanTabelaModelo();

                                beanTabelaModelo.setId_empresa(resultSet.getLong(1));
                                beanTabelaModelo.setNomeFantasia(resultSet.getString(2));
                                beanTabelaModelo.setNomeContato(resultSet.getString(3));
                                beanTabelaModelo.setTelefone1(resultSet.getString(4));
                                beanTabelaModelo.setRadio(resultSet.getString(5));
                                beanTabelaModelo.setEstado(resultSet.getString(6));
                                beanTabelaModelo.setMunicipio(resultSet.getString(7));

                                lista.add(beanTabelaModelo);
                }
                return lista;
        }

}

e o modelo

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agenda.telas;

import agenda.bean.BeanTabelaModelo;
import agenda.dao.DaoTabelaModelo;
import java.sql.SQLException;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author ti-rj
 */
class TabelaModelo extends AbstractTableModel{

        private String[] colunas = {"EMPRESA","NOME","SOBRENOME","TELEFONE","ENDEREÇO"};
        private List&lt;BeanTabelaModelo&gt; dados;

        private DaoTabelaModelo daoTabelaModelo = new DaoTabelaModelo();


        public TabelaModelo() throws SQLException {
                setDados(daoTabelaModelo.listarParaTabela());
        }

        private void setDados(List&lt;BeanTabelaModelo&gt; dados) {
                this.dados = dados;
        }

        private void setLinhas(List 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
                BeanTabelaModelo linha = dados.get(rowIndex);
                String valor = "";
                switch(columnIndex){
                        case 1: valor = linha.getNomeFantasia();
                                break;
                        case 2: valor = linha.getNomeContato();
                                break;
                        case 3: valor = linha.getTelefone1();
                                break;
                        case 4: valor = linha.getRadio();
                                break;
                        case 5: valor = linha.getEstado();
                                break;
                        case 6: valor = linha.getMunicipio();
                                break;
                }
                return valor;
        }

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

}

ainda não consigo preencher a tabela, me aparece um erro de SQl, no squirrel-sql 3.2.1(eu o uso para conferir os dados dentro do banco) funciona perfeitamente, inclusive montei o SQL nele, mas quando ponho essa instrução para rodar na aplicação dá erro. Pensando em compatibilidade de caracteres entre programas, eu já retirei os espaços e virgulas e refiz, joguei no bloco de notas tb e nada de funcionar.

Exception in thread "main" java.sql.SQLSyntaxErrorException: Erro de sintaxe: Encountered "where" at line 1, column 173.
.
.
.

consegui,
quando quebro a instrução sql dá erro, coloquei tudo numa linha só e funcionou, vlw, muito o brigado.
está funcionando …eeeeeeeee
o próximo passo é:

  • botar para funcionar o deletar, que na verdade só vai esconder o s registros(n apaga), já tenho quase tudo, só n busca da tabela os dados.
  • selecionar uma linha na tabela abrindo uma janela para alterar os registros
  • fazer uma busca num campo de texto onde vá diminuindo o n de registrso na tabela conforme vou digitando
    show né.
    vlw!!!
    ===
    editado.
    colocamos no listarParaTabela da classe DaoTabelaModelo um throws, esse método é chamado na classe TabelaModelos e é jogado novamente um throws como mostrado acima, isso me obriga a tratar lá na tela do programa, eu retirei e tratei ali mesmo na tabelaModelo com try-catch, fiz certo? ou trato lá na tela quando chamado?

configurei a minha tabela para reordenar os registros quando click no cabeçalho da coluna, (pensei que ia ter que fazer na mão mas é mole-mole ainda mais no netbeans ), mas ai me ferrou noutra coisa. Quando seleciono uma linha, pensei em devolver para o modelo o número da linha e lá ele pegar um id (chave primária) para localizar todos os meus registros dessa linha da tabela, mas com a tabela sortablel, essa ordem pode mudar e consequentemente o número do row da tabela.
lá no select do modelo eu tenho um campo que não é carregado na tabela, empresa.id, o que acha de eu colocar ele no fim da tabela sem o exibir? quando eu selecionar a linha da tabela, busco apenas esse dado. O que acha(m)? fica feio? tem outro jeito?

[quote=daquinho]configurei a minha tabela para reordenar os registros quando click no cabeçalho da coluna, (pensei que ia ter que fazer na mão mas é mole-mole ainda mais no netbeans ), mas ai me ferrou noutra coisa. Quando seleciono uma linha, pensei em devolver para o modelo o número da linha e lá ele pegar um id (chave primária) para localizar todos os meus registros dessa linha da tabela, mas com a tabela sortablel, essa ordem pode mudar e consequentemente o número do row da tabela.
lá no select do modelo eu tenho um campo que não é carregado na tabela, empresa.id, o que acha de eu colocar ele no fim da tabela sem o exibir? quando eu selecionar a linha da tabela, busco apenas esse dado. O que acha(m)? fica feio? tem outro jeito?[/quote]
com getvalueAt() não dá para buscar essa coluna da linha, claro, pois não existe coluna, deixei essa coluna omitida assim mesmo pensando em daquiapouco resgatar essa row com um cast desse bena que popula a tabela.

com esse problema da seleção da linha da tabela, acredito estar avançado e só faltar como buscar essa linha da tabela.
quando a cadastrar, depois de cadastrar um formulário, quero atualizar automaticamente a minha tabela, mas não estou conseguindo, tenho q fechar e reabrir o programa.

o meu modelo ficou assim.

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];
        }


        public void alterarDadosDaTabela(){
                fireTableRowsUpdated(0, getRowCount()-1);
        }

        public void adicionarDadosNaTabela(){
                fireTableRowsInserted(getDados().size()-1, getDados().size()-1);
        }

}

a tela onde eu cadastro e altero o formulário:

/**
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * TelaCadastro.java
 *
 * Created on 27/01/2011, 15:06:30
 */

package agenda.telas;

import agenda.bean.BeanTabelaModelo;
import agenda.dao.Dao;
import agenda.dao.DaoContato;
import agenda.dao.DaoEmpresa;
import agenda.dao.DaoEndereco;
import agenda.dao.DaoTelefone;
import agenda.excessao.ErroAgenda;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
 *
 * @author ti-rj
 */
public class TelaCadastro extends javax.swing.JDialog implements  KeyListener, ActionListener{

    private Dao dao;



    /** Creates new form TelaCadastro */
    public TelaCadastro() {
        initComponents();
    }


    /**
     *
     * @param BeanTabelaModelo
     * Contrutor usado para receber o bean selecionado na tabela.
     */
    public TelaCadastro(BeanTabelaModelo beanTabelaModelo){
        long id = beanTabelaModelo.getId_empresa();
        preencherBeans(id);
        initComponents();
        preencherCampos();
    }



    /**
     * preenche os beans de acordo com o id passado como parâmetro
     * @param id_empresa
     */
    private void preencherBeans(long id_empresa){}


    /**
     * pega os beans e preenche os campos do formulário
     */
    private void preencherCampos(){}


    /**
     * Pega os valores dos campos e os salva em beans
     */
    private void salvarCampos(){ }


    /**
     *se o médoto retornar false, é porque um dos campos tem o seu texto acima do limite permitido,
     * caso retorne true, os campos está dentro dos limites.
     * @return boolean
     * 
     */
    private boolean validarCampos(){ }





    /**
     * limpa todos os campos do formulário
     */
    private void limparCampos(){ }



    /** 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">                          
        private void initComponents() {
.
.
.
        public void actionPerformed(java.awt.event.ActionEvent evt) {
                if (evt.getSource() == btnGravar) {
                        TelaCadastro.this.btnGravarActionPerformed(evt);
                }
        }

        public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getSource() == txaContatoDescricao) {
                        TelaCadastro.this.txaContatoDescricaoKeyPressed(evt);
                }
        }

        public void keyReleased(java.awt.event.KeyEvent evt) {
        }

        public void keyTyped(java.awt.event.KeyEvent evt) {
        }// </editor-fold>                        

    private void txaContatoDescricaoKeyPressed(java.awt.event.KeyEvent evt) {                                               
        lblQuantidade.setText((500 - txaContatoDescricao.getText().length())+"");
    }                                              

    private void btnGravarActionPerformed(java.awt.event.ActionEvent evt) {                                          
        long id_contato , id_empresa, id_endereco, id_telefone;

                salvarCampos();
                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){

                        if(empresa.getId() == -1){

                                
                                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);

                                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);
                this.dispose();
    }
}

com ceteza se eu conseguir colocar o tabela atualizando em automático no cadastro, vou conseguir fazer ele tb atualizar no update dos registros e tb o deletar.
nas linhas 153 e 163, eu tentei tb chamar alterarDadosDaTabela() e adicionarDadosNaTabela() em tabelaModelo, eles fazer a mesma coisa, mas de dentro de TabelaModelo, mas tb não adiantou em nada.

OOOO pessoal, ninguém sabe como solucionar isso ai???
consigo abrir a tela do formulário clicando na linha da tabela, mas se eu reordenar alguma coluna da tabela e faço um click em alguma linha novamente, não mostra os registrso corretos, mosta os dados da linha antes da reordenação.
outra coisa… não precisa de código, se me mandarem a ordem de afazeres para conseguir atualizar a tabela automáticamente.
eu estou fazendo o seguinte:
na janela do formulário eu no memso botão cadastro ou atualiso verificando se o id está em -1 ou não.
se eu cadastro.
-insiro no banco os dados
-declaro e instâncio o modelo do jtable e chamo tabelaModelo.fireTableRowsInserted(tabelaModelo.getRowCount()-1,tabelaModelo.getRowCount()-1);
-fecho a janela do formulário

se eu estiver atualizando:
-altero os dados na tabela do banco
-declaro e instâncio o o modelo do jtable
-chamo tabelaModelo.fireTableRowsUpdated(0,tabelaModelo.getRowCount()-1);
-fecho a janela do formulário.

estou certo? a ordem é essa ou falta alguma coisa?

CARACAAAAAA…
o meu problema era que ao abrir uma nova janela para editar os dados, eu não passava por parâmetro do controtor dessa nova janela o meu modelo em uso, lá na nova janela do formulário eu estava usando o “new TabelaModelo()” e assim usava um outro qualquer, e não o que deveria.
uuufa… isso deveria ser básico né?! (rs)

po… me ajudem no seguinte.
quando tento alterar os dados a aplicação congela no preparedStatement.executeUpgrade(), onde está o erro?

          /**
         * @param contato
         * @return alterar o registro do objeto passado como parâmetro
         * @return &lt;strong&gt;boolean&lt;/strong&gt; indicando true se a atualização foi bem sucedida, ou false caso o registro não foi alterado.
         */
        public void alterar(Contato contato) throws SQLException{
                
                System.out.println("aa");
                String sql = "update contato set nome=? , segundonome=? , sobrenome=? , descricao=? where id=?";
                java.sql.PreparedStatement preparedStatement = dao.getConexao().prepareStatement(sql);

                preparedStatement.setString(1, contato.getNome());
                preparedStatement.setString(2, contato.getSegundoNome());
                preparedStatement.setString(3, contato.getSobreNome());
                preparedStatement.setString(4, contato.getDescricao());
                preparedStatement.setLong(5, contato.getId());

                int i = preparedStatement.executeUpdate();
                System.out.println("dd");
        }

ooo pessoal, consegui corrigir, era um problema básico, não estava fechando as conexões com o close(), básico né!?
agora tô com outro problema, senão uma dúvida.
na minha aplicação estou adicionando , alterando e excluindo registros pela minha JTable, até aqui tudo certo, só que apra conseguir fazer esses procedimentos, acho que estou fazendo da forma errada, por exemplo:
para adicionar um registro, estou limpando a minha lista de registros que vai preencher a tabela e preenchendo novamente essa lista, veja.

void addRow(BeanTabelaModelo beanTabelaModelo) throws SQLException{
            dados.clear();            //limpando a lista
            DaoTabelaModelo daoTabelaModelo = new DaoTabelaModelo(); 
            setDados(daoTabelaModelo.listarParaTabela());                   // preenchendo novamente a lista
            this.fireTableRowsInserted(0,dados.size());                    //avisando que ouve alteração
        }

eu tentei simplesmente adicionar na lista mais registro e avisar que foi adicionado.

void addRow(BeanTabelaModelo beanTabelaModelo) throws SQLException{
            dados.add(beanTabelaModelo);
            this.fireTableRowsInserted(dados.size(),dados.size());
        }

mas não dá certo, isso aconteceu tb em deletar e atualizar os registro, está certo isso de limpar a lista e refazer?

[quote=daquinho][quote]
po… me ajudem no seguinte.
quando tento alterar os dados a aplicação congela no preparedStatement.executeUpgrade(), onde está o erro?
[/quote]
ooo pessoal, consegui corrigir, era um problema básico, não estava fechando as conexões com o close(), básico né!?
agora tô com outro problema, senão uma dúvida.
na minha aplicação estou adicionando , alterando e excluindo registros pela minha JTable, até aqui tudo certo, só que apra conseguir fazer esses procedimentos, acho que estou fazendo da forma errada, por exemplo:
para adicionar um registro, estou limpando a minha lista de registros que vai preencher a tabela e preenchendo novamente essa lista, veja.

//classe TableModel //
void addRow(BeanTabelaModelo beanTabelaModelo) throws SQLException{
            this.dados.clear();            //limpando a lista
            DaoTabelaModelo daoTabelaModelo = new DaoTabelaModelo(); 
            this.setDados(daoTabelaModelo.listarParaTabela());                   // preenchendo novamente a lista
            this.fireTableRowsInserted(0,dados.size());                    //avisando que ouve alteração
        }

aqui não funciona, eu tentei simplesmente adicionar na lista mais registro e avisar que foi adicionado.

void addRow(BeanTabelaModelo beanTabelaModelo) throws SQLException{
            dados.add(beanTabelaModelo);
            this.fireTableRowsInserted(dados.size(),dados.size());
        }

mas não dá certo, isso aconteceu tb em deletar e atualizar os registro, está certo isso de limpar a lista e refazer?
não dá erro e o resultado certo só aparece se eu fechar e reabrir a aplicação.[/quote]