Jtable + DefaultTableModel + Banco de Dados = Erro de Index do array

10 respostas
gregorioarthur

Povo!

estou com um problema, criei um Jtable para mostrar os clientes cadastrados (os dados estão no BD) … porém quando vou inserir os dados na tabela dá um exeção de

“xception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 0 >= 0”

porém, já fiz de tudo! tentei mudar o index, colocar valores menores, maiores… mas NAAAAAADDDDDDAAAAA! funfo!

já li alguns tópicos parecidos aqui na GUJ mas nenhum me desse alguma idéia do que fosse meu problema…

se alguem puder ajudar eu agradeço!

ou se alguem tiver um proto para que eu adapte ao meu código, pois preciso intregar o programa e so falta isso praticamente!

valew galera!

package Interface;

import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.*;
import Core.*;
import java.sql.*;

public class TelaProcurar extends JFrame {

    public TelaProcurar() {
        initComponents();
        Modelo();
        getRootPane().setDefaultButton(BtSelecionar);
    }

    private void Modelo(){

        BancoDados Bd = new BancoDados();

        int Linhas = 0;

        try{
            Bd.Conecta();

            BancoDados.Stm = BancoDados.Con.createStatement();
            BancoDados.Rs = BancoDados.Stm.executeQuery("SELECT * FROM v_procura;");
            
            //Puxa qtd de Linhas que a tabela vai ter
            while(BancoDados.Rs.next()){
                Linhas++;
            }

            //posiciona o ResultSet no primeiro registro
            BancoDados.Rs.first();
            
            DefaultTableModel Dtm = new DefaultTableModel(4, 4);
            
            int Row = 0;
            
            //Preenche a tabela
            do{
                
                Tabela.setValueAt(BancoDados.Rs.getString("IdCliente"), Row, 0);   // Segundo o NetBeans,
                Tabela.setValueAt(BancoDados.Rs.getString("NomeCliente"), Row, 1); // aqui esta o começo do erro ...
                Tabela.setValueAt(BancoDados.Rs.getString("Cpf"), Row, 2);
                Tabela.setValueAt(BancoDados.Rs.getString("NomeCia"), Row, 3);                                                
                Row++;

            }while(BancoDados.Rs.next());

            Tabela.setModel(Dtm); // seta na tabela o modelo criado
        }
        catch(SQLException Erro){
            JOptionPane.showMessageDialog(rootPane,"Erro ao Executar atualização da Tabela Dinamica\n"+Erro,".:: Erro - SCC ::.",JOptionPane.ERROR_MESSAGE);
        }
    }

