Inserindo dados no jtable[Resolvido]

Quando clico no botão pesquisar, busco na minha dao uma lista de dados para inserir no jtable, só que não estou conseguindo setar esta lista no jtable, se alguém puder me ajudar.
o código do evento do botão é o seguinte:

   public  void enviaDados() throws Exception{
        portariaAction action = new portariaAction();
        String tabela = new String();
        String busca = new String();
        String colunaTabela = new String();
        if(rbtAlunos.isSelected()){
            tabela = "alunos";
        }else
        if(rbtCursos.isSelected()){
            tabela = "cursos";
        }else
        if(rbtDisciplinas.isSelected()){
            tabela = "disciplinas";
        }else
        if(rbtProfessores.isSelected()){
            tabela = "professores";
        }else{
            JOptionPane.showMessageDialog(null,"Marque um item para consultar!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE);
        }
        if(txfId.getText().trim().equals("")){
            busca = jTextField2.getText();
            colunaTabela = "nome";
        }else
            if(jTextField2.getText().trim().equals("")){
                busca = txfId.getText();
                colunaTabela = "id";
            }else{
                JOptionPane.showMessageDialog(null, "Você não digitou nada em sua busca!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE);
            }
        lista = action.consultaGeral(busca,tabela,colunaTabela);
    }
   private void buscarDadosActionPerformed(java.awt.event.ActionEvent evt) {                                            
        try {
            enviaDados();
        } catch (Exception ex) {
            Logger.getLogger(SubJanela_ConsultaGeral.class.getName()).log(Level.SEVERE, null, ex);
        }
    }           

e o do meu jtable:

    List<portariaBean> lista = new ArrayList<portariaBean>();
    AbstractTableModel tableConsulta = new AbstractTableModel() {

        public int getRowCount() {
            return lista.size();
        }

        public int getColumnCount() {
            return 2;
        }
        @Override
        public String getColumnName(int coluna){
            switch(coluna){
                case 0:
                    return "ID";
                case 1:
                    return "Nome";
                default:
                    return "Não existe coluna para aparecer!!!!";
            }
        }
        public Object getValueAt(int rowIndex, int columnIndex) {
            portariaBean dados = lista.get(rowIndex);
            if(columnIndex == 0) return dados.getCodigo();
            if(columnIndex == 1) return dados.getNome();
            return "";
        }
    };

o restante é a action, business e a dao.
quando clico no botão, ele envia os dados e faz o select, põem na lista e retorna, tudo direitinho. o que está me faltando é setar a lista dentro do jtable.

Opa, Dani!

Vamos por partes:

1.Sobre o seu método de consulta…[quote=Dani Gomes] public void enviaDados() throws Exception{ portariaAction action = new portariaAction(); String tabela = new String(); String busca = new String(); String colunaTabela = new String(); if(rbtAlunos.isSelected()){ tabela = "alunos"; }else if(rbtCursos.isSelected()){ tabela = "cursos"; }else if(rbtDisciplinas.isSelected()){ tabela = "disciplinas"; }else if(rbtProfessores.isSelected()){ tabela = "professores"; }else{ JOptionPane.showMessageDialog(null,"Marque um item para consultar!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE); } if(txfId.getText().trim().equals("")){ busca = jTextField2.getText(); colunaTabela = "nome"; }else if(jTextField2.getText().trim().equals("")){ busca = txfId.getText(); colunaTabela = "id"; }else{ JOptionPane.showMessageDialog(null, "Você não digitou nada em sua busca!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE); } lista = action.consultaGeral(busca,tabela,colunaTabela); }[/quote]

Primeiro: ele é um método de consulta, certo. Normalmente, métodos onde se consultam dados retornam algum valor. Porque você o assinou como void de retorno? Mude o retorno para a sua lista que foi consultada no banco de dados.public List<SuaClasse> enviaDados()
Segundo: lance as exceções direito. Ao lançar Exception, você está sendo muito pouco específico, o que atrapalha na hora de saber o que acontece com os erros. Lançe um SQLException para as consultas. public List<SuaClasse> enviaDados() throws SQLException { ... }

[quote=Dani Gomes]
e o do meu jtable:

    List<portariaBean> lista = new ArrayList<portariaBean>();
    AbstractTableModel tableConsulta = new AbstractTableModel() {

        public int getRowCount() {
            return lista.size();
        }

        public int getColumnCount() {
            return 2;
        }
        @Override
        public String getColumnName(int coluna){
            switch(coluna){
                case 0:
                    return "ID";
                case 1:
                    return "Nome";
                default:
                    return "Não existe coluna para aparecer!!!!";
            }
        }
        public Object getValueAt(int rowIndex, int columnIndex) {
            portariaBean dados = lista.get(rowIndex);
            if(columnIndex == 0) return dados.getCodigo();
            if(columnIndex == 1) return dados.getNome();
            return "";
        }
    };

o restante é a action, business e a dao.
quando clico no botão, ele envia os dados e faz o select, põem na lista e retorna, tudo direitinho. o que está me faltando é setar a lista dentro do jtable.[/quote]
Primeiro: Faça sua classe do TableModel separado, só para não poluir muito o código. Deixe ele separadinho, fica mais fácil de manutenção e reajustes.
Segundo: Como você quer preencher a tabela, você precisa receber a coleção de dados. Você pode fazer isso via construtor ou um método qualquer.

[code]public class PortariaTableModel extends AbstractTableModel {

private List<portariaBean> portariaCollection;
public PortariaTableModel(List<portariaBean> portariaCollection) {
    this.portariaCollection = portariaCollection == null ? new ArrayList<portariaBean>() : portariaCollection;
}

public void setPortariaCollection(List<portariaBean> portariaCollection) {
    
    if (portariaCollection != null) {
        this.portariaCollection = portariaCollection;
    }
    fireTableDataChanged();
}

// e o resto dos seus métodos...

}
[/code]

Agora… Como fazer para os dados aparecerem na sua Tabela? Simples! Você possui o modelo dela. Você deve instanciá-lo e setá-lo na tabela!

List<portariaBean> portariaCollection = enviaDados(); // seu método de consulta.
PortariaTableModel tbmPortaria = new PortariaTableModel(portariaCollection); // seu modelo de tabela.
JTable tabela = new JTable(tbmPortaria); // atribuo o modelo à tabela.

E voilà, pronto!
Qualquer dúvida, só postar que te ajudaremos!

Fique com Deus, abraços!

1 curtida

As alterações da assinatura do método, já foram feitas. Mas o que eu faço com o retorno? Na verdade, é esse retorno que eu quero colocar no jtable, mas não estou conseguindo. Acho que está faltando algo para setar este retorno no jtable.
Quanto a este código:

List<portariaBean> lista = new ArrayList<portariaBean>();  
AbstractTableModel tableConsulta = new AbstractTableModel() {  
  
    public int getRowCount() {  
        return lista.size();  
    }  
  
    public int getColumnCount() {  
        return 2;  
    }  
    @Override  
    public String getColumnName(int coluna){  
        switch(coluna){  
            case 0:  
                return "ID";  
            case 1:  
                return "Nome";  
            default:  
                return "Não existe coluna para aparecer!!!!";  
        }  
    }  
    public Object getValueAt(int rowIndex, int columnIndex) {  
        portariaBean dados = lista.get(rowIndex);  
        if(columnIndex == 0) return dados.getCodigo();  
        if(columnIndex == 1) return dados.getNome();  
        return "";  
    }  
};  

eu deletei do meu form e criei uma classe portariaTableModel, e coloquei tudo lá juntamente com o código que você passou, acho que é essa a intenção, apesar de não ter dado certo.

List<portariaBean> portariaCollection = enviaDados();

Está acusando erro de incompatibilidade no enviaDados(). Acredito que seja por causa do retorno que não está sendo setado, por isso do erro.
Se puderes me ajudar.
Agradeço

O método retorna determinada coleção. Olhe o modelo da classe que eu fiz para o TableModel. Você recebe uma coleção por assinatura. Logo, você deve instanciar o modelo e adicioná-lo à tabela.

List<portariaBean> portariaCollection = enviaDados(); PortariaTableModel tbmPortaria = new PortariaTableModel(portariaCollection); JTable tablePortaria = new JTable(tbmPortaria);

As coisas são separadas. Uma coisa é o form e uma coisa é o modelo da tabela. O form exibe as informações e componentes na tela. O tablemodel trata dos dados a serem exibidos na tabela.

[code]public class Formulario extends JFrame {

public Formulario() {

    List<portariaBean> portariaCollection = ServicosPortaria.enviaDados();
    PortariaTableModel tbmPortaria = new PortariaTableModel(portariaCollection);
    JTable tablePortaria = new JTable(tbmPortaria);

    add(new JScrollPane(tablePortaria));
}

}[/code]
O tablemodel é outra classe, independente:

[code]public class PortariaTableModel extends AbstractTableModel {

private List<portariaBean> portariaCollection;
public PortariaTableModel(List<portariaBean> portariaCollection) {
    this.portariaCollection = portariaCollection == null ? new ArrayList<portariaBean>() : portariaCollection;
}

public void setPortariaCollection(List<portariaBean> portariaCollection) {
    
    if (portariaCollection != null) {
        this.portariaCollection = portariaCollection;
    }
    fireTableDataChanged();
}

// e o resto dos seus métodos...

}[/code]

E a classe que envia os dados também é outra coisa diferente:

[code]public class ServicosPortaria {

public List<portariaBean> enviaDados() throws SQLException {

    portariaAction action = new portariaAction();  
    String tabela = new String();  
    String busca = new String();  
    String colunaTabela = new String();  
    if(rbtAlunos.isSelected()){  
         tabela = "alunos";  
    }else  
    if(rbtCursos.isSelected()){  
        tabela = "cursos";  
    }else  
 if(rbtDisciplinas.isSelected()){  
     tabela = "disciplinas";  
 }else  
 if(rbtProfessores.isSelected()){  
     tabela = "professores";  
 }else{  
     JOptionPane.showMessageDialog(null,"Marque um item para consultar!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE);  
 }  
 if(txfId.getText().trim().equals("")){  
     busca = jTextField2.getText();  
     colunaTabela = "nome";  
 }else  
     if(jTextField2.getText().trim().equals("")){  
         busca = txfId.getText();  
         colunaTabela = "id";  
     }else{  
         JOptionPane.showMessageDialog(null, "Você não digitou nada em sua busca!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE);  
     }  
 lista = action.consultaGeral(busca,tabela,colunaTabela);  

 return lista;

}
}
}[/code]

E bingo! Não tem nenhum segredo.
Abraços!

Fiz várias alterações no código, mas ainda não consigo fazer com que os dados apareçam no jtable.
Minha tableModel está assim:

public class portariaTableModel extends AbstractTableModel{
    private List<portariaBean> listTabela;
    
    public portariaTableModel(){
        listTabela = new ArrayList<portariaBean>();
    }
    
    public portariaTableModel(List<portariaBean> lista){
        this();
        listTabela.addAll(lista);
    }
    
    @Override
    public Class<?> getColumnClass(int coluna){
        return String.class;
    }
    public int getRowCount() {
        return listTabela.size();
    }

    public int getColumnCount() {
        return 2;
    }
    
    @Override
    public String getColumnName(int coluna){
        switch(coluna){
            case 0:
                return "Código";
            case 1:
                return "Nome";
            default:
                return "";
        }
    }

    public Object getValueAt(int linha, int coluna) {
        portariaBean bean = listTabela.get(linha);
        switch(coluna){
            case 0:
                return bean.getCodigo();
            case 1:
                return bean.getNome();
            default:
                return null;
        }
    }
    
	public void adicionaLista(List<portariaBean> lista) {
		int i = listTabela.size();
		listTabela.addAll(lista);
// falta o código que vai setar os dados no jtable.
        }

Meu método que o jbutton chama quando clico em pesquisar está assim:

   public void enviaDados() throws Exception, SQLException{
        portariaAction action = new portariaAction();
        String tabela = btgSelecao.getSelection().getActionCommand();
        String busca = null;
        String colunaTabela = new String();
        if(txfId.getText().trim().equals("")){
            busca = jTextField2.getText();
            colunaTabela = "nome";
        }else
            if(jTextField2.getText().trim().equals("")){
                busca = txfId.getText();
                colunaTabela = "id";
            }else{
                JOptionPane.showMessageDialog(null, "Você não digitou nada em sua busca!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE);
            }
        List<portariaBean> consultaGeral = action.consultaGeral(busca,tabela,colunaTabela);
        modelo.adicionaLista(consultaGeral);
    }

Eu acho que agora só falta um detalhe, mas qual é este detalhe é que tá dificil de saber. Se puderes me ajudar novamente.

[quote=Dani Gomes]Fiz várias alterações no código, mas ainda não consigo fazer com que os dados apareçam no jtable.
Minha tableModel está assim:

//... public void adicionaLista(List<portariaBean> lista) { int i = listTabela.size(); listTabela.addAll(lista); } [/quote]

Faltou avisar à tabela que você alterou a coleção.
Primeiro: não precisa dessa variável i.
Segundo: limpe a coleção e adicione novamente.
Terceiro: acrescente na última linha desse método: fireTableDataChanged().

Abraços!

Double topic, foi mal.

Estou tentando fazer o que você disse. Mas não estou conseguindo, você pode postar o código de como eu faço para limpar a coleção e adicioná-la novamente.
Abraços.

Cara, é simples:

Ou você faz assim…

[code]public void adicionaLista(List lista) {

this.lista.removeAll();
this.lista.addAll(lista);
fireTableDataChanged();

}[/code]

Ou:

[code]public void adicionaLista(List lista) {

this.lista = lista;
fireTableDataChanged();

}[/code]

Simples assim!

Não funcionou.
No primeiro modo:

public void adicionaLista(List<portariaBean> lista) {  
    
    this.lista.removeAll();
    this.lista.addAll(lista);
    fireTableDataChanged();
}

O netbeans somente aceita se mudar a terceira linha para:

this.lista.removeAll(lista);

E no outro, ele aceita normal, mas não imprime nada no jtable.
Vou colocar como está meu código, pode ser que eu tenha alterado alguma coisa que não devia.
Meu método de chamada no form, no botão pesquisar.

    public void enviaDados() throws Exception, SQLException{
        portariaAction action = new portariaAction();
        String tabela = btgSelecao.getSelection().getActionCommand();
        String busca = null;
        String colunaTabela = new String();
        if(txfId.getText().trim().equals("")){
            busca = jTextField2.getText();
            colunaTabela = "nome";
        }else
            if(jTextField2.getText().trim().equals("")){
                busca = txfId.getText();
                colunaTabela = "id";
            }else{
                JOptionPane.showMessageDialog(null, "Você não digitou nada em sua busca!!!", "Atenção!!!", JOptionPane.INFORMATION_MESSAGE);
            }
        List<portariaBean> consultaGeral = action.consultaGeral(busca,tabela,colunaTabela);
        modelo.adicionaLista(consultaGeral);
    }

A chamada da tablemodel.

public class SubJanela_ConsultaGeral extends javax.swing.JFrame {
    private portariaTableModel modelo = new portariaTableModel();
    /** Creates new form SubJanela_ConsultaGeral */
    public SubJanela_ConsultaGeral() throws Exception, SQLException {
        initComponents();
        setTamanho();
    }
    private void setTamanho() throws Exception{
        Dimension dimensao = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((dimensao.width-750)/2,(dimensao.height-350)/2,750,350);
        modelo = new portariaTableModel();
        modelo.addTableModelListener(tblDados);
    }

a minha TableModel:

package Util;

import Bean.portariaBean;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

          
/**
 *
 * @author casa
 */
public final class portariaTableModel extends AbstractTableModel{
    
    private List<portariaBean> lista;
    
    public portariaTableModel(){
        lista = new ArrayList<portariaBean>();
    }
    
    public portariaTableModel(List<portariaBean> lista){
        this();
        this.lista.addAll(lista);
    }
    
    @Override
    public Class<?> getColumnClass(int coluna){
        return String.class;
    }
    public int getRowCount() {
        return lista.size();
    }

    public int getColumnCount() {
        return 2;
    }
    
    @Override
    public String getColumnName(int coluna){
        switch(coluna){
            case 0:
                return "Código";
            case 1:
                return "Nome";
            default:
                return "";
        }
    }

    public Object getValueAt(int linha, int coluna) {
        portariaBean bean = lista.get(linha);
        switch(coluna){
            case 0:
                return bean.getCodigo();
            case 1:
                return bean.getNome();
            default:
                return null;
        }
    }
    
    @Override
    public void setValueAt(Object value, int row, int col){
        fireTableCellUpdated(row, col);
    }
    
    public void adicionaLista(List<portariaBean> lista) {
        this.lista = lista;
        fireTableDataChanged();           
    }

    private void removeRow(int row) {
        lista.remove(row);
        fireTableRowsDeleted(row, row);
    }

    private void addRow(List<portariaBean> lista) {
        int linha = this.lista.size()-1;
        fireTableRowsInserted(linha, linha);
    }
}

e o restante é parte do mvc, que está passando tudo direitinho.
Coloquei tudo que eu acho que possa estar um erro que não acusa, mas também não me deixa prosseguir com o projeto.
Abraços

O seu TableModel está correto.
Deixe o adicionaLista do modo que você postou agora.
Seu problema é ali em cima. Você adiciona o modelo na tabela, não a tabela no modelo.

modelo = new portariaTableModel();  

// ou assim...
tblDados = new JTable(modelo);
// ou assim:
tblDados = new JTable();
tblDados.setModel(modelo);

Consegui fazer funcionar, mas tá retornando sempre o mesmo número e o mesmo nome, mas a quantidade de registro que deveria ter está correto.
O que estava faltando era fazer a chamada da jtable no método do botão.
Vou colocar como resolvido, mas se souberes porque está retornando a lista com os dados iguais e não como deveriam ser, cada linha um cadastro diferente, favor postar neste tópico mesmo.
Obrigado pela ajuda.

Confira sua consulta SQL. Veja qual é a sentença que é executada no banco de dados. Talvez seja isso!