Pegar todos os dados de uma JTable![RESOLVIDO]

5 respostas
A

Olá amigos.
Estou precisando de uma força aqui com minha JTable.
Seguindo o conselho de vários amigos aqui no fórum como o ViniGodoy e outros, não ultilizo o DefaultTableModel como modelo e implementei os meus métodos o que realmente é uma mão na roda.
Só que ainda sou iniciante no AbstractTableModel e estou precisando de uma força pessoal.
É o seguinte.
Tenho um JTable onde o cara, em tempo de execução, vai adicionando linhas de acordo com o formulário preenchido, quando ele clica em incluir o sistema pega os valores e coloca em uma nova linha no JTable, tá tudo funcionando legal(trata-se de várias linhas porque é um controle de saída de produtos de estoque).
Então, até ae tudo bem, só que agora eu preciso pegar todos os dados da JTable, para poder jogar tudo no banco depois.

É o seguinte esquema, um array de itens retirados, pessoa que retirou(vem de um textField),data que retirou.

Preciso pegar todas as linahs e todas as colunas e colocar em um List mas ele só joga para Object e não estou sabendo como manipular, não estou conseguindo pensar como, estive olhando várias coisas aqui no fórum mas gostaria de algo mas específico para o meu caso.

meu model:

package Util;

import Model.SaidaPatrimonio;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Andre
 */
public class MyTable extends AbstractTableModel {
    
    private List<SaidaPatrimonio> linhas;
    private String[] colunas = {"Código Patrimônio","Descrição","Quantidade","Setor"};

   
    
    public MyTable(){
        linhas = new ArrayList<SaidaPatrimonio>();
    }
    
    @Override
    public int getRowCount() {
        return linhas.size();
    
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        SaidaPatrimonio s = linhas.get(rowIndex);  
  
        // Retorna o campo referente a coluna especificada.  
        // Aqui é feito um switch para verificar qual é a coluna  
        // e retornar o campo adequado. As colunas sãoas mesmas  
        // que foram especificadas no array "colunas".  
        switch (columnIndex) {  
  
            // Seguindo o exemplo: "código","Descrição", "Quantidade", "setor"};  
            case 0:  
                return s.getIdPatrimonio();  
            case 1:  
                return s.getDescricaoPatrimonio();  
            case 2:  
                return s.getQuantidadeRetirada();  
            case 3:  
                return s.getSetor(); 
            default:  
                // Isto não deveria acontecer...  
                throw new IndexOutOfBoundsException("columnIndex out of bounds");  
        }  
        
    }
    
     @Override  
    public String getColumnName(int columnIndex) {  
        // Retorna o conteúdo do Array que possui o nome das colunas  
        return colunas[columnIndex];  
    }  
     
       public SaidaPatrimonio getSaidaPatrimonio(int indiceLinha) {  
        return linhas.get(indiceLinha);  
    }  
       
        /* Adiciona um registro. */  
    public void addSaida(SaidaPatrimonio s) {  
        // Adiciona o registro.  
        linhas.add(s);
        //JOptionPane.showMessageDialog(null,linhas.get(0).getDescricaoPatrimonio());
        int ultimoIndice = getRowCount()-1;  
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }
    
     /* Remove a linha especificada. */  
    public void removeCliente(int indiceLinha) {  
        linhas.remove(indiceLinha);  
  
        fireTableRowsDeleted(indiceLinha, indiceLinha);  
    }  
    
    /* Remove todos os registros. */  
    public void limpar() {  
        linhas.clear();  
  
  
        fireTableDataChanged();  
    }  
  
    /* Verifica se este table model esta vazio. */  
    public boolean isEmpty() {  
        return linhas.isEmpty();  
    } 
    
    
    /* Adiciona uma lista de Cliente ao final dos registros. */  
    public void addListaDeSaidas(List<SaidaPatrimonio> s) {  
        // Pega o tamanho antigo da tabela.  
        int tamanhoAntigo = getRowCount();  
  
        // Adiciona os registros.  
        linhas.addAll(s);  
  
        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);  
    }  
    
   
    
}

Por favor amigos me ajudem.
Qualquer informação que precisarem é só falar.

5 Respostas

L

Seu problema está mais fácil que vc imagina…

Pense:
Onde estão armazenados os dados da sua JTable ? No objeto MyTable.
Como estão armazenados? Num ArraylistList&lt;SaidaPatrimonio&gt; .
Então o que vc tem que fazer pra pegar essas dados? Criar um método que retorne List&lt;SaidaPatrimonio&gt; linhas
Como fazer isso num JTable ? Chame getModel no JTable , obtenha o MyTable e chame esse método que retorna o List , pronto!

A

Olá amigo!
Cara, muito obrigado pela força, mas ainda não consegui fazer como vc me falou!
Vc poderia colocar um exemplo do código para mim de como ficaria(desculpa o incômodo).
Obrigado amigos!

E
é só criar um get pra tua lista do model e depois chamá-lo de onde vc quiser.. como o luiz_renato falou, é o teu List que armazena todos os dados do model..
...
MyTable model = new MyTable();
JTable table = new JTable(model);

//agora vc pode operar com o model
model.getLinhas(); //esse método retorna a tua lista de SaidaPatrimonio
...
espero ter ajudado..
A

Olá amigo.
Muito obrigado pela ajuda cara, eu acabei resolvendo de outra maneira aqui.
No meu caso, eu vi que eu tenho apenas um campo que é um array de Strings (no meu caso Itens Retirados)... ae eu fiz o seguinte:

MyTable
public Object[][] getAllItems(){
       int row = getRowCount();
       int col = getColumnCount();
       Object[][] dados =new Object[row][1];
       
       for(int i=0;i<row;i++){
        dados[i][0] = getValueAt2(i, 0);
        //dados[i][1] = getValueAt2(i, 1);
        //dados[i][2] = getValueAt2(i, 2);
       
        
       }
       return dados;
   }
public Object getValueAt2(int rowIndex, int columnIndex) {
        SaidaPatrimonio s = linhas.get(rowIndex);
  
        // Retorna o campo referente a coluna especificada.  
        // Aqui é feito um switch para verificar qual é a coluna  
        // e retornar o campo adequado. As colunas sãoas mesmas  
        // que foram especificadas no array "colunas".  
        switch (columnIndex) {  
  
            // Seguindo o exemplo: "código","Descrição", "Quantidade", "setor"};  
            case 0:  
                return s.getDescricaoPatrimonio();  
            /*
            case 1:  
                return s.getNomePessoaPegou();  
            case 2:  
                return s.getDataRetirada(); */
            default:  
                // Isto não deveria acontecer...  
                throw new IndexOutOfBoundsException("columnIndex out of bounds");  
        }  
        
    }
Tela:
public List<SaidaPatrimonio> getAllItems(){
    Object[][] dados = model.getAllItems();
    List<SaidaPatrimonio>list = new ArrayList();
    SaidaPatrimonio s = new SaidaPatrimonio();
    int tam = dados.length;
    s.setNomePessoaPegou(txtNomePessoaPegou.getText());
    String data = new SimpleDateFormat("dd/MM/yyyy").format(txtDataRetirada.getDate());
    s.setDataRetirada(data);
    String [] descricoes = new String [tam];
    for(int i=0;i<tam;i++){//ver aqui que está dando o erro... usar o debug para ver os valores corretos
        
        descricoes[i] = String.valueOf(dados[i][0]);
        
       
    }
        s.setItensRetirados(descricoes);
       
        list.add(0, s);
    
    return list;
    
}

Consegui pegar os dados da minha tabela dessa maneira, e também entendi o que os amigos falaram e construí um método para pegar os dados da minha table (getAllTable)...
Agora estou enfrentando outro problema mas é cmo a questão do array!rsrsrsr
Muito obrigado amigos...
Um forte abraço!

L

Bom andre_bento ,

Não sei se eu entendi direito mas posso sugerir o seguinte:

  • Troque o tipo de atributo itensRetirados da SaidaPatrimonio de array p/ List<String> pois te facilita lá na frente…
  • Vc não precisa de getValue2 só p/ retornar a descrição de cada patrimonio , os dados do seu model estão no atributo List<SaidaPatrimonio>lista então vc varre ela e retira somente a descricaoPatrimonio dos objetos SaidaPatrimonio, daí getAllItems ficaria assim:
public List&lt;String&gt; getAllItems(){  
          List&lt;String&gt; dados= new ArrayList&lt;String&gt;();
          // no seu atributo itensRetirados vc nao precisa de um int  que la na tela vc pega somente a String 
          for(SaidaPatrimonio saida: linhas ) {
              dados.add ( saida.getDescricaoPatrimonio() );
          }
         return dados;
}

Na tela:

public List&lt;SaidaPatrimonio&gt; getAllItems(){
    List&lt;SaidaPatrimonio&gt;list = new ArrayList();
    SaidaPatrimonio s = new SaidaPatrimonio();
    s.setNomePessoaPegou(txtNomePessoaPegou.getText());
    String data = new SimpleDateFormat("dd/MM/yyyy").format(txtDataRetirada.getDate());
    s.setDataRetirada(data);
    ArrayList&lt;String&gt; descricoes = model.getAllItems();
    s.setItensRetirados(descricoes);
     list.add(0, s);
    
    return list;
    
}

Me explica algumas coisas :

  • No código da tela não entendi vc retorna um List<SaidePatrimonio> mas só adiciona um objeto na lista?
  • Os itensRetirados são as descricoes dos patrimonios como vc fez no getAllItems do model ?
  • O método getAllItems está retornando um Object[][] preenchido com inteiros e String’s ,talves seria o caso de vc criar uma classe ItemRetirado com atributos int e String e colocar um atributo List<ItemRetirado> itensRetirados no classe SaidaPatrimonio. Senão a melhor opção seria mesmo um List<String>.

Espero ter ajudado.

Criado 9 de novembro de 2011
Ultima resposta 10 de nov. de 2011
Respostas 5
Participantes 3