JTable sem o primeiro campo da Tabela

12 respostas
M

Boa tarde,

Estou tentando montar um JTable para listar os clientes cadastrados em uma tabela Access, o código está funcionando, mas os dados apresentados são divergentes, minha tabela é composta de Código, Nome, etc… mas quando os dados são apresentados no JTable o valor do nome é inserida na coluna Código e a coluna nome fica vazia, meu código está ignorando os valores da coluna Código que esta como autonumeração.

Alguém poderia me ajudar?

Obrigado

package cadastroSwing;

import java.awt.*;
import java.sql.*;
import javax.swing.*;
import java.util.*;

public class Relatorio extends JFrame {
	private static final long serialVersionUID = 1L;
	private Connection con;
	private JTable tabela;

	public Relatorio() {
		super("Clientes");
		String url = "jdbc:odbc:Banco";
		String usuario = "";
		String senha = "";
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			con = DriverManager.getConnection(url, usuario, senha);
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Conexão não estabelecida",
					"Mensagem do Programa", JOptionPane.ERROR_MESSAGE);
		}
		buscaTabela();
		setSize(600, 200);
		setVisible(true);
	}

	public static void main(String args[]) {
		Relatorio app = new Relatorio();
		app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void buscaTabela() {
		Statement st;
		ResultSet res;
		try {
			Vector cabecalho = new Vector();
			Vector linhas = new Vector();
			st = con.createStatement();
			res = st.executeQuery("SELECT codigo, nome FROM Clientes ORDER BY Nome");
			res.next();
			ResultSetMetaData rsmd = res.getMetaData();
			for (int i = 1; i <= rsmd.getColumnCount(); ++i)
				cabecalho.addElement(rsmd.getColumnName(i));
			do {
				linhas.addElement(proximaLinha(res, rsmd));
			} while (res.next());
			tabela = new JTable(linhas, cabecalho);
			JScrollPane scroller = new JScrollPane(tabela);
			getContentPane().add(scroller, BorderLayout.CENTER);
			scroller.setPreferredSize(new java.awt.Dimension(592, 144));
			validate();
			st.close();
		} catch (SQLException sqlex) {
		}
	}

	private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) {
		Vector LinhaAtual = new Vector();
		try {
			for (int i = 1; i <= rsmd.getColumnCount(); ++i)
				switch (rsmd.getColumnType(i)) {
				case Types.VARCHAR:
					LinhaAtual.addElement(rs.getString(i));
					break;
				case Types.TIMESTAMP:
					LinhaAtual.addElement(rs.getDate(i));
					break;
				case Types.NUMERIC:
					LinhaAtual.addElement(new Long(rs.getLong(i)));
					break;
				}
		} catch (SQLException e) {
		}
		return LinhaAtual;
	}
}

12 Respostas

R

Este for não deveria começar do 0?

Isto é mais uma dúvida do que uma resposta em si…

Att.,

S
private void buscaTabela() {
		Statement st;
		ResultSet res;
		try {
			Vector cabecalho = new Vector();
			Vector linhas = new Vector();
			st = con.createStatement();
			res = st.executeQuery("SELECT codigo, nome FROM Clientes ORDER BY Nome");
			res.next();
			ResultSetMetaData rsmd = res.getMetaData();



// O Contador de Colunas está começando por 1, deveria estar começando por zero, pois no java, array conta n-1.
			for (int i = 1; i <= rsmd.getColumnCount(); ++i)
				cabecalho.addElement(rsmd.getColumnName(i));



			do {
				linhas.addElement(proximaLinha(res, rsmd));
			} while (res.next());
			tabela = new JTable(linhas, cabecalho);
			JScrollPane scroller = new JScrollPane(tabela);
			getContentPane().add(scroller, BorderLayout.CENTER);
			scroller.setPreferredSize(new java.awt.Dimension(592, 144));
			validate();
			st.close();
		} catch (SQLException sqlex) {
		}
	}
Fernando_Generoso_da

renan3006:
Este for não deveria começar do 0?

Isto é mais uma dúvida do que uma resposta em si…

Att.,

não…a primeira coluna realmente começa do 1…assim como no resultset também está correto começar do 1.