    private void initComponents() {

        PainelTabela = new javax.swing.JScrollPane();
        Tabela = new javax.swing.JTable();
        Titulo = new javax.swing.JLabel();
        BtSair = new javax.swing.JButton();
        BtSelecionar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(".:: Procurar Cadastro - SCC ::.");
        setAlwaysOnTop(true);

        PainelTabela.setViewportView(Tabela);

        Titulo.setFont(new java.awt.Font("Arial", 0, 12));
        Titulo.setText("Aqui você seleciona o cliente que você deseja Alterar... ");

        BtSair.setIcon(new javax.swing.ImageIcon(getClass().getResource("/IconesImagens/Can_ico.png"))); // NOI18N
        BtSair.setText("Sair");
        BtSair.setToolTipText("Sair desta Tela");
        BtSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {        
                TelaProcurar.this.dispose();
            }
        });

        BtSelecionar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/IconesImagens/Ok_ico.png"))); // NOI18N
        BtSelecionar.setText("Selecionar");
        BtSelecionar.setToolTipText("Seleciona o registro atual");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(PainelTabela, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 622, Short.MAX_VALUE)
                    .addComponent(Titulo)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(BtSelecionar, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(BtSair, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(Titulo)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(PainelTabela, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(BtSair, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(BtSelecionar, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(21, Short.MAX_VALUE))
        );

        pack();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        java.awt.Dimension dialogSize = getSize();
        setLocation((screenSize.width-dialogSize.width)/2,(screenSize.height-dialogSize.height)/2);
    }

    private javax.swing.JButton BtSair;
    private javax.swing.JButton BtSelecionar;
    private javax.swing.JScrollPane PainelTabela;
    private javax.swing.JTable Tabela;
    private javax.swing.JLabel Titulo;

}

10 Respostas

Marky.Vasconcelos

NÃO use DefaultTableModel.

Criei um TableModel legal para trabalhar com Lists… da uma olhada no ObjectTableModel.

gregorioarthur

cara, vi essa mesma resposta em muitos fóruns, mas nenhuma resposta convincente do pq de não usar?

poderia explicar?

vou tentar com um tablemodel(), mas … qual a principal diferença entre o default e o tablemodel?

valeu pela resposta!

gregorioarthur

Desisto!!!

naum consegui!

preciso de um exemplo para entender bem! alguem teria?

Procurei na net, axei uns mas nenhum faz oq eu preciso saber fazer…

Marky.Vasconcelos

Vou te ensinar como usar no que fiz… primeiro… voce tem que trabalhar com List e não o ResultSet… carregue os dados e coloque em uma List do objeto que voce tem. E mostra a classe do objeto também.

gregorioarthur

OK!

isso eu já fiz, criar um Array com o RS, pois ja tinha tentado cria uns model aqui… mas nenhum funfo!

mas entao, crio o list e carrego ele no model da tabela?? só isso?

Marky.Vasconcelos

Mas não é um array de strings. É uma list de objetos.
Para funcionar voce precisa anotar a classe que voce quer mostrar primeiro. Exemplo.

public class Cliente{
@Resolvable(colName="Id")
private int id;
@Resolvable(colName="Nome:")
private String nome;
@Resolvable(colName="Companhia")
private String cia;
@Resolvable(colName="CPF")
private String cpf;
//getters e setters
}

Note que o atributo colName vai aparecer no nome da coluna da tabela
E para o modelo voce faria o seguinte.

AnnotationResolver resolver = new AnnotationResolver(Cliente.class);
 ObjectTableModel<Cliente> tableModel = new ObjectTableModel<Cliente>(resolver, "id,nome,cpf,cia"); 
tableModel.setData(suaListComObjetosCliente);
JTable tabela = new JTable(tableModel);

“id,nome,cpf,cia” vao ser as colunas de acordo com o nome do atributo na classe. Voce só precisa colocar @Resolvable nos atributos que voce quer mostrar na tabela.

Tem bem mais coisa desse TableModel que não passei aqui. Por isso te passei o link. Para funcionar voce precisa do jar que coloquei no blog ou os fontes.

Marky.Vasconcelos

Uma vantagem que voce vai ter nesse modelo é que voce pode trabalhar com ele como Lists…

Cliente cli = new Cliente()//seta os atributos

model.add(cli);
int idx = model.indexOf(cli);
model.remove(cli); //ou model.remove(idx);
model.addAll(umaListAqui);
Cliente cliente = model.get(5);//Pega o cliente da 5° linha.
ViniGodoy

Engraçado, eu já respondi diversas vezes nesse fórum pq não usar DefaultTableModel. Ok, vamos repetir:

  1. Consome o dobro de espaço em memória, uma vez que os dados do seu banco são efetivamente copiados para o modelo;
  2. A necessidade de copiar dados também torna a carga dos dados mais lenta;
  3. Deixa o código mais rebuscado desnecessariamente;
  4. Exige casts, o que torna o código inseguro;
  5. Trabalha com valores, e não com objetos. Num model próprio, você pode ter um get() que retorna diretamente o objeto de sua classe;
  6. Não permite reuso.

Bom, esses são os principais motivos, mas a lista não para por aí. Sugiro fortemente que você aprenda a gerar seu próprio model, use o model do Mark ou, se não quiser mais nada reflexivo ou com anotações junto as suas classes, use o model que eu já postei por aqui.

Marky.Vasconcelos

PS: Voce não é obrigado a usar Annotations para usar o model que fiz. Mas acho que é a maneira mais facil. Pra isso que criei a classe FieldResolver.

É Reflection também só não tem annotations.

ViniGodoy

Eu vi, ficou bacana o esquema do FieldResolver.

Criado 17 de junho de 2009
Ultima resposta 18 de jun. de 2009
Respostas 10
Participantes 3