[Dúvida]JTable

12 respostas
victorgilc

Olá pessoal!

tenho uma JTable em um JDialog, separado do JFrame, quero pegar os dados selecionados (codigo,cidade,estado)pelo usuário na JTable e guarda-los,
depois de pega-los tenho que transmiti-los a 3 labels distintos no JFrame.

Como faço isso :?:

PS(Uso Netbeans)

Obrigado.

12 Respostas

A

E ai doido, seguinte, você tem que criar um evento chamado TableMouseClick na JTable, como você está utilizando o NetBens fica fácil, você concerteza deve saber fazer isso, dentro desse evento, você tem que pegar os dados selecionados e adicionalos numa classe, essa classe tem que conter os atributos que você deseja pegar da JTable…
Você está utilzando AbstractTableModel??

victorgilc

Sim, não uso o default table model, mas amanhã eu vejo se eu consigo fazer, pois os arquivos não estão comigo :smiley:
vlw cara

A

Tenta ai, qualquer coisa você avisa ai…

victorgilc

eu fiz isso, esse código tá num arquivo chamado dialogCidade.java(é um JDiloag)
ai como eu faço pra jogar estes dados nos labels que estão num outro arquivo chamado Formulario? O código tá certo, é isso msm?

private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {                                      

    if(tableCidade.getSelectedRows().length > 0)
    {
        int linhaselecionada = tableCidade.getSelectedRow();
        tableCidade.getSelectedColumn();

        codigoselecionado = tableCidade.getValueAt(linhaselecionada, 0);
        cidadeselecionada = tableCidade.getValueAt(linhaselecionada, 1);
        estadoselecionado = tableCidade.getValueAt(linhaselecionada, 2);

        JOptionPane.showMessageDialog(null, ""+codigoselecionado);
    }
    else
    {
            JOptionPane.showMessageDialog(this,"Selecione algum item da tabela","Erro",JOptionPane.ERROR_MESSAGE);
    }
    }                                     
    public int getCodigo()
    {
        int resultado=Integer.parseInt(codigoselecionado.toString());
        return resultado;
    }

    public String getCidade()
    {
        return cidadeselecionada.toString();
    }

    public String getEstado()
    {
        return estadoselecionado.toString();
    }
ViniGodoy

Isso não está certo:

  1. Você deve pedir o dado da linha para o model, não para o JTable;
  2. O model deve te retornar um objeto, que é quem você passa para uma outra tela.

Por isso, não use DefaultTableModel.
Ele está complicando, e muito, a lógica do seu código.

victorgilc

Mas eu não estou usando defaulttable model…

victorgilc

Como ficaria?

ViniGodoy

Qual model você está usando? Pode posta-lo?

victorgilc

É este aqui, o arquivo chama CidadeTableModel

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

public class CidadeTableModel extends AbstractTableModel
{
    private final int COL_COD = 0;
    private final int COL_CID = 1;
    private final int COL_EST = 2;



    private List <CatCidade> catCidades;

    public CidadeTableModel()
    {
        catCidades = new ArrayList();
    }

    public CidadeTableModel(List Lista)
    {
        this();
        catCidades.addAll(Lista);
    }

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

    public int getColumnCount()
    {
        return 3;
    }

    @Override
    public String getColumnName(int column)
    {
         if (column == COL_COD)
         {
             return "Código";
         }
         else if (column == COL_CID)
         {
            return "Cidade";
         }
         else if (column == COL_EST)
         {
            return "Estado";
         }
        return "";

    }
    @Override
    public Class getColumnClass (int columnIndex)
    {
        if (columnIndex == COL_COD)
        {
            return Integer.class;
        }
        else if (columnIndex == COL_CID)
        {
            return String.class;
        }
        else if (columnIndex == COL_EST)
        {
            return String.class;
        }
        return String.class;
    }


    public Object getValueAt(int rowIndex, int columnIndex)
    {
        CatCidade c = catCidades.get(rowIndex);
        

        if (columnIndex == COL_COD)
        {
          //return Integer.class;

          return c.getCod();

        }

        else if (columnIndex == COL_CID)
        {
            //return String.class;

            return c.getCidade();

        }
        else if (columnIndex == COL_EST)
        {
            //return String.class;

            return c.getEstado();

        }

        return String.class;
    }
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex)
    {
         CatCidade c = catCidades.get(rowIndex);

        if(columnIndex == COL_COD)
        {
          c.setCod(Integer.parseInt(aValue.toString()));
        }
        else if(columnIndex == COL_CID)
        {
            c.setCidade(aValue.toString());
        }
        else if(columnIndex == COL_EST)
        {
            c.setEstado(aValue.toString());
        }

        fireTableDataChanged();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return false;
    }

     public void inserir(CatCidade c)
    {
        catCidades.add(c);

        fireTableDataChanged();
    }

    public CatCidade excluir(int pos)
    {
        CatCidade c = catCidades.remove(pos);
        fireTableDataChanged();

        return c;
    }

    public void excluir(CatCidade c)
    {
        catCidades.remove(c);

        fireTableDataChanged();
    }

    public CatCidade getCidade(int pos)
    {
        if (pos < 0 || pos >= catCidades.size())
        {
            throw new IllegalArgumentException("O índice informado é inválido...");
            //return null;
        }

        return catCidades.get(pos);
     }

    
}
victorgilc

Como q eu faço pra colocar os dados no label?

ViniGodoy

Então, ao invés de toda essa encrenca aqui:

int linhaselecionada = tableCidade.getSelectedRow();  
         tableCidade.getSelectedColumn();  
   
         codigoselecionado = tableCidade.getValueAt(linhaselecionada, 0);  
         cidadeselecionada = tableCidade.getValueAt(linhaselecionada, 1);  
         estadoselecionado = tableCidade.getValueAt(linhaselecionada, 2);  
   
         JOptionPane.showMessageDialog(null, ""+codigoselecionado);

Você faz:

CidadeTableModel model = (CidadeTableModel)tabelaCidade.getModel();
   int linhaselecionada = tableCidade.getSelectedRow();  
   CatCidade cidade = model.getCidade(linhaselecionada);
   JOptionPane.showMessageDialog(null, ""+c.getCod());

Note que o código que sugeri além de mais simples, não depende da ordem das colunas e, como o objeto já é do tipo certo, não haverá necessidade de casts. Sempre que precisar de dados, pergunte ao model. Idealmente, você nunca deveria chamar o método getValueAt e setValueAt, para nada.

Agora, para transportar dados entre janelas, veja o exemplo:
http://www.guj.com.br/posts/list/55710.java#292687

O que você vai transportar é justamente o objeto CatCidade.

victorgilc

Vlw Vini, é isso aí, brigaduuu!

Criado 18 de novembro de 2010
Ultima resposta 19 de nov. de 2010
Respostas 12
Participantes 3