M

Fernando Generoso da Rosa:
renan3006:
Este for não deveria começar do 0?

Isto é mais uma dúvida do que uma resposta em si…

Att.,

não…a primeira coluna realmente começa do 1…assim como no resultset também está correto começar do 1.

Você consegue ver aonde está o erro?

Fernando_Generoso_da

olha…eu acho que é nesse trecho:

do {   
                linhas.addElement(proximaLinha(res, rsmd));   
            } while (res.next());

tenta:

while (res.next()) {   
                linhas.addElement(proximaLinha(res, rsmd));   
            }
S

Usei como base o seu, deu certo aqui, segue anexo print.

Estou usando o Oracle XE, arrumei alguns trechos, só mudar o driver a string SQL e ve se funciona...

package novoprojeto;

import java.awt.*;
import java.sql.*;
import javax.swing.*;
import java.util.*;
import oracle.jdbc.driver.OracleDriver;

public class Relatorio extends JFrame {

    private Connection connection;
    private JTable jTable;

    public Relatorio(){

        super("Emploeyees");

        String url = "jdbc:oracle:thin:@localhost:1521:XE";
        String username = "system";
        String password = "1";

        try {
            
            Class.forName("oracle.jdbc.driver.OracleDriver");
            connection = DriverManager.getConnection(url, username, password);

            buildJTable();
            this.setSize(600, 200);
            this.setVisible(true);
            this.setEnabled(true);

        }
        catch (Exception exception) {
            JOptionPane.showMessageDialog(
                    null
                    , "Conexão não estabelecida"
                    , "Mensagem do Programa"
                    , JOptionPane.ERROR_MESSAGE
                    );
        }

    }

    public static void main(String args[]){
        Relatorio app = new Relatorio();
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void buildJTable() {

        Statement statement;
        ResultSet resultSet;

        try {

            Vector jTableHeader = new Vector();
            Vector jTableRows   = new Vector();
            String scriptSQL;

            scriptSQL  =    "SELECT EMPLOYEE_ID";
            scriptSQL +=         ", FIRST_NAME";
            scriptSQL +=         ", LAST_NAME";
            scriptSQL +=         ", PHONE_NUMBER";
            scriptSQL +=     " FROM HR.EMPLOYEES";
            scriptSQL += " ORDER BY FIRST_NAME";

            statement = connection.createStatement();
            resultSet = statement.executeQuery(scriptSQL);
            resultSet.next();
            ResultSetMetaData rsMetaData = resultSet.getMetaData();

            for (int i = 1; i <= rsMetaData.getColumnCount(); ++i)
                jTableHeader.addElement(rsMetaData.getColumnName(i));

            do {
                jTableRows.addElement(nextRow(resultSet, rsMetaData));
            } while (resultSet.next());

            jTable = new JTable(jTableRows, jTableHeader);
            JScrollPane jScrollPane = new JScrollPane(jTable);
            getContentPane().add(jScrollPane, BorderLayout.CENTER);
            jScrollPane.setPreferredSize(new java.awt.Dimension(592, 144));
            validate();

            statement.close();
        }
        catch (SQLException exception) {
        }
    }

    private Vector nextRow(ResultSet resultSet, ResultSetMetaData rsMetaData) {
        Vector currentRow = new Vector();
        try {
            for (int i = 1; i <= rsMetaData.getColumnCount(); ++i){
                switch (rsMetaData.getColumnType(i)) {
                    case Types.VARCHAR:
                        currentRow.addElement(resultSet.getString(i));
                        break;
                    case Types.TIMESTAMP:
                        currentRow.addElement(resultSet.getDate(i));
                        break;
                    case Types.NUMERIC:
                        currentRow.addElement(new Long(resultSet.getLong(i)));
                        break;
                }
            }
        }
        catch (SQLException exception) {
        }
        return currentRow;
    }

}

71C4700

Eu iria tentar resolver seguindo esta ordem:

1. Se ele criasse um objeto que conteria todos os campos da pesquisa;

2. Armazenase em um ArrayList os valores vindos do ResultSet;

3. Montar a Jtable, baseada neste ArrayList, ou melhor o TableModel da JTable;

Lembrando sempre que é uma boa pratica de programação implementar seu proprio TableModel, aqui no guj já tem bons tutoriais.
Sim cada passo deste sendo realizado em classes diferentes pra dividir as responsabilidades, tá tudo em um unico local.

ps1: Eu iria tentar assim, mas pode não ser a melhor solução.
ps2: Pra armazenar os valores vindos seria melhor utilizar um ArrayList invés da classe Vector - opinião.

M
Fernando Generoso da Rosa:
olha...eu acho que é nesse trecho:
do {   
                linhas.addElement(proximaLinha(res, rsmd));   
            } while (res.next());

tenta:

while (res.next()) {   
                linhas.addElement(proximaLinha(res, rsmd));   
            }

Abriu a tabela zavia.

M

Caro SilentSierra, obrigado pela ajuda, mas o erro persiste conforme seu código.

M

Continuo sem solução e pior ainda sem entender, alguém pode me ajudar?

M

Em um teste, acabei de ver que o código está mostrando somente campos textos do banco, mudei o tipo da coluna para Texto e mostro o valor.

Alguma sugestão de como mostrar todos os tipos de dados?

P

Massucato

Estou tentando desenvolver uma classe genérica para preenchimento de objetos, preciso de ajuda, aquele que desejar implementar esta classe desde  agradeço. Por enquanto  tem JTable e JComboBox.

           Está funcionando. Pois pode ficar melhor ainda.

           Segue código:
/*
 * PreencheObjetos.java
 *
 * Created on 5 de Agosto de 2007, 19:37
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package utilitarios;

//import bancodados.BancoDados;

import bancodados.BancoDados;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author PRSantos
 */
public class PreencheObjetos {
    /** Creates a new instance of PreencheObjetos */
    public static Object fill(Object objeto, StringBuffer sbSQL, Connection Conexao) {
        System.out.println("Populando Objeto - " + objeto.getClass().getName());
        
        if (objeto.getClass().getName().equals("ComboBox")) {
            
        } else if (objeto.getClass().getName().equals("javax.swing.JTable")) {
            objeto = PreencheJTable((JTable) objeto, BancoDados.FabricaCosulta(sbSQL, Conexao));
        } else if (objeto.getClass().getName().equals("javax.swing.DataGridView")){
            
        };
        
        return objeto;
    }
    
    protected static JTable PreencheJTable(final JTable jT, final ResultSet rs) {
        try {
            Vector colunas = new Vector();  //Cabeçalho das colunas
            Vector linhas = new Vector();   //Registros da tabela
            while (rs.next()) {
                if (rs.isFirst()) {
                    for (int intContadorColunas = 1; intContadorColunas <= rs.getMetaData().getColumnCount(); intContadorColunas++) {
                        Vector parametrosColunas = new Vector();
                        
                        parametrosColunas.addElement(rs.getMetaData().getCatalogName(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getColumnClassName(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getColumnCount());
                        parametrosColunas.addElement(rs.getMetaData().getColumnDisplaySize(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getColumnLabel(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getColumnName(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getColumnType(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getColumnTypeName(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getPrecision(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getScale(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getSchemaName(intContadorColunas));
                        parametrosColunas.addElement(rs.getMetaData().getTableName(intContadorColunas));

//                        System.out.println("getCatalogName - " + rs.getMetaData().getCatalogName(intContadorColunas));
//                        System.out.println("getColumnClassName - " + rs.getMetaData().getColumnClassName(intContadorColunas));
//                        System.out.println("getColumnCount - " + rs.getMetaData().getColumnCount());
//                        System.out.println("getColumnDisplaySize - " + rs.getMetaData().getColumnDisplaySize(intContadorColunas));
//                        System.out.println("getColumnLabel - " + rs.getMetaData().getColumnLabel(intContadorColunas));
//                        System.out.println("getColumnName - " + rs.getMetaData().getColumnName(intContadorColunas));
//                        System.out.println("getColumnType - " + rs.getMetaData().getColumnType(intContadorColunas));
//                        System.out.println("getColumnTypeName - " + rs.getMetaData().getColumnTypeName(intContadorColunas));
//                        System.out.println("getPrecision - " + rs.getMetaData().getPrecision(intContadorColunas));
//                        System.out.println("getScale - " + rs.getMetaData().getScale(intContadorColunas));
//                        System.out.println("getSchemaName - " + rs.getMetaData().getSchemaName(intContadorColunas));
//                        System.out.println("getTableName - " + rs.getMetaData().getTableName(intContadorColunas));
//                        System.out.println(" ========================================= ");

                        colunas.addElement(parametrosColunas);
                    }
                }
                
                Vector valoresColunas = new Vector();
                for (int intContadorLinhas = 1; intContadorLinhas <= rs.getMetaData().getColumnCount(); intContadorLinhas++) {
                    valoresColunas.addElement(FormataDado(rs.getObject(rs.getMetaData().getColumnName(intContadorLinhas))));
//                    System.out.println(rs.getObject(rs.getMetaData().getColumnName(intContadorLinhas)));
                }

                linhas.addElement(valoresColunas);
            }
            
            
            
            //Configura Tabela
            jT.setModel(new ModeloTabelaPadrao(linhas, colunas));
            jT.setColumnModel(new ModeloColunaTabelaPadrao(colunas));
            
            //Configura Tabela (Segundo bloco)
            jT.getTableHeader().setReorderingAllowed(false);
            jT.getTableHeader().setResizingAllowed(false);
            jT.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            
//////////            //Configura tabela
//////////            jT.setCellSelectionEnabled(false);
//////////            jT.setColumnSelectionAllowed(false);
//////////            jT.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//////////            jT.setAutoCreateColumnsFromModel(false);
//////////            jT.setSelectionModel(new DefaultListSelectionModel());
//////////
//////////            //Define o modelo da tabela
//////////            jT.setModel(new ModeloTabelaPadrao(linhas, colunas));
//////////
//////////            //Define o modelo das colunas da tabela
//////////            jT.setColumnModel(new ModeloColunaTabelaPadrao(colunas));
//////////
//////////            //
//////////            //jT.getTableHeader().setDefaultRenderer(CelulaCabecalhoTabela(jT.getTableHeader()));
//////////
//////////            //Define objeto da célula
//////////            jT.setDefaultRenderer(Object.class, new CelulaTabela());
            
        } catch (SQLException errorSQL) {
            JOptionPane.showMessageDialog(null, errorSQL.getMessage(), "Erro SQL", JOptionPane.ERROR_MESSAGE);
            errorSQL.printStackTrace();
        }
        
        return jT;
    }

    protected static Object FormataDado(final Object objDado) {
        SimpleDateFormat sdf;
        NumberFormat nf;
        DecimalFormat df;
        Object objDadoFormatado;

        sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
        df = new DecimalFormat("###,###,##0.00");
        nf = NumberFormat.getNumberInstance(Locale.getDefault());
        objDadoFormatado = objDado;
        
        if (objDadoFormatado instanceof Integer) {
            objDadoFormatado = df.format(objDadoFormatado);
        } else if (objDadoFormatado instanceof byte[]) {
            objDadoFormatado = new String(((byte[]) objDadoFormatado));
        } else if (objDadoFormatado instanceof Timestamp) {
            objDadoFormatado = sdf.format(objDadoFormatado);
        } else if (objDadoFormatado instanceof Float) {
            objDadoFormatado = df.format(((Float) objDadoFormatado));
        } else if (objDadoFormatado instanceof BigDecimal) {
            objDadoFormatado = df.format(((BigDecimal) objDadoFormatado));
        } else if (objDadoFormatado instanceof BigInteger) {
            objDadoFormatado = df.format(objDadoFormatado);
        } else if (objDadoFormatado instanceof Double) {
            objDadoFormatado = df.format(((Double) objDadoFormatado));
        } else if (objDadoFormatado instanceof Long) {
            objDadoFormatado = df.format(objDadoFormatado);
        } else {
            if (objDadoFormatado != null) {
                System.out.println("Tipo de dado inexistênte - " + objDadoFormatado.getClass().getName());
            }
        }
        
        return objDadoFormatado;
    }
}
Criado 29 de setembro de 2008
Ultima resposta 30 de set. de 2008
Respostas 12
Participantes 6