Preenchimento de jtable não funciona

Olá pessoal!
Eu tenho o seguinte codigo:

[code]private void addObra() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
TmObras = (DefaultTableModel) jTable1.getModel();
obras = session.createQuery("FROM Obra where codObra = " + jTextField4.getText().trim()).list();
exemplares = session.createQuery(“FROM Exemplar”).list();
while (TmObras.getRowCount() > 0) {
TmObras.removeRow(0);
}
if (obras.isEmpty()) {
JOptionPane.showMessageDialog(null, “Nenhum Obra encontrada.”);
} else {
String[] campos = new String[]{};
TmObras.addRow(campos);
for (int j = 0; j < obras.size(); j++) {
TmObras.setValueAt(obras.get(j).getCodObra(), j, 0);
TmObras.setValueAt(obras.get(j).getTitulo(), j, 1);
TmObras.setValueAt(obras.get(j).getNuExemplar(), j, 2);

//aqui estava tentando buscar o código do exemplar que faz parte da obra.
TmObras.setValueAt(exemplares.listIterator(3), j, 3);
}
}
session.close();
}
[/code]
Este método preenche a tabela, mas não da forma como eu quero, ou seja, preciso que a cada obra selecionada, eu possa adicioná-la na jtable, mas não é o que ocorre, ocorre o seguinte: quando seleciono código e insiro no jtable com ação de um botão ele vai, mas quando escolho um outro código para tbm ser adicionado ele simplesmente fica no lugar do primeiro.

Alguém sabe por que isto esta acontecendo?
Ajuda! \o/

Por causa desse trecho de código aqui, retire esse código e veja se resolve profavelmente sim


        while (TmObras.getRowCount() &gt; 0) {  
            TmObras.removeRow(0);  
        } 

Usa esse pacote e todos os seus problemas com JTable serão resolvidos…

rs2xml.jar

http://www.mediafire.com/?tdohli0yr89zg7y

[youtube]http://www.youtube.com/watch?v=QdPNi_xkBnA[/youtube]

Sds,

Maurijava.

Olá maurijava!

Continua do mesmo jeito: Pegando só uma linha… :cry:

Veja o código:

private void addObra() { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); TmObras = (DefaultTableModel) jTable1.getModel(); exemplares = session.createQuery("FROM Exemplar where codExemplar = " + jTextField4.getText()).list(); obras = session.createQuery("FROM Obra").list(); if (exemplares.isEmpty()) { JOptionPane.showMessageDialog(null, "Nenhum Exemplar encontrado."); } else { String[] campos = new String[]{null, null, null, null}; TmObras.addRow(campos); for (int j = 0; j < exemplares.size(); j++) { TmObras.setValueAt(exemplares.get(j).getCodExemplar(), j, 0); TmObras.setValueAt(exemplares.get(j).getCodObra(), j, 1); TmObras.setValueAt(obras.get(j).getTitulo(), j, 2); TmObras.setValueAt(obras.get(j).getNuExemplar(), j, 3); } } session.close(); }

Estou pegando os campos de um JTextField e chamo este método num botão.

Todas as vezes que você clicar no JButon ele vai criar um JTable, seta com o TableModel Defaut e popula com a query que pega da session. Então esta acontecendo exatamente o que você escreveu para acontecer.

O certo seria você criar o JTable fora do metodo addObra() e passa-lo como argumento, mais ou menos assim:

 
TmObras = (DefaultTableModel) jTable1.getModel(); 


private void addObra(JTable table) { 

Session session = HibernateUtil.getSessionFactory().openSession();  
        session.beginTransaction();  
        exemplares = session.createQuery("FROM Exemplar where codExemplar = " + jTextField4.getText()).list();  
        obras = session.createQuery("FROM Obra").list();  
        if (exemplares.isEmpty()) {  
            JOptionPane.showMessageDialog(null, "Nenhum Exemplar encontrado.");  
        } else { 
            String[] campos = new String[]{null, null, null, null};  
            table.addRow(campos);  
            for (int j = 0; j < exemplares.size(); j++) {        
                TmObras.setValueAt(exemplares.get(j).getCodExemplar(), j, 0);  
                TmObras.setValueAt(exemplares.get(j).getCodObra(), j, 1);  
                TmObras.setValueAt(obras.get(j).getTitulo(), j, 2);  
                TmObras.setValueAt(obras.get(j).getNuExemplar(), j, 3);  
            }  
        }  
        session.close();  
    }   

Lá no JButon você chama o metodo assim:

addObra(TmObras);

É mais ou menos por ai…

Espero ajudar.

Sds,

Maurijava.

Corrigindo o primeiro código da resposta:

TmObras = (DefaultTableModel) jTable1.getModel();   
  
  
private void addObra(JTable table) {   
  
Session session = HibernateUtil.getSessionFactory().openSession();    
        session.beginTransaction();    
        exemplares = session.createQuery("FROM Exemplar where codExemplar = " + jTextField4.getText()).list();    
        obras = session.createQuery("FROM Obra").list();    
        if (exemplares.isEmpty()) {    
            JOptionPane.showMessageDialog(null, "Nenhum Exemplar encontrado.");    
        } else {   
            String[] campos = new String[]{null, null, null, null};    
            table.addRow(campos);    
            for (int j = 0; j < exemplares.size(); j++) {          
                table.setValueAt(exemplares.get(j).getCodExemplar(), j, 0);    
                table.setValueAt(exemplares.get(j).getCodObra(), j, 1);    
                table.setValueAt(obras.get(j).getTitulo(), j, 2);    
                table.setValueAt(obras.get(j).getNuExemplar(), j, 3);    
            }    
        }    
        session.close();    
    }     

Tinha esquecido de mudar de TmObras para table dentro do laço de for…

Olá!

Não consegui fazer com essas modificações. :cry:

Dá erro na linha TmObras = (DefaultTableModel) jTable1.getModel(); diz que não foi encontrada a classe TmObras, sendo que TmObras é o nome de uma variável que defini como DefaultTableModel TmObras; lá no inicio dos metodos. Além disso, dá erro na linha table.addRow(campos);

Tem uma forma mais fácil de buscar a obra no banco e com um evento no botao adicionar na tabela e salvar no banco de dados?
Veja anexo a ideia. (Algo bem simples!)

O código a seguir é o evento de preencher a table, preenche direitinho, mas não preenche linha a linha, sempre atualiza a primeira linha.

[code]private void addObra(JTable jTable) {
Session session = HibernateUtil.getSessionFactory().openSession();
// session.beginTransaction();
exemplares = session.createQuery("FROM Exemplar where codExemplar = " + jTextField4.getText().trim()).list();
obras = session.createQuery(“FROM Obra”).list();
if (exemplares.isEmpty()) {
JOptionPane.showMessageDialog(null, “Nenhum Exemplar encontrado.”);
} else {
String[] campos = new String[]{null, null, null, null};
TmObras = (DefaultTableModel) jTable1.getModel();
TmObras.addRow(campos);
for (int j = 0; j < exemplares.size(); j++) {
try {
if (exemplares.get(j).getInConsulta() != 0) {
JOptionPane.showMessageDialog(null, “Não pode ser emprestado!”);
} else {
jTable.setValueAt(exemplares.get(j).getCodExemplar(), j, 0);
jTable.setValueAt(exemplares.get(j).getCodObra(), j, 1);
jTable.setValueAt(obras.get(j).getTitulo(), j, 2);
jTable.setValueAt(obras.get(j).getNuExemplar(), j, 3);
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Este está com o campo InConsulta nulo! Por isso este erro: " + e);
}

        }
         
    }
    session.close();       
}[/code]

Ajuda! Este é um trabalho pra o final de curso. E estou iniciando nessa área. Tenho muito o que aprender. :slight_smile:


Você está usando um DefaultTableModel, está não é uma boa opção, por diversos motivos, segue links:

http://www.guj.com.br/posts/list/15/199067.java#1001295

O objeto JTable do Swing é um componente MVC, e é preciso entender o seu conceito, segue link:

http://www.guj.com.br/articles/140

Eu passei um pacote lá pra cima que abstrai essa dificuldade toda de se trabalhar com JTable, sinceramente nunca fiz uma aplicação com esta necessidade específica usando este pacote, mas acredito que lá tem uma solução para isto. Sugiro que você estudo a documentação do rs2xml.jar que lá deve ter um metodo para resolver isso bem facim…

Sds,

Maurijava

Eu fiz o seguinte, criei uma classe que extends ao AbstractTableModel:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package Visao;

import Dominio.Obra;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
*

  • @author Jackeline
    */
    public class TabelaObras extends AbstractTableModel {

    private List obras;
    private static final String[] col = {“CódigoObra”, “Número de Exemplar”, “Título”, “ISBN”};

    public TabelaObras(List obras) {
    this.obras = obras;
    fireTableStructureChanged();
    }

    @Override
    public int getRowCount() {
    return obras.size();
    }

    @Override
    public int getColumnCount() {
    return col.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    Obra obra = obras.get(rowIndex);
    Object dado = null;
    switch (columnIndex) {
    case 0:
    dado = obra.getCodObra();
    break;
    case 1:
    dado = obra.getTitulo();
    break;
    case 2:
    dado = obra.getNuExemplar();
    break;
    }
    return dado;
    }

    public void addRow(String[] campos) {
    //Gostaria que me ajudasse a criar este metodo
    //que pega a obra e adiciona na tabela.
    }
    }
    [/code]

Como modifico estemetodo para atribuir a TableModel que criei?

[code]TmObras = (DefaultTableModel) jTable1.getModel();

private void addObra(JTable table) {

Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
exemplares = session.createQuery("FROM Exemplar where codExemplar = " + jTextField4.getText()).list();
obras = session.createQuery(“FROM Obra”).list();
if (exemplares.isEmpty()) {
JOptionPane.showMessageDialog(null, “Nenhum Exemplar encontrado.”);
} else {
String[] campos = new String[]{null, null, null, null};
table.addRow(campos);
for (int j = 0; j < exemplares.size(); j++) {
TmObras.setValueAt(exemplares.get(j).getCodExemplar(), j, 0);
TmObras.setValueAt(exemplares.get(j).getCodObra(), j, 1);
TmObras.setValueAt(obras.get(j).getTitulo(), j, 2);
TmObras.setValueAt(obras.get(j).getNuExemplar(), j, 3);
}
}
session.close();
}
[/code]

Até.

Tem uma dica aqui mesmo no forum com este metodo (add) já pronto. Percebi que faltou você implementar alguns metodos no seu TableModel. Dá uma estudade neste link, ele vai de ajudar:

http://www.guj.com.br/articles/147

Sds,

Maurijava.

Outra coisa

Você esta fazendo:

TmObras = (DefaultTableModel) jTable1.getModel();

por quê???

se você tem um Table model deve usar ele, por este código você está utilizando o DefaultTableModel. O correto seria:

TabelaObras tmObras = new TabelaObras(obras);

a partir daqui você começa a usar os metodos e estrutura que criou no TableModel TabelaObras…

Sds,

Maurijava