JTable não mostra a primeira linha do resultado[RESOLVIDO]

6 respostas
M

Olá, estou usando o código abaixo pra pegar uma consulta feito ao banco de dados e mostrar em uma tabela, o problema é que eu percebi que ele nunca mostra a primeira linha da tabela, só a partir da segunda!
Quando o resulto tem só um registro, ele manda a mensagem que não tem registros, mas qndo não tem, ele não faz nada, fica lá procurando eu acho…
Acho que o problema está nas linhas 2 a 7
Alguém pode me ajudar?

public void displayResultSet (ResultSet rs, Container NomePainel)throws SQLException {
       boolean moreRecords = rs.next();
        if (!moreRecords) {
            JOptionPane.showMessageDialog(this,"Sem Registros");
            setTitle("Nothing!");
            return;
        }
        setTitle("Nome da Tabela");
         //nome da tabela
        Vector coluna = new Vector();
        Vector linha = new Vector();

        try { // tenta pegar os títulos da colunas
            ResultSetMetaData titulocoluna = rs.getMetaData();
            for (int i = 1; i<=titulocoluna.getColumnCount(); i++) {
                coluna.addElement(titulocoluna.getColumnName(i));
            }
            do { // obtem dados da linha
                linha.addElement(getNextRow(rs, titulocoluna));
            }
            while (rs.next());
            // cria a tabela com os resultados

            JTable table = new JTable(linha, coluna);


            //adiciona função scroll
            JScrollPane scroller = new JScrollPane(table);
            //scroller.setSize(900, 100);
            scroller.setBounds(0, 200, 900, 100);
            //setContentPane(PResultado_ConsultaNotaBim);
            setContentPane(NomePainel);
            getContentPane().add(scroller);

            
           validate();


        }
        catch (SQLException ex) {
            ex.printStackTrace();
            System.out.println("\nerro na criação da tabela");
        }

   }
    public Vector getNextRow( ResultSet rs, ResultSetMetaData titulocoluna ) throws SQLException {
        Vector currentRow = new Vector();
        for ( int i = 1; i <= titulocoluna.getColumnCount(); i++ )
        switch( titulocoluna.getColumnType( i ) ) {
        case Types.VARCHAR:
        currentRow.addElement( rs.getString( i ) );
        break;
        case Types.INTEGER:
        currentRow.addElement( new Long( rs.getLong( i ) ) );
        break;
        case Types.DECIMAL:
        currentRow.addElement(rs.getFloat(i));
        break;
        case Types.DATE:
            String dataEmUmFormato = rs.getString(i);
            SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
            Date data = null;
            try {
                 data = (Date) formato.parse(dataEmUmFormato);
                 }
            catch (ParseException ex) {
                 Logger.getLogger(MenuPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                 }
            formato.applyPattern("dd/MM/yyyy");
            String aniv = formato.format(data);
            //System.out.println(aniv);
        currentRow.addElement(aniv);
        break;    
        }
        return currentRow;
    }

6 Respostas

ViniGodoy

Me impressiona que esse código sequer funcione. Você deve dar o next() antes de navegar no primeiro registro. Ou seja, troque isso:

do { // obtem dados da linha linha.addElement(getNextRow(rs, titulocoluna)); } while (rs.next());

Por isso:

while (rs.next()) { // obtem dados da linha linha.addElement(getNextRow(rs, titulocoluna)); }

ViniGodoy

Ops. Esqueça o que eu falei. Agora que vi que você dá um next logo na primeira linha… voltando a ler o código…

ViniGodoy

Você pode colocar o código da função que chama o método displayResultSet?

lina

Oi,

Você só pode estar dando um next no ResultSet antes de chamar o método displayResultSet.

Outra coisa, você não precisa criar 1 variavel a mais para a comparação:

if (!rs.next()) { JOptionPane.showMessageDialog(this,"Sem Registros"); setTitle("Nothing!"); return; }

Tchauzin!

M

Putz… só vi a resposta de vocês agora =/ e preciso entregar o programa jájá
Fiz uma gambiarra que deu certo… fiz três opções: consulta com um resultado, com nenhum e com mais de um. Acabou dando certo…
Quando voltar eu tento fazer o que foi recomendado para tirar essa gambiarra =D
Muito obrigada

ViniGodoy

mimila:
Putz… só vi a resposta de vocês agora =/ e preciso entregar o programa jájá
Fiz uma gambiarra que deu certo… fiz três opções: consulta com um resultado, com nenhum e com mais de um. Acabou dando certo…
Quando voltar eu tento fazer o que foi recomendado para tirar essa gambiarra =D
Muito obrigada

Se for realmente retrabalhar o código para retirar a gambi, considere fortemente tirar fora o seu DefaultTableModel e usar um TableModel próprio.
Na minha assinatura, tem a sugestão de 2 já implementados.

Criado 25 de novembro de 2009
Ultima resposta 25 de nov. de 2009
Respostas 6
Participantes 3