[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]