[quote=Eric SantAnna]Para trabalhar com uma JTable, é quase que obrigatório que você defina sua própria TableModel (TableModel é o que define os dados da sua JTable)…
Eu levei um tempão pra aprender, mas vale a pena, não é muito difícil.
Eu montei um exemplo aqui, é só copiar e alterar os valores:
[code]import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import javax.swing.table.AbstractTableModel;
import model.Peca;
import util.SISMA;
public class MyTableModelPeca extends AbstractTableModel {
// Essa é a classe que vai definir o como são manipulados os dados na JTable
// Aqui definimos os métodos de inserir linha, remover linha, definir se um campo é ou não editável, etc
// O "banco de dados" que minha JTable usa aqui é o meu ArrayList<Peca> linhas (Peca é uma classe que criei para dados de peças de carro)
// Para alterar o valor de um campo, precisamos saber em qual linha e coluna ele está
// Uma vez que sabemos qual a linha e coluna, para achar o valor no "banco de dados" da JTable é só fazer:
// Peca minhaPeca = linhas.get(linhaDaTabelaInteger)  - cada linha do ArrayList corresponde a uma linha da milha tabela
// Cada coluna é um atributo da minha classe Peca, para obter o dado é só testar qual coluna foi selecionada:
// if(colunaDaTabelaInteger = 1) 
//     valor = minhaPeca.getNome();
// else if(colunaDaTabelaInteger = 2)
//     valor = minhaPeca.getPreco();
/**
 * 
 */
private static final long serialVersionUID = 6644666173929755642L;
private ArrayList<Peca> linhas = null;
// Construtor para o caso da JTable for iniciada vazia
public MyTableModelPeca()	{
	linhas = new ArrayList<Peca>();
}
// Construtor para o caso da JTable for iniciada com alguns dados
public MyTableModelPeca(LinkedHashSet<Peca> linhas)	{
	this.linhas = new ArrayList<Peca>();
	populaTabela(linhas);
}
// Popula a tabela pelo contrutor declarado acima
public void populaTabela(LinkedHashSet<Peca> linhas)	{
	Iterator<Peca> it = linhas.iterator();
	while(it.hasNext())	{
		addRow((Peca)it.next());
	}
}
// O "banco de dados" da JTable, cada linha, um registro
private ArrayList<Peca> getLinhas()	{
	return linhas;
}
// Quantidade de colunas da JTable
@Override
public int getColumnCount() {
	return 6;
}
// Quantidade de registros da JTable
@Override
public int getRowCount() {
	return linhas.size();
}
// Obtém o valor de uma célula
@Override
public Object getValueAt(int linha, int coluna) {
	Peca peca = getLinhas().get(linha); // Obtenho a linha (objeto, registro)
	if(coluna == SISMA.Peca.ID) return peca; // SISMA.Peca.CONSTANTE é um interface que criei com valores constantes para facilitar a leitura
											 // Ex: Na interface SISMA existe uma classe interna Peca, e lá é declarado:
											 // public final static int ID = 0;
											 //	public final static int NOME = 1;
											 //	public final static int MARCA = 2;
											 // ou seja, a coluna 0 é o ID, a coluna 1 é o NOME, etc
	  										 // mas se quiser pode colocar o número literal mesmo: 0, 1, 2, 3...
											 // Ex.: if(coluna == 0) return peca;
	else if(coluna == SISMA.Peca.NOME) return peca.getNome();
	else if(coluna == SISMA.Peca.MARCA) return peca.getMarca(); 
	else if(coluna == SISMA.Peca.MODELO) return peca.getModelo();
	else if(coluna == SISMA.Peca.QUANTIDADE) return peca.getQuantidade();
	else if(coluna == SISMA.Peca.MEDIDA) return peca.getMedida();
	else return null;
}
// Seta o valor de uma célula
// No exemplo somente a coluna QUANTIDADE "seta" um valor
// Esse método deve "combinar" com o método isEditable() mais a frente
// Quem não é editável não precisa entrar aqui...
@Override
public void setValueAt(Object valor, int linha, int coluna) {
	if(coluna == SISMA.Peca.QUANTIDADE)  getLinhas().get(linha).setQuantidade((Double)valor);
	this.fireTableCellUpdated(linha, coluna);
}
// Define o tipo da coluna
// É bom que seja o mesmo tipo do que é definido em getValueAt(x, x)
// A JTable utiliza o tipo da célula com base nesse método
// Ex: se definir o retorno como Boolean.class a célula terá um Checkbox, se for um número alinha à direita, se for string, alinha à esquerda, etc
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Class getColumnClass(int coluna)	{
	if(coluna == SISMA.Peca.ID) return Peca.class;
	else if(coluna == SISMA.Peca.QUANTIDADE) return Double.class;
	else return String.class;
}
// Define o nome que aparecerá no Header da JTable
@Override
public String getColumnName(int coluna)	{
	if(coluna == SISMA.Peca.ID) return "Id";
	else if(coluna == SISMA.Peca.NOME) return "Nome";
	else if(coluna == SISMA.Peca.MARCA) return "Marca";
	else if(coluna == SISMA.Peca.MODELO) return "Modelo";
	else if(coluna == SISMA.Peca.QUANTIDADE) return "Qntd";
	else if(coluna == SISMA.Peca.MEDIDA) return "Un.";
	else return "";
}
// Define se a célula é editável pelo usuário
@Override
public boolean isCellEditable(int linha, int coluna)	{
	if(coluna == SISMA.Peca.QUANTIDADE) return true;
	else return false;
}
// Adiciona uma linha no meu "banco de dados" e informa à JTable sobre a inclusão (para que ela se atualize)
public void addRow(Peca peca)		{
	getLinhas().add(peca);
	int linha = getLinhas().size()-1;
	this.fireTableRowsInserted(linha, linha);
}
// Remove uma linha no meu "banco de dados" e informa à JTable sobre a exclusão (para que ela se atualize)
public void removeRow(int linha)	{
	getLinhas().remove(linha);
	this.fireTableRowsDeleted(linha, linha);
}
// Limpa o meu "banco de dados" e informa à JTable sobre a exclusão (para que ela se atualize)
public void removeAll()	{
	getLinhas().clear();
	this.fireTableDataChanged();
}
}[/code]
Por exemplo, se você definir a sua data como do tipo Date, Timestamp, etc, ele vai ordenar da forma correta…
[/quote]
[quote]Eric, obrigado
a minha jTable é bem diferente da sua, mas ai segue a minha para entender melhor
[code]package Relatorios;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.Date;
import javax.swing.* ;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import utilitarios.conexao;
import javax.swing.text.MaskFormatter;
public class RelaContasCompleto extends javax.swing.JFrame
{
MaskFormatter formatodatacada;
private MaskFormatter formatodata;
private MaskFormatter formatocep;
private MaskFormatter formatocnpj;
private MaskFormatter formatoie;
private MaskFormatter formatoccm;
private MaskFormatter formatoddi;
private MaskFormatter formatotelefone;
int navega = 0 ;
String ordenacao ="codigo";
//String ordenacao1 ="datavencimento";
String novo = "n";
conexao contas;
private ActionListener ActionListener;
/** Creates new form RelaContasCompleto */
public RelaContasCompleto()
{
initComponents();
contas = new conexao();
contas.conecta();
contas.executeSQL("select * from fornecedor order by "+ordenacao);
try
{
contas.executeSQL("select * from Contas order by posicaoconta");
preencher_jtable();
contas.executeSQL("select * from Contas order by codigo");
contas.resultset.last();
mostrardados();
}
catch(SQLException erro)
{
JOptionPane.showMessageDialog(null,"BANCO DE DADOS NÃO ENCONTRADO, VERIFIQUE O ERRO");
}
}
public void mostrardados()
{
//try
{
//MOSTRA DATA NO FORMULÁRIO
Date data = new Date();
String dia = "" + data.getDate();
String mes = "" + String.valueOf(data.getMonth()+1);
String ano = "" + (1900 + data.getYear());
if (Integer.parseInt(dia)<=9)
dia = "0" + dia;
if (Integer.parseInt(mes)<=9)
mes = "0" + mes;
datacada.setText(dia+"/"+mes+"/"+ano);
datacada.setEditable(false);
//MOSTRA HORA NO FORMULÁRIO
Date hora = new Date();
String thora ="" + data.getHours();
String tminuto=""+ data.getMinutes();
String tsegundo=""+ data.getSeconds();
if (Integer.parseInt(tminuto)<=9)
tminuto = "0" + tminuto;
if (Integer.parseInt(tsegundo)<=9)
tsegundo = "0" + tsegundo;
horacada.setText(thora+":"+tminuto+":"+tsegundo);
horacada.setEditable(false);
//DESABILITA O X NO FORMULÁRIO
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
}
public void preencher_jtable()
{
DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer();
DefaultTableCellRenderer centro = new DefaultTableCellRenderer();
DefaultTableCellRenderer direita = new DefaultTableCellRenderer();
esquerda.setHorizontalAlignment(SwingConstants.LEFT);
centro.setHorizontalAlignment(SwingConstants.CENTER);
direita.setHorizontalAlignment(SwingConstants.RIGHT);
//CODIGO
jTable.getColumnModel().getColumn(0).setCellRenderer(centro);
//DATAVENCIMENTO
jTable.getColumnModel().getColumn(1).setCellRenderer(centro);
//FORNECEDOR
jTable.getColumnModel().getColumn(2).setCellRenderer(esquerda);
//VALOR
jTable.getColumnModel().getColumn(3).setCellRenderer(direita);
//PISIÇÃO CONTA
jTable.getColumnModel().getColumn(4).setCellRenderer(centro);
//CODIGO DE BARRAS
jTable.getColumnModel().getColumn(5).setCellRenderer(esquerda);
//CODIGO
jTable.getColumnModel().getColumn(0).setPreferredWidth(10);
//DATA VENCIMENTO
jTable.getColumnModel().getColumn(1).setPreferredWidth(20);
//FORNECEDOR
jTable.getColumnModel().getColumn(2).setPreferredWidth(200);
//VALOR
jTable.getColumnModel().getColumn(3).setPreferredWidth(30);
//POSIÇÃO CONTA
jTable.getColumnModel().getColumn(4).setPreferredWidth(30);
//CODIGO DE BARRAS
jTable.getColumnModel().getColumn(5).setPreferredWidth(200);
DefaultTableModel modelo = (DefaultTableModel)jTable.getModel();
modelo.setNumRows(0);
try
{
while(contas.resultset.next()
)
modelo.addRow(new Object[]
{
contas.resultset.getString("codigo"),
contas.resultset.getString("datavencimento"),
contas.resultset.getString("fornecedor"),
contas.resultset.getString("valor"),
contas.resultset.getString("posicaoconta"),
contas.resultset.getString("codigobarras"),
}
)
;
}
catch(SQLException erro)
{
}
}
/** 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() {
    jPanel3 = new javax.swing.JPanel();
    jLabel14 = new javax.swing.JLabel();
    datacada = new javax.swing.JTextField();
    horacada = new javax.swing.JTextField();
    jPanel1 = new javax.swing.JPanel();
    btsair = new javax.swing.JButton();
    jScrollPane2 = new javax.swing.JScrollPane();
    jTable = new javax.swing.JTable();
    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    setTitle("CRCJ - Assessoria Em Informática");
    setResizable(false);
    jPanel3.setBackground(java.awt.SystemColor.desktop);
    jPanel3.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
    jPanel3.setForeground(new java.awt.Color(255, 255, 255));
    jLabel14.setBackground(new java.awt.Color(0, 255, 0));
    jLabel14.setFont(new java.awt.Font("Haettenschweiler", 0, 24));
    jLabel14.setForeground(new java.awt.Color(255, 255, 255));
    jLabel14.setText("Relatório Das Contas Pagar e Receber");
    datacada.setBackground(java.awt.SystemColor.desktop);
    datacada.setFont(new java.awt.Font("Arial", 0, 16));
    datacada.setForeground(new java.awt.Color(255, 255, 255));
    datacada.setHorizontalAlignment(javax.swing.JTextField.CENTER);
    horacada.setBackground(java.awt.SystemColor.desktop);
    horacada.setFont(new java.awt.Font("Arial", 0, 16));
    horacada.setForeground(new java.awt.Color(255, 255, 255));
    horacada.setHorizontalAlignment(javax.swing.JTextField.CENTER);
    javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
    jPanel3.setLayout(jPanel3Layout);
    jPanel3Layout.setHorizontalGroup(
        jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jLabel14)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 433, Short.MAX_VALUE)
            .addComponent(datacada, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addComponent(horacada, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(21, 21, 21))
    );
    jPanel3Layout.setVerticalGroup(
        jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel3Layout.createSequentialGroup()
            .addContainerGap(13, Short.MAX_VALUE)
            .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(horacada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(datacada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap())
        .addGroup(jPanel3Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jLabel14)
            .addContainerGap(12, Short.MAX_VALUE))
    );
    jPanel1.setBackground(new java.awt.Color(102, 255, 204));
    jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
    jPanel1.setForeground(new java.awt.Color(255, 255, 255));
    btsair.setFont(new java.awt.Font("Tahoma", 1, 10));
    btsair.setText("Sair");
    btsair.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btsairActionPerformed(evt);
        }
    });
    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
            .addContainerGap(868, Short.MAX_VALUE)
            .addComponent(btsair, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(28, 28, 28))
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(btsair)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
    jTable.setFont(new java.awt.Font("Tahoma", 0, 10));
    jTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null, null, null},
            {null, null, null, null, null, null},
            {null, null, null, null, null, null},
            {null, null, null, null, null, null},
            {null, null, null, null, null, null}
        },
        new String [] {
            "Código", "Data Vencimento", "Fornecedor", "Valor", "Posição da Conta", "Código de Barras"
        }
    ) {
        boolean[] canEdit = new boolean [] {
            false, false, false, false, false, false
        };
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    jTable.getTableHeader().setReorderingAllowed(false);
    jScrollPane2.setViewportView(jTable);
    jTable.getColumnModel().getColumn(0).setResizable(false);
    jTable.getColumnModel().getColumn(1).setResizable(false);
    jTable.getColumnModel().getColumn(2).setResizable(false);
    jTable.getColumnModel().getColumn(3).setResizable(false);
    jTable.getColumnModel().getColumn(4).setResizable(false);
    jTable.getColumnModel().getColumn(5).setResizable(false);
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 965, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(1, 1, 1)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE)
            .addContainerGap())
    );
    java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    setBounds((screenSize.width-993)/2, (screenSize.height-685)/2, 993, 685);
}// </editor-fold>                        
private void btsairActionPerformed(java.awt.event.ActionEvent evt) {                                       
    // TODO add your handling code here:
//if(javax.swing.JOptionPane.showConfirmDialog(null,“DESEJA FECHAR ESTE FORMULÁRIO ?”,“SAIR”,javax.swing.JOptionPane.YES_NO_OPTION )==0)
//this.dispose();
//new Principal.TelaPrincipal().show();
Object[] options =
{
“Sim”, “Não”
};
int i = JOptionPane.showOptionDialog(null,
“DESEJA FECHAR ESTE FORMULÁRIO ?”,“SAIR”,
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
options, options[0]);
if (i == JOptionPane.YES_OPTION)
{
//System.exit(0);
this.dispose();
new Principal.TelaPrincipal().show();
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new RelaContasCompleto().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JButton btsair;
private javax.swing.JTextField datacada;
private javax.swing.JTextField horacada;
private javax.swing.JLabel jLabel14;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable jTable;
// End of variables declaration                   
}
[/code]