Problema com meu Jtable Model

Criei meu tableModel seguindo um artigo aki do guj, fiz tudo q tava escrito pra fazer, só que quando eu mando rodar, nao cria o nome das colunas, só aparece os dados, aluem pode me ajudar, o codigo q eu estou usando é o seguinte:

TTableModel:



/*
 * TTable.java
 *
 * Created on 4 de Outubro de 2008, 15:22
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package componentes;

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

/**
 *
 * @author Administrador
 */
public class TTableModel extends AbstractTableModel{
    
    private ArrayList linhas = null;
    private String [] colunas = null;
    private boolean [] colsEdicao;
    
    /** Creates a new instance of TTable */
    public TTableModel(ArrayList dados, String[] colunas, boolean [] edicao) {
        setLinhas(dados);
        setColunas(colunas);
        colsEdicao = edicao;
    }
    
    public String[] getColunas() {
        return colunas;
    }
    
    public ArrayList getLinhas() {
        return linhas;
    }
    
    public void setColunas(String[] strings) {
        colunas = strings;
    }
    
    public void setLinhas(ArrayList list) {
        linhas = list;
    }
    
    public int getRowCount() {
        return getLinhas().size();
    }
    
    public int getColumnCount() {
        return getColunas().length;
    }
    
    public String getColumnName(int col){
        return getColunas()[col];
    }
    
    public boolean isCellEditable(int row, int col){
        return colsEdicao[col];
    }
    
    public Object getValueAt(int rowIndex, int columnIndex) {
        // Obtem a linha, que é uma String []
        String [] linha = (String [])getLinhas().get(rowIndex);
        // Retorna o objeto que esta na coluna
        return linha[columnIndex];
    }
    
    public void setValueAt(Object value, int row, int col){
        // Obtem a linha, que é uma String []
        String [] linha = (String [])getLinhas().get(row);
        // Altera o conteudo no indice da coluna passado
        linha[col] = (String)value;
        // dispara o evento de celula alterada
        fireTableCellUpdated(row,col);
    }
    
    public void addRow( String [] dadosLinha){
        getLinhas().add(dadosLinha);
        // Informa a jtable de que houve linhas incluidas no modelo
        // COmo adicionamos no final, pegamos o tamanho total do modelo
        // menos 1 para obter a linha incluida.
        int linha = getLinhas().size()-1;
        fireTableRowsInserted(linha,linha);
        return;
    }
    
    public void removeRow(int row){
        getLinhas().remove(0);
        // informa a jtable que houve dados deletados passando a
        // linha reovida
        fireTableRowsDeleted(row,row);
    }
    
    public boolean removeRow(String val, int col){
        // obtem o iterator
        Iterator i = getLinhas().iterator();
        int linha = 0;
        // Faz um looping em cima das linhas
        while(i.hasNext()){
            // Obtem as colunas da linha atual
            String[] linhaCorrente = (String[])i.next();
            linha++;
            // compara o conteudo String da linha atual na coluna desejada
            // com o valor informado
            if( linhaCorrente[col].equals(val) ){
                getLinhas().remove(linha);
                // informa a jtable que houve dados deletados passando a
                // linha removida
                fireTableRowsDeleted(linha,linha);
                return true;
            }
        }
        // Nao encontrou nada
        return false;
    }
    
}

e o frame q eu estou criando a tabela é o seguinte (vou colar sómente onde crio a tabela e coloco no frame, pq o ressto é o codigo q o netbeans gera):


public class TesteTabela extends javax.swing.JFrame {
    private TTableModel modelo;
    /** Creates new form TesteTabela */
    public TesteTabela() {
        initComponents();
        JTable tabela = criaTabela();
        tabela.setBounds(50,100,300,100);
        this.add(tabela);
    }
    
    public JTable criaTabela(){
        ArrayList dados = new ArrayList();
        String[] colunas = new String[] { "Estado", "Cidade" };
        boolean [] edicao = {false, true};
        
        // Alimenta as linhas de dados
        dados.add(new String[] { "SP", "São Paulo" });
        dados.add(new String[] { "RJ", "Rio de Janeiro" });
        dados.add(new String[] { "RN", "Rio Grande do Norte" });
        dados.add(new String[] { "ES", "Espirito Santo" });
        
        modelo = new TTableModel(dados, colunas, edicao);
        JTable jtable = new JTable(modelo);
        jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
        return jtable;
    } 
}

aguardo resposta

Se você vai fazer um TableModel próprio para ser igual a droga do DefaultTableModel, então é melhor usar a classe da Sun mesmo.

Agora, a idéia de fazer um TableModel é trabalhar com suas classes de negócio, sem copiar seus dados para listas de Strings. Um ótimo tutorial que ensina a fazer isso direito é esse aqui:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

[quote=ViniGodoy]Se você vai fazer um TableModel próprio para ser igual a droga do DefaultTableModel, então é melhor usar a classe da Sun mesmo.

Agora, a idéia de fazer um TableModel é trabalhar com suas classes de negócio, sem copiar seus dados para listas de Strings. Um ótimo tutorial que ensina a fazer isso direito é esse aqui:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

[/quote]

mais eu nao quero fazer uma tableModel pra funcionar igual a “droga” da defaulTableModel, mais se eu nao consegui fazer funcionar o basico, como eu poderia mudar, akele tutodial q vc me mandou, eu implementei tbm, ais ocorre o msm erro, as informacoes aparece mais o cabecalho nao, e não sei o que poderia estar errado, c puder me ajudar a consertar isso pra eu poder adaptar para o que eu preciso…eu agradeco

Coloque sua tabela em cima de um JScrollPane.

Ou seja troque a linha:

por:

Em 99.99% dos casos, é esse o problema do cabeçalho.

Mas é sério, um TableModel certinho poupa muita dor de cabeça, mesmo